dbody entity key refactor
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good

This commit is contained in:
austin 2024-09-11 21:11:00 -04:00
parent 3082dde1b1
commit 5fce9bc292
10 changed files with 51 additions and 32 deletions

View File

@ -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;
}

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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