diff --git a/src/main/java/electrosphere/controls/CameraHandler.java b/src/main/java/electrosphere/controls/CameraHandler.java index d60daccc..5867a19f 100644 --- a/src/main/java/electrosphere/controls/CameraHandler.java +++ b/src/main/java/electrosphere/controls/CameraHandler.java @@ -41,6 +41,9 @@ public class CameraHandler { //if set to true, the camera will track the player's entity boolean trackPlayerEntity = true; + //sets whether the camera handler should update the player's camera or not + boolean update = true; + /** * Handles a mouse event * @param event The mouse event @@ -75,88 +78,90 @@ public class CameraHandler { */ public void updateGlobalCamera(){ Globals.profiler.beginCpuSample("updateGlobalCamera"); - if(Globals.playerCamera != null){ - cameraSpeed = 2.5f * (float)Globals.timekeeper.getMostRecentRawFrametime(); + if(update){ + if(Globals.playerCamera != null){ + cameraSpeed = 2.5f * (float)Globals.timekeeper.getMostRecentRawFrametime(); - if(Crosshair.getCrosshairActive()){ - - // if(Globals.playerCharacter != null){ - // Vector3d charPos = EntityUtils.getPosition(Globals.playerCharacter); - // CameraEntityUtils.setCameraCenter(Globals.playerCamera, new Vector3f((float)charPos.x,(float)charPos.y,(float)charPos.z)); - // } - - Vector3d characterPos = EntityUtils.getPosition(Globals.playerEntity); - Vector3d targetPos = Crosshair.getTargetPosition(); - Vector3d diffed = new Vector3d(targetPos).sub(characterPos).mul(-1).normalize(); - cameraRotationVector.set((float)diffed.x, 0.5f, (float)diffed.z).normalize(); - - yaw = (float)Math.toDegrees(Math.atan2(diffed.z, diffed.x)); - - CameraEntityUtils.setCameraPitch(Globals.playerCamera, pitch); - CameraEntityUtils.setCameraYaw(Globals.playerCamera, yaw); - - } else { - CameraEntityUtils.setCameraPitch(Globals.playerCamera, pitch); - CameraEntityUtils.setCameraYaw(Globals.playerCamera, yaw); + if(Crosshair.getCrosshairActive()){ + + // if(Globals.playerCharacter != null){ + // Vector3d charPos = EntityUtils.getPosition(Globals.playerCharacter); + // CameraEntityUtils.setCameraCenter(Globals.playerCamera, new Vector3f((float)charPos.x,(float)charPos.y,(float)charPos.z)); + // } + + Vector3d characterPos = EntityUtils.getPosition(Globals.playerEntity); + Vector3d targetPos = Crosshair.getTargetPosition(); + Vector3d diffed = new Vector3d(targetPos).sub(characterPos).mul(-1).normalize(); + cameraRotationVector.set((float)diffed.x, 0.5f, (float)diffed.z).normalize(); + + yaw = (float)Math.toDegrees(Math.atan2(diffed.z, diffed.x)); + + CameraEntityUtils.setCameraPitch(Globals.playerCamera, pitch); + CameraEntityUtils.setCameraYaw(Globals.playerCamera, yaw); + + } else { + CameraEntityUtils.setCameraPitch(Globals.playerCamera, pitch); + CameraEntityUtils.setCameraYaw(Globals.playerCamera, yaw); - // System.out.println(pitch); - // if(Globals.playerCharacter != null){ - // Vector3d charPos = EntityUtils.getPosition(Globals.playerCharacter); - // CameraEntityUtils.setCameraCenter(Globals.playerCamera, new Vector3f((float)charPos.x,(float)charPos.y,(float)charPos.z)); - // } + // System.out.println(pitch); + // if(Globals.playerCharacter != null){ + // Vector3d charPos = EntityUtils.getPosition(Globals.playerCharacter); + // CameraEntityUtils.setCameraCenter(Globals.playerCamera, new Vector3f((float)charPos.x,(float)charPos.y,(float)charPos.z)); + // } - Quaternionf pitchQuat = new Quaternionf().fromAxisAngleDeg(MathUtils.getLeftVectorf(), -pitch); - Quaternionf yawQuat = new Quaternionf().fromAxisAngleDeg(MathUtils.getUpVectorf(), -yaw); - // float yawRad = yaw / 180.0f * (float)Math.PI; - // float pitchRad = pitch / 180.0f * (float)Math.PI; - // float rollRad = 0.0f; - // pitchQuat.mul(yawQuat); - cameraRotationVector = pitchQuat.transform(MathUtils.getOriginVectorf()); - cameraRotationVector = yawQuat.transform(cameraRotationVector); - cameraRotationVector.normalize(); + Quaternionf pitchQuat = new Quaternionf().fromAxisAngleDeg(MathUtils.getLeftVectorf(), -pitch); + Quaternionf yawQuat = new Quaternionf().fromAxisAngleDeg(MathUtils.getUpVectorf(), -yaw); + // float yawRad = yaw / 180.0f * (float)Math.PI; + // float pitchRad = pitch / 180.0f * (float)Math.PI; + // float rollRad = 0.0f; + // pitchQuat.mul(yawQuat); + cameraRotationVector = pitchQuat.transform(MathUtils.getOriginVectorf()); + cameraRotationVector = yawQuat.transform(cameraRotationVector); + cameraRotationVector.normalize(); - // cameraRotationVector.x = 0 + (float) Math.cos(yaw / 180.0f * Math.PI) * 1; - // cameraRotationVector.y = 0 + (float) Math.sin(pitch / 180.0f * Math.PI) * 1; - // cameraRotationVector.z = 0 + (float) Math.sin(yaw / 180.0f * Math.PI) * 1; - // cameraRotationVector.normalize(); - // System.out.println(yaw + " " + pitch); + // cameraRotationVector.x = 0 + (float) Math.cos(yaw / 180.0f * Math.PI) * 1; + // cameraRotationVector.y = 0 + (float) Math.sin(pitch / 180.0f * Math.PI) * 1; + // cameraRotationVector.z = 0 + (float) Math.sin(yaw / 180.0f * Math.PI) * 1; + // cameraRotationVector.normalize(); + // System.out.println(yaw + " " + pitch); + } + if(trackPlayerEntity && Globals.playerEntity != null){ + Vector3d entityPos = EntityUtils.getPosition(Globals.playerEntity); + CameraEntityUtils.setCameraCenter(Globals.playerCamera, new Vector3f((float)entityPos.x,(float)entityPos.y,(float)entityPos.z).add(CameraEntityUtils.getOrbitalCameraRadialOffset(Globals.playerCamera))); + } + //update view matrix offset + float xFactor = (float)Math.cos(yaw / 180.0f * Math.PI); + float yFactor = (float)Math.sin(yaw / 180.0f * Math.PI); + Vector3f radialOffset = CameraEntityUtils.getOrbitalCameraRadialOffset(Globals.playerCamera); + Vector3f trueOffset = new Vector3f(radialOffset).mul(xFactor,1.0f,yFactor); + CameraEntityUtils.setOrbitalCameraRadialOffset(Globals.playerCamera, trueOffset); + cameraRotationVector.mul(CameraEntityUtils.getOrbitalCameraDistance(Globals.playerCamera)); + CameraEntityUtils.setCameraEye(Globals.playerCamera, cameraRotationVector); + + //tell the server that we changed where we're looking, if we're in first person + int perspectiveVal = CameraHandler.CAMERA_PERSPECTIVE_FIRST; + if(Globals.controlHandler.cameraIsThirdPerson()){ + perspectiveVal = CameraHandler.CAMERA_PERSPECTIVE_THIRD; + } + if(Globals.cameraHandler.getTrackPlayerEntity() && Globals.playerEntity != null){ + Globals.clientConnection.queueOutgoingMessage( + EntityMessage.constructupdateEntityViewDirMessage( + Globals.clientSceneWrapper.mapClientToServerId(Globals.playerEntity.getId()), + Globals.timekeeper.getNumberOfSimFramesElapsed(), + perspectiveVal, + yaw, + pitch + ) + ); + } + + //the view matrix + Globals.viewMatrix = CameraEntityUtils.getCameraViewMatrix(Globals.playerCamera); + + //update the cursor on client side + updatePlayerCursor(); } - if(trackPlayerEntity && Globals.playerEntity != null){ - Vector3d entityPos = EntityUtils.getPosition(Globals.playerEntity); - CameraEntityUtils.setCameraCenter(Globals.playerCamera, new Vector3f((float)entityPos.x,(float)entityPos.y,(float)entityPos.z).add(CameraEntityUtils.getOrbitalCameraRadialOffset(Globals.playerCamera))); - } - //update view matrix offset - float xFactor = (float)Math.cos(yaw / 180.0f * Math.PI); - float yFactor = (float)Math.sin(yaw / 180.0f * Math.PI); - Vector3f radialOffset = CameraEntityUtils.getOrbitalCameraRadialOffset(Globals.playerCamera); - Vector3f trueOffset = new Vector3f(radialOffset).mul(xFactor,1.0f,yFactor); - CameraEntityUtils.setOrbitalCameraRadialOffset(Globals.playerCamera, trueOffset); - cameraRotationVector.mul(CameraEntityUtils.getOrbitalCameraDistance(Globals.playerCamera)); - CameraEntityUtils.setCameraEye(Globals.playerCamera, cameraRotationVector); - - //tell the server that we changed where we're looking, if we're in first person - int perspectiveVal = CameraHandler.CAMERA_PERSPECTIVE_FIRST; - if(Globals.controlHandler.cameraIsThirdPerson()){ - perspectiveVal = CameraHandler.CAMERA_PERSPECTIVE_THIRD; - } - if(Globals.cameraHandler.getTrackPlayerEntity() && Globals.playerEntity != null){ - Globals.clientConnection.queueOutgoingMessage( - EntityMessage.constructupdateEntityViewDirMessage( - Globals.clientSceneWrapper.mapClientToServerId(Globals.playerEntity.getId()), - Globals.timekeeper.getNumberOfSimFramesElapsed(), - perspectiveVal, - yaw, - pitch - ) - ); - } - - //the view matrix - Globals.viewMatrix = CameraEntityUtils.getCameraViewMatrix(Globals.playerCamera); - - //update the cursor on client side - updatePlayerCursor(); } Globals.profiler.endCpuSample(); } @@ -208,6 +213,14 @@ public class CameraHandler { public boolean getTrackPlayerEntity(){ return trackPlayerEntity; } + + /** + * Sets whether the camera should update with player input or not + * @param update true to update with input, false otherwise + */ + public void setUpdate(boolean update){ + this.update = update; + } diff --git a/src/main/java/electrosphere/engine/loadingthreads/ClientLoading.java b/src/main/java/electrosphere/engine/loadingthreads/ClientLoading.java index 0d1ddc12..a4c0845f 100644 --- a/src/main/java/electrosphere/engine/loadingthreads/ClientLoading.java +++ b/src/main/java/electrosphere/engine/loadingthreads/ClientLoading.java @@ -112,6 +112,7 @@ public class ClientLoading { //init camera Globals.playerCamera = CameraEntityUtils.spawnBasicCameraEntity(new Vector3f(0,0,0), new Vector3f(-1,0,0)); Globals.cameraHandler.setTrackPlayerEntity(false); + Globals.cameraHandler.setUpdate(false); //initialize the "real" objects simulation initClientSimulation(); //init foliage manager