From e43ce32d70567a79bcfb31f4df0b5e35f9361ea2 Mon Sep 17 00:00:00 2001 From: austin Date: Sun, 5 Nov 2023 14:00:39 -0500 Subject: [PATCH] Docs + fixes --- assets/Data/foliage.json | 4 ++-- docs/src/images/CollisionEngineEntityFlow.png | Bin 0 -> 60614 bytes docs/src/physics/collision.md | 2 ++ .../collision/CollisionBodyCreation.java | 12 +++++++++++- .../collision/collidable/Collidable.java | 3 +-- .../state/movement/GroundMovementTree.java | 10 +++++----- .../electrosphere/renderer/RenderingEngine.java | 4 ++-- 7 files changed, 23 insertions(+), 12 deletions(-) create mode 100644 docs/src/images/CollisionEngineEntityFlow.png diff --git a/assets/Data/foliage.json b/assets/Data/foliage.json index 88cce696..ead21524 100644 --- a/assets/Data/foliage.json +++ b/assets/Data/foliage.json @@ -73,8 +73,8 @@ "physicsCutoff": 3, "physicsBody": { "type" : "CYLINDER", - "dimension1" : 3, - "dimension2" : 1, + "dimension1" : 1, + "dimension2" : 3, "dimension3" : 1, "offsetX" : 0, "offsetY" : 1.5, diff --git a/docs/src/images/CollisionEngineEntityFlow.png b/docs/src/images/CollisionEngineEntityFlow.png new file mode 100644 index 0000000000000000000000000000000000000000..a49485b674d70815cc4e99a604d8739c7c1323b8 GIT binary patch literal 60614 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 {j&7rQfNX_Q&D>Ra&M0?G? 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 literal 0 HcmV?d00001 diff --git a/docs/src/physics/collision.md b/docs/src/physics/collision.md index 7c4b8d6e..dea41589 100644 --- a/docs/src/physics/collision.md +++ b/docs/src/physics/collision.md @@ -12,6 +12,8 @@ The big case for this engine is the main physics system. The goal is to provide +![](/docs/src/images/CollisionEngineEntityFlow.png) + diff --git a/src/main/java/electrosphere/collision/CollisionBodyCreation.java b/src/main/java/electrosphere/collision/CollisionBodyCreation.java index 63ef03cc..02f42bf0 100644 --- a/src/main/java/electrosphere/collision/CollisionBodyCreation.java +++ b/src/main/java/electrosphere/collision/CollisionBodyCreation.java @@ -8,6 +8,7 @@ import org.lwjgl.assimp.AIFace; import org.lwjgl.assimp.AIMesh; import org.lwjgl.assimp.AIScene; import org.lwjgl.assimp.AIVector3D; +import org.ode4j.math.DMatrix3; import org.ode4j.ode.DBody; import org.ode4j.ode.DBox; import org.ode4j.ode.DCylinder; @@ -21,6 +22,13 @@ import electrosphere.entity.types.terrain.TerrainChunkData; */ public class CollisionBodyCreation { + //Matrix for correcting initial axis of eg cylinders or capsules + static final DMatrix3 AXIS_CORRECTION_MATRIX = new DMatrix3( + 1.0000000, 0.0000000, 0.0000000, + 0.0000000, 0.0000000, -1.0000000, + 0.0000000, 1.0000000, 0.0000000 + ); + //The width of a plane rigid body @@ -56,7 +64,9 @@ public class CollisionBodyCreation { */ public static DBody createCylinderBody(CollisionEngine collisionEngine, double radius, double length){ DCylinder geom = collisionEngine.createCylinderGeom(radius,length); - return collisionEngine.createDBody(geom); + DBody returnBody = collisionEngine.createDBody(geom); + geom.setOffsetRotation(AXIS_CORRECTION_MATRIX); + return returnBody; } /** diff --git a/src/main/java/electrosphere/collision/collidable/Collidable.java b/src/main/java/electrosphere/collision/collidable/Collidable.java index f04fc6f0..9ccda361 100644 --- a/src/main/java/electrosphere/collision/collidable/Collidable.java +++ b/src/main/java/electrosphere/collision/collidable/Collidable.java @@ -11,8 +11,7 @@ import org.joml.Vector3f; /** - * - * @author satellite + * Stores the type of the collidable object as well as the impulses currently applied to it */ public class Collidable { diff --git a/src/main/java/electrosphere/entity/state/movement/GroundMovementTree.java b/src/main/java/electrosphere/entity/state/movement/GroundMovementTree.java index 0a42cec7..9384a426 100644 --- a/src/main/java/electrosphere/entity/state/movement/GroundMovementTree.java +++ b/src/main/java/electrosphere/entity/state/movement/GroundMovementTree.java @@ -229,11 +229,11 @@ public class GroundMovementTree implements BehaviorTree { // System.out.println(EntityUtils.getEntityPosition(parent)); // System.out.println(message.getpositionX() + " " + message.getpositionY() + " " + message.getpositionZ()); //this should only fire on the client, we don't want the server snap updating due to client position reporting - if(position.distance(message.getpositionX(),message.getpositionY(),message.getpositionZ()) > STATE_DIFFERENCE_HARD_UPDATE_THRESHOLD){ - EntityUtils.getPosition(parent).set(message.getpositionX(),message.getpositionY(),message.getpositionZ()); - } else if(position.distance(message.getpositionX(),message.getpositionY(),message.getpositionZ()) > STATE_DIFFERENCE_SOFT_UPDATE_THRESHOLD){ - EntityUtils.getPosition(parent).add(new Vector3d(message.getpositionX(),message.getpositionY(),message.getpositionZ()).mul(SOFT_UPDATE_MULTIPLIER)); - } + // if(position.distance(message.getpositionX(),message.getpositionY(),message.getpositionZ()) > STATE_DIFFERENCE_HARD_UPDATE_THRESHOLD){ + // EntityUtils.getPosition(parent).set(message.getpositionX(),message.getpositionY(),message.getpositionZ()); + // } else if(position.distance(message.getpositionX(),message.getpositionY(),message.getpositionZ()) > STATE_DIFFERENCE_SOFT_UPDATE_THRESHOLD){ + // EntityUtils.getPosition(parent).add(new Vector3d(message.getpositionX(),message.getpositionY(),message.getpositionZ()).mul(SOFT_UPDATE_MULTIPLIER)); + // } //we want to always update the server facing vector with where the client says they're facing EntityUtils.getRotation(parent).set(message.getrotationX(),message.getrotationY(),message.getrotationZ(),message.getrotationW()); // CreatureUtils.setFacingVector(parent, new Vector3d(message.getrotationX(),message.getrotationY(),message.getrotationZ())); diff --git a/src/main/java/electrosphere/renderer/RenderingEngine.java b/src/main/java/electrosphere/renderer/RenderingEngine.java index b7362c44..08860fcb 100644 --- a/src/main/java/electrosphere/renderer/RenderingEngine.java +++ b/src/main/java/electrosphere/renderer/RenderingEngine.java @@ -930,7 +930,7 @@ public class RenderingEngine { Model physicsGraphicsModel; for(Collidable collidable : Globals.clientSceneWrapper.getCollisionEngine().getCollidables()){ Entity physicsEntity = collidable.getParent(); - if((boolean)physicsEntity.getData(EntityDataStrings.DATA_STRING_DRAW)){ + if((boolean)physicsEntity.getData(EntityDataStrings.DATA_STRING_DRAW) && physicsEntity.getData(EntityDataStrings.PHYSICS_MODEL_TEMPLATE) != null){ CollidableTemplate template = (CollidableTemplate)physicsEntity.getData(EntityDataStrings.PHYSICS_MODEL_TEMPLATE); switch(template.getType()){ case "CYLINDER": @@ -942,7 +942,7 @@ public class RenderingEngine { modelTransformMatrix.translate(cameraModifiedPosition); modelTransformMatrix.rotate(EntityUtils.getRotation(physicsEntity)); // modelTransformMatrix.translate(template.getOffsetX(),template.getOffsetY(),template.getOffsetZ()); //center sphere - modelTransformMatrix.scale(template.getDimension1() * 0.5,template.getDimension2() * 0.5,template.getDimension3() * 0.5); + modelTransformMatrix.scale(template.getDimension1(),template.getDimension2(),template.getDimension3()); physicsGraphicsModel.modelMatrix = modelTransformMatrix; physicsGraphicsModel.draw(renderPipelineState); }