Advertisement
Guest User

Untitled

a guest
Feb 24th, 2014
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.94 KB | None | 0 0
  1.  
  2.  
  3. import com.jme3.app.Application;
  4. import com.jme3.app.state.AbstractAppState;
  5. import com.jme3.app.state.AppStateManager;
  6. import com.jme3.input.InputManager;
  7. import com.jme3.input.KeyInput;
  8. import com.jme3.input.MouseInput;
  9. import com.jme3.input.controls.ActionListener;
  10. import com.jme3.input.controls.KeyTrigger;
  11. import com.jme3.input.controls.MouseButtonTrigger;
  12. import com.jme3.math.Quaternion;
  13. import com.jme3.math.Vector2f;
  14. import com.jme3.math.Vector3f;
  15. import com.jme3.renderer.Camera;
  16. import com.jme3.renderer.ViewPort;
  17. import com.jme3.scene.Node;
  18. import com.jme3.system.AppSettings;
  19. import de.b00n.daltura.client.scene.Daltura3DApplication;
  20. import de.b00n.daltura.client.scene.DalturaFreeWorldScene;
  21. import de.b00n.daltura.client.scene.appstates.gui.HudState;
  22. import java.util.concurrent.Callable;
  23.  
  24. /**
  25.  *
  26.  * @author Sascha
  27.  */
  28. public class MiniMapState extends AbstractAppState implements ActionListener {
  29.  
  30.     public static final String MINI_MAP = "miniMap", MINI_MAP_MOVE = "miniMapMove";
  31.     public static final float MINIMAP_VIEWPORT_LEFT = .8f;
  32.     public static final float MINIMAP_VIEWPORT_RIGHT = 1f;
  33.     public static final float MINIMAP_VIEWPORT_BOTTOM = 0.f;
  34.     public static final float MINIMAP_VIEWPORT_TOP = .2f;
  35.     /*
  36.      * 1/(Sqrt(2))
  37.      */
  38.     public static final double InverseSqrtOf2 = 0.70710678118654752440084436210485;
  39.     /*
  40.      * Distance of the minimap-camera.
  41.      */
  42.     public static final float MINI_MAP_CAMERA_DISTANCE = 2250f;
  43.     private Camera miniMapCam;
  44.     private ViewPort miniMapViewPort;
  45.     private Application app;
  46.     private InputManager inputManager;
  47.     private float miniMapLeftScreen;
  48.     private float miniMapRightScreen;
  49.     private float miniMapTopScreen;
  50.     private float miniMapBottomScreen;
  51.     private float miniMapHeightScreenSpaceCenter;
  52.     private float miniMapWidthScreenSpaceCenter;
  53.     private Vector3f center;
  54.     private RTSCam rtsCam;
  55.     private Quaternion qRotationMiniMap;
  56.     private Vector3f miniMapPosition;
  57.     private double angle = -1;
  58.     private float negSinY, cosY;
  59.     private int screenWidth;
  60.     private int screenHeight;
  61.  
  62.     @Override
  63.     public void onAction(String name, boolean isPressed, float tpf) {
  64.         switch (name) {
  65.             case MINI_MAP:
  66.                 if (isPressed) {
  67.                     boolean b = !miniMapViewPort.isEnabled();
  68.                     HudState state = app.getStateManager().getState(HudState.class);
  69.                     if (state != null) {
  70.                         state.setMiniMapPanelEnabled(b);
  71.                     }
  72.                     setEnabled(b);
  73.                 }
  74.                 break;
  75.             case MINI_MAP_MOVE:
  76.                 if (isPressed) {
  77.                     Vector2f cursorPosition = inputManager.getCursorPosition();
  78.                     if (cursorPosition.x >= miniMapLeftScreen && cursorPosition.x <= miniMapRightScreen
  79.                             && cursorPosition.y >= miniMapBottomScreen && cursorPosition.y <= miniMapTopScreen) {
  80.                         float xScale = (cursorPosition.x - miniMapRightScreen) / (miniMapWidthScreenSpaceCenter) + 1f;
  81.                         float x = DalturaFreeWorldScene.TerrainPatchScaleTimesPatchSize * xScale;
  82.                         float zScale = (cursorPosition.y - miniMapTopScreen) / (miniMapHeightScreenSpaceCenter) + 1f;
  83.                         float z = DalturaFreeWorldScene.TerrainPatchScaleTimesPatchSize * zScale;
  84.  
  85.                         center.subtractLocal(qRotationMiniMap.mult(new Vector3f(x, -z, 0)));
  86.                     }
  87.                 }
  88.                 break;
  89.         }
  90.     }
  91.  
  92.     @Override
  93.     public void setEnabled(boolean enabled) {
  94.         super.setEnabled(enabled);
  95.         miniMapViewPort.setEnabled(enabled);
  96.     }
  97.  
  98.     public void attachScene(final Node scene) {
  99.         app.enqueue(new Callable<Void>() {
  100.             @Override
  101.             public Void call() throws Exception {
  102.                 miniMapViewPort.attachScene(scene);
  103.                 return null;
  104.             }
  105.         });
  106.     }
  107.  
  108.     public void detachScene(final Node scene) {
  109.         app.enqueue(new Callable<Void>() {
  110.             @Override
  111.             public Void call() throws Exception {
  112.                 miniMapViewPort.detachScene(scene);
  113.                 return null;
  114.             }
  115.         });
  116.     }
  117.  
  118.     @Override
  119.     public void initialize(AppStateManager stateManager, final Application app) {
  120.         super.initialize(stateManager, app);
  121.         AppSettings settings = ((Daltura3DApplication) app).getSettings();
  122.         screenWidth = settings.getWidth();
  123.         screenHeight = settings.getHeight();
  124.         miniMapLeftScreen = MINIMAP_VIEWPORT_LEFT * screenWidth;
  125.         miniMapRightScreen = MINIMAP_VIEWPORT_RIGHT * screenWidth;
  126.         miniMapTopScreen = MINIMAP_VIEWPORT_TOP * screenHeight;
  127.         miniMapBottomScreen = MINIMAP_VIEWPORT_BOTTOM * screenHeight;
  128.  
  129.         miniMapHeightScreenSpaceCenter = (miniMapTopScreen - miniMapBottomScreen) * 0.5f;
  130.         miniMapWidthScreenSpaceCenter = (miniMapRightScreen - miniMapLeftScreen) * 0.5f;
  131.         rtsCam = stateManager.getState(RTSCam.class);
  132.         center = rtsCam.getCenter();
  133.  
  134.         inputManager = app.getInputManager();
  135.         this.app = app;
  136.         inputManager.addMapping(MINI_MAP, new KeyTrigger(KeyInput.KEY_K));
  137.         inputManager.addMapping(MINI_MAP_MOVE, new MouseButtonTrigger(MouseInput.BUTTON_LEFT));
  138.         inputManager.addListener(this, MINI_MAP, MINI_MAP_MOVE);
  139.         Camera cam = app.getCamera();
  140.         miniMapCam = cam.clone();
  141.         miniMapCam.setViewPort(MINIMAP_VIEWPORT_LEFT, MINIMAP_VIEWPORT_RIGHT, MINIMAP_VIEWPORT_BOTTOM, MINIMAP_VIEWPORT_TOP);
  142.         miniMapCam.setParallelProjection(true);
  143.         miniMapCam.setFrustumPerspective(90f, cam.getWidth() / cam.getHeight(), 0.01f, MINI_MAP_CAMERA_DISTANCE + DalturaFreeWorldScene.heightScale);
  144.         miniMapViewPort = app.getRenderManager().createPostView(MINI_MAP, miniMapCam);
  145.         miniMapViewPort.setClearFlags(true, true, true);
  146.         miniMapViewPort.setBackgroundColor(Daltura3DApplication.VIEWPORT_BACKGROUND_COLOR);
  147.         qRotationMiniMap = miniMapCam.getRotation();
  148.         miniMapPosition = miniMapCam.getLocation();
  149.         miniMapPosition.y = MINI_MAP_CAMERA_DISTANCE;
  150.         miniMapPosition.x = center.x;
  151.         miniMapPosition.z = center.z;
  152.     }
  153.  
  154.     public ViewPort getMiniMapView() {
  155.         return miniMapViewPort;
  156.     }
  157.  
  158.     @Override
  159.     public void update(float tpf) {
  160.         double rot = rtsCam.getRot() * 0.5;
  161.         /**
  162.          * Only refresh if position or rotation changed.
  163.          */
  164.         if (angle != rot || miniMapPosition.x != center.x || miniMapPosition.z != center.z) {
  165.             miniMapPosition.x = center.x;
  166.             miniMapPosition.z = center.z;
  167.             negSinY = -(float) (StrictMath.sin(angle) * InverseSqrtOf2); //Doing double because Fastmath.sin is doing also double...
  168.             cosY = (float) (StrictMath.cos(angle) * InverseSqrtOf2);//Doing double because Fastmath.cos is doing also double...
  169.             qRotationMiniMap.set(negSinY, cosY, -cosY, negSinY);
  170.             miniMapCam.onFrameChange();
  171.             angle = rot;
  172.         }
  173.     }
  174.  
  175.     @Override
  176.     public void cleanup() {
  177.         super.cleanup();
  178.         app.getRenderManager().removePostView(MINI_MAP);
  179.         miniMapViewPort = null;
  180.     }
  181.  
  182.     public void setMiniMapViewPort(float mLeft, float mRight, float mBottom, float mTop) {
  183.         if (miniMapCam != null) {
  184.             miniMapLeftScreen = mLeft * screenWidth;
  185.             miniMapRightScreen = mRight * screenWidth;
  186.             miniMapTopScreen = mTop * screenHeight;
  187.             miniMapBottomScreen = mBottom * screenHeight;
  188.  
  189.             miniMapHeightScreenSpaceCenter = (miniMapTopScreen - miniMapBottomScreen) * 0.5f;
  190.             miniMapWidthScreenSpaceCenter = (miniMapRightScreen - miniMapLeftScreen) * 0.5f;
  191.             miniMapCam.setViewPort(mLeft, mRight, mBottom, mTop);
  192.         }
  193.     }
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement