From 0014b98c8541cdcd64bd00d9da9eab456080f46a Mon Sep 17 00:00:00 2001 From: austin Date: Sun, 8 Jun 2025 16:48:09 -0400 Subject: [PATCH] fix scene re-adding trees after delete --- docs/src/progress/renderertodo.md | 3 +++ .../collision/CollisionEngine.java | 2 ++ .../collision/RayCastCallback.java | 14 +++++++---- .../electrosphere/entity/scene/Scene.java | 13 +++++++++-- .../entity/types/item/ItemUtils.java | 3 +++ .../datacell/utils/DataCellSearchUtils.java | 23 ++++++++++++++++++- 6 files changed, 51 insertions(+), 7 deletions(-) diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 8e89cf3f..a5fb5d9d 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -2127,6 +2127,9 @@ Synchronization change for memory pressure Lerp non-body height differential based on distance (holds closer to ground) Sim range update +(06/08/2025) +Fix scene re-adding tree that was previously removed + diff --git a/src/main/java/electrosphere/collision/CollisionEngine.java b/src/main/java/electrosphere/collision/CollisionEngine.java index c54ac599..e9c2c95f 100644 --- a/src/main/java/electrosphere/collision/CollisionEngine.java +++ b/src/main/java/electrosphere/collision/CollisionEngine.java @@ -944,6 +944,7 @@ public class CollisionEngine { //create the ray DRay ray = OdeHelper.createRay(space, length); ray.set(start.x - this.floatingOrigin.x, start.y - this.floatingOrigin.y, start.z - this.floatingOrigin.z, unitDir.x, unitDir.y, unitDir.z); + ray.setCategoryBits(Collidable.TYPE_OBJECT_BIT); //collide RayCastCallbackData data = new RayCastCallbackData(bodyPointerMap, geomPointerMap, null); rayCastCallback.setLength(length); @@ -968,6 +969,7 @@ public class CollisionEngine { //create the ray DRay ray = OdeHelper.createRay(space, length); ray.set(start.x - this.floatingOrigin.x, start.y - this.floatingOrigin.y, start.z - this.floatingOrigin.z, unitDir.x, unitDir.y, unitDir.z); + ray.setCategoryBits(Collidable.TYPE_OBJECT_BIT); //collide RayCastCallbackData data = new RayCastCallbackData(bodyPointerMap, geomPointerMap, typeMask); rayCastCallback.setLength(length); diff --git a/src/main/java/electrosphere/collision/RayCastCallback.java b/src/main/java/electrosphere/collision/RayCastCallback.java index 2ac550f4..e68b09c5 100644 --- a/src/main/java/electrosphere/collision/RayCastCallback.java +++ b/src/main/java/electrosphere/collision/RayCastCallback.java @@ -59,16 +59,22 @@ void RayCallback(void *Data, dGeomID Geometry1, dGeomID Geometry2) { @Override public void call(Object data, DGeom o1, DGeom o2) { - // if (o1->body && o2->body) return; RayCastCallbackData rayCastData = (RayCastCallbackData)data; + //Don't self-collide + if(o1 == o2){ + return; + } + //null out potentially previous results // rayCastData.collisionPosition = null; // rayCastData.collidedEntity = null; // exit without doing anything if the two bodies are connected by a joint DBody b1 = o1.getBody(); DBody b2 = o2.getBody(); - if (b1!=null && b2!=null && areConnectedExcluding (b1,b2,DContactJoint.class)) return; + if(b1 != null && b2 != null && areConnectedExcluding(b1,b2,DContactJoint.class)){ + return; + } Collidable collidable1 = rayCastData.bodyEntityMap.get(b1); Collidable collidable2 = rayCastData.bodyEntityMap.get(b2); @@ -106,8 +112,8 @@ void RayCallback(void *Data, dGeomID Geometry1, dGeomID Geometry2) { //calculate collisions int numc = OdeHelper.collide(o1,o2,MAX_CONTACTS,contacts.getGeomBuffer()); //create DContacts based on each collision that occurs - if (numc != 0) { - for (int i=0; i