animation flickering bugfixes
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit

This commit is contained in:
austin 2024-07-26 20:59:59 -04:00
parent 3092b70c1e
commit 8484fad7da
15 changed files with 482 additions and 284 deletions

View File

@ -455,6 +455,8 @@ Devtools for updating first person attachment rotations
(07/26/2024) (07/26/2024)
Viewmodel equipped item rotates inverted to bone rotation Viewmodel equipped item rotates inverted to bone rotation
Visually block Visually block
Utility object for reducing boilerplate when writing btree transitions that just play an animation then transition
First animations flickering in first person (enforce animation priority requirement)
# TODO # TODO

View File

@ -125,7 +125,6 @@ public class StateTransitionUtil {
if(state.audioPath != null){ if(state.audioPath != null){
Globals.virtualAudioSourceManager.createVirtualAudioSource(state.audioPath, VirtualAudioSourceType.CREATURE, false); Globals.virtualAudioSourceManager.createVirtualAudioSource(state.audioPath, VirtualAudioSourceType.CREATURE, false);
} }
FirstPersonTree.conditionallyPlayAnimation(Globals.firstPersonEntity, firstPersonAnimation);
} else { } else {
//play third person audio //play third person audio
if(state.audioPath != null){ if(state.audioPath != null){
@ -133,13 +132,16 @@ public class StateTransitionUtil {
} }
} }
actor.playAnimation(animationToPlay,1); actor.playAnimation(animationToPlay,state.animPriority);
actor.incrementAnimationTime(0.0001); actor.incrementAnimationTime(0.0001);
state.startedAnimation = true; state.startedAnimation = true;
} else if(animationToPlay == null && state.onComplete != null){ } else if(animationToPlay == null && state.onComplete != null){
state.onComplete.run(); state.onComplete.run();
state.startedAnimation = false; state.startedAnimation = false;
} }
if(firstPersonAnimation != null){
FirstPersonTree.conditionallyPlayAnimation(Globals.firstPersonEntity, firstPersonAnimation, state.animPriority);
}
} }
} }
@ -165,7 +167,7 @@ public class StateTransitionUtil {
state.startedAnimation = false; state.startedAnimation = false;
} else if(animationToPlay != null && (!poseActor.isPlayingAnimation() || !poseActor.isPlayingAnimation(animationToPlay))){ } else if(animationToPlay != null && (!poseActor.isPlayingAnimation() || !poseActor.isPlayingAnimation(animationToPlay))){
//play animation for state //play animation for state
poseActor.playAnimation(animationToPlay,1); poseActor.playAnimation(animationToPlay,state.animPriority);
poseActor.incrementAnimationTime(0.0001); poseActor.incrementAnimationTime(0.0001);
state.startedAnimation = true; state.startedAnimation = true;
} else if(animationToPlay == null && state.onComplete != null){ } else if(animationToPlay == null && state.onComplete != null){
@ -183,6 +185,9 @@ public class StateTransitionUtil {
//The enum value for this state //The enum value for this state
Object stateEnum; Object stateEnum;
//the priority of this animation in particular
int animPriority;
//T1he animation to play in first person //T1he animation to play in first person
String firstPersonAnimation; String firstPersonAnimation;
@ -206,62 +211,22 @@ public class StateTransitionUtil {
/** /**
* Constructor * Constructor
* @param stateEnum The enum value for this state
* @param firstPersonAnimation The animation to play in first person. If this is null, it will not play any animation in first person.
* @param thirdPersonAnimation The animation to play in third person. If this is null, it will not play any animation in third person.
* @param audioPath The audio path to play when the animation starts. If this is null, it will not play any audio.
* @param onComplete The function to fire on completion (ie to transition to the next state). If this is null, the animation and audio will be looped on completion.
*/ */
public StateTransitionUtilItem( private StateTransitionUtilItem(
Object stateEnum, Object stateEnum,
int animPriority,
String firstPersonAnimation, String firstPersonAnimation,
String thirdPersonAnimation,
String audioPath,
Runnable onComplete
){
this.stateEnum = stateEnum;
this.firstPersonAnimation = firstPersonAnimation;
this.thirdPersonAnimation = thirdPersonAnimation;
this.audioPath = audioPath;
this.onComplete = onComplete;
}
/**
* Constructor
* @param stateEnum The enum value for this state
* @param firstPersonAnimation The animation to play in first person. If this is null, it will not play any animation in first person.
* @param thirdPersonAnimation The animation to play in third person. If this is null, it will not play any animation in third person.
* @param onComplete The function to fire on completion (ie to transition to the next state). If this is null, the animation and audio will be looped on completion.
*/
public StateTransitionUtilItem(
Object stateEnum,
String firstPersonAnimation,
String thirdPersonAnimation,
Runnable onComplete
){
this.stateEnum = stateEnum;
this.firstPersonAnimation = firstPersonAnimation;
this.thirdPersonAnimation = thirdPersonAnimation;
this.onComplete = onComplete;
}
/**
* Constructor
* @param stateEnum The enum value for this state
* @param firstPersonAnimation The animation to play in first person. If this is null, it will not play any animation in first person.
* @param thirdPersonAnimation The animation to play in third person. If this is null, it will not play any animation in third person.
* @param audioPath The audio path to play when the animation starts. If this is null, it will not play any audio.
* @param onComplete The function to fire on completion (ie to transition to the next state). If this is null, the animation and audio will be looped on completion.
*/
public StateTransitionUtilItem(
Object stateEnum,
Supplier<String> getFirstPersonAnimation, Supplier<String> getFirstPersonAnimation,
String thirdPersonAnimation,
Supplier<String> getThirdPersonAnimation, Supplier<String> getThirdPersonAnimation,
String audioPath, String audioPath,
Runnable onComplete Runnable onComplete
){ ){
this.stateEnum = stateEnum; this.stateEnum = stateEnum;
this.animPriority = animPriority;
this.firstPersonAnimation = firstPersonAnimation;
this.getFirstPersonAnimation = getFirstPersonAnimation; this.getFirstPersonAnimation = getFirstPersonAnimation;
this.thirdPersonAnimation = thirdPersonAnimation;
this.getThirdPersonAnimation = getThirdPersonAnimation; this.getThirdPersonAnimation = getThirdPersonAnimation;
this.audioPath = audioPath; this.audioPath = audioPath;
this.onComplete = onComplete; this.onComplete = onComplete;
@ -270,83 +235,195 @@ public class StateTransitionUtil {
/** /**
* Constructor * Constructor
* @param stateEnum The enum value for this state * @param stateEnum The enum value for this state
* @param firstPersonAnimation The animation to play in first person. If this is null, it will not play any animation in first person. * @param animPriority The priority of this state's animations
* @param thirdPersonAnimation The animation to play in third person. If this is null, it will not play any animation in third person. * @param firstPersonAnimation The animation to play in first person. If this is null, it will not play any animation in first person
* @param onComplete The function to fire on completion (ie to transition to the next state). If this is null, the animation and audio will be looped on completion. * @param getFirstPersonAnimation The supplier for a first person animation name. If it is null, it will not play any animation in first person
* @param thirdPersonAnimation The animation to play in third person. If this is null, it will not play any animation in third person
* @param getThirdPersonAnimation The supplier for a third person animation name. If it is null, it will not play any animation in the third person
* @param audioPath The path to an audio file to play on starting the animation. If null, no audio will be played
* @param onComplete !!Must transition to the next state!! Fires when the animation completes. If not supplied, animations and autio will loop
*/ */
public StateTransitionUtilItem( public static StateTransitionUtilItem create(
Object stateEnum, Object stateEnum,
int animPriority,
String firstPersonAnimation,
Supplier<String> getFirstPersonAnimation, Supplier<String> getFirstPersonAnimation,
Supplier<String> getThirdPersonAnimation,
Runnable onComplete
){
this.stateEnum = stateEnum;
this.getFirstPersonAnimation = getFirstPersonAnimation;
this.getThirdPersonAnimation = getThirdPersonAnimation;
this.onComplete = onComplete;
}
/**
* Constructor
* @param stateEnum The enum value for this state
* @param thirdPersonAnimation The animation to play in third person. If this is null, it will not play any animation in third person.
* @param onComplete The function to fire on completion (ie to transition to the next state). If this is null, the animation and audio will be looped on completion.
*/
public StateTransitionUtilItem(
Object stateEnum,
Supplier<String> getThirdPersonAnimation,
Runnable onComplete
){
this.stateEnum = stateEnum;
this.getThirdPersonAnimation = getThirdPersonAnimation;
this.onComplete = onComplete;
}
/**
* Constructor
* @param stateEnum The enum value for this state
* @param firstPersonAnimation The animation to play in first person. If this is null, it will not play any animation in first person.
* @param thirdPersonAnimation The animation to play in third person. If this is null, it will not play any animation in third person.
*/
public StateTransitionUtilItem(
Object stateEnum,
Supplier<String> getFirstPersonAnimation,
Supplier<String> getThirdPersonAnimation
){
this.stateEnum = stateEnum;
this.getFirstPersonAnimation = getFirstPersonAnimation;
this.getThirdPersonAnimation = getThirdPersonAnimation;
}
/**
* Constructor
* @param stateEnum The enum value for this state
* @param thirdPersonAnimation The animation to play in third person. If this is null, it will not play any animation in third person.
*/
public StateTransitionUtilItem(
Object stateEnum,
Supplier<String> getThirdPersonAnimation
){
this.stateEnum = stateEnum;
this.getThirdPersonAnimation = getThirdPersonAnimation;
}
/**
* Constructor
* @param stateEnum The enum value for this state
* @param thirdPersonAnimation The animation to play in third person. If this is null, it will not play any animation in third person.
* @param onComplete The function to fire on completion (ie to transition to the next state). If this is null, the animation and audio will be looped on completion.
*/
public StateTransitionUtilItem(
Object stateEnum,
String thirdPersonAnimation, String thirdPersonAnimation,
Supplier<String> getThirdPersonAnimation,
String audioPath,
Runnable onComplete Runnable onComplete
){ ){
this.stateEnum = stateEnum; return new StateTransitionUtilItem(
this.thirdPersonAnimation = thirdPersonAnimation; stateEnum,
this.onComplete = onComplete; animPriority,
firstPersonAnimation,
getFirstPersonAnimation,
thirdPersonAnimation,
getThirdPersonAnimation,
audioPath,
onComplete
);
} }
/**
* Constructor
* @param stateEnum The enum value for this state
* @param animPriority The priority of this state's animations
* @param firstPersonAnimation The animation to play in first person. If this is null, it will not play any animation in first person
* @param thirdPersonAnimation The animation to play in third person. If this is null, it will not play any animation in third person
* @param audioPath The path to an audio file to play on starting the animation. If null, no audio will be played
* @param onComplete !!Must transition to the next state!! Fires when the animation completes. If not supplied, animations and autio will loop
*/
public static StateTransitionUtilItem create(
Object stateEnum,
int animPriority,
String firstPersonAnimation,
String thirdPersonAnimation,
String audioPath,
Runnable onComplete
){
return create(
stateEnum,
animPriority,
firstPersonAnimation,
null,
thirdPersonAnimation,
null,
audioPath,
onComplete
);
}
/**
* Constructor
* @param stateEnum The enum value for this state
* @param animPriority The priority of this state's animations
* @param getFirstPersonAnimation The supplier for a first person animation name. If it is null, it will not play any animation in first person
* @param getThirdPersonAnimation The supplier for a third person animation name. If it is null, it will not play any animation in the third person
* @param audioPath The path to an audio file to play on starting the animation. If null, no audio will be played
* @param onComplete !!Must transition to the next state!! Fires when the animation completes. If not supplied, animations and autio will loop
*/
public static StateTransitionUtilItem create(
Object stateEnum,
int animPriority,
Supplier<String> getFirstPersonAnimation,
Supplier<String> getThirdPersonAnimation,
String audioPath,
Runnable onComplete
){
return new StateTransitionUtilItem(
stateEnum,
animPriority,
null,
getFirstPersonAnimation,
null,
getThirdPersonAnimation,
audioPath,
onComplete
);
}
/**
* Constructor
* @param stateEnum The enum value for this state
* @param animPriority The priority of this state's animations
* @param getFirstPersonAnimation The supplier for a first person animation name. If it is null, it will not play any animation in first person
* @param getThirdPersonAnimation The supplier for a third person animation name. If it is null, it will not play any animation in the third person
* @param onComplete !!Must transition to the next state!! Fires when the animation completes. If not supplied, animations and autio will loop
*/
public static StateTransitionUtilItem create(
Object stateEnum,
int animPriority,
Supplier<String> getFirstPersonAnimation,
Supplier<String> getThirdPersonAnimation,
Runnable onComplete
){
return new StateTransitionUtilItem(
stateEnum,
animPriority,
null,
getFirstPersonAnimation,
null,
getThirdPersonAnimation,
null,
onComplete
);
}
/**
* Constructor
* @param stateEnum The enum value for this state
* @param animPriority The priority of this state's animations
* @param getThirdPersonAnimation The supplier for a third person animation name. If it is null, it will not play any animation in the third person
* @param onComplete !!Must transition to the next state!! Fires when the animation completes. If not supplied, animations and autio will loop
*/
public static StateTransitionUtilItem create(
Object stateEnum,
int animPriority,
Supplier<String> getThirdPersonAnimation,
Runnable onComplete
){
return new StateTransitionUtilItem(
stateEnum,
animPriority,
null,
null,
null,
getThirdPersonAnimation,
null,
onComplete
);
}
/**
* Constructor
* @param stateEnum The enum value for this state
* @param animPriority The priority of this state's animations
* @param getThirdPersonAnimation The supplier for a third person animation name. If it is null, it will not play any animation in the third person
*/
public static StateTransitionUtilItem create(
Object stateEnum,
int animPriority,
Supplier<String> getThirdPersonAnimation
){
return new StateTransitionUtilItem(
stateEnum,
animPriority,
null,
null,
null,
getThirdPersonAnimation,
null,
null
);
}
/**
* Constructor
* @param stateEnum The enum value for this state
* @param animPriority The priority of this state's animations
* @param getFirstPersonAnimation The supplier for a first person animation name. If it is null, it will not play any animation in first person
* @param getThirdPersonAnimation The supplier for a third person animation name. If it is null, it will not play any animation in the third person
*/
public static StateTransitionUtilItem create(
Object stateEnum,
int animPriority,
Supplier<String> getFirstPersonAnimation,
Supplier<String> getThirdPersonAnimation
){
return new StateTransitionUtilItem(
stateEnum,
animPriority,
null,
getFirstPersonAnimation,
null,
getThirdPersonAnimation,
null,
null
);
}
} }
} }

View File

@ -0,0 +1,34 @@
package electrosphere.entity.state;
/**
* The list of animation priorities
*/
public class AnimationPriorities {
//
//2
//
public static final int ATTACK = 2;
public static final int BLOCK = 2;
//
//4
//
public static final int FALL = 4;
public static final int JUMP = 4;
public static final int LAND = 4;
//
//5
//
public static final int GROUND_MOVE = 5;
//
//10
//
public static final int IDLE = 10;
}

View File

@ -8,6 +8,7 @@ import electrosphere.entity.Entity;
import electrosphere.entity.EntityDataStrings; 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.AnimationPriorities;
import electrosphere.entity.state.client.firstPerson.FirstPersonTree; import electrosphere.entity.state.client.firstPerson.FirstPersonTree;
import electrosphere.entity.state.collidable.Impulse; import electrosphere.entity.state.collidable.Impulse;
import electrosphere.entity.state.equip.ClientEquipState; import electrosphere.entity.state.equip.ClientEquipState;
@ -243,7 +244,7 @@ public class ClientAttackTree implements BehaviorTree {
entityActor.playAnimation(currentMove.getWindupAnimationName(),1); entityActor.playAnimation(currentMove.getWindupAnimationName(),1);
entityActor.incrementAnimationTime(0.0001); entityActor.incrementAnimationTime(0.0001);
} }
FirstPersonTree.conditionallyPlayAnimation(Globals.firstPersonEntity, currentMove.getAnimationFirstPersonWindup().getName()); FirstPersonTree.conditionallyPlayAnimation(Globals.firstPersonEntity, currentMove.getAnimationFirstPersonWindup().getName(), AnimationPriorities.ATTACK);
} }
} }
} break; } break;
@ -253,7 +254,7 @@ public class ClientAttackTree implements BehaviorTree {
entityActor.playAnimation(currentMove.getHoldAnimationName(),1); entityActor.playAnimation(currentMove.getHoldAnimationName(),1);
entityActor.incrementAnimationTime(0.0001); entityActor.incrementAnimationTime(0.0001);
} }
FirstPersonTree.conditionallyPlayAnimation(Globals.firstPersonEntity, currentMove.getAnimationFirstPersonHold().getName()); FirstPersonTree.conditionallyPlayAnimation(Globals.firstPersonEntity, currentMove.getAnimationFirstPersonHold().getName(), AnimationPriorities.ATTACK);
} }
} break; } break;
case ATTACK: { case ATTACK: {
@ -262,7 +263,7 @@ public class ClientAttackTree implements BehaviorTree {
entityActor.playAnimation(currentMove.getAttackAnimationName(),1); entityActor.playAnimation(currentMove.getAttackAnimationName(),1);
entityActor.incrementAnimationTime(0.0001); entityActor.incrementAnimationTime(0.0001);
} }
FirstPersonTree.conditionallyPlayAnimation(Globals.firstPersonEntity, currentMove.getAnimationFirstPersonAttack().getName()); FirstPersonTree.conditionallyPlayAnimation(Globals.firstPersonEntity, currentMove.getAnimationFirstPersonAttack().getName(), AnimationPriorities.ATTACK);
} }
//activate hitboxes //activate hitboxes
List<Entity> attachedEntities = AttachUtils.getChildrenList(parent); List<Entity> attachedEntities = AttachUtils.getChildrenList(parent);

