Skip to content

Commit e9854cd

Browse files
committed
Added 3D broadphaselayer test in ray
1 parent 9384129 commit e9854cd

File tree

5 files changed

+42
-5
lines changed

5 files changed

+42
-5
lines changed

engine/core/Scene.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,10 @@ Scene::~Scene(){
8585
destroy();
8686

8787
std::vector<Entity> entityList = entityManager.getEntityList();
88-
for(int entity : entityList){
89-
destroyEntity(entity);
88+
while(entityList.size() > 0){
89+
destroyEntity(entityList.front());
90+
// some entities can destroy other entities (ex: models)
91+
entityList = entityManager.getEntityList();
9092
}
9193

9294
}

engine/core/math/Ray.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,38 @@ RayReturn Ray::intersects(Scene* scene, RayFilter raytest, bool onlyStatic, uint
365365

366366
return {true, hit.mFraction, getPoint(hit.mFraction), Vector3(normal.GetX(), normal.GetY(), normal.GetZ()), entity, shapeIndex};
367367
}
368+
}
369+
}
370+
371+
return NO_HIT;
372+
}
373+
374+
RayReturn Ray::intersects(Scene* scene, uint8_t broadPhaseLayer3D){
375+
return intersects(scene, broadPhaseLayer3D, (uint16_t)~0u, (uint16_t)~0u);
376+
}
377+
378+
RayReturn Ray::intersects(Scene* scene, uint8_t broadPhaseLayer3D, uint16_t categoryBits, uint16_t maskBits){
379+
JPH::PhysicsSystem* world = scene->getSystem<PhysicsSystem>()->getWorld3D();
380+
381+
if (world && broadPhaseLayer3D < MAX_BROADPHASELAYER_3D){
382+
JPH::RayCast ray(JPH::Vec3(origin.x, origin.y, origin.z), JPH::Vec3(direction.x, direction.y, direction.z));
383+
JPH::RayCastResult hit;
384+
385+
JPH::ObjectLayer objectLayer = JPH::ObjectLayerPairFilterMask::sGetObjectLayer(categoryBits, maskBits);
386+
387+
if (world->GetNarrowPhaseQuery().CastRay(JPH::RRayCast(ray), hit, JPH::SpecifiedBroadPhaseLayerFilter(JPH::BroadPhaseLayer(broadPhaseLayer3D)), JPH::DefaultObjectLayerFilter(JPH::ObjectLayerPairFilterMask(), objectLayer))){
388+
JPH::Vec3 normal;
389+
Entity entity = NULL_ENTITY;
390+
size_t shapeIndex = 0;
391+
JPH::BodyLockRead lock(world->GetBodyLockInterface(), hit.mBodyID);
392+
if (lock.Succeeded()){
393+
const JPH::Body &hit_body = lock.GetBody();
394+
normal = hit_body.GetWorldSpaceSurfaceNormal(hit.mSubShapeID2, ray.GetPointOnRay(hit.mFraction));
395+
entity = hit_body.GetUserData();
396+
shapeIndex = hit_body.GetShape()->GetSubShapeUserData(hit.mSubShapeID2);
397+
}
368398

399+
return {true, hit.mFraction, getPoint(hit.mFraction), Vector3(normal.GetX(), normal.GetY(), normal.GetZ()), entity, shapeIndex};
369400
}
370401
}
371402

engine/core/math/Ray.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ namespace Supernova {
5959
RayReturn intersects(Scene* scene, RayFilter raytest, bool onlyStatic);
6060
RayReturn intersects(Scene* scene, RayFilter raytest, uint16_t categoryBits, uint16_t maskBits);
6161
RayReturn intersects(Scene* scene, RayFilter raytest, bool onlyStatic, uint16_t categoryBits, uint16_t maskBits);
62+
RayReturn intersects(Scene* scene, uint8_t broadPhaseLayer3D); // only 3D bodies
63+
RayReturn intersects(Scene* scene, uint8_t broadPhaseLayer3D, uint16_t categoryBits, uint16_t maskBits); // only 3D bodies
6264
};
6365

6466
}

engine/core/script/binding/MathClassesLua.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,9 @@ void LuaBinding::registerMathClasses(lua_State *L){
423423
luabridge::overload<Scene*, RayFilter>(&Ray::intersects),
424424
luabridge::overload<Scene*, RayFilter, bool>(&Ray::intersects),
425425
luabridge::overload<Scene*, RayFilter, uint16_t, uint16_t>(&Ray::intersects),
426-
luabridge::overload<Scene*, RayFilter, bool, uint16_t, uint16_t>(&Ray::intersects))
426+
luabridge::overload<Scene*, RayFilter, bool, uint16_t, uint16_t>(&Ray::intersects),
427+
luabridge::overload<Scene*, uint8_t>(&Ray::intersects),
428+
luabridge::overload<Scene*, uint8_t, uint16_t, uint16_t>(&Ray::intersects))
427429
.endClass();
428430

429431
#endif //DISABLE_LUA_BINDINGS

engine/core/subsystem/MeshSystem.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1914,8 +1914,6 @@ bool MeshSystem::loadGLTF(Entity entity, std::string filename){
19141914
}
19151915
}
19161916

1917-
clearAnimations(model);
1918-
19191917
for (size_t i = 0; i < model.gltfModel->animations.size(); i++) {
19201918
const tinygltf::Animation &animation = model.gltfModel->animations[i];
19211919

@@ -2082,6 +2080,8 @@ bool MeshSystem::loadOBJ(Entity entity, std::string filename){
20822080
ModelComponent& model = scene->getComponent<ModelComponent>(entity);
20832081
Transform& transform = scene->getComponent<Transform>(entity);
20842082

2083+
destroyModel(model);
2084+
20852085
tinyobj::attrib_t attrib;
20862086
std::vector<tinyobj::shape_t> shapes;
20872087
std::vector<tinyobj::material_t> materials;

0 commit comments

Comments
 (0)