/* * Copyright (c) 2003-2009 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'jMonkeyEngine' nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ //package com.jme.scene; import java.io.IOException; import java.io.Serializable; import java.util.HashMap; import com.jme.util.export.InputCapsule; import com.jme.util.export.JMEExporter; import com.jme.util.export.JMEImporter; import com.jme.util.export.OutputCapsule; import com.jme.util.export.Savable; /** * Controller provides a base class for creation of controllers * to modify nodes and render states over time. The base controller provides a * repeat type, min and max time, as well as speed. Subclasses of this will * provide the update method that takes the time between the last call and the * current one and modifies an object in a application specific way. * * @author Mark Powell * @version $Id: Controller.java 4131 2009-03-19 20:15:28Z blaine.dev $ */ public abstract class Controller implements Serializable, Savable { /** * A clamped repeat type signals that the controller should look like its * final state when it's done
* Example: 0 1 5 8 9 10 10 10 10 10 10 10 10 10 10 10... */ public static final int RT_CLAMP = 0; /** * A wrapped repeat type signals that the controller should start back at * the begining when it's final state is reached
* Example: 0 1 5 8 9 10 0 1 5 8 9 10 0 1 5 .... * */ public static final int RT_WRAP = 1; /** * A cycled repeat type signals that the controller should cycle it's states * forwards and backwards
* Example: 0 1 5 8 9 10 9 8 5 1 0 1 5 8 9 10 9 .... */ public static final int RT_CYCLE = 2; /** * Defines how this controller should repeat itself. This can be one of * RT_CLAMP, RT_WRAP, RT_CYCLE, or an application specific repeat flag. */ private int repeatType; /** * The controller's minimum cycle time */ private float minTime; /** * The controller's maximum cycle time */ private float maxTime; /** * The 'speed' of this Controller. Genericly, less than 1 is slower, more * than 1 is faster, and 1 represents the base speed */ public float timestep = 1; /** * True if this controller is active, false otherwise */ private boolean active = true; private static final long serialVersionUID = 1; /** * Returns the speed of this controller. Speed is 1 by default. * * @return */ public float getTimeStep() { return timestep; } /** * Sets the speed of this controller * * @param speed * The new speed */ public void setTimeStep(float speed) { this.timestep = speed; } /** * Returns the current maximum time for this controller. * * @return This controller's maximum time. */ public float getMaxTime() { return maxTime; } /** * Sets the maximum time for this controller * * @param maxTime * The new maximum time */ public void setMaxTime(float maxTime) { this.maxTime = maxTime; } /** * Returns the current minimum time of this controller * * @return This controller's minimum time */ public float getMinTime() { return minTime; } /** * Sets the minimum time of this controller * * @param minTime * The new minimum time. */ public void setMinTime(float minTime) { this.minTime = minTime; } /** * Returns the current repeat type of this controller. * * @return The current repeat type */ public int getRepeatType() { return repeatType; } /** * Sets the repeat type of this controller. * * @param repeatType * The new repeat type. */ public void setRepeatType(int repeatType) { this.repeatType = repeatType; } /** * Sets the active flag of this controller. Note: updates on controllers are * still called even if this flag is set to false. It is the responsibility * of the extending class to check isActive if it wishes to be * turn-off-able. * * @param active * The new active state. */ public void setActive(boolean active) { this.active = active; } /** * Returns if this Controller is active or not. * * @return True if this controller is set to active, false if not. */ public boolean isActive() { return active; } /** * Defined by extending classes, update is a signal to * Controller that it should update whatever object(s) it is controlling. * * @param time * The time in seconds between the last call to update and the * current one */ public abstract void update(float time); public void write(JMEExporter e) throws IOException { OutputCapsule capsule = e.getCapsule(this); capsule.write(repeatType, "repeatType", RT_CLAMP); capsule.write(minTime, "minTime", 0); capsule.write(maxTime, "maxTime", 0); capsule.write(timestep, "speed", 1); capsule.write(active, "active", true); } public void read(JMEImporter e) throws IOException { InputCapsule capsule = e.getCapsule(this); repeatType = capsule.readInt("repeatType", RT_CLAMP); minTime = capsule.readFloat("minTime", 0); maxTime = capsule.readFloat("maxTime", 0); timestep = capsule.readFloat("speed", 1); active = capsule.readBoolean("active", true); } public Class getClassTag() { return this.getClass(); } public void getControllerValues(HashMap store) { } public void setControllerValues(HashMap values) { } }