View File

@ -17,7 +17,6 @@ import electrosphere.entity.EntityUtils;
import electrosphere.entity.btree.BehaviorTree; import electrosphere.entity.btree.BehaviorTree;
import electrosphere.entity.state.attack.ClientAttackTree.AttackTreeDriftState; import electrosphere.entity.state.attack.ClientAttackTree.AttackTreeDriftState;
import electrosphere.entity.state.attack.ClientAttackTree.AttackTreeState; import electrosphere.entity.state.attack.ClientAttackTree.AttackTreeState;
import electrosphere.entity.state.client.firstPerson.FirstPersonTree;
import electrosphere.entity.state.collidable.Impulse; import electrosphere.entity.state.collidable.Impulse;
import electrosphere.entity.state.equip.ServerEquipState; import electrosphere.entity.state.equip.ServerEquipState;
import electrosphere.entity.state.hitbox.HitboxCollectionState; import electrosphere.entity.state.hitbox.HitboxCollectionState;
@ -264,7 +263,6 @@ public class ServerAttackTree implements BehaviorTree {
entityPoseActor.playAnimation(currentMove.getAttackAnimationName(),1); entityPoseActor.playAnimation(currentMove.getAttackAnimationName(),1);
entityPoseActor.incrementAnimationTime(0.0001); entityPoseActor.incrementAnimationTime(0.0001);
} }
FirstPersonTree.conditionallyPlayAnimation(Globals.firstPersonEntity, currentMove.getAnimationFirstPersonAttack().getName());
} }
//activate hitboxes //activate hitboxes
List<Entity> attachedEntities = AttachUtils.getChildrenList(parent); List<Entity> attachedEntities = AttachUtils.getChildrenList(parent);

