package fr.lyrgard.hexScape; import com.jme3.app.SimpleApplication; import com.jme3.app.state.AppState; import com.jme3.asset.plugins.FileLocator; import com.jme3.light.AmbientLight; import com.jme3.light.DirectionalLight; import com.jme3.light.PointLight; import com.jme3.math.ColorRGBA; import com.jme3.math.Vector3f; import com.jme3.renderer.ViewPort; import com.jme3.renderer.queue.RenderQueue.ShadowMode; import com.jme3.shadow.DirectionalLightShadowRenderer; import fr.lyrgard.hexScape.bus.GuiMessageBus; import fr.lyrgard.hexScape.camera.FlyByCameraAppState; import fr.lyrgard.hexScape.camera.PointOfViewCameraAppState; import fr.lyrgard.hexScape.camera.RotatingAroundCameraAppState; import fr.lyrgard.hexScape.control.PieceControlerAppState; import fr.lyrgard.hexScape.control.SelectMarkerAppState; import fr.lyrgard.hexScape.control.TitleMenuButtonsAppState; import fr.lyrgard.hexScape.control.View3dControlState; import fr.lyrgard.hexScape.message.CoreReady; import fr.lyrgard.hexScape.message.LookingFreelyMessage; import fr.lyrgard.hexScape.message.LookingFromAboveMessage; import fr.lyrgard.hexScape.message.LookingFromPieceMessage; import fr.lyrgard.hexScape.model.CurrentUserInfo; import fr.lyrgard.hexScape.model.TitleScreen; import fr.lyrgard.hexScape.service.MapManager; import fr.lyrgard.hexScape.service.PieceManager; public class HexScapeJme3Application extends SimpleApplication { private MapManager scene; private PieceManager pieceLookedAt; private RotatingAroundCameraAppState rotatingAroundCameraAppState = new RotatingAroundCameraAppState(); private PointOfViewCameraAppState pointOfViewCameraAppState = new PointOfViewCameraAppState(); private FlyByCameraAppState flyByCameraAppState = new FlyByCameraAppState(); private PieceControlerAppState pieceControlerAppState = new PieceControlerAppState(); private TitleMenuButtonsAppState titleMenuButtonsAppState = new TitleMenuButtonsAppState(); private SelectMarkerAppState selectMarkerAppState = new SelectMarkerAppState(); PointLight haloLight; public HexScapeJme3Application() { super(new AppState[] {}); //stateManager.attach(new StatsAppState()); stateManager.attach(rotatingAroundCameraAppState); stateManager.attach(pieceControlerAppState); stateManager.attach(titleMenuButtonsAppState); stateManager.attach(pointOfViewCameraAppState); stateManager.attach(selectMarkerAppState); stateManager.attach(flyByCameraAppState); pieceControlerAppState.setEnabled(false); rotatingAroundCameraAppState.setEnabled(false); pointOfViewCameraAppState.setEnabled(false); selectMarkerAppState.setEnabled(false); flyByCameraAppState.setEnabled(false); } @Override public void simpleInitApp() { assetManager.registerLocator("", FileLocator.class); float aspect = (float)cam.getWidth() / (float)cam.getHeight(); cam.setFrustumPerspective( 45f, aspect, 0.1f, cam.getFrustumFar() ); rotatingAroundCameraAppState.setRotateAroundNode(null); DirectionalLight sun = new DirectionalLight(); sun.setColor(ColorRGBA.White.mult(0.5f)); sun.setDirection(new Vector3f(1,-1, 0.5f).normalizeLocal()); rootNode.addLight(sun); AmbientLight al = new AmbientLight(); al.setColor(ColorRGBA.White.mult(1f)); rootNode.addLight(al); final int SHADOWMAP_SIZE=1024; DirectionalLightShadowRenderer dlsr = new DirectionalLightShadowRenderer(assetManager, SHADOWMAP_SIZE, 3); dlsr.setLight(sun); dlsr.setShadowIntensity(0.3f); viewPort.addProcessor(dlsr); //viewPort.setBackgroundColor(ColorRGBA.Blue); // p = new Picture("background"); // Texture tileTexture = assetManager.loadTexture("model/texture/select_cross_white.png"); // Material bgMaterial = new Material(assetManager, // "Common/MatDefs/Light/Lighting.j3md"); // bgMaterial.setBoolean("UseMaterialColors",true); // bgMaterial.setTexture("DiffuseMap", tileTexture); // bgMaterial.setColor("Ambient", ColorRGBA.Red); // bgMaterial.setColor("Diffuse",ColorRGBA.White); // minimum material color // bgMaterial.setColor("Specular",ColorRGBA.White); // for shininess // bgMaterial.setFloat("Shininess", 50f); // p.setMaterial(bgMaterial); // // // ViewPort pv = renderManager.createPreView("background", cam); // pv.setClearFlags(true, true, true); // pv.attachScene(p); // viewPort.setClearFlags(false, true, true); rootNode.setShadowMode(ShadowMode.CastAndReceive); setPauseOnLostFocus(false); displayTitleScreen(); //rotatingAroundCameraAppState.setRotateAroundNode(TitleScreen.getInstance().getSpatial()); GuiMessageBus.post(new CoreReady()); } public MapManager getScene() { return scene; } public void setControlState(View3dControlState state) { switch(state) { case TITLE_SCREEN: pointOfViewCameraAppState.setEnabled(false); pieceControlerAppState.setEnabled(false); rotatingAroundCameraAppState.setEnabled(false); selectMarkerAppState.setEnabled(false); flyByCameraAppState.setEnabled(false); titleMenuButtonsAppState.setEnabled(true); cam.setLocation(new Vector3f(0, 100, 0)); cam.lookAt(new Vector3f(0, 0, 0), new Vector3f(0, 1, 0)); break; case SHOW_MAP_OBSERVE: pointOfViewCameraAppState.setEnabled(false); titleMenuButtonsAppState.setEnabled(false); pieceControlerAppState.setEnabled(false); flyByCameraAppState.setEnabled(false); rotatingAroundCameraAppState.setEnabled(true); selectMarkerAppState.setEnabled(true); rotatingAroundCameraAppState.setRotateAroundNode(scene.getSpatial()); break; case SHOW_MAP_PLAYING: pointOfViewCameraAppState.setEnabled(false); titleMenuButtonsAppState.setEnabled(false); flyByCameraAppState.setEnabled(false); pieceControlerAppState.setEnabled(true); selectMarkerAppState.setEnabled(true); rotatingAroundCameraAppState.setEnabled(true); rotatingAroundCameraAppState.setRotateAroundNode(scene.getSpatial()); break; case SHOW_PIECE_VIEW: titleMenuButtonsAppState.setEnabled(false); pieceControlerAppState.setEnabled(false); rotatingAroundCameraAppState.setEnabled(false); flyByCameraAppState.setEnabled(false); pointOfViewCameraAppState.setEnabled(true); selectMarkerAppState.setEnabled(true); pointOfViewCameraAppState.setPiece(pieceLookedAt); break; case FREE_MOVING: pointOfViewCameraAppState.setEnabled(false); titleMenuButtonsAppState.setEnabled(false); rotatingAroundCameraAppState.setEnabled(false); pieceControlerAppState.setEnabled(true); selectMarkerAppState.setEnabled(true); flyByCameraAppState.setEnabled(true); break; default: break; } } public void displayTitleScreen() { if (this.scene != null) { rootNode.detachChild(this.scene.getSpatial()); scene = null; } setControlState(View3dControlState.TITLE_SCREEN); rootNode.attachChild(TitleScreen.getInstance().getSpatial()); } public void setScene(MapManager scene) { rootNode.detachChild(TitleScreen.getInstance().getSpatial()); if (this.scene != null) { rootNode.detachChild(this.scene.getSpatial()); } this.scene = scene; if (scene != null) { rootNode.attachChild(scene.getSpatial()); //rootNode.attachChild(Sky.getInstance().getSpatial()); if (CurrentUserInfo.getInstance().isPlayingGame()) { setControlState(View3dControlState.SHOW_MAP_PLAYING); } else { setControlState(View3dControlState.SHOW_MAP_OBSERVE); } } else { rotatingAroundCameraAppState.setRotateAroundNode(null); } } public void lookThroughEyesOf(PieceManager piece) { if (piece != null) { pieceLookedAt = piece; setControlState(View3dControlState.SHOW_PIECE_VIEW); GuiMessageBus.post(new LookingFromPieceMessage(CurrentUserInfo.getInstance().getPlayerId(), piece.getPiece().getId())); } } public void lookAtTheMap() { if (scene != null) { pieceLookedAt = null; if (CurrentUserInfo.getInstance().isPlayingGame()) { setControlState(View3dControlState.SHOW_MAP_PLAYING); } else { setControlState(View3dControlState.SHOW_MAP_OBSERVE); } GuiMessageBus.post(new LookingFromAboveMessage(CurrentUserInfo.getInstance().getPlayerId())); } } public void lookFreely() { if (scene != null) { setControlState(View3dControlState.FREE_MOVING); GuiMessageBus.post(new LookingFreelyMessage(CurrentUserInfo.getInstance().getPlayerId())); } } public PieceControlerAppState getPieceControlerAppState() { return pieceControlerAppState; } public ViewPort getViewPort() { return viewPort; } }