Renderer/src/main/java/electrosphere/menu/debug/ImGuiEntityMacros.java
austin 249db4fc89
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
Data View for entities in debug menu
2024-09-02 19:27:42 -04:00

626 lines
32 KiB
Java

package electrosphere.menu.debug;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.joml.Quaterniond;
import org.joml.Vector3d;
import org.ode4j.ode.DBody;
import electrosphere.collision.PhysicsEntityUtils;
import electrosphere.engine.Globals;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityUtils;
import electrosphere.entity.state.client.firstPerson.FirstPersonTree;
import electrosphere.entity.state.equip.ClientEquipState;
import electrosphere.entity.state.server.ServerPlayerViewDirTree;
import electrosphere.entity.types.attach.AttachUtils;
import electrosphere.entity.types.creature.CreatureUtils;
import electrosphere.entity.types.debug.DebugVisualizerUtils;
import electrosphere.entity.types.foliage.FoliageUtils;
import electrosphere.entity.types.item.ItemUtils;
import electrosphere.game.data.creature.type.equip.EquipPoint;
import electrosphere.logger.LoggerInterface;
import electrosphere.renderer.actor.Actor;
import electrosphere.renderer.actor.ActorAnimationMask;
import electrosphere.renderer.actor.ActorMeshMask;
import electrosphere.renderer.anim.AnimChannel;
import electrosphere.renderer.anim.Animation;
import electrosphere.renderer.model.Bone;
import electrosphere.renderer.model.Mesh;
import electrosphere.renderer.model.Model;
import electrosphere.renderer.ui.imgui.ImGuiWindow;
import electrosphere.renderer.ui.imgui.ImGuiWindow.ImGuiWindowCallback;
import electrosphere.server.datacell.utils.EntityLookupUtils;
import electrosphere.server.poseactor.PoseActor;
import electrosphere.server.poseactor.PoseModel;
import imgui.ImGui;
/**
* Macros for creating imgui windows relating to entity debugging
*/
public class ImGuiEntityMacros {
//window for selecting entities to view
protected static ImGuiWindow clientEntityListWindow;
private static boolean filterToCreatures = true; //filters the entity list to just creatures
//window for viewing details about an entity
protected static ImGuiWindow clientEntityDetailWindow;
private static Entity detailViewEntity = null;
//tree node values
private static boolean showDataTab = false; //show all data names stored in the entity
private static boolean showActorTab = false; //show the actor tab
private static boolean showPoseActorTab = false; //show the pose actor tab
private static boolean showEquipStateTab = false; //actor details
private static boolean showFirstPersonTab = false; //first person tab
private static boolean showLinkedEntitiesTab = false;//show linked entities
private static boolean showServerViewDirTab = false; //show server view dir
private static boolean showPhysicsTab = false; //show physics values
/**
* Creates the windows in this file
*/
protected static void createClientEntityWindows(){
createClientEntityDetailWindow();
createClientEntitySelectionWindow();
}
/**
* Client scene entity view
*/
protected static void createClientEntitySelectionWindow(){
clientEntityListWindow = new ImGuiWindow("Client Entities");
clientEntityListWindow.setCallback(new ImGuiWindowCallback() {
@Override
public void exec() {
//audio engine details
ImGui.text("Client Entities");
if(ImGui.checkbox("Filter to Creatures", filterToCreatures)){
filterToCreatures = !filterToCreatures;
}
for(Entity entity : Globals.clientSceneWrapper.getScene().getEntityList()){
//filters
if(filterToCreatures && !CreatureUtils.isCreature(entity)){
continue;
}
ImGui.beginGroup();
ImGui.pushID(entity.getId());
ImGui.text("Id: " + entity.getId() + " (" + getEntityName(entity) + ")");
if(ImGui.button("Details")){
showEntity(entity);
}
ImGui.popID();
ImGui.endGroup();
}
}
});
clientEntityListWindow.setOpen(false);
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.text("Current ID: " + detailViewEntity.getId());
if(ImGui.treeNode("Views")){
if(ImGui.checkbox("Data View", showDataTab)){
showDataTab = !showDataTab;
}
if(EntityUtils.getActor(detailViewEntity) != null && ImGui.checkbox("Actor Details", showActorTab)){
showActorTab = !showActorTab;
}
if(EntityUtils.getPoseActor(detailViewEntity) != null && ImGui.checkbox("Pose Actor Details", showPoseActorTab)){
showPoseActorTab = !showPoseActorTab;
}
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;
}
if(ServerPlayerViewDirTree.hasTree(detailViewEntity) && ImGui.checkbox("Server View Dir", showServerViewDirTab)){
showServerViewDirTab = !showServerViewDirTab;
}
if(PhysicsEntityUtils.getDBody(detailViewEntity) != null && ImGui.checkbox("Physics", showPhysicsTab)){
showPhysicsTab = !showPhysicsTab;
}
ImGui.treePop();
}
ImGui.nextColumn();
drawActorView();
drawPoseActor();
drawEquipState();
drawFirstPersonView();
drawLinkedEntities();
drawServerViewDir();
drawPhysicsDetails();
drawDataView();
}
});
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);
}
/**
* Draws the data view
*/
protected static void drawDataView(){
if(showDataTab && ImGui.collapsingHeader("Data View")){
if(detailViewEntity != null){
for(String key : detailViewEntity.getKeys()){
ImGui.text(key);
}
}
}
}
/**
* Client scene entity view
*/
protected static void drawActorView(){
if(showActorTab && ImGui.collapsingHeader("Actor Details")){
ImGui.indent();
if(detailViewEntity != null && EntityUtils.getActor(detailViewEntity) != null){
Actor actor = EntityUtils.getActor(detailViewEntity);
//mesh mask
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);
}
}
//animation queue
if(ImGui.collapsingHeader("Animation Queue")){
Set<ActorAnimationMask> animationQueue = actor.getAnimationQueue();
for(ActorAnimationMask mask : animationQueue){
ImGui.text(mask.getAnimationName() + " - " + mask.getPriority());
ImGui.text(mask.getDuration() + " " + mask.getTime());
}
}
//bone values
if(ImGui.collapsingHeader("Bone Values")){
for(Bone bone : actor.getBoneValues()){
ImGui.text(bone.boneID);
ImGui.text("Position: " + actor.getBonePosition(bone.boneID));
ImGui.text("Rotation: " + actor.getBoneRotation(bone.boneID));
ImGui.text(bone.getFinalTransform() + "");
}
}
//Draws all the bones in the world
if(ImGui.button("Draw Bones")){
Globals.renderingEngine.getDebugContentPipeline().getDebugBonesPipeline().setEntity(detailViewEntity);
}
//Browsable list of all animations with their data
if(ImGui.collapsingHeader("Animation Channel Data")){
Model model = Globals.assetManager.fetchModel(actor.getModelPath());
ImGui.indent();
for(Animation animation : model.getAnimations()){
if(ImGui.collapsingHeader(animation.name)){
for(AnimChannel channel : animation.channels){
ImGui.pushID(channel.getNodeID());
if(ImGui.button("Fully describe")){
channel.fullDescribeChannel();
}
ImGui.text("=" + channel.getNodeID() + "=");
ImGui.text("" + channel.getCurrentPosition());
ImGui.text("" + channel.getCurrentRotation());
ImGui.text("" + channel.getCurrentScale());
ImGui.popID();
}
}
}
ImGui.unindent();
}
//print data macros
if(ImGui.collapsingHeader("Print Data")){
//print bone values
if(ImGui.button("Print current bone values")){
for(Bone bone : actor.getBoneValues()){
LoggerInterface.loggerRenderer.DEBUG(bone.boneID);
LoggerInterface.loggerRenderer.DEBUG("" + bone.getFinalTransform());
}
}
//print animation keys
if(ImGui.button("Print animation keys")){
Model model = Globals.assetManager.fetchModel(actor.getModelPath());
model.describeAllAnimations();
}
}
}
ImGui.unindent();
}
}
/**
* Draws pose actor
*/
protected static void drawPoseActor(){
if(showPoseActorTab && ImGui.collapsingHeader("Pose Actor Details")){
ImGui.indent();
if(detailViewEntity != null && EntityUtils.getPoseActor(detailViewEntity) != null){
PoseActor poseActor = EntityUtils.getPoseActor(detailViewEntity);
//animation queue
if(ImGui.collapsingHeader("Animation Queue")){
Set<ActorAnimationMask> animationQueue = poseActor.getAnimationQueue();
for(ActorAnimationMask mask : animationQueue){
ImGui.text(mask.getAnimationName() + " - " + mask.getPriority());
ImGui.text(mask.getDuration() + " " + mask.getTime());
}
}
//bone values
if(ImGui.collapsingHeader("Bone Values")){
for(Bone bone : poseActor.getBoneValues()){
ImGui.text(bone.boneID);
ImGui.text("Position: " + poseActor.getBonePosition(bone.boneID));
ImGui.text("Rotation: " + poseActor.getBoneRotation(bone.boneID));
ImGui.text(bone.getFinalTransform() + "");
}
}
//Draws all the bones in the world
if(ImGui.button("Draw Bones")){
Globals.renderingEngine.getDebugContentPipeline().getDebugBonesPipeline().setEntity(detailViewEntity);
}
//Browsable list of all animations with their data
if(ImGui.collapsingHeader("Animation Channel Data")){
Model model = Globals.assetManager.fetchModel(poseActor.getModelPath());
ImGui.indent();
for(Animation animation : model.getAnimations()){
if(ImGui.collapsingHeader(animation.name)){
for(AnimChannel channel : animation.channels){
ImGui.pushID(channel.getNodeID());
if(ImGui.button("Fully describe")){
channel.fullDescribeChannel();
}
ImGui.text("=" + channel.getNodeID() + "=");
ImGui.text("" + channel.getCurrentPosition());
ImGui.text("" + channel.getCurrentRotation());
ImGui.text("" + channel.getCurrentScale());
ImGui.popID();
}
}
}
ImGui.unindent();
}
//print data macros
if(ImGui.collapsingHeader("Print Data")){
//print bone values
if(ImGui.button("Print current bone values")){
for(Bone bone : poseActor.getBoneValues()){
LoggerInterface.loggerRenderer.DEBUG(bone.boneID);
LoggerInterface.loggerRenderer.DEBUG("" + bone.getFinalTransform());
}
}
//print animation keys
if(ImGui.button("Print animation keys")){
PoseModel model = Globals.assetManager.fetchPoseModel(poseActor.getModelPath());
model.describeAllAnimations();
}
}
}
ImGui.unindent();
}
}
/**
* First person data
*/
protected static void drawFirstPersonView(){
if(showFirstPersonTab && ImGui.collapsingHeader("First Person Tree")){
ImGui.indent();
// FirstPersonTree firstPersonTree = FirstPersonTree.getTree(detailViewEntity);
if(ImGui.button("Visualize facing vectors")){
DebugVisualizerUtils.clientSpawnVectorVisualizer((Entity vector) -> {
EntityUtils.getPosition(vector).set(EntityUtils.getPosition(Globals.firstPersonEntity));
EntityUtils.getRotation(vector).set(EntityUtils.getRotation(Globals.firstPersonEntity));
});
DebugVisualizerUtils.clientSpawnVectorVisualizer((Entity vector) -> {
EntityUtils.getPosition(vector).set(EntityUtils.getPosition(Globals.playerEntity));
EntityUtils.getRotation(vector).set(EntityUtils.getRotation(Globals.playerEntity));
});
DebugVisualizerUtils.clientSpawnVectorVisualizer((Entity vector) -> {
int serverIdForClientEntity = Globals.clientSceneWrapper.mapClientToServerId(Globals.playerEntity.getId());
Entity serverPlayerEntity = EntityLookupUtils.getEntityById(serverIdForClientEntity);
EntityUtils.getPosition(vector).set(EntityUtils.getPosition(serverPlayerEntity));
EntityUtils.getRotation(vector).set(EntityUtils.getRotation(serverPlayerEntity));
});
}
ImGui.unindent();
}
}
//stores the edited rotation values
private static float[] rotationValuesFirstPerson = new float[]{
0,0,0
};
private static float[] rotationValuesThirdPerson = new float[]{
0,0,0
};
private static float[] vectorValuesFirstPerson = new float[]{
0,0,0
};
private static float[] vectorValuesThirdPerson = new float[]{
0,0,0
};
//constraints for vector offset
private static final float MAXIMUM_OFFSET = 1;
private static final float MINIMUM_OFFSET = -MAXIMUM_OFFSET;
/**
* Client scene equip state view
*/
protected static void drawEquipState(){
if(showEquipStateTab && ImGui.collapsingHeader("Equip State Details")){
ImGui.indent();
if(detailViewEntity != null && ClientEquipState.getClientEquipState(detailViewEntity) != null){
ClientEquipState clientEquipState = ClientEquipState.getClientEquipState(detailViewEntity);
if(ImGui.collapsingHeader("All Equip Points")){
for(EquipPoint point : clientEquipState.getAllEquipPoints()){
if(ImGui.collapsingHeader(point.getEquipPointId())){
ImGui.text("Has item equipped: " + (clientEquipState.getEquippedItemAtPoint(point.getEquipPointId()) != null));
ImGui.text("Bone (Third Person): " + point.getBone());
ImGui.text("Bone (First Person): " + point.getFirstPersonBone());
//offsets
ImGui.text("[Third Person] Offset: " + AttachUtils.getEquipPointVectorOffset(point.getOffsetVectorThirdPerson()));
if(ImGui.sliderFloat3("[Third Person] Offset", vectorValuesThirdPerson, MINIMUM_OFFSET, MAXIMUM_OFFSET)){
Vector3d offset = new Vector3d(vectorValuesThirdPerson[0],vectorValuesThirdPerson[1],vectorValuesThirdPerson[2]);
List<Float> newValues = new LinkedList<Float>();
newValues.add((float)offset.x);
newValues.add((float)offset.y);
newValues.add((float)offset.z);
point.setOffsetVectorThirdPerson(newValues);
Entity equippedEntity = clientEquipState.getEquippedItemAtPoint(point.getEquipPointId());
if(equippedEntity != null){
AttachUtils.setVectorOffset(equippedEntity, AttachUtils.getEquipPointVectorOffset(point.getOffsetVectorThirdPerson()));
}
}
ImGui.text("[First Person] Offset: " + AttachUtils.getEquipPointVectorOffset(point.getOffsetVectorFirstPerson()));
if(ImGui.sliderFloat3("[First Person] Offset", vectorValuesFirstPerson, MINIMUM_OFFSET, MAXIMUM_OFFSET)){
Vector3d offset = new Vector3d(vectorValuesFirstPerson[0],vectorValuesFirstPerson[1],vectorValuesFirstPerson[2]);
List<Float> newValues = new LinkedList<Float>();
newValues.add((float)offset.x);
newValues.add((float)offset.y);
newValues.add((float)offset.z);
point.setOffsetVectorFirstPerson(newValues);
Entity equippedEntity = clientEquipState.getEquippedItemAtPoint(point.getEquipPointId());
if(equippedEntity != null){
AttachUtils.setVectorOffset(equippedEntity, AttachUtils.getEquipPointVectorOffset(point.getOffsetVectorFirstPerson()));
}
}
//rotations
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))){
Quaterniond rotation = new Quaterniond().rotateXYZ(rotationValuesFirstPerson[0], rotationValuesFirstPerson[1], rotationValuesFirstPerson[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.setOffsetRotationFirstPerson(newValues);
Entity equippedEntity = clientEquipState.getEquippedItemAtPoint(point.getEquipPointId());
if(equippedEntity != null){
AttachUtils.setRotationOffset(equippedEntity, AttachUtils.getEquipPointRotationOffset(point.getOffsetRotationFirstPerson()));
}
}
if(ImGui.button("Print transforms")){
LoggerInterface.loggerEngine.WARNING("Third person Offset: " + AttachUtils.getEquipPointVectorOffset(point.getOffsetVectorThirdPerson()));
LoggerInterface.loggerEngine.WARNING("First person Offset: " + AttachUtils.getEquipPointVectorOffset(point.getOffsetVectorFirstPerson()));
LoggerInterface.loggerEngine.WARNING("Third person Rotation: " + AttachUtils.getEquipPointRotationOffset(point.getOffsetRotationThirdPerson()));
LoggerInterface.loggerEngine.WARNING("First person Rotation: " + AttachUtils.getEquipPointRotationOffset(point.getOffsetRotationFirstPerson()));
}
}
}
}
}
ImGui.unindent();
}
}
/**
* Client scene equip state view
*/
protected static void drawLinkedEntities(){
if(showLinkedEntitiesTab && ImGui.collapsingHeader("Linked entities")){
ImGui.indent();
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")){
ClientEquipState clientEquipState = ClientEquipState.getClientEquipState(detailViewEntity);
for(String equippedPoint : clientEquipState.getEquippedPoints()){
Entity entity = clientEquipState.getEquippedItemAtPoint(equippedPoint);
if(ImGui.button("Slot: " + equippedPoint)){
showEntity(entity);
}
}
}
if(Globals.clientSceneWrapper.clientToServerMapContainsId(detailViewEntity.getId())){
//detailViewEntity is a client entity
//get server entity
int serverIdForClientEntity = Globals.clientSceneWrapper.mapClientToServerId(detailViewEntity.getId());
Entity serverEntity = EntityLookupUtils.getEntityById(serverIdForClientEntity);
if(serverEntity != null && ImGui.button("Server Entity")){
showEntity(serverEntity);
}
} else if(Globals.clientSceneWrapper.containsServerId(detailViewEntity.getId())){
//detailViewEntity is a server entity
//get client entity
int clientId = Globals.clientSceneWrapper.mapServerToClientId(detailViewEntity.getId());
Entity clientEntity = Globals.clientSceneWrapper.getScene().getEntityFromId(clientId);
if(clientEntity != null && ImGui.button("Client Entity")){
showEntity(clientEntity);
}
}
ImGui.unindent();
}
}
/**
* Server view dir
*/
protected static void drawServerViewDir(){
if(showServerViewDirTab && ImGui.collapsingHeader("Server View Dir")){
ImGui.indent();
if(ServerPlayerViewDirTree.hasTree(detailViewEntity)){
ServerPlayerViewDirTree viewDirTree = ServerPlayerViewDirTree.getTree(detailViewEntity);
ImGui.text("Yaw: " + viewDirTree.getYaw());
ImGui.text("Pitch: " + viewDirTree.getPitch());
}
ImGui.unindent();
}
}
/**
* Physics details
*/
protected static void drawPhysicsDetails(){
if(showPhysicsTab && ImGui.collapsingHeader("Physics")){
ImGui.indent();
if(PhysicsEntityUtils.getDBody(detailViewEntity) != null){
DBody physicsBody = PhysicsEntityUtils.getDBody(detailViewEntity);
if(physicsBody != null){
ImGui.text("Position: " + EntityUtils.getPosition(detailViewEntity));
ImGui.text("Rotation: " + EntityUtils.getRotation(detailViewEntity));
ImGui.text("Velocity: " + physicsBody.getLinearVel());
ImGui.text("Force: " + physicsBody.getForce());
ImGui.text("Angular Velocity: " + physicsBody.getAngularVel());
ImGui.text("Torque: " + physicsBody.getTorque());
ImGui.text("Move Vector: " + CreatureUtils.getFacingVector(detailViewEntity));
ImGui.text("Velocity: " + CreatureUtils.getVelocity(detailViewEntity));
}
//synchronized data
if(Globals.clientSceneWrapper.getScene().getEntityFromId(detailViewEntity.getId()) != null){
//detailViewEntity is a client entity
//get server entity
int serverIdForClientEntity = Globals .clientSceneWrapper.mapClientToServerId(detailViewEntity.getId());
Entity serverEntity = EntityLookupUtils.getEntityById(serverIdForClientEntity);
DBody serverPhysicsBody = PhysicsEntityUtils.getDBody(serverEntity);
if(serverPhysicsBody != null){
ImGui.newLine();
ImGui.text("Linked server entity:");
ImGui.text("Position (Server): " + EntityUtils.getPosition(serverEntity));
ImGui.text("Rotation (Server): " + EntityUtils.getRotation(serverEntity));
ImGui.text("Velocity (Server): " + serverPhysicsBody.getLinearVel());
ImGui.text("Force (Server): " + serverPhysicsBody.getForce());
ImGui.text("Angular Velocity: " + serverPhysicsBody.getAngularVel());
ImGui.text("Torque: " + serverPhysicsBody.getTorque());
ImGui.text("Move Vector (Server): "+ CreatureUtils.getFacingVector(serverEntity));
ImGui.text("Velocity (Server): " + CreatureUtils.getVelocity(serverEntity));
}
} else if(Globals.clientSceneWrapper.containsServerId(detailViewEntity.getId())){
//detailViewEntity is a server entity
//get client entity
int clientId = Globals.clientSceneWrapper.mapServerToClientId(detailViewEntity.getId());
Entity clientEntity = Globals.clientSceneWrapper.getScene().getEntityFromId(clientId);
DBody clientPhysicsBody = PhysicsEntityUtils.getDBody(clientEntity);
if(clientPhysicsBody != null){
ImGui.newLine();
ImGui.text("Linked client entity:");
ImGui.text("Position (Client): " + EntityUtils.getPosition(clientEntity));
ImGui.text("Rotation (Client): " + EntityUtils.getRotation(clientEntity));
ImGui.text("Velocity (Client): " + clientPhysicsBody.getLinearVel());
ImGui.text("Force (Client): " + clientPhysicsBody.getForce());
ImGui.text("Angular Velocity: " + clientPhysicsBody.getAngularVel());
ImGui.text("Torque: " + clientPhysicsBody.getTorque());
ImGui.text("Move Vector (Client): " + CreatureUtils.getFacingVector(clientEntity));
ImGui.text("Velocity (Client): " + CreatureUtils.getVelocity(clientEntity));
}
}
}
ImGui.unindent();
}
}
/**
* Gets the displayed name of an entity (ie creature type, foliage type, terrain, etc)
* @param entity
* @return
*/
private static String getEntityName(Entity entity){
if(CreatureUtils.isCreature(entity)){
return CreatureUtils.getType(entity);
}
if(ItemUtils.isItem(entity)){
return ItemUtils.getType(entity);
}
if(FoliageUtils.isFoliage(entity)){
return FoliageUtils.getFoliageType(entity).getName();
}
return "Entity";
}
}