View File

@ -7,6 +7,7 @@ import electrosphere.entity.EntityDataStrings;
import electrosphere.entity.btree.BehaviorTree; import electrosphere.entity.btree.BehaviorTree;
import electrosphere.entity.btree.StateTransitionUtil; import electrosphere.entity.btree.StateTransitionUtil;
import electrosphere.entity.btree.StateTransitionUtil.StateTransitionUtilItem; import electrosphere.entity.btree.StateTransitionUtil.StateTransitionUtilItem;
import electrosphere.entity.state.AnimationPriorities;
import electrosphere.game.data.creature.type.block.BlockSystem; import electrosphere.game.data.creature.type.block.BlockSystem;
import electrosphere.net.synchronization.BehaviorTreeIdEnums; import electrosphere.net.synchronization.BehaviorTreeIdEnums;
@ -53,18 +54,21 @@ public class ClientBlockTree implements BehaviorTree {
this.parent = parent; this.parent = parent;
this.blockSystem = blockSystem; this.blockSystem = blockSystem;
this.stateTransitionUtil = StateTransitionUtil.create(parent, false, new StateTransitionUtilItem[]{ this.stateTransitionUtil = StateTransitionUtil.create(parent, false, new StateTransitionUtilItem[]{
new StateTransitionUtilItem( StateTransitionUtilItem.create(
BlockState.WIND_UP, BlockState.WIND_UP,
AnimationPriorities.BLOCK,
() -> {return this.blockSystem.getBlockVariant(this.currentBlockVariant).getWindUpFirstPersonAnimation();}, () -> {return this.blockSystem.getBlockVariant(this.currentBlockVariant).getWindUpFirstPersonAnimation();},
() -> {return this.blockSystem.getBlockVariant(this.currentBlockVariant).getWindUpAnimation();} () -> {return this.blockSystem.getBlockVariant(this.currentBlockVariant).getWindUpAnimation();}
), ),
new StateTransitionUtilItem( StateTransitionUtilItem.create(
BlockState.BLOCKING, BlockState.BLOCKING,
AnimationPriorities.BLOCK,
() -> {return this.blockSystem.getBlockVariant(this.currentBlockVariant).getMainFirstPersonAnimation();}, () -> {return this.blockSystem.getBlockVariant(this.currentBlockVariant).getMainFirstPersonAnimation();},
() -> {return this.blockSystem.getBlockVariant(this.currentBlockVariant).getMainAnimation();} () -> {return this.blockSystem.getBlockVariant(this.currentBlockVariant).getMainAnimation();}
), ),
new StateTransitionUtilItem( StateTransitionUtilItem.create(
BlockState.COOLDOWN, BlockState.COOLDOWN,
AnimationPriorities.BLOCK,
() -> {return this.blockSystem.getBlockVariant(this.currentBlockVariant).getCooldownFirstPersonAnimation();}, () -> {return this.blockSystem.getBlockVariant(this.currentBlockVariant).getCooldownFirstPersonAnimation();},
() -> {return this.blockSystem.getBlockVariant(this.currentBlockVariant).getCooldownAnimation();} () -> {return this.blockSystem.getBlockVariant(this.currentBlockVariant).getCooldownAnimation();}
), ),

View File

@ -14,7 +14,7 @@ import electrosphere.server.datacell.utils.ServerBehaviorTreeUtils;
import electrosphere.net.parser.net.message.SynchronizationMessage; import electrosphere.net.parser.net.message.SynchronizationMessage;
import electrosphere.server.datacell.utils.DataCellSearchUtils; import electrosphere.server.datacell.utils.DataCellSearchUtils;
import electrosphere.entity.state.AnimationPriorities;
import electrosphere.entity.state.block.ClientBlockTree.BlockState; import electrosphere.entity.state.block.ClientBlockTree.BlockState;
import electrosphere.game.data.creature.type.block.BlockSystem; import electrosphere.game.data.creature.type.block.BlockSystem;
import electrosphere.net.synchronization.annotation.SyncedField; import electrosphere.net.synchronization.annotation.SyncedField;
@ -48,17 +48,20 @@ public class ServerBlockTree implements BehaviorTree {
this.parent = parent; this.parent = parent;
this.blockSystem = blockSystem; this.blockSystem = blockSystem;
this.stateTransitionUtil = StateTransitionUtil.create(parent, true, new StateTransitionUtilItem[]{ this.stateTransitionUtil = StateTransitionUtil.create(parent, true, new StateTransitionUtilItem[]{
new StateTransitionUtilItem( StateTransitionUtilItem.create(
BlockState.WIND_UP, BlockState.WIND_UP,
AnimationPriorities.BLOCK,
() -> {return this.blockSystem.getBlockVariant(this.currentBlockVariant).getWindUpAnimation();}, () -> {return this.blockSystem.getBlockVariant(this.currentBlockVariant).getWindUpAnimation();},
() -> {this.setState(BlockState.BLOCKING);} () -> {this.setState(BlockState.BLOCKING);}
), ),
new StateTransitionUtilItem( StateTransitionUtilItem.create(
BlockState.BLOCKING, BlockState.BLOCKING,
AnimationPriorities.BLOCK,
() -> {return this.blockSystem.getBlockVariant(this.currentBlockVariant).getMainAnimation();} () -> {return this.blockSystem.getBlockVariant(this.currentBlockVariant).getMainAnimation();}
), ),
new StateTransitionUtilItem( StateTransitionUtilItem.create(
BlockState.COOLDOWN, BlockState.COOLDOWN,
AnimationPriorities.BLOCK,
() -> {return this.blockSystem.getBlockVariant(this.currentBlockVariant).getCooldownAnimation();}, () -> {return this.blockSystem.getBlockVariant(this.currentBlockVariant).getCooldownAnimation();},
() -> {this.setState(BlockState.NOT_BLOCKING);} () -> {this.setState(BlockState.NOT_BLOCKING);}
), ),

View File

@ -22,22 +22,8 @@ public class FirstPersonTree implements BehaviorTree {
//the amount to pull behind the camera //the amount to pull behind the camera
double cameraViewDirOffsetZ; double cameraViewDirOffsetZ;
//the animation to play currently
String currentAnimation = "Idle";
@Override @Override
public void simulate(float deltaTime) { public void simulate(float deltaTime) {
if(Globals.firstPersonEntity != null){
Actor actor = EntityUtils.getActor(Globals.firstPersonEntity);
if(
(!actor.isPlayingAnimation() || !actor.isPlayingAnimation(currentAnimation)) &&
(Globals.assetManager.fetchModel(actor.getModelPath()) != null && Globals.assetManager.fetchModel(actor.getModelPath()).getAnimation(currentAnimation) != null)
){
actor.playAnimation(currentAnimation,3);
actor.incrementAnimationTime(0.0001);
}
}
} }
/** /**
@ -105,16 +91,17 @@ public class FirstPersonTree implements BehaviorTree {
* Plays an animation if it exists * Plays an animation if it exists
* @param animationName the name of the animation * @param animationName the name of the animation
*/ */
public void playAnimation(String animationName){ public void playAnimation(String animationName, int priority){
this.currentAnimation = animationName; if(Globals.firstPersonEntity != null){
} Actor actor = EntityUtils.getActor(Globals.firstPersonEntity);
if(
/** (!actor.isPlayingAnimation() || !actor.isPlayingAnimation(animationName)) &&
* Gets the animation currently playing (Globals.assetManager.fetchModel(actor.getModelPath()) != null && Globals.assetManager.fetchModel(actor.getModelPath()).getAnimation(animationName) != null)
* @return The name of the animation ){
*/ actor.playAnimation(animationName,priority);
public String getCurrentAnimation(){ actor.incrementAnimationTime(0.0001);
return currentAnimation; }
}
} }
/** /**
@ -122,9 +109,9 @@ public class FirstPersonTree implements BehaviorTree {
* @param entity The entity * @param entity The entity
* @param animationName the name of the animation * @param animationName the name of the animation
*/ */
public static void conditionallyPlayAnimation(Entity entity, String animationName){ public static void conditionallyPlayAnimation(Entity entity, String animationName, int priority){
if(entity != null && hasTree(entity)){ if(entity != null && FirstPersonTree.hasTree(entity)){
getTree(entity).playAnimation(animationName); FirstPersonTree.getTree(entity).playAnimation(animationName, priority);
} }
} }

View File

@ -2,6 +2,7 @@ package electrosphere.entity.state.idle;
import electrosphere.net.synchronization.BehaviorTreeIdEnums; import electrosphere.net.synchronization.BehaviorTreeIdEnums;
import electrosphere.entity.state.AnimationPriorities;
import electrosphere.entity.state.attack.ClientAttackTree; import electrosphere.entity.state.attack.ClientAttackTree;
import electrosphere.entity.state.client.firstPerson.FirstPersonTree; import electrosphere.entity.state.client.firstPerson.FirstPersonTree;
import electrosphere.entity.state.movement.AirplaneMovementTree; import electrosphere.entity.state.movement.AirplaneMovementTree;
@ -99,8 +100,8 @@ public class ClientIdleTree implements BehaviorTree {
){ ){
entityActor.playAnimation(idleData.getIdleAnimation(),3); entityActor.playAnimation(idleData.getIdleAnimation(),3);
entityActor.incrementAnimationTime(0.0001); entityActor.incrementAnimationTime(0.0001);
FirstPersonTree.conditionallyPlayAnimation(Globals.firstPersonEntity, idleData.getFirstPersonIdleAnimation());
} }
FirstPersonTree.conditionallyPlayAnimation(Globals.firstPersonEntity, idleData.getFirstPersonIdleAnimation(), AnimationPriorities.IDLE);
} }
break; break;
case NOT_IDLE: case NOT_IDLE:

View File

@ -5,6 +5,7 @@ import electrosphere.entity.Entity;
import electrosphere.entity.EntityDataStrings; 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.AnimationPriorities;
import electrosphere.entity.state.client.firstPerson.FirstPersonTree; import electrosphere.entity.state.client.firstPerson.FirstPersonTree;
import electrosphere.game.data.creature.type.movement.FallMovementSystem; import electrosphere.game.data.creature.type.movement.FallMovementSystem;
import electrosphere.renderer.actor.Actor; import electrosphere.renderer.actor.Actor;
@ -51,8 +52,8 @@ public class FallTree implements BehaviorTree {
){ ){
entityActor.playAnimation(fallMovementSystem.getAnimationFall().getName(),1); entityActor.playAnimation(fallMovementSystem.getAnimationFall().getName(),1);
entityActor.incrementAnimationTime(0.0001); entityActor.incrementAnimationTime(0.0001);
FirstPersonTree.conditionallyPlayAnimation(Globals.firstPersonEntity, fallMovementSystem.getAnimationFirstPersonFall().getName());
} }
FirstPersonTree.conditionallyPlayAnimation(Globals.firstPersonEntity, fallMovementSystem.getAnimationFirstPersonFall().getName(), AnimationPriorities.FALL);
} }
break; break;
case INACTIVE: case INACTIVE:
@ -88,8 +89,8 @@ public class FallTree implements BehaviorTree {
){ ){
entityActor.playAnimation(fallMovementSystem.getAnimationLand().getName(),1); entityActor.playAnimation(fallMovementSystem.getAnimationLand().getName(),1);
entityActor.incrementAnimationTime(0.0001); entityActor.incrementAnimationTime(0.0001);
FirstPersonTree.conditionallyPlayAnimation(Globals.firstPersonEntity, fallMovementSystem.getAnimationFirstPersonLand().getName());
} }
FirstPersonTree.conditionallyPlayAnimation(Globals.firstPersonEntity, fallMovementSystem.getAnimationFirstPersonLand().getName(), AnimationPriorities.LAND);
} }
} }
} }

