From 5fce9bc2922761079ba49e622214a12e6bb08e04 Mon Sep 17 00:00:00 2001 From: austin Date: Wed, 11 Sep 2024 21:11:00 -0400 Subject: [PATCH] dbody entity key refactor --- .../client/terrain/cells/DrawCellManager.java | 5 +-- .../collision/CollisionEngine.java | 4 +-- .../collision/PhysicsEntityUtils.java | 32 +++++++++++++++---- .../entity/state/equip/ClientEquipState.java | 5 +-- .../entity/state/equip/ServerEquipState.java | 5 +-- .../types/collision/CollisionObjUtils.java | 13 +++----- .../entity/types/creature/CreatureUtils.java | 4 +-- .../entity/types/item/ItemUtils.java | 6 ++-- .../entity/types/object/ObjectUtils.java | 4 +-- .../entity/types/tree/ProceduralTree.java | 5 +-- 10 files changed, 51 insertions(+), 32 deletions(-) diff --git a/src/main/java/electrosphere/client/terrain/cells/DrawCellManager.java b/src/main/java/electrosphere/client/terrain/cells/DrawCellManager.java index 617b0bea..ef4eb85c 100644 --- a/src/main/java/electrosphere/client/terrain/cells/DrawCellManager.java +++ b/src/main/java/electrosphere/client/terrain/cells/DrawCellManager.java @@ -11,6 +11,7 @@ import org.joml.Vector3i; import electrosphere.client.terrain.cache.ChunkData; import electrosphere.client.terrain.cells.DrawCell.DrawCellFace; import electrosphere.client.terrain.manager.ClientTerrainManager; +import electrosphere.collision.PhysicsEntityUtils; import electrosphere.engine.Globals; import electrosphere.entity.EntityUtils; import electrosphere.net.parser.net.message.TerrainMessage; @@ -76,7 +77,7 @@ public class DrawCellManager { //the real-space radius for which we will construct draw cells inside of //ie, we check if the draw cell's entity would be inside this radius. If it would, create the draw cell, otherwise don't - double drawFullModelRadius = 50; + double drawFullModelRadius = 70; //the radius we'll draw LODed chunks for double drawLODRadius = drawFullModelRadius + ServerTerrainChunk.CHUNK_DIMENSION * (2*2 + 4*4 + 8*8 + 16*16); @@ -501,7 +502,7 @@ public class DrawCellManager { return false; } DrawCell cell = this.keyCellMap.get(key); - return cell.modelEntity != null; + return cell.modelEntity != null && PhysicsEntityUtils.getDBody(cell.modelEntity) != null; } diff --git a/src/main/java/electrosphere/collision/CollisionEngine.java b/src/main/java/electrosphere/collision/CollisionEngine.java index 2f6a382f..c1c40c4f 100644 --- a/src/main/java/electrosphere/collision/CollisionEngine.java +++ b/src/main/java/electrosphere/collision/CollisionEngine.java @@ -623,8 +623,8 @@ public class CollisionEngine { */ public void destroyPhysics(Entity e){ //make uncollidable - if(e.containsKey(EntityDataStrings.PHYSICS_COLLISION_BODY)){ - DBody rigidBody = (DBody)e.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); + if(PhysicsEntityUtils.containsDBody(e)){ + DBody rigidBody = PhysicsEntityUtils.getDBody(e); deregisterCollisionObject(rigidBody,PhysicsEntityUtils.getCollidable(e)); e.removeData(EntityDataStrings.PHYSICS_COLLISION_BODY); deregisterPhysicsObject(rigidBody); diff --git a/src/main/java/electrosphere/collision/PhysicsEntityUtils.java b/src/main/java/electrosphere/collision/PhysicsEntityUtils.java index 15a46177..e9179d20 100644 --- a/src/main/java/electrosphere/collision/PhysicsEntityUtils.java +++ b/src/main/java/electrosphere/collision/PhysicsEntityUtils.java @@ -50,7 +50,7 @@ public class PhysicsEntityUtils { ); collidable = new Collidable(rVal, Collidable.TYPE_CREATURE, true); ClientCollidableTree tree = new ClientCollidableTree(rVal,collidable,rigidBody); - rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, rigidBody); + PhysicsEntityUtils.setDBody(rVal,rigidBody); Matrix4d offsetTransform = new Matrix4d().translationRotate( physicsTemplate.getOffsetX(), physicsTemplate.getOffsetY(), physicsTemplate.getOffsetZ(), //translate physicsTemplate.getRotX(), physicsTemplate.getRotY(), physicsTemplate.getRotZ(), physicsTemplate.getRotW() //rotate @@ -76,7 +76,7 @@ public class PhysicsEntityUtils { ); collidable = new Collidable(rVal, Collidable.TYPE_CREATURE, true); ClientCollidableTree tree = new ClientCollidableTree(rVal,collidable,rigidBody); - rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, rigidBody); + PhysicsEntityUtils.setDBody(rVal,rigidBody); Matrix4d offsetTransform = new Matrix4d().translationRotateScale( physicsTemplate.getOffsetX(), physicsTemplate.getOffsetY(), physicsTemplate.getOffsetZ(), //translate physicsTemplate.getRotX(), physicsTemplate.getRotY(), physicsTemplate.getRotZ(), physicsTemplate.getRotW(), //rotate @@ -128,7 +128,7 @@ public class PhysicsEntityUtils { ); collidable = new Collidable(rVal, Collidable.TYPE_CREATURE, true); ServerCollidableTree tree = new ServerCollidableTree(rVal,collidable,rigidBody); - rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, rigidBody); + PhysicsEntityUtils.setDBody(rVal,rigidBody); Matrix4d offsetTransform = new Matrix4d().translationRotateScale( physicsTemplate.getOffsetX(), physicsTemplate.getOffsetY(), physicsTemplate.getOffsetZ(), //translate physicsTemplate.getRotX(), physicsTemplate.getRotY(), physicsTemplate.getRotZ(), physicsTemplate.getRotW(), //rotate @@ -151,7 +151,7 @@ public class PhysicsEntityUtils { rigidBody = CollisionBodyCreation.createCubeBody(realm.getCollisionEngine(),new Vector3d(physicsTemplate.getDimension1(),physicsTemplate.getDimension2(),physicsTemplate.getDimension3()),Collidable.TYPE_CREATURE_BIT); collidable = new Collidable(rVal, Collidable.TYPE_CREATURE, true); ServerCollidableTree tree = new ServerCollidableTree(rVal,collidable,rigidBody); - rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, rigidBody); + PhysicsEntityUtils.setDBody(rVal,rigidBody); Matrix4d offsetTransform = new Matrix4d().translationRotateScale( physicsTemplate.getOffsetX(), physicsTemplate.getOffsetY(), physicsTemplate.getOffsetZ(), //translate physicsTemplate.getRotX(), physicsTemplate.getRotY(), physicsTemplate.getRotZ(), physicsTemplate.getRotW(), //rotate @@ -248,7 +248,7 @@ public class PhysicsEntityUtils { DBody body = collisionEngine.createDBody(triMesh); Globals.clientSceneWrapper.getCollisionEngine().registerCollisionObject(body, new Collidable(terrain,Collidable.TYPE_TERRAIN, false)); - terrain.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, body); + PhysicsEntityUtils.setDBody(terrain,body); return body; } @@ -267,7 +267,7 @@ public class PhysicsEntityUtils { Globals.clientSceneWrapper.getCollisionEngine().registerCollisionObject(terrainBody, new Collidable(terrain,Collidable.TYPE_TERRAIN, false)); - terrain.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, terrainBody); + PhysicsEntityUtils.setDBody(terrain,terrainBody); return terrainBody; } @@ -286,7 +286,7 @@ public class PhysicsEntityUtils { CollisionBodyCreation.setGravityMode(terrainRealm.getCollisionEngine(), terrainBody, false); terrainRealm.getCollisionEngine().registerCollisionObject(terrainBody, new Collidable(terrain,Collidable.TYPE_TERRAIN, false)); - terrain.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, terrainBody); + PhysicsEntityUtils.setDBody(terrain,terrainBody); return terrainBody; } @@ -300,6 +300,24 @@ public class PhysicsEntityUtils { return (Matrix4d) entity.getData(EntityDataStrings.PHYSICS_COLLISION_BODY_TRANSFORM); } + /** + * Checks if the entity contains a dbody + * @param entity the entity + * @return true if contains, false otherwise + */ + public static boolean containsDBody(Entity entity){ + return entity.containsKey(EntityDataStrings.PHYSICS_COLLISION_BODY); + } + + /** + * Sets the dbody on the entity + * @param entity The entity + * @param body The body + */ + public static void setDBody(Entity entity, DBody body){ + entity.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, body); + } + /** * Gets the DBody attached to an entity * @param entity the entity diff --git a/src/main/java/electrosphere/entity/state/equip/ClientEquipState.java b/src/main/java/electrosphere/entity/state/equip/ClientEquipState.java index 2f61d61f..251aec17 100644 --- a/src/main/java/electrosphere/entity/state/equip/ClientEquipState.java +++ b/src/main/java/electrosphere/entity/state/equip/ClientEquipState.java @@ -6,6 +6,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import electrosphere.collision.PhysicsEntityUtils; import electrosphere.engine.Globals; import electrosphere.entity.Entity; import electrosphere.entity.EntityCreationUtils; @@ -151,7 +152,7 @@ public class ClientEquipState implements BehaviorTree { ); } //make uncollidable - if(toEquip.containsKey(EntityDataStrings.PHYSICS_COLLISION_BODY) && toEquip.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){ + if(PhysicsEntityUtils.containsDBody(toEquip) && toEquip.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){ Globals.clientSceneWrapper.getCollisionEngine().destroyPhysics(toEquip); } //hide toEquip actor @@ -190,7 +191,7 @@ public class ClientEquipState implements BehaviorTree { AttachUtils.getEquipPointRotationOffset(point.getOffsetRotationFirstPerson()) ); } - if(toEquip.containsKey(EntityDataStrings.PHYSICS_COLLISION_BODY) && toEquip.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){ + if(PhysicsEntityUtils.containsDBody(toEquip) && toEquip.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){ Globals.clientSceneWrapper.getCollisionEngine().destroyPhysics(toEquip); } Globals.clientSceneWrapper.getScene().removeEntityFromTag(toEquip, EntityTags.TARGETABLE); diff --git a/src/main/java/electrosphere/entity/state/equip/ServerEquipState.java b/src/main/java/electrosphere/entity/state/equip/ServerEquipState.java index f49d6296..9df7185c 100644 --- a/src/main/java/electrosphere/entity/state/equip/ServerEquipState.java +++ b/src/main/java/electrosphere/entity/state/equip/ServerEquipState.java @@ -10,6 +10,7 @@ import java.util.Map; import org.joml.Vector3d; +import electrosphere.collision.PhysicsEntityUtils; import electrosphere.engine.Globals; import electrosphere.entity.Entity; import electrosphere.entity.EntityDataStrings; @@ -125,7 +126,7 @@ public class ServerEquipState implements BehaviorTree { AttachUtils.getEquipPointRotationOffset(point.getOffsetRotationThirdPerson()) ); //make uncollidable - if(inWorldItem.containsKey(EntityDataStrings.PHYSICS_COLLISION_BODY) && inWorldItem.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){ + if(PhysicsEntityUtils.containsDBody(inWorldItem) && inWorldItem.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){ Realm inWorldRealm = Globals.realmManager.getEntityRealm(inWorldItem); inWorldRealm.getCollisionEngine().destroyPhysics(inWorldItem); } @@ -146,7 +147,7 @@ public class ServerEquipState implements BehaviorTree { AttachUtils.getEquipPointVectorOffset(point.getOffsetVectorThirdPerson()), AttachUtils.getEquipPointRotationOffset(point.getOffsetRotationThirdPerson()) ); - if(inWorldItem.containsKey(EntityDataStrings.PHYSICS_COLLISION_BODY) && inWorldItem.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){ + if(PhysicsEntityUtils.containsDBody(inWorldItem) && inWorldItem.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){ Realm inWorldRealm = Globals.realmManager.getEntityRealm(inWorldItem); inWorldRealm.getCollisionEngine().destroyPhysics(inWorldItem); } diff --git a/src/main/java/electrosphere/entity/types/collision/CollisionObjUtils.java b/src/main/java/electrosphere/entity/types/collision/CollisionObjUtils.java index 9bc35e72..16a21ebb 100644 --- a/src/main/java/electrosphere/entity/types/collision/CollisionObjUtils.java +++ b/src/main/java/electrosphere/entity/types/collision/CollisionObjUtils.java @@ -7,6 +7,7 @@ import org.ode4j.ode.DBody; import electrosphere.collision.CollisionBodyCreation; import electrosphere.collision.CollisionEngine; +import electrosphere.collision.PhysicsEntityUtils; import electrosphere.collision.PhysicsUtils; import electrosphere.collision.collidable.Collidable; import electrosphere.engine.Globals; @@ -237,7 +238,7 @@ public class CollisionObjUtils { Collidable collidable = new Collidable(entity, collidableType, true); Globals.clientSceneWrapper.getCollisionEngine().registerCollisionObject(collisionObject, collidable); - entity.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, collisionObject); + PhysicsEntityUtils.setDBody(entity, collisionObject); //update world transform of collision object clientPositionCharacter(entity,position,rotation); @@ -261,7 +262,7 @@ public class CollisionObjUtils { Realm realm = Globals.realmManager.getEntityRealm(entity); realm.getCollisionEngine().registerCollisionObject(collisionObject, collidable); - entity.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, collisionObject); + PhysicsEntityUtils.setDBody(entity, collisionObject); //update world transform of collision object serverPositionCharacter(entity,position); @@ -271,14 +272,10 @@ public class CollisionObjUtils { entity.putData(EntityDataStrings.PHYSICS_MASS, mass); } - public static DBody getCollisionBody(Entity e){ - return (DBody)e.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); - } - public static void serverPositionCharacter(Entity e, Vector3d position){ EntityUtils.getPosition(e).set(position); Quaterniond rotation = EntityUtils.getRotation(e); - DBody body = getCollisionBody(e); + DBody body = PhysicsEntityUtils.getDBody(e); CollisionEngine collisionEngine = Globals.realmManager.getEntityRealm(e).getCollisionEngine(); if(body != null){ PhysicsUtils.setRigidBodyTransform(collisionEngine, position, rotation, body); @@ -287,7 +284,7 @@ public class CollisionObjUtils { public static void clientPositionCharacter(Entity e, Vector3d position, Quaterniond rotation){ EntityUtils.getPosition(e).set(position); - DBody body = getCollisionBody(e); + DBody body = PhysicsEntityUtils.getDBody(e); if(body != null){ PhysicsUtils.setRigidBodyTransform(Globals.clientSceneWrapper.getCollisionEngine(), position, rotation, body); } diff --git a/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java b/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java index f6fdb59e..3c07ea5e 100644 --- a/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java +++ b/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java @@ -239,7 +239,7 @@ public class CreatureUtils { } break; case "GRAVITY": Collidable collidable = (Collidable)rVal.getData(EntityDataStrings.PHYSICS_COLLIDABLE); - DBody collisionObject = (DBody)rVal.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); + DBody collisionObject = PhysicsEntityUtils.getDBody(rVal); ClientGravityTree.attachTree(rVal, collidable, collisionObject, 30); rVal.putData(EntityDataStrings.GRAVITY_ENTITY, true); break; @@ -527,7 +527,7 @@ public class CreatureUtils { } break; case "GRAVITY": { Collidable collidable = (Collidable)rVal.getData(EntityDataStrings.PHYSICS_COLLIDABLE); - DBody collisionObject = (DBody)rVal.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); + DBody collisionObject = PhysicsEntityUtils.getDBody(rVal); ServerGravityTree.attachTree(rVal, collidable, collisionObject, 30); rVal.putData(EntityDataStrings.GRAVITY_ENTITY, true); } break; diff --git a/src/main/java/electrosphere/entity/types/item/ItemUtils.java b/src/main/java/electrosphere/entity/types/item/ItemUtils.java index 01043429..d0560635 100644 --- a/src/main/java/electrosphere/entity/types/item/ItemUtils.java +++ b/src/main/java/electrosphere/entity/types/item/ItemUtils.java @@ -68,7 +68,7 @@ public class ItemUtils { switch(token){ case "GRAVITY": Collidable collidable = (Collidable)rVal.getData(EntityDataStrings.PHYSICS_COLLIDABLE); - DBody collisionObject = (DBody)rVal.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); + DBody collisionObject = PhysicsEntityUtils.getDBody(rVal); ClientGravityTree.attachTree(rVal, collidable, collisionObject, 30); rVal.putData(EntityDataStrings.GRAVITY_ENTITY, true); break; @@ -147,7 +147,7 @@ public class ItemUtils { switch(token){ case "GRAVITY": Collidable collidable = (Collidable)rVal.getData(EntityDataStrings.PHYSICS_COLLIDABLE); - DBody collisionObject = (DBody)rVal.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); + DBody collisionObject = PhysicsEntityUtils.getDBody(rVal); ServerGravityTree.attachTree(rVal, collidable, collisionObject, 30); rVal.putData(EntityDataStrings.GRAVITY_ENTITY, true); break; @@ -449,7 +449,7 @@ public class ItemUtils { public static void clientDestroyInWorldItem(Entity item){ if(isItem(item)){ //destroy physics - if(item.containsKey(EntityDataStrings.PHYSICS_COLLISION_BODY) && item.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){ + if(PhysicsEntityUtils.containsDBody(item) && item.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){ //destroy physics //this deregisters from all four & unhooks rigid bodies from the physics runtime Globals.clientSceneWrapper.getCollisionEngine().destroyPhysics(item); diff --git a/src/main/java/electrosphere/entity/types/object/ObjectUtils.java b/src/main/java/electrosphere/entity/types/object/ObjectUtils.java index 60a32450..cdb7768e 100644 --- a/src/main/java/electrosphere/entity/types/object/ObjectUtils.java +++ b/src/main/java/electrosphere/entity/types/object/ObjectUtils.java @@ -86,7 +86,7 @@ public class ObjectUtils { switch(token){ case "GRAVITY": Collidable collidable = (Collidable)rVal.getData(EntityDataStrings.PHYSICS_COLLIDABLE); - DBody collisionObject = (DBody)rVal.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); + DBody collisionObject = PhysicsEntityUtils.getDBody(rVal); ClientGravityTree.attachTree(rVal, collidable, collisionObject, 30); rVal.putData(EntityDataStrings.GRAVITY_ENTITY, true); break; @@ -173,7 +173,7 @@ public class ObjectUtils { switch(token){ case "GRAVITY": Collidable collidable = (Collidable)rVal.getData(EntityDataStrings.PHYSICS_COLLIDABLE); - DBody collisionObject = (DBody)rVal.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); + DBody collisionObject = PhysicsEntityUtils.getDBody(rVal); ServerGravityTree.attachTree(rVal, collidable, collisionObject, 30); rVal.putData(EntityDataStrings.GRAVITY_ENTITY, true); break; diff --git a/src/main/java/electrosphere/entity/types/tree/ProceduralTree.java b/src/main/java/electrosphere/entity/types/tree/ProceduralTree.java index 1fb3899c..b24374f6 100644 --- a/src/main/java/electrosphere/entity/types/tree/ProceduralTree.java +++ b/src/main/java/electrosphere/entity/types/tree/ProceduralTree.java @@ -17,6 +17,7 @@ import org.joml.Vector4f; import org.ode4j.ode.DBody; import electrosphere.collision.CollisionBodyCreation; +import electrosphere.collision.PhysicsEntityUtils; import electrosphere.collision.collidable.Collidable; import electrosphere.engine.Globals; import electrosphere.entity.Entity; @@ -119,7 +120,7 @@ public class ProceduralTree { CollisionBodyCreation.setOffsetPosition(Globals.clientSceneWrapper.getCollisionEngine(), rigidBody, new Vector3d(0,treeModel.getPhysicsBody().getOffsetY(),0)); CollisionBodyCreation.setKinematic(Globals.clientSceneWrapper.getCollisionEngine(), rigidBody); Collidable collidable = new Collidable(trunkChild, Collidable.TYPE_FOLIAGE_STATIC, true); - trunkChild.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, rigidBody); + PhysicsEntityUtils.setDBody(trunkChild, rigidBody); Matrix4d offsetTransform = new Matrix4d().translationRotateScale( 0,treeModel.getPhysicsBody().getOffsetY(),0, //translate 0,0,0,1, //rotate @@ -385,7 +386,7 @@ public class ProceduralTree { CollisionBodyCreation.setOffsetPosition(realm.getCollisionEngine(), rigidBody, new Vector3d(0,treeModel.getPhysicsBody().getOffsetY(),0)); CollisionBodyCreation.setKinematic(realm.getCollisionEngine(), rigidBody); Collidable collidable = new Collidable(trunkChild, Collidable.TYPE_FOLIAGE_STATIC, true); - trunkChild.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, rigidBody); + PhysicsEntityUtils.setDBody(trunkChild, rigidBody); Matrix4d offsetTransform = new Matrix4d().translationRotateScale( 0,treeModel.getPhysicsBody().getOffsetY(),0, //translate 0,0,0,1, //rotate