From 9782e2c6b5fb0955a273e3bab4b9002a1bb543ac Mon Sep 17 00:00:00 2001 From: austin Date: Sun, 22 Sep 2024 14:10:21 -0400 Subject: [PATCH] physics work --- assets/Data/entity/creatures/human.json | 2 +- assets/Models/creatures/viewmodel.glb | Bin 889180 -> 924376 bytes docs/src/progress/currenttarget.md | 6 +- docs/src/progress/renderertodo.md | 6 ++ .../collision/CollisionBodyCreation.java | 26 ++++++ .../collision/CollisionEngine.java | 76 +++++++++++++++--- .../collision/PhysicsEntityUtils.java | 41 +++++++++- .../state/attack/ServerAttackTreeTests.java | 2 +- 8 files changed, 142 insertions(+), 17 deletions(-) diff --git a/assets/Data/entity/creatures/human.json b/assets/Data/entity/creatures/human.json index 4afddda4..b5cdc0f2 100644 --- a/assets/Data/entity/creatures/human.json +++ b/assets/Data/entity/creatures/human.json @@ -549,7 +549,7 @@ }, "idleData": { "animation": { - "nameFirstPerson" : "Idle", + "nameFirstPerson" : "BindPose", "nameThirdPerson" : "Idle", "priorityCategory" : "IDLE" } diff --git a/assets/Models/creatures/viewmodel.glb b/assets/Models/creatures/viewmodel.glb index 69377b958a95ccbd011f4f08d3ed0b20608a2793..bd50013aac57e7ab2bfb097621a74ebe2b8df05e 100644 GIT binary patch delta 50714 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 JcD{Yp{{edU;V1wA delta 45732 zcmZu)d0{onr$m{I@#+KpJ4-lyh@>MpPK=`%1rP@ zlxrTpX}CkacHW@H=cua=1ltFSY8MU-jcZ!-#rm$Vy(%Y^wdpxqvJ1$!4k+*x~Y>(XRk*7Se&AYCI{vJ8WBUgFk z*B;ququZ>zN8aa=FL~r1kF2xFZC2`$w|nGlkKF8$r#!OFW>-RgkDTO@t32{+k8Jdw z)2wApkN4{7Wo=n=zem38k)L|xIa^%bOFZ {IFKzUPs@7_vo8oA*6^J#vyquJXvQ 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

qHtY%Lztwb5Jc+T5hnu$d*#a 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 0 + // && + // //force is pointing basically upwards + // PhysicsUtils.odeVecToJomlVec(contact.geom.normal).dot(MathUtils.getUpVector()) > 0.7 + // ){ + // System.out.println(PhysicsUtils.odeVecToJomlVec(contact.geom.normal).dot(MathUtils.getUpVector())); + // if(//force is pointing basically upwards + // PhysicsUtils.odeVecToJomlVec(contact.geom.normal).dot(MathUtils.getUpVector()) > 0.7){ + // contact.geom.normal.set(PhysicsUtils.jomlVecToOdeVec(MathUtils.getUpVector())); + // } + // } + // //add contact to contact group DJoint c = OdeHelper.createContactJoint(world,contactgroup,contact); @@ -801,9 +831,6 @@ public class CollisionEngine { spaceLock.acquireUninterruptibly(); DMass mass = OdeHelper.createMass(); mass.setCylinder(massValue, 2, radius, length); - // mass.setCylinderTotal(massValue, 2, radius, length); - // mass.translate(offset.x, offset.y, offset.z); - // mass.rotate(PhysicsUtils.jomlQuatToOdeMat(rotation)); body.setMass(mass); spaceLock.release(); return mass; @@ -820,14 +847,45 @@ public class CollisionEngine { spaceLock.acquireUninterruptibly(); DMass mass = OdeHelper.createMass(); mass.setBox(massValue, dims.x, dims.y, dims.z); - // mass.setBoxTotal(massValue, dims.x, dims.y, dims.z); - // mass.translate(offset.x, offset.y, offset.z); - // mass.rotate(PhysicsUtils.jomlQuatToOdeMat(rotation)); body.setMass(mass); spaceLock.release(); return mass; } + /** + * Creates a DMass and attaches a body to it + * @param massValue The amount of mass for the object + * @param radius The radius of the capsule + * @param length The length of the capsule + * @param body The DBody to attach the mass to + * @return The DMass + */ + protected DMass createCapsuleMass(double massValue, double radius, double length, DBody body, Vector3d offset, Quaterniond rotation){ + spaceLock.acquireUninterruptibly(); + DMass mass = OdeHelper.createMass(); + mass.setCapsule(massValue, 2, radius, length); + body.setMass(mass); + spaceLock.release(); + return mass; + } + + /** + * Sets the auto disable flags for the body + * @param body The body + * @param autoDisable whether auto disable should be used or not + * @param linearThreshold The linear velocity threshold to disable under + * @param angularThreshold The angular velocity threshold to disable under + * @param steps The number of steps the body must be beneath the threshold before disabling + */ + protected void setAutoDisableFlags(DBody body, boolean autoDisable, double linearThreshold, double angularThreshold, int steps){ + spaceLock.acquireUninterruptibly(); + body.setAutoDisableFlag(autoDisable); + body.setAutoDisableLinearThreshold(0.1); + body.setAutoDisableAngularThreshold(angularThreshold); + body.setAutoDisableSteps(steps); + spaceLock.release(); + } + /** * Sets the damping of the body * @param body The body diff --git a/src/main/java/electrosphere/collision/PhysicsEntityUtils.java b/src/main/java/electrosphere/collision/PhysicsEntityUtils.java index b9477f95..0ab96d1d 100644 --- a/src/main/java/electrosphere/collision/PhysicsEntityUtils.java +++ b/src/main/java/electrosphere/collision/PhysicsEntityUtils.java @@ -25,6 +25,21 @@ import electrosphere.server.datacell.utils.ServerEntityTagUtils; */ public class PhysicsEntityUtils { + /** + * The linear velocity threshold to disable under + */ + static final double LINEAR_THRESHOLD = 0.1; + + /** + * The angular velocity threshold to disable under + */ + static final double ANGULAR_THRESHOLD = 0.1; + + /** + * The number of steps below threshold to disable after + */ + static final int STEP_THRESHOLD = 4; + /** * [CLIENT ONLY] Attaches a collidable template to a given entity * @param rVal The entity @@ -59,6 +74,7 @@ public class PhysicsEntityUtils { new Quaterniond(physicsTemplate.getRotX(), physicsTemplate.getRotY(), physicsTemplate.getRotZ(), physicsTemplate.getRotW()) ); } + CollisionBodyCreation.setAutoDisable(Globals.clientSceneWrapper.getCollisionEngine(), rigidBody, true, LINEAR_THRESHOLD, ANGULAR_THRESHOLD, STEP_THRESHOLD); // //set offset from center of entity position @@ -117,6 +133,7 @@ public class PhysicsEntityUtils { new Quaterniond(physicsTemplate.getRotX(), physicsTemplate.getRotY(), physicsTemplate.getRotZ(), physicsTemplate.getRotW()) ); } + CollisionBodyCreation.setAutoDisable(Globals.clientSceneWrapper.getCollisionEngine(), rigidBody, true, LINEAR_THRESHOLD, ANGULAR_THRESHOLD, STEP_THRESHOLD); // //set offset from center of entity position @@ -168,8 +185,17 @@ public class PhysicsEntityUtils { Collidable.TYPE_CREATURE_BIT ); if(physicsTemplate.getMass() != null){ - throw new UnsupportedOperationException("todo"); + CollisionBodyCreation.setCapsuleMass( + Globals.clientSceneWrapper.getCollisionEngine(), + rigidBody, + mass, + physicsTemplate.getDimension1(), + physicsTemplate.getDimension2(), + new Vector3d(physicsTemplate.getOffsetX(), physicsTemplate.getOffsetY(), physicsTemplate.getOffsetZ()), + new Quaterniond(physicsTemplate.getRotX(), physicsTemplate.getRotY(), physicsTemplate.getRotZ(), physicsTemplate.getRotW()) + ); } + CollisionBodyCreation.setAutoDisable(Globals.clientSceneWrapper.getCollisionEngine(), rigidBody, true, LINEAR_THRESHOLD, ANGULAR_THRESHOLD, STEP_THRESHOLD); // //set offset from center of entity position @@ -254,6 +280,7 @@ public class PhysicsEntityUtils { new Quaterniond(physicsTemplate.getRotX(), physicsTemplate.getRotY(), physicsTemplate.getRotZ(), physicsTemplate.getRotW()) ); } + CollisionBodyCreation.setAutoDisable(realm.getCollisionEngine(), rigidBody, true, LINEAR_THRESHOLD, ANGULAR_THRESHOLD, STEP_THRESHOLD); // //set offset from entity center @@ -313,6 +340,7 @@ public class PhysicsEntityUtils { new Quaterniond(physicsTemplate.getRotX(), physicsTemplate.getRotY(), physicsTemplate.getRotZ(), physicsTemplate.getRotW()) ); } + CollisionBodyCreation.setAutoDisable(realm.getCollisionEngine(), rigidBody, true, LINEAR_THRESHOLD, ANGULAR_THRESHOLD, STEP_THRESHOLD); // //set offset from entity center @@ -364,8 +392,17 @@ public class PhysicsEntityUtils { Collidable.TYPE_CREATURE_BIT ); if(physicsTemplate.getMass() != null){ - throw new UnsupportedOperationException("todo"); + CollisionBodyCreation.setCapsuleMass( + realm.getCollisionEngine(), + rigidBody, + mass, + physicsTemplate.getDimension1(), + physicsTemplate.getDimension2(), + new Vector3d(physicsTemplate.getOffsetX(), physicsTemplate.getOffsetY(), physicsTemplate.getOffsetZ()), + new Quaterniond(physicsTemplate.getRotX(), physicsTemplate.getRotY(), physicsTemplate.getRotZ(), physicsTemplate.getRotW()) + ); } + CollisionBodyCreation.setAutoDisable(realm.getCollisionEngine(), rigidBody, true, LINEAR_THRESHOLD, ANGULAR_THRESHOLD, STEP_THRESHOLD); // //set offset from entity center diff --git a/src/test/java/electrosphere/entity/state/attack/ServerAttackTreeTests.java b/src/test/java/electrosphere/entity/state/attack/ServerAttackTreeTests.java index 6bf245d2..60ca12bc 100644 --- a/src/test/java/electrosphere/entity/state/attack/ServerAttackTreeTests.java +++ b/src/test/java/electrosphere/entity/state/attack/ServerAttackTreeTests.java @@ -55,7 +55,7 @@ public class ServerAttackTreeTests extends EntityTestTemplate { serverAttackTree.start(); //wait for the attack to propagate back to the client - TestEngineUtils.simulateFrames(10); + TestEngineUtils.simulateFrames(2); //verify it was started on server assertNotEquals(serverAttackTree.getState(), AttackTreeState.IDLE);