View File

@ -9,6 +9,7 @@ import electrosphere.entity.Entity;
import electrosphere.entity.EntityDataStrings; 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.AnimationPriorities;
import electrosphere.entity.state.client.firstPerson.FirstPersonTree; import electrosphere.entity.state.client.firstPerson.FirstPersonTree;
import electrosphere.entity.state.gravity.GravityUtils; import electrosphere.entity.state.gravity.GravityUtils;
import electrosphere.game.data.creature.type.movement.JumpMovementSystem; import electrosphere.game.data.creature.type.movement.JumpMovementSystem;
@ -62,8 +63,8 @@ public class JumpTree implements BehaviorTree {
if(!entityActor.isPlayingAnimation() || !entityActor.isPlayingAnimation(jumpData.getAnimationJump().getName())){ if(!entityActor.isPlayingAnimation() || !entityActor.isPlayingAnimation(jumpData.getAnimationJump().getName())){
entityActor.playAnimation(jumpData.getAnimationJump().getName(),1); entityActor.playAnimation(jumpData.getAnimationJump().getName(),1);
entityActor.incrementAnimationTime(0.0001); entityActor.incrementAnimationTime(0.0001);
FirstPersonTree.conditionallyPlayAnimation(Globals.firstPersonEntity, jumpData.getAnimationFirstPersonJump().getName());
} }
FirstPersonTree.conditionallyPlayAnimation(Globals.firstPersonEntity, jumpData.getAnimationFirstPersonJump().getName(), AnimationPriorities.JUMP);
} }
currentFrame++; currentFrame++;
currentJumpForce = currentJumpForce * jumpFalloff; currentJumpForce = currentJumpForce * jumpFalloff;

