update assumptions about facing vector on server
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good

This commit is contained in:
austin 2024-09-02 19:19:24 -04:00
parent 91490103a4
commit 7c363143f2
4 changed files with 37 additions and 5 deletions

View File

@ -163,13 +163,13 @@ public class ServerGroundMovementTree implements BehaviorTree {
if(CreatureUtils.hasVelocity(parent)){ if(CreatureUtils.hasVelocity(parent)){
maxNaturalVelocity = ServerGroundMovementTree.getMaximumVelocity(parent, this.groundMovementSystem, facing); maxNaturalVelocity = ServerGroundMovementTree.getMaximumVelocity(parent, this.groundMovementSystem, facing);
} }
if(ServerPlayerViewDirTree.hasTree(parent)){
ServerPlayerViewDirTree serverViewTree =ServerPlayerViewDirTree.getTree(parent);
CreatureUtils.setFacingVector(parent, CameraEntityUtils.getFacingVec(serverViewTree.getYaw(), serverViewTree.getPitch()));
}
PoseActor poseActor = EntityUtils.getPoseActor(parent); PoseActor poseActor = EntityUtils.getPoseActor(parent);
Vector3d position = EntityUtils.getPosition(parent); Vector3d position = EntityUtils.getPosition(parent);
Vector3d facingVector = CreatureUtils.getFacingVector(parent); Vector3d facingVector = CreatureUtils.getFacingVector(parent);
if(ServerPlayerViewDirTree.hasTree(parent)){
ServerPlayerViewDirTree serverViewTree =ServerPlayerViewDirTree.getTree(parent);
facingVector = CameraEntityUtils.getFacingVec(serverViewTree.getYaw(), serverViewTree.getPitch());
}
DBody body = PhysicsEntityUtils.getDBody(parent); DBody body = PhysicsEntityUtils.getDBody(parent);
DVector3C linearVelocity = body.getLinearVel(); DVector3C linearVelocity = body.getLinearVel();
@ -249,6 +249,7 @@ public class ServerGroundMovementTree implements BehaviorTree {
//state machine //state machine
switch(state){ switch(state){
case STARTUP: { case STARTUP: {
CreatureUtils.setFacingVector(parent, facingVector);
rotation.set(movementQuaternion); rotation.set(movementQuaternion);
if(poseActor != null){ if(poseActor != null){
String animationToPlay = determineCorrectAnimation(MovementTreeState.STARTUP); String animationToPlay = determineCorrectAnimation(MovementTreeState.STARTUP);
@ -298,6 +299,7 @@ public class ServerGroundMovementTree implements BehaviorTree {
); );
} break; } break;
case MOVE: { case MOVE: {
CreatureUtils.setFacingVector(parent, facingVector);
rotation.set(movementQuaternion); rotation.set(movementQuaternion);
//check if can restart animation //check if can restart animation
//if yes, restart animation //if yes, restart animation
@ -344,6 +346,7 @@ public class ServerGroundMovementTree implements BehaviorTree {
ServerScriptUtils.fireSignalOnEntity(parent, "entityGroundMove", AccessTransforms.getVector(position)); ServerScriptUtils.fireSignalOnEntity(parent, "entityGroundMove", AccessTransforms.getVector(position));
} break; } break;
case SLOWDOWN: { case SLOWDOWN: {
CreatureUtils.setFacingVector(parent, facingVector);
rotation.set(movementQuaternion); rotation.set(movementQuaternion);
//run slowdown code //run slowdown code
if(poseActor != null){ if(poseActor != null){

View File

@ -12,8 +12,10 @@ import electrosphere.entity.EntityDataStrings;
import electrosphere.entity.EntityUtils; import electrosphere.entity.EntityUtils;
import electrosphere.entity.btree.BehaviorTree; import electrosphere.entity.btree.BehaviorTree;
import electrosphere.entity.state.physicssync.ServerPhysicsSyncTree; import electrosphere.entity.state.physicssync.ServerPhysicsSyncTree;
import electrosphere.entity.types.creature.CreatureUtils;
import electrosphere.server.datacell.Realm; import electrosphere.server.datacell.Realm;
import electrosphere.server.datacell.utils.ServerBehaviorTreeUtils; import electrosphere.server.datacell.utils.ServerBehaviorTreeUtils;
import electrosphere.util.math.MathUtils;
public class ServerAlwaysUprightTree implements BehaviorTree { public class ServerAlwaysUprightTree implements BehaviorTree {
@ -43,6 +45,11 @@ public class ServerAlwaysUprightTree implements BehaviorTree {
//make sure rotation is vertical //make sure rotation is vertical
// sourceRotation = sourceRotation.mul(0.001, 0.001, 0.001, 1).normalize(); // sourceRotation = sourceRotation.mul(0.001, 0.001, 0.001, 1).normalize();
//calculate rotation based on facing vector
if(CreatureUtils.getFacingVector(parent) != null){
Vector3d facingVector = CreatureUtils.getFacingVector(parent);
sourceRotation = new Quaterniond().rotationTo(MathUtils.getOriginVector(), new Vector3d(facingVector.x,0,facingVector.z)).normalize();
}
EntityUtils.getPosition(parent).set(position); EntityUtils.getPosition(parent).set(position);
EntityUtils.getRotation(parent).set(sourceRotation); EntityUtils.getRotation(parent).set(sourceRotation);

View File

@ -1,5 +1,7 @@
package electrosphere.entity.state.server; package electrosphere.entity.state.server;
import org.joml.Quaterniond;
import electrosphere.controls.CameraHandler; import electrosphere.controls.CameraHandler;
import electrosphere.entity.Entity; import electrosphere.entity.Entity;
import electrosphere.entity.EntityDataStrings; import electrosphere.entity.EntityDataStrings;
@ -95,12 +97,20 @@ public class ServerPlayerViewDirTree implements BehaviorTree {
//if first person, set facing angle //if first person, set facing angle
if(perspective == CameraHandler.CAMERA_PERSPECTIVE_FIRST){ if(perspective == CameraHandler.CAMERA_PERSPECTIVE_FIRST){
CreatureUtils.setFacingVector(parent, CameraEntityUtils.getFacingVec(yaw, pitch)); CreatureUtils.setFacingVector(parent, CameraEntityUtils.getFacingVec(yaw, pitch));
EntityUtils.getRotation(parent).set(CameraEntityUtils.getRotationQuat(yaw,pitch)); EntityUtils.getRotation(parent).set(CameraEntityUtils.getUprightQuat(yaw));
} }
this.lastUpdateTime = time; this.lastUpdateTime = time;
} }
} }
/**
* Gets the current rotation of the view dir tree
* @return The current rotation of the view dir tree
*/
public Quaterniond getRotationQuat(){
return CameraEntityUtils.getRotationQuat(yaw,pitch);
}
} }

View File

@ -250,6 +250,18 @@ public class CameraEntityUtils {
return quatd; return quatd;
} }
/**
* Gets the entity rotation for the upright-aligned entity with a given yaw
* @param yaw The yaw of the camera
* @return The upright-aligned entity rotation
*/
public static Quaterniond getUprightQuat(double yaw){
//quaternion is multiplied by pi because we want to point away from the eye of the camera, NOT towards it
Quaternionf quatRaw = CameraEntityUtils.getYawQuat(yaw).mul(new Quaternionf().rotateY((float)Math.PI));
Quaterniond quatd = new Quaterniond(quatRaw).normalize();
return quatd;
}
/** /**
* Gets the rotation matrix from a yaw and pitch * Gets the rotation matrix from a yaw and pitch
* @param yaw The yaw * @param yaw The yaw