159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/* 259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Copyright (c) 2009-2010 jMonkeyEngine 359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * All rights reserved. 459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Redistribution and use in source and binary forms, with or without 659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * modification, are permitted provided that the following conditions are 759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * met: 859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions of source code must retain the above copyright 1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * notice, this list of conditions and the following disclaimer. 1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions in binary form must reproduce the above copyright 1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * notice, this list of conditions and the following disclaimer in the 1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * documentation and/or other materials provided with the distribution. 1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Neither the name of 'jMonkeyEngine' nor the names of its contributors 1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * may be used to endorse or promote products derived from this software 1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * without specific prior written permission. 1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.cinematic; 3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.animation.LoopMode; 3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.app.Application; 3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.app.state.AppState; 3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.app.state.AppStateManager; 3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.asset.TextureKey; 3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.cinematic.events.AbstractCinematicEvent; 4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.cinematic.events.CinematicEvent; 4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.cinematic.events.CinematicEventListener; 4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.*; 4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.renderer.Camera; 4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.renderer.RenderManager; 4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.CameraNode; 4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.Node; 4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.control.CameraControl; 4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.control.CameraControl.ControlDirection; 4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.io.IOException; 5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.ArrayList; 5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.HashMap; 5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.List; 5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.Map; 5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Level; 5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Logger; 5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/** 5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Nehon 6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class Cinematic extends AbstractCinematicEvent implements AppState { 6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private static final Logger logger = Logger.getLogger(Application.class.getName()); 6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Node scene; 6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected TimeLine timeLine = new TimeLine(); 6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int lastFetchedKeyFrame = -1; 6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private List<CinematicEvent> cinematicEvents = new ArrayList<CinematicEvent>(); 6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Map<String, CameraNode> cameras = new HashMap<String, CameraNode>(); 6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private CameraNode currentCam; 7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private boolean initialized = false; 7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Map<String, Map<String, Object>> eventsData; 7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Cinematic() { 7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Cinematic(Node scene) { 7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.scene = scene; 7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Cinematic(Node scene, float initialDuration) { 8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta super(initialDuration); 8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.scene = scene; 8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Cinematic(Node scene, LoopMode loopMode) { 8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta super(loopMode); 8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.scene = scene; 8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Cinematic(Node scene, float initialDuration, LoopMode loopMode) { 9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta super(initialDuration, loopMode); 9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.scene = scene; 9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void onPlay() { 9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (isInitialized()) { 9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (playState == PlayState.Paused) { 9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < cinematicEvents.size(); i++) { 10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta CinematicEvent ce = cinematicEvents.get(i); 10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (ce.getPlayState() == PlayState.Paused) { 10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ce.play(); 10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void onStop() { 11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta time = 0; 11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta lastFetchedKeyFrame = -1; 11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < cinematicEvents.size(); i++) { 11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta CinematicEvent ce = cinematicEvents.get(i); 11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ce.stop(); 11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta enableCurrentCam(false); 11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void onPause() { 12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < cinematicEvents.size(); i++) { 12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta CinematicEvent ce = cinematicEvents.get(i); 12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (ce.getPlayState() == PlayState.Playing) { 12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ce.pause(); 12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void write(JmeExporter ex) throws IOException { 13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta super.write(ex); 13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta OutputCapsule oc = ex.getCapsule(this); 13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta oc.writeSavableArrayList((ArrayList) cinematicEvents, "cinematicEvents", null); 13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta oc.writeStringSavableMap(cameras, "cameras", null); 13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta oc.write(timeLine, "timeLine", null); 13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void read(JmeImporter im) throws IOException { 14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta super.read(im); 14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta InputCapsule ic = im.getCapsule(this); 14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cinematicEvents = ic.readSavableArrayList("cinematicEvents", null); 14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cameras = (Map<String, CameraNode>) ic.readStringSavableMap("cameras", null); 14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta timeLine = (TimeLine) ic.readSavable("timeLine", null); 14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setSpeed(float speed) { 15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta super.setSpeed(speed); 15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < cinematicEvents.size(); i++) { 15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta CinematicEvent ce = cinematicEvents.get(i); 15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ce.setSpeed(speed); 15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void initialize(AppStateManager stateManager, Application app) { 16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta initEvent(app, this); 16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (CinematicEvent cinematicEvent : cinematicEvents) { 16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cinematicEvent.initEvent(app, this); 16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta initialized = true; 16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public boolean isInitialized() { 17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return initialized; 17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setEnabled(boolean enabled) { 17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (enabled) { 17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta play(); 17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public boolean isEnabled() { 18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return playState == PlayState.Playing; 18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void stateAttached(AppStateManager stateManager) { 18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void stateDetached(AppStateManager stateManager) { 18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta stop(); 19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void update(float tpf) { 19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (isInitialized()) { 19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta internalUpdate(tpf); 19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void onUpdate(float tpf) { 20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < cinematicEvents.size(); i++) { 20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta CinematicEvent ce = cinematicEvents.get(i); 20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ce.internalUpdate(tpf); 20359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 20459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 20559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int keyFrameIndex = timeLine.getKeyFrameIndexFromTime(time); 20659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 20759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //iterate to make sure every key frame is triggered 20859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = lastFetchedKeyFrame + 1; i <= keyFrameIndex; i++) { 20959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta KeyFrame keyFrame = timeLine.get(i); 21059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (keyFrame != null) { 21159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta keyFrame.trigger(); 21259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 21359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 21459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 21559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta lastFetchedKeyFrame = keyFrameIndex; 21659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 21759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 21859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 21959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setTime(float time) { 22059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta super.setTime(time); 22159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int keyFrameIndex = timeLine.getKeyFrameIndexFromTime(time); 22259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 22359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //triggering all the event from start to "time" 22459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //then computing timeOffset for each event 22559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i <= keyFrameIndex; i++) { 22659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta KeyFrame keyFrame = timeLine.get(i); 22759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (keyFrame != null) { 22859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (CinematicEvent ce : keyFrame.getCinematicEvents()) { 22959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ce.play(); 23059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ce.setTime(time - timeLine.getKeyFrameTime(keyFrame)); 23159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 23259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 23359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 23459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (playState != PlayState.Playing) { 23559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pause(); 23659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 23759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 23859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // step(); 23959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 24059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 24159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public KeyFrame addCinematicEvent(float timeStamp, CinematicEvent cinematicEvent) { 24259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta KeyFrame keyFrame = timeLine.getKeyFrameAtTime(timeStamp); 24359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (keyFrame == null) { 24459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta keyFrame = new KeyFrame(); 24559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta timeLine.addKeyFrameAtTime(timeStamp, keyFrame); 24659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 24759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta keyFrame.cinematicEvents.add(cinematicEvent); 24859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cinematicEvents.add(cinematicEvent); 24959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return keyFrame; 25059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 25159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void render(RenderManager rm) { 25359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 25459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void postRender() { 25659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 25759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void cleanup() { 25959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 26059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 26159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 26259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * fits the duration of the cinamatic to the duration of all its child cinematic events 26359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 26459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void fitDuration() { 26559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta KeyFrame kf = timeLine.getKeyFrameAtTime(timeLine.getLastKeyFrameIndex()); 26659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float d = 0; 26759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < kf.getCinematicEvents().size(); i++) { 26859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta CinematicEvent ce = kf.getCinematicEvents().get(i); 26959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (d < (ce.getDuration() * ce.getSpeed())) { 27059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta d = (ce.getDuration() * ce.getSpeed()); 27159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 27259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 27359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 27459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta initialDuration = d; 27559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 27659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 27759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public CameraNode bindCamera(String cameraName, Camera cam) { 27859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta CameraNode node = new CameraNode(cameraName, cam); 27959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta node.setControlDir(ControlDirection.SpatialToCamera); 28059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta node.getControl(CameraControl.class).setEnabled(false); 28159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cameras.put(cameraName, node); 28259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta scene.attachChild(node); 28359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return node; 28459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 28559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 28659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public CameraNode getCamera(String cameraName) { 28759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return cameras.get(cameraName); 28859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 28959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 29059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void enableCurrentCam(boolean enabled) { 29159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (currentCam != null) { 29259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta currentCam.getControl(CameraControl.class).setEnabled(enabled); 29359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 29459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 29559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 29659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setActiveCamera(String cameraName) { 29759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta enableCurrentCam(false); 29859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta currentCam = cameras.get(cameraName); 29959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (currentCam == null) { 30059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logger.log(Level.WARNING, "{0} is not a camera bond to the cinematic, cannot activate", cameraName); 30159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 30259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta enableCurrentCam(true); 30359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 30459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 30559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void activateCamera(final float timeStamp, final String cameraName) { 30659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta addCinematicEvent(timeStamp, new AbstractCinematicEvent() { 30759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 30859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 30959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void play() { 31059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta super.play(); 31159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta stop(); 31259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 31359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 31459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 31559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void onPlay() { 31659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setActiveCamera(cameraName); 31759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 31859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 31959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 32059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void onUpdate(float tpf) { 32159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 32259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 32359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 32459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void onStop() { 32559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 32659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 32759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 32859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void onPause() { 32959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 33059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 33159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 33259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setTime(float time) { 33359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta play(); 33459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 33559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }); 33659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 33759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 33859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setScene(Node scene) { 33959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.scene = scene; 34059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 34159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 34259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Map<String, Map<String, Object>> getEventsData() { 34359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (eventsData == null) { 34459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta eventsData = new HashMap<String, Map<String, Object>>(); 34559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 34659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return eventsData; 34759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 34859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 34959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void putEventData(String type, String name, Object object) { 35059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Map<String, Map<String, Object>> data = getEventsData(); 35159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Map<String, Object> row = data.get(type); 35259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (row == null) { 35359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta row = new HashMap<String, Object>(); 35459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 35559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta row.put(name, object); 35659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 35759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 35859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Object getEventData(String type, String name) { 35959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (eventsData != null) { 36059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Map<String, Object> row = eventsData.get(type); 36159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (row != null) { 36259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return row.get(name); 36359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 36459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 36559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return null; 36659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 36759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 36859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Savable removeEventData(String type, String name) { 36959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (eventsData != null) { 37059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Map<String, Object> row = eventsData.get(type); 37159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (row != null) { 37259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta row.remove(name); 37359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 37459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 37559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return null; 37659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 37759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 37859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Node getScene() { 37959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return scene; 38059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 38159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta} 382