View File

@ -14,6 +14,7 @@ import electrosphere.entity.Entity;
import electrosphere.entity.EntityDataStrings; 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.AnimationPriorities;
import electrosphere.entity.state.attack.ClientAttackTree; import electrosphere.entity.state.attack.ClientAttackTree;
import electrosphere.entity.state.attack.ClientAttackTree.AttackTreeState; import electrosphere.entity.state.attack.ClientAttackTree.AttackTreeState;
import electrosphere.entity.state.client.firstPerson.FirstPersonTree; import electrosphere.entity.state.client.firstPerson.FirstPersonTree;
@ -292,8 +293,8 @@ public class ClientGroundMovementTree implements BehaviorTree {
){ ){
entityActor.playAnimation(animationToPlay,1); entityActor.playAnimation(animationToPlay,1);
entityActor.incrementAnimationTime(0.0001); entityActor.incrementAnimationTime(0.0001);
FirstPersonTree.conditionallyPlayAnimation(Globals.firstPersonEntity, groundMovementData.getAnimationFirstPersonStartup().getName());
} }
FirstPersonTree.conditionallyPlayAnimation(Globals.firstPersonEntity, groundMovementData.getAnimationFirstPersonStartup().getName(), AnimationPriorities.GROUND_MOVE);
} }
//run startup code //run startup code
velocity = velocity + acceleration * (float)Globals.timekeeper.getSimFrameTime(); velocity = velocity + acceleration * (float)Globals.timekeeper.getSimFrameTime();
@ -326,8 +327,8 @@ public class ClientGroundMovementTree implements BehaviorTree {
){ ){
entityActor.playAnimation(animationToPlay,1); entityActor.playAnimation(animationToPlay,1);
entityActor.incrementAnimationTime(0.0001); entityActor.incrementAnimationTime(0.0001);
FirstPersonTree.conditionallyPlayAnimation(Globals.firstPersonEntity, groundMovementData.getAnimationFirstPersonLoop().getName());
} }
FirstPersonTree.conditionallyPlayAnimation(Globals.firstPersonEntity, groundMovementData.getAnimationFirstPersonLoop().getName(), AnimationPriorities.GROUND_MOVE);
} }
if(velocity != maxNaturalVelocity){ if(velocity != maxNaturalVelocity){
velocity = maxNaturalVelocity; velocity = maxNaturalVelocity;
@ -354,8 +355,8 @@ public class ClientGroundMovementTree implements BehaviorTree {
){ ){
entityActor.playAnimation(animationToPlay,1); entityActor.playAnimation(animationToPlay,1);
entityActor.incrementAnimationTime(0.0001); entityActor.incrementAnimationTime(0.0001);
FirstPersonTree.conditionallyPlayAnimation(Globals.firstPersonEntity, groundMovementData.getAnimationFirstPersonWindDown().getName());
} }
FirstPersonTree.conditionallyPlayAnimation(Globals.firstPersonEntity, groundMovementData.getAnimationFirstPersonWindDown().getName(), AnimationPriorities.GROUND_MOVE);
} }
//velocity stuff //velocity stuff
velocity = velocity - acceleration * (float)Globals.timekeeper.getSimFrameTime(); velocity = velocity - acceleration * (float)Globals.timekeeper.getSimFrameTime();

