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 jme3test.animation; 3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.animation.AnimControl; 3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.animation.AnimationFactory; 3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.animation.LoopMode; 3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.app.SimpleApplication; 3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.cinematic.Cinematic; 3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.cinematic.MotionPath; 4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.cinematic.PlayState; 4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.cinematic.events.*; 4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.font.BitmapText; 4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.ChaseCamera; 4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.controls.ActionListener; 4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.controls.KeyTrigger; 4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.light.DirectionalLight; 4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.material.Material; 4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.ColorRGBA; 4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.FastMath; 5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.Quaternion; 5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.Vector3f; 5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.niftygui.NiftyJmeDisplay; 5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.post.FilterPostProcessor; 5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.post.filters.FadeFilter; 5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.renderer.Caps; 5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.renderer.queue.RenderQueue.ShadowMode; 5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.CameraNode; 5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.Geometry; 5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.Spatial; 6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.shape.Box; 6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.shadow.PssmShadowRenderer; 6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport de.lessvoid.nifty.Nifty; 6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class TestCinematic extends SimpleApplication { 6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Spatial model; 6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Spatial teapot; 6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private MotionPath path; 6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private MotionTrack cameraMotionTrack; 7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Cinematic cinematic; 7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private ChaseCamera chaseCam; 7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private FilterPostProcessor fpp; 7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private FadeFilter fade; 7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private float time = 0; 7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static void main(String[] args) { 7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta TestCinematic app = new TestCinematic(); 7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta app.start(); 7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void simpleInitApp() { 8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //just some text 8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta NiftyJmeDisplay niftyDisplay = new NiftyJmeDisplay(getAssetManager(), 8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta getInputManager(), 8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta getAudioRenderer(), 9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta getGuiViewPort()); 9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Nifty nifty; 9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta nifty = niftyDisplay.getNifty(); 9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta nifty.fromXmlWithoutStartScreen("Interface/Nifty/CinematicTest.xml"); 9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta getGuiViewPort().addProcessor(niftyDisplay); 9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt"); 9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta final BitmapText text = new BitmapText(guiFont, false); 9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta text.setSize(guiFont.getCharSet().getRenderedSize()); 9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta text.setText("Press enter to play/pause cinematic"); 9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta text.setLocalTranslation((cam.getWidth() - text.getLineWidth()) / 2, cam.getHeight(), 0); 10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta guiNode.attachChild(text); 10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta createScene(); 10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cinematic = new Cinematic(rootNode, 20); 10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta stateManager.attach(cinematic); 10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta createCameraMotion(); 10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //creating spatial animation for the teapot 11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta AnimationFactory factory = new AnimationFactory(20, "teapotAnim"); 11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta factory.addTimeTranslation(0, new Vector3f(10, 0, 10)); 11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta factory.addTimeTranslation(20, new Vector3f(10, 0, -10)); 11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta factory.addTimeScale(10, new Vector3f(4, 4, 4)); 11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta factory.addTimeScale(20, new Vector3f(1, 1, 1)); 11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta factory.addTimeRotationAngles(20, 0, 4 * FastMath.TWO_PI, 0); 11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta AnimControl control = new AnimControl(); 11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta control.addAnim(factory.buildAnimation()); 11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta teapot.addControl(control); 12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //fade in 12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cinematic.addCinematicEvent(0, new FadeEvent(true)); 12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // cinematic.activateCamera(0, "aroundCam"); 12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cinematic.addCinematicEvent(0, new AnimationTrack(teapot, "teapotAnim", LoopMode.DontLoop)); 12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cinematic.addCinematicEvent(0, cameraMotionTrack); 12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cinematic.addCinematicEvent(0, new SoundTrack("Sound/Environment/Nature.ogg", LoopMode.Loop)); 12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cinematic.addCinematicEvent(3f, new SoundTrack("Sound/Effects/kick.wav")); 12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cinematic.addCinematicEvent(3, new SubtitleTrack(nifty, "start", 3, "jMonkey engine really kicks A...")); 12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cinematic.addCinematicEvent(5.1f, new SoundTrack("Sound/Effects/Beep.ogg", 1)); 13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cinematic.addCinematicEvent(2, new AnimationTrack(model, "Walk", LoopMode.Loop)); 13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cinematic.activateCamera(0, "topView"); 13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // cinematic.activateCamera(10, "aroundCam"); 13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //fade out 13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cinematic.addCinematicEvent(19, new FadeEvent(false)); 13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// cinematic.addCinematicEvent(19, new AbstractCinematicEvent() { 13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// @Override 13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// public void onPlay() { 14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// fade.setDuration(1f / cinematic.getSpeed()); 14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// fade.fadeOut(); 14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// @Override 14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// public void onUpdate(float tpf) { 14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// @Override 15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// public void onStop() { 15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// 15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// @Override 15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// public void onPause() { 15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// }); 15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cinematic.addListener(new CinematicEventListener() { 15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void onPlay(CinematicEvent cinematic) { 16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta chaseCam.setEnabled(false); 16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta System.out.println("play"); 16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void onPause(CinematicEvent cinematic) { 16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta System.out.println("pause"); 16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void onStop(CinematicEvent cinematic) { 17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta chaseCam.setEnabled(true); 17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fade.setValue(1); 17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta System.out.println("stop"); 17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }); 17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //cinematic.setSpeed(2); 17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta flyCam.setEnabled(false); 17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta chaseCam = new ChaseCamera(cam, model, inputManager); 17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta initInputs(); 18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void createCameraMotion() { 18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta CameraNode camNode = cinematic.bindCamera("topView", cam); 18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta camNode.setLocalTranslation(new Vector3f(0, 50, 0)); 18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta camNode.lookAt(teapot.getLocalTranslation(), Vector3f.UNIT_Y); 18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta CameraNode camNode2 = cinematic.bindCamera("aroundCam", cam); 19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta path = new MotionPath(); 19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta path.setCycle(true); 19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta path.addWayPoint(new Vector3f(20, 3, 0)); 19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta path.addWayPoint(new Vector3f(0, 3, 20)); 19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta path.addWayPoint(new Vector3f(-20, 3, 0)); 19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta path.addWayPoint(new Vector3f(0, 3, -20)); 19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta path.setCurveTension(0.83f); 19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cameraMotionTrack = new MotionTrack(camNode2, path); 19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cameraMotionTrack.setLoopMode(LoopMode.Loop); 19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cameraMotionTrack.setLookAt(model.getWorldTranslation(), Vector3f.UNIT_Y); 20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cameraMotionTrack.setDirectionType(MotionTrack.Direction.LookAt); 20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 20359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 20459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void createScene() { 20559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 20659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta model = (Spatial) assetManager.loadModel("Models/Oto/Oto.mesh.xml"); 20759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta model.center(); 20859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta model.setShadowMode(ShadowMode.CastAndReceive); 20959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rootNode.attachChild(model); 21059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 21159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); 21259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta mat.setColor("Color", ColorRGBA.Cyan); 21359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 21459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta teapot = assetManager.loadModel("Models/Teapot/Teapot.obj"); 21559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta teapot.setLocalTranslation(10, 0, 10); 21659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta teapot.setMaterial(mat); 21759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta teapot.setShadowMode(ShadowMode.CastAndReceive); 21859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rootNode.attachChild(teapot); 21959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 22059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Material matSoil = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md"); 22159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta matSoil.setBoolean("UseMaterialColors", true); 22259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta matSoil.setColor("Ambient", ColorRGBA.Gray); 22359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta matSoil.setColor("Diffuse", ColorRGBA.Green); 22459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta matSoil.setColor("Specular", ColorRGBA.Black); 22559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 22659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Geometry soil = new Geometry("soil", new Box(new Vector3f(0, -6.0f, 0), 50, 1, 50)); 22759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta soil.setMaterial(matSoil); 22859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta soil.setShadowMode(ShadowMode.Receive); 22959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rootNode.attachChild(soil); 23059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta DirectionalLight light = new DirectionalLight(); 23159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta light.setDirection(new Vector3f(0, -1, -1).normalizeLocal()); 23259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta light.setColor(ColorRGBA.White.mult(1.5f)); 23359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rootNode.addLight(light); 23459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 23559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fpp = new FilterPostProcessor(assetManager); 23659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fade = new FadeFilter(); 23759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fpp.addFilter(fade); 23859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 23959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (renderer.getCaps().contains(Caps.GLSL100)) { 24059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta PssmShadowRenderer pssm = new PssmShadowRenderer(assetManager, 512, 1); 24159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pssm.setDirection(new Vector3f(0, -1, -1).normalizeLocal()); 24259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pssm.setShadowIntensity(0.4f); 24359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta viewPort.addProcessor(pssm); 24459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta viewPort.addProcessor(fpp); 24559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 24659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 24759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 24859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void initInputs() { 24959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta inputManager.addMapping("togglePause", new KeyTrigger(keyInput.KEY_RETURN)); 25059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta inputManager.addMapping("navFwd", new KeyTrigger(keyInput.KEY_RIGHT)); 25159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta inputManager.addMapping("navBack", new KeyTrigger(keyInput.KEY_LEFT)); 25259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ActionListener acl = new ActionListener() { 25359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void onAction(String name, boolean keyPressed, float tpf) { 25559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (name.equals("togglePause") && keyPressed) { 25659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (cinematic.getPlayState() == PlayState.Playing) { 25759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cinematic.pause(); 25859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta time = cinematic.getTime(); 25959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 26059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cinematic.play(); 26159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 26259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 26359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 26459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (cinematic.getPlayState() != PlayState.Playing) { 26559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (name.equals("navFwd") && keyPressed) { 26659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta time += 0.25; 26759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta FastMath.clamp(time, 0, cinematic.getInitialDuration()); 26859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cinematic.setTime(time); 26959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 27059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (name.equals("navBack") && keyPressed) { 27159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta time -= 0.25; 27259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta FastMath.clamp(time, 0, cinematic.getInitialDuration()); 27359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cinematic.setTime(time); 27459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 27559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 27659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 27759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 27859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }; 27959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta inputManager.addListener(acl, "togglePause", "navFwd", "navBack"); 28059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 28159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 28259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private class FadeEvent extends AbstractCinematicEvent { 28359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 28459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta boolean in = true; 28559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float value = 0; 28659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 28759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public FadeEvent(boolean in) { 28859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta super(1); 28959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.in = in; 29059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta value = in ? 0 : 1; 29159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 29259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 29359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 29459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void onPlay() { 29559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 29659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fade.setDuration(1f / cinematic.getSpeed()); 29759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (in) { 29859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fade.fadeIn(); 29959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 30059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fade.fadeOut(); 30159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 30259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fade.setValue(value); 30359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 30459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 30559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 30659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 30759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setTime(float time) { 30859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta super.setTime(time); 30959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (time >= fade.getDuration()) { 31059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta value = in ? 1 : 0; 31159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fade.setValue(value); 31259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 31359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta value = time; 31459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (in) { 31559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fade.setValue(time / cinematic.getSpeed()); 31659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 31759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fade.setValue(1 - time / cinematic.getSpeed()); 31859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 31959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 32059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 32159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 32259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 32359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void onUpdate(float tpf) { 32459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 32559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 32659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 32759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void onStop() { 32859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 32959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 33059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 33159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void onPause() { 33259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta value = fade.getValue(); 33359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fade.pause(); 33459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 33559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 33659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta} 337