diff --git a/Nuake/src/Physics/DynamicWorld.cpp b/Nuake/src/Physics/DynamicWorld.cpp index b17f19e3..f44919c5 100644 --- a/Nuake/src/Physics/DynamicWorld.cpp +++ b/Nuake/src/Physics/DynamicWorld.cpp @@ -233,6 +233,7 @@ namespace Nuake return false; } } + }; BPLayerInterfaceImpl JoltBroadphaseLayerInterface = BPLayerInterfaceImpl(); @@ -522,6 +523,8 @@ namespace Nuake JPH::ShapeCastSettings shapeCastSetting; shapeCastSetting.mCollectFacesMode = JPH::ECollectFacesMode::CollectFaces; + shapeCastSetting.mUseShrunkenShapeAndConvexRadius = true; + _JoltPhysicsSystem->GetNarrowPhaseQuery().CastShape(ray, shapeCastSetting, JPH::Vec3(0, 0, 0), collector); std::vector shapecastResults; @@ -538,14 +541,16 @@ namespace Nuake auto bodyId = static_cast(results[i].mBodyID2); JPH::TransformedShape ts = _JoltPhysicsSystem->GetBodyInterface().GetTransformedShape(results[i].mBodyID2); - JPH::Vec3 surfaceNormal = ts.GetWorldSpaceSurfaceNormal(results[i].mSubShapeID2, results[i].mContactPointOn2); - + + auto layer = _JoltBodyInterface->GetObjectLayer(bodyId); + ShapeCastResult result { Vector3(hitPosition.GetX(), hitPosition.GetY(), hitPosition.GetZ()), hitFraction, - Vector3(surfaceNormal.GetX(), surfaceNormal.GetY(), surfaceNormal.GetZ()) + Vector3(surfaceNormal.GetX(), surfaceNormal.GetY(), surfaceNormal.GetZ()), + layer }; shapecastResults.push_back(std::move(result)); diff --git a/Nuake/src/Physics/RaycastResult.h b/Nuake/src/Physics/RaycastResult.h index 4abc67ca..995914bc 100644 --- a/Nuake/src/Physics/RaycastResult.h +++ b/Nuake/src/Physics/RaycastResult.h @@ -17,5 +17,6 @@ namespace Nuake Vector3 ImpactPosition; float Fraction; Vector3 ImpactNormal; + float Layer; }; } diff --git a/Nuake/src/Scripting/NetModules/EngineNetAPI.cpp b/Nuake/src/Scripting/NetModules/EngineNetAPI.cpp index 5c56536d..7ca7adb4 100644 --- a/Nuake/src/Scripting/NetModules/EngineNetAPI.cpp +++ b/Nuake/src/Scripting/NetModules/EngineNetAPI.cpp @@ -47,6 +47,7 @@ namespace Nuake { results.push_back(hit.ImpactNormal.y); results.push_back(hit.ImpactNormal.z); results.push_back(hit.Fraction); + results.push_back(hit.Layer); } return Coral::Array::New(results); diff --git a/NuakeNet/src/Physic.cs b/NuakeNet/src/Physic.cs index 5e3d03f0..4d37cb93 100644 --- a/NuakeNet/src/Physic.cs +++ b/NuakeNet/src/Physic.cs @@ -92,6 +92,7 @@ namespace Nuake.Net public Vector3 ImpactPosition; public Vector3 ImpactNormal; public float Fraction; + public Layers Layer; } public struct BoxInternal { @@ -106,6 +107,16 @@ namespace Nuake.Net public float Height; } + public enum Layers + { + NON_MOVING = 0, + MOVING = 1, + KINEMATIC = 2, + CHARACTER_GHOST = 3, + CHARACTER = 4, + SENSORS = 5 + } + internal static unsafe delegate*> ShapeCastBoxIcall; internal static unsafe delegate*> ShapeCastSphereIcall; internal static unsafe delegate*> ShapeCastCapsuleIcall; @@ -125,7 +136,6 @@ namespace Nuake.Net { NativeArray resultICall = ShapeCastBoxIcall(from.X, from.Y, from.Z, to.X, to.Y, to.Z, boxInternal); - for (int i = 0; i < resultICall.Length / 7; i++) { int index = i * 7; @@ -133,7 +143,8 @@ namespace Nuake.Net { ImpactPosition = new Vector3(resultICall[index + 0], resultICall[index + 1], resultICall[index + 2]), ImpactNormal = new Vector3(resultICall[index + 3], resultICall[index + 4], resultICall[index + 5]), - Fraction = resultICall[index + 6] + Fraction = resultICall[index + 6], + Layer = (Layers)resultICall[index + 7] }; result.Add(shapeCastResult); @@ -158,7 +169,8 @@ namespace Nuake.Net { ImpactPosition = new Vector3(resultICall[index + 0], resultICall[index + 1], resultICall[index + 2]), ImpactNormal = new Vector3(resultICall[index + 3], resultICall[index + 4], resultICall[index + 5]), - Fraction = resultICall[index + 6] + Fraction = resultICall[index + 6], + Layer = (Layers)resultICall[index + 7] }; result.Add(shapeCastResult); @@ -189,7 +201,8 @@ namespace Nuake.Net { ImpactPosition = new Vector3(resultICall[index + 0], resultICall[index + 1], resultICall[index + 2]), ImpactNormal = new Vector3(resultICall[index + 3], resultICall[index + 4], resultICall[index + 5]), - Fraction = resultICall[index + 6] + Fraction = resultICall[index + 6], + Layer = (Layers)resultICall[index + 7] }; result.Add(shapeCastResult); @@ -220,7 +233,8 @@ namespace Nuake.Net { ImpactPosition = new Vector3(resultICall[index + 0], resultICall[index + 1], resultICall[index + 2]), ImpactNormal = new Vector3(resultICall[index + 3], resultICall[index + 4], resultICall[index + 5]), - Fraction = resultICall[index + 6] + Fraction = resultICall[index + 6], + Layer = (Layers)resultICall[index + 7] }; result.Add(shapeCastResult);