View File

@ -2,12 +2,14 @@ package electrosphere.menu.debug;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.PriorityQueue;
import org.joml.Quaterniond; import org.joml.Quaterniond;
import electrosphere.engine.Globals; import electrosphere.engine.Globals;
import electrosphere.entity.Entity; import electrosphere.entity.Entity;
import electrosphere.entity.EntityUtils; import electrosphere.entity.EntityUtils;
import electrosphere.entity.state.client.firstPerson.FirstPersonTree;
import electrosphere.entity.state.equip.ClientEquipState; import electrosphere.entity.state.equip.ClientEquipState;
import electrosphere.entity.types.attach.AttachUtils; import electrosphere.entity.types.attach.AttachUtils;
import electrosphere.entity.types.creature.CreatureUtils; import electrosphere.entity.types.creature.CreatureUtils;
@ -16,6 +18,7 @@ import electrosphere.entity.types.item.ItemUtils;
import electrosphere.game.data.creature.type.equip.EquipPoint; import electrosphere.game.data.creature.type.equip.EquipPoint;
import electrosphere.logger.LoggerInterface; import electrosphere.logger.LoggerInterface;
import electrosphere.renderer.actor.Actor; import electrosphere.renderer.actor.Actor;
import electrosphere.renderer.actor.ActorAnimationMask;
import electrosphere.renderer.actor.ActorMeshMask; import electrosphere.renderer.actor.ActorMeshMask;
import electrosphere.renderer.anim.AnimChannel; import electrosphere.renderer.anim.AnimChannel;
import electrosphere.renderer.anim.Animation; import electrosphere.renderer.anim.Animation;
@ -31,33 +34,34 @@ import imgui.ImGui;
*/ */
public class ImGuiEntityMacros { public class ImGuiEntityMacros {
//window for viewing main player entity's stats on both client and server //window for selecting entities to view
protected static ImGuiWindow clientEntityWindow; protected static ImGuiWindow clientEntityListWindow;
private static boolean filterToCreatures = false; //filters the entity list to just creatures private static boolean filterToCreatures = true; //filters the entity list to just creatures
//views stats about an actor //window for viewing details about an entity
protected static ImGuiWindow actorView; protected static ImGuiWindow clientEntityDetailWindow;
static Entity actorViewEntity; //the entity whose actor we're viewing in the actor window private static Entity detailViewEntity = null;
//views stats about equip state //tree node values
protected static ImGuiWindow equipStateView; private static boolean showActorTab = false; //show the actor tab
static Entity equipViewEntity; //the entity whose equip state we're viewing in the equip window private static boolean showEquipStateTab = false; //actor details
private static boolean showFirstPersonTab = false; //first person tab
private static boolean showLinkedEntitiesTab = false;//show linked entities
/** /**
* Creates the windows in this file * Creates the windows in this file
*/ */
protected static void createClientEntityWindows(){ protected static void createClientEntityWindows(){
createClientEntityDebugWindow(); createClientEntityDetailWindow();
createActorViewDebugWindow(); createClientEntitySelectionWindow();
createEquipStateDebugWindow();
} }
/** /**
* Client scene entity view * Client scene entity view
*/ */
protected static void createClientEntityDebugWindow(){ protected static void createClientEntitySelectionWindow(){
clientEntityWindow = new ImGuiWindow("Client Entities"); clientEntityListWindow = new ImGuiWindow("Client Entities");
clientEntityWindow.setCallback(new ImGuiWindowCallback() { clientEntityListWindow.setCallback(new ImGuiWindowCallback() {
@Override @Override
public void exec() { public void exec() {
//audio engine details //audio engine details
@ -73,53 +77,111 @@ public class ImGuiEntityMacros {
ImGui.beginGroup(); ImGui.beginGroup();
ImGui.pushID(entity.getId()); ImGui.pushID(entity.getId());
ImGui.text("Id: " + entity.getId() + " (" + getEntityName(entity) + ")"); ImGui.text("Id: " + entity.getId() + " (" + getEntityName(entity) + ")");
if(CreatureUtils.isCreature(entity)){ if(ImGui.button("Details")){
if(EntityUtils.getActor(entity) != null){ showEntity(entity);
if(ImGui.button("Actor View")){
actorViewEntity = entity;
actorView.setOpen(true);
}
}
if(ClientEquipState.getClientEquipState(entity) != null){
if(ImGui.button("Client Equip State View")){
equipViewEntity = entity;
equipStateView.setOpen(true);
}
}
} }
ImGui.popID(); ImGui.popID();
ImGui.endGroup(); ImGui.endGroup();
} }
} }
}); });
clientEntityWindow.setOpen(false); clientEntityListWindow.setOpen(false);
Globals.renderingEngine.getImGuiPipeline().addImGuiWindow(clientEntityWindow); Globals.renderingEngine.getImGuiPipeline().addImGuiWindow(clientEntityListWindow);
}
/**
* View details about a client entity
*/
protected static void createClientEntityDetailWindow(){
clientEntityDetailWindow = new ImGuiWindow("Entity Data");
clientEntityDetailWindow.setCallback(new ImGuiWindowCallback() {
@Override
public void exec() {
ImGui.sameLine();
if(ImGui.treeNode("Views")){
if(EntityUtils.getActor(detailViewEntity) != null && ImGui.checkbox("Actor Details", showActorTab)){
showActorTab = !showActorTab;
}
if(ClientEquipState.hasEquipState(detailViewEntity) && ImGui.checkbox("Equip State", showEquipStateTab)){
showEquipStateTab = !showEquipStateTab;
}
if(FirstPersonTree.hasTree(detailViewEntity) && ImGui.checkbox("First Person", showFirstPersonTab)){
showFirstPersonTab = !showFirstPersonTab;
}
if(
(AttachUtils.hasChildren(detailViewEntity) || AttachUtils.getParent(detailViewEntity) != null || detailViewEntity == Globals.firstPersonEntity || detailViewEntity == Globals.playerEntity) &&
ImGui.checkbox("Linked entities`", showLinkedEntitiesTab)
){
showLinkedEntitiesTab = !showLinkedEntitiesTab;
}
ImGui.treePop();
}
ImGui.nextColumn();
drawActorView();
drawEquipState();
drawFirstPersonView();
drawLinkedEntities();
}
});
clientEntityDetailWindow.setOpen(false);
Globals.renderingEngine.getImGuiPipeline().addImGuiWindow(clientEntityDetailWindow);
}
/**
* Shows the entity window for a specific entity
* @param entity The entity
*/
protected static void showEntity(Entity entity){
detailViewEntity = entity;
clientEntityDetailWindow.setOpen(true);
} }
/** /**
* Client scene entity view * Client scene entity view
*/ */
protected static void createActorViewDebugWindow(){ protected static void drawActorView(){
actorView = new ImGuiWindow("Actor View"); if(showActorTab && ImGui.collapsingHeader("Actor Details")){
actorView.setCallback(new ImGuiWindowCallback() { if(detailViewEntity != null && EntityUtils.getActor(detailViewEntity) != null){
@Override Actor actor = EntityUtils.getActor(detailViewEntity);
public void exec() {
if(actorViewEntity != null && EntityUtils.getActor(actorViewEntity) != null){ //mesh mask
Actor actor = EntityUtils.getActor(actorViewEntity); if(ImGui.collapsingHeader("Mesh Mask")){
ActorMeshMask meshMask = actor.getMeshMask();
ImGui.text("To Draw Meshes:");
for(Mesh mesh : meshMask.getToDrawMeshes()){
ImGui.text(mesh.getMeshName());
}
ImGui.text("Blocked Meshes:");
for(String blocked : meshMask.getBlockedMeshes()){
ImGui.text(blocked);
}
}
//mesh mask //animation queue
if(ImGui.collapsingHeader("Mesh Mask")){ if(ImGui.collapsingHeader("Animation Queue")){
ActorMeshMask meshMask = actor.getMeshMask(); PriorityQueue<ActorAnimationMask> animationQueue = actor.getAnimationQueue();
ImGui.text("To Draw Meshes:"); for(ActorAnimationMask mask : animationQueue){
for(Mesh mesh : meshMask.getToDrawMeshes()){ ImGui.text(mask.getPriority() + " " + mask.getAnimationName());
ImGui.text(mesh.getMeshName()); }
} }
ImGui.text("Blocked Meshes:");
for(String blocked : meshMask.getBlockedMeshes()){ //Browsable list of all animations with their data
ImGui.text(blocked); if(ImGui.collapsingHeader("Animation Channel Data")){
Model model = Globals.assetManager.fetchModel(actor.getModelPath());
for(Animation animation : model.getAnimations()){
ImGui.text(" - " + animation.name);
for(AnimChannel channel : animation.channels){
ImGui.text("=" + channel.getNodeID() + "=");
ImGui.text("" + channel.getCurrentPosition());
ImGui.text("" + channel.getCurrentRotation());
ImGui.text("" + channel.getCurrentScale());
} }
} }
}
//print data macros
if(ImGui.collapsingHeader("Print Data")){
//print bone values //print bone values
if(ImGui.button("Print current bone values")){ if(ImGui.button("Print current bone values")){
for(Bone bone : actor.getBoneValues()){ for(Bone bone : actor.getBoneValues()){
@ -127,97 +189,115 @@ public class ImGuiEntityMacros {
LoggerInterface.loggerRenderer.DEBUG("" + bone.getFinalTransform()); LoggerInterface.loggerRenderer.DEBUG("" + bone.getFinalTransform());
} }
} }
//print animation keys //print animation keys
if(ImGui.button("Print animation keys")){ if(ImGui.button("Print animation keys")){
Model model = Globals.assetManager.fetchModel(actor.getModelPath()); Model model = Globals.assetManager.fetchModel(actor.getModelPath());
model.describeAllAnimations(); model.describeAllAnimations();
} }
//Browsable list of all animations with their data
if(ImGui.collapsingHeader("Animation Channel Data")){
Model model = Globals.assetManager.fetchModel(actor.getModelPath());
for(Animation animation : model.getAnimations()){
ImGui.text(" - " + animation.name);
for(AnimChannel channel : animation.channels){
ImGui.text("=" + channel.getNodeID() + "=");
ImGui.text("" + channel.getCurrentPosition());
ImGui.text("" + channel.getCurrentRotation());
ImGui.text("" + channel.getCurrentScale());
}
}
}
} }
} }
}); }
actorView.setOpen(false);
Globals.renderingEngine.getImGuiPipeline().addImGuiWindow(actorView);
} }
/**
* First person data
*/
protected static void drawFirstPersonView(){
if(showFirstPersonTab && ImGui.collapsingHeader("First Person Tree")){
FirstPersonTree firstPersonTree = FirstPersonTree.getTree(detailViewEntity);
}
}
//stores the edited rotation values
private static float[] rotationValuesFirstPerson = new float[]{
0,0,0
};
private static float[] rotationValuesThirdPerson = new float[]{
0,0,0
};
/** /**
* Client scene equip state view * Client scene equip state view
*/ */
protected static void createEquipStateDebugWindow(){ protected static void drawEquipState(){
equipStateView = new ImGuiWindow("Client Equip State View"); if(showEquipStateTab && ImGui.collapsingHeader("Equip State Details")){
equipStateView.setCallback(new ImGuiWindowCallback() { if(detailViewEntity != null && ClientEquipState.getClientEquipState(detailViewEntity) != null){
ClientEquipState clientEquipState = ClientEquipState.getClientEquipState(detailViewEntity);
//stores the edited rotation values if(ImGui.collapsingHeader("All Equip Points")){
float[] rotationValuesFirstPerson = new float[]{ for(EquipPoint point : clientEquipState.getAllEquipPoints()){
0,0,0 if(ImGui.collapsingHeader(point.getEquipPointId())){
}; ImGui.text("Has item equipped: " + (clientEquipState.getEquippedItemAtPoint(point.getEquipPointId()) != null));
float[] rotationValuesThirdPerson = new float[]{ ImGui.text("Bone (Third Person): " + point.getBone());
0,0,0 ImGui.text("Bone (First Person): " + point.getFirstPersonBone());
}; ImGui.text("[Third Person] Rotation: " + AttachUtils.getEquipPointRotationOffset(point.getOffsetRotationThirdPerson()));
if(ImGui.sliderFloat3("[Third Person] Rotation (In Euler along x,y,z)", rotationValuesThirdPerson, 0, (float)(Math.PI * 2))){
@Override Quaterniond rotation = new Quaterniond().rotateXYZ(rotationValuesThirdPerson[0], rotationValuesThirdPerson[1], rotationValuesThirdPerson[2]);
public void exec() { List<Float> newValues = new LinkedList<Float>();
if(equipViewEntity != null && ClientEquipState.getClientEquipState(equipViewEntity) != null){ newValues.add((float)rotation.x);
ClientEquipState clientEquipState = ClientEquipState.getClientEquipState(equipViewEntity); newValues.add((float)rotation.y);
newValues.add((float)rotation.z);
if(ImGui.collapsingHeader("All Equip Points")){ newValues.add((float)rotation.w);
for(EquipPoint point : clientEquipState.getAllEquipPoints()){ point.setOffsetRotationThirdPerson(newValues);
if(ImGui.collapsingHeader(point.getEquipPointId())){ Entity equippedEntity = clientEquipState.getEquippedItemAtPoint(point.getEquipPointId());
ImGui.text("Has item equipped: " + (clientEquipState.getEquippedItemAtPoint(point.getEquipPointId()) != null)); if(equippedEntity != null){
ImGui.text("Bone (Third Person): " + point.getBone()); AttachUtils.setRotationOffset(equippedEntity, AttachUtils.getEquipPointRotationOffset(point.getOffsetRotationThirdPerson()));
ImGui.text("Bone (First Person): " + point.getFirstPersonBone());
ImGui.text("[Third Person] Rotation: " + AttachUtils.getEquipPointRotationOffset(point.getOffsetRotationThirdPerson()));
if(ImGui.sliderFloat3("[Third Person] Rotation (In Euler along x,y,z)", rotationValuesThirdPerson, 0, (float)(Math.PI * 2))){
Quaterniond rotation = new Quaterniond().rotateXYZ(rotationValuesThirdPerson[0], rotationValuesThirdPerson[1], rotationValuesThirdPerson[2]);
List<Float> newValues = new LinkedList<Float>();
newValues.add((float)rotation.x);
newValues.add((float)rotation.y);
newValues.add((float)rotation.z);
newValues.add((float)rotation.w);
point.setOffsetRotationThirdPerson(newValues);
Entity equippedEntity = clientEquipState.getEquippedItemAtPoint(point.getEquipPointId());
if(equippedEntity != null){
AttachUtils.setRotationOffset(equippedEntity, AttachUtils.getEquipPointRotationOffset(point.getOffsetRotationThirdPerson()));
}
} }
ImGui.text("[First Person] Rotation: " + AttachUtils.getEquipPointRotationOffset(point.getOffsetRotationFirstPerson())); }
if(ImGui.sliderFloat3("[First Person] Rotation (In Euler along x,y,z)", rotationValuesFirstPerson, 0, (float)(Math.PI * 2))){ ImGui.text("[First Person] Rotation: " + AttachUtils.getEquipPointRotationOffset(point.getOffsetRotationFirstPerson()));
Quaterniond rotation = new Quaterniond().rotateXYZ(rotationValuesFirstPerson[0], rotationValuesFirstPerson[1], rotationValuesFirstPerson[2]); if(ImGui.sliderFloat3("[First Person] Rotation (In Euler along x,y,z)", rotationValuesFirstPerson, 0, (float)(Math.PI * 2))){
List<Float> newValues = new LinkedList<Float>(); Quaterniond rotation = new Quaterniond().rotateXYZ(rotationValuesFirstPerson[0], rotationValuesFirstPerson[1], rotationValuesFirstPerson[2]);
newValues.add((float)rotation.x); List<Float> newValues = new LinkedList<Float>();
newValues.add((float)rotation.y); newValues.add((float)rotation.x);
newValues.add((float)rotation.z); newValues.add((float)rotation.y);
newValues.add((float)rotation.w); newValues.add((float)rotation.z);
point.setOffsetRotationFirstPerson(newValues); newValues.add((float)rotation.w);
Entity equippedEntity = clientEquipState.getEquippedItemAtPoint(point.getEquipPointId()); point.setOffsetRotationFirstPerson(newValues);
if(equippedEntity != null){ Entity equippedEntity = clientEquipState.getEquippedItemAtPoint(point.getEquipPointId());
AttachUtils.setRotationOffset(equippedEntity, AttachUtils.getEquipPointRotationOffset(point.getOffsetRotationFirstPerson())); if(equippedEntity != null){
} AttachUtils.setRotationOffset(equippedEntity, AttachUtils.getEquipPointRotationOffset(point.getOffsetRotationFirstPerson()));
} }
} }
} }
} }
}
}
}
}
/**
* Client scene equip state view
*/
protected static void drawLinkedEntities(){
if(showLinkedEntitiesTab && ImGui.collapsingHeader("Linked entities")){
if(detailViewEntity == Globals.playerEntity && ImGui.button("View Model")){
showEntity(Globals.firstPersonEntity);
}
if(detailViewEntity == Globals.firstPersonEntity && ImGui.button("3rd Person Model")){
showEntity(Globals.playerEntity);
}
if(AttachUtils.getParent(detailViewEntity) != null && ImGui.button("Parent")){
showEntity(AttachUtils.getParent(detailViewEntity));
}
if(AttachUtils.hasChildren(detailViewEntity) && ImGui.collapsingHeader("Children")){
for(Entity child : AttachUtils.getChildrenList(detailViewEntity)){
if(ImGui.button("Child " + child.getId())){
showEntity(child);
}
} }
} }
}); if(ClientEquipState.hasEquipState(detailViewEntity) && ImGui.collapsingHeader("Equipped")){
equipStateView.setOpen(false); ClientEquipState clientEquipState = ClientEquipState.getClientEquipState(detailViewEntity);
Globals.renderingEngine.getImGuiPipeline().addImGuiWindow(equipStateView); for(String equippedPoint : clientEquipState.getEquippedPoints()){
Entity entity = clientEquipState.getEquippedItemAtPoint(equippedPoint);
if(ImGui.button("Slot: " + equippedPoint)){
showEntity(entity);
}
}
}
}
} }
/** /**

View File

@ -277,7 +277,7 @@ public class ImGuiWindowMacros {
} }
//client entity debug //client entity debug
if(ImGui.button("Client Entity Debug")){ if(ImGui.button("Client Entity Debug")){
ImGuiEntityMacros.clientEntityWindow.setOpen(true); ImGuiEntityMacros.clientEntityListWindow.setOpen(true);
} }
//controls state debug //controls state debug
if(ImGui.button("Control State Debug")){ if(ImGui.button("Control State Debug")){

View File

@ -169,6 +169,14 @@ public class Actor {
} }
} }
/**
* Gets the animation queue
* @return The animation queue
*/
public PriorityQueue<ActorAnimationMask> getAnimationQueue(){
return animationQueue;
}
void applyAnimationMasks(Model model){ void applyAnimationMasks(Model model){
// Model model = Globals.assetManager.fetchModel(modelPath); // Model model = Globals.assetManager.fetchModel(modelPath);
// if(model != null){ // if(model != null){