diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 30387fbe..5cd58c9b 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -384,6 +384,7 @@ Transvoxel implementation - Scaling LODed chunks by lod level Fix items falling below the ground +Fix server always rotating entity to face client camera -- should only be changing movement vector # TODO diff --git a/src/main/java/electrosphere/entity/state/movement/groundmove/ClientGroundMovementTree.java b/src/main/java/electrosphere/entity/state/movement/groundmove/ClientGroundMovementTree.java index 85362dfb..95ec2fae 100644 --- a/src/main/java/electrosphere/entity/state/movement/groundmove/ClientGroundMovementTree.java +++ b/src/main/java/electrosphere/entity/state/movement/groundmove/ClientGroundMovementTree.java @@ -101,6 +101,9 @@ public class ClientGroundMovementTree implements BehaviorTree { long lastUpdateTime = 0; //the last position reported by the server Vector3d lastServerPosition = null; + + //the vector controling the direction the entity will move in + Vector3d movementVector = new Vector3d(1,0,0); /** * Constructor @@ -186,44 +189,44 @@ public class ClientGroundMovementTree implements BehaviorTree { // Model entityModel = Globals.assetManager.fetchModel(EntityUtils.getEntityModelPath(parent)); Vector3d position = EntityUtils.getPosition(parent); Vector3d facingVector = CreatureUtils.getFacingVector(parent); - Vector3d movementVector = new Vector3d(facingVector); DBody body = PhysicsEntityUtils.getDBody(parent); DVector3C linearVelocity = body.getLinearVel(); - switch(facing){ - case FORWARD: - movementVector.normalize(); - break; - case LEFT: - movementVector.rotateY((float)(90 * Math.PI / 180)).normalize(); - break; - case RIGHT: - movementVector.rotateY((float)(-90 * Math.PI / 180)).normalize(); - break; - case BACKWARD: - movementVector.x = -movementVector.x; - movementVector.z = -movementVector.z; - movementVector.normalize(); - break; - case FORWARD_LEFT: - movementVector.rotateY((float)(45 * Math.PI / 180)).normalize(); - break; - case FORWARD_RIGHT: - movementVector.rotateY((float)(-45 * Math.PI / 180)).normalize(); - break; - case BACKWARD_LEFT: - movementVector.rotateY((float)(135 * Math.PI / 180)).normalize(); - break; - case BACKWARD_RIGHT: - movementVector.rotateY((float)(-135 * Math.PI / 180)).normalize(); - break; + + // + //rotation update + if(this.state != MovementTreeState.IDLE){ + this.movementVector.set(facingVector); + switch(facing){ + case FORWARD: + movementVector.normalize(); + break; + case LEFT: + movementVector.rotateY((float)(90 * Math.PI / 180)).normalize(); + break; + case RIGHT: + movementVector.rotateY((float)(-90 * Math.PI / 180)).normalize(); + break; + case BACKWARD: + movementVector.x = -movementVector.x; + movementVector.z = -movementVector.z; + movementVector.normalize(); + break; + case FORWARD_LEFT: + movementVector.rotateY((float)(45 * Math.PI / 180)).normalize(); + break; + case FORWARD_RIGHT: + movementVector.rotateY((float)(-45 * Math.PI / 180)).normalize(); + break; + case BACKWARD_LEFT: + movementVector.rotateY((float)(135 * Math.PI / 180)).normalize(); + break; + case BACKWARD_RIGHT: + movementVector.rotateY((float)(-135 * Math.PI / 180)).normalize(); + break; + } } -// float movementYaw = CameraEntityUtils.getCameraYaw(Globals.playerCamera); - Quaterniond movementQuaternion = new Quaterniond().rotationTo(MathUtils.getOriginVector(), new Vector3d(facingVector.x,0,facingVector.z)).normalize(); + Quaterniond movementQuaternion = new Quaterniond().rotationTo(MathUtils.getOriginVector(), new Vector3d(movementVector.x,0,movementVector.z)).normalize(); Quaterniond rotation = EntityUtils.getRotation(parent); - //TODO: optimize away and document (I know for the moment if this exception isn't here it will bite me in the ass later) - if(facingVector.length() == 0){ - throw new IllegalStateException("Facing vector length is 0. This will break ODE4J"); - } rotation.set(movementQuaternion); //parse attached network messages diff --git a/src/main/java/electrosphere/entity/state/movement/groundmove/ServerGroundMovementTree.java b/src/main/java/electrosphere/entity/state/movement/groundmove/ServerGroundMovementTree.java index 2ef56d8c..0e915b38 100644 --- a/src/main/java/electrosphere/entity/state/movement/groundmove/ServerGroundMovementTree.java +++ b/src/main/java/electrosphere/entity/state/movement/groundmove/ServerGroundMovementTree.java @@ -69,6 +69,9 @@ public class ServerGroundMovementTree implements BehaviorTree { CopyOnWriteArrayList networkMessageQueue = new CopyOnWriteArrayList(); long lastUpdateTime = 0; + + //the vector organizing the direction the entity will move in + Vector3d movementVector = new Vector3d(1,0,0); private ServerGroundMovementTree(Entity e){ @@ -161,45 +164,49 @@ public class ServerGroundMovementTree implements BehaviorTree { // Model entityModel = Globals.assetManager.fetchModel(EntityUtils.getEntityModelPath(parent)); Vector3d position = EntityUtils.getPosition(parent); Vector3d facingVector = CreatureUtils.getFacingVector(parent); - Vector3d movementVector = new Vector3d(facingVector); DBody body = PhysicsEntityUtils.getDBody(parent); DVector3C linearVelocity = body.getLinearVel(); - switch(facing){ - case FORWARD: - movementVector.normalize(); - break; - case LEFT: - movementVector.rotateY((float)(90 * Math.PI / 180)).normalize(); - break; - case RIGHT: - movementVector.rotateY((float)(-90 * Math.PI / 180)).normalize(); - break; - case BACKWARD: - movementVector.x = -movementVector.x; - movementVector.z = -movementVector.z; - movementVector.normalize(); - break; - case FORWARD_LEFT: - movementVector.rotateY((float)(45 * Math.PI / 180)).normalize(); - break; - case FORWARD_RIGHT: - movementVector.rotateY((float)(-45 * Math.PI / 180)).normalize(); - break; - case BACKWARD_LEFT: - movementVector.rotateY((float)(135 * Math.PI / 180)).normalize(); - break; - case BACKWARD_RIGHT: - movementVector.rotateY((float)(-135 * Math.PI / 180)).normalize(); - break; + + // + //rotation update + if(this.state != MovementTreeState.IDLE){ + this.movementVector.set(facingVector); + switch(facing){ + case FORWARD: + movementVector.normalize(); + break; + case LEFT: + movementVector.rotateY((float)(90 * Math.PI / 180)).normalize(); + break; + case RIGHT: + movementVector.rotateY((float)(-90 * Math.PI / 180)).normalize(); + break; + case BACKWARD: + movementVector.x = -movementVector.x; + movementVector.z = -movementVector.z; + movementVector.normalize(); + break; + case FORWARD_LEFT: + movementVector.rotateY((float)(45 * Math.PI / 180)).normalize(); + break; + case FORWARD_RIGHT: + movementVector.rotateY((float)(-45 * Math.PI / 180)).normalize(); + break; + case BACKWARD_LEFT: + movementVector.rotateY((float)(135 * Math.PI / 180)).normalize(); + break; + case BACKWARD_RIGHT: + movementVector.rotateY((float)(-135 * Math.PI / 180)).normalize(); + break; + } } -// float movementYaw = CameraEntityUtils.getCameraYaw(Globals.playerCamera); - Quaterniond movementQuaternion = new Quaterniond().rotationTo(MathUtils.getOriginVector(), new Vector3d(facingVector.x,0,facingVector.z)).normalize(); + Quaterniond movementQuaternion = new Quaterniond().rotationTo(MathUtils.getOriginVector(), new Vector3d(movementVector.x,0,movementVector.z)).normalize(); Quaterniond rotation = EntityUtils.getRotation(parent); + rotation.set(movementQuaternion); //TODO: optimize away and document (I know for the moment if this exception isn't here it will bite me in the ass later) if(facingVector.length() == 0){ throw new IllegalStateException("Facing vector length is 0. This will break ODE4J"); } - rotation.set(movementQuaternion); //parse attached network messages for(EntityMessage message : networkMessageQueue){ @@ -269,7 +276,6 @@ public class ServerGroundMovementTree implements BehaviorTree { ); body.setAngularVel(0, 0, 0); // position.set(newPosition); - rotation.set(movementQuaternion); GravityUtils.serverAttemptActivateGravity(parent); @@ -320,7 +326,6 @@ public class ServerGroundMovementTree implements BehaviorTree { ); body.setAngularVel(0, 0, 0); // position.set(newPosition); - rotation.set(movementQuaternion); GravityUtils.serverAttemptActivateGravity(parent); @@ -380,7 +385,6 @@ public class ServerGroundMovementTree implements BehaviorTree { ); body.setAngularVel(0, 0, 0); // position.set(newPosition); - rotation.set(movementQuaternion); GravityUtils.serverAttemptActivateGravity(parent); diff --git a/src/main/java/electrosphere/menu/debug/ImGuiWindowMacros.java b/src/main/java/electrosphere/menu/debug/ImGuiWindowMacros.java index 7badf53f..7811df92 100644 --- a/src/main/java/electrosphere/menu/debug/ImGuiWindowMacros.java +++ b/src/main/java/electrosphere/menu/debug/ImGuiWindowMacros.java @@ -182,11 +182,13 @@ public class ImGuiWindowMacros { ImGui.text("Player Entity Details"); if(Globals.playerEntity != null){ ImGui.text("Position: " + EntityUtils.getPosition(Globals.playerEntity)); + ImGui.text("Rotation: " + EntityUtils.getRotation(Globals.playerEntity)); //server pos int serverIdForClientEntity = Globals.clientSceneWrapper.mapClientToServerId(Globals.playerEntity.getId()); Entity serverPlayerEntity = EntityLookupUtils.getEntityById(serverIdForClientEntity); ImGui.text("Position (Server): " + EntityUtils.getPosition(serverPlayerEntity)); + ImGui.text("Rotation (Server): " + EntityUtils.getRotation(serverPlayerEntity)); //client-side tree stuff DBody body = PhysicsEntityUtils.getDBody(Globals.playerEntity);