summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJeffery Myers <[email protected]>2020-12-14 10:26:32 -0800
committerGitHub <[email protected]>2020-12-14 19:26:32 +0100
commit7a0e73331d1b243ff6ad95ca6c38c04bf83928a3 (patch)
tree611d8824fc28b6fa4b7628340e14c3ebab15f4ac
parenta840d8a77d3b582226ce08326a709d388016e87a (diff)
downloadraylib-7a0e73331d1b243ff6ad95ca6c38c04bf83928a3.tar.gz
raylib-7a0e73331d1b243ff6ad95ca6c38c04bf83928a3.zip
Add mesh collision function so we can check meshes directly instead of having to put them in a model. (#1459)
Make model collision function call the mesh function.
-rw-r--r--src/models.c86
-rw-r--r--src/raylib.h1
2 files changed, 51 insertions, 36 deletions
diff --git a/src/models.c b/src/models.c
index c0b1bf05..ac9c63ba 100644
--- a/src/models.c
+++ b/src/models.c
@@ -2838,6 +2838,51 @@ bool CheckCollisionRayBox(Ray ray, BoundingBox box)
return collision;
}
+// Get collision info between ray and mesh
+RayHitInfo GetCollisionRayMesh(Ray ray, Mesh mesh, Matrix transform)
+{
+ RayHitInfo result = { 0 };
+
+ // Check if mesh vertex data on CPU for testing
+ if (mesh.vertices != NULL)
+ {
+ // model->mesh.triangleCount may not be set, vertexCount is more reliable
+ int triangleCount = mesh.vertexCount / 3;
+
+ // Test against all triangles in mesh
+ for (int i = 0; i < triangleCount; i++)
+ {
+ Vector3 a, b, c;
+ Vector3* vertdata = (Vector3*)mesh.vertices;
+
+ if (mesh.indices)
+ {
+ a = vertdata[mesh.indices[i * 3 + 0]];
+ b = vertdata[mesh.indices[i * 3 + 1]];
+ c = vertdata[mesh.indices[i * 3 + 2]];
+ }
+ else
+ {
+ a = vertdata[i * 3 + 0];
+ b = vertdata[i * 3 + 1];
+ c = vertdata[i * 3 + 2];
+ }
+
+ a = Vector3Transform(a, transform);
+ b = Vector3Transform(b, transform);
+ c = Vector3Transform(c, transform);
+
+ RayHitInfo triHitInfo = GetCollisionRayTriangle(ray, a, b, c);
+
+ if (triHitInfo.hit)
+ {
+ // Save the closest hit triangle
+ if ((!result.hit) || (result.distance > triHitInfo.distance)) result = triHitInfo;
+ }
+ }
+ }
+ return result;
+}
// Get collision info between ray and model
RayHitInfo GetCollisionRayModel(Ray ray, Model model)
@@ -2846,43 +2891,12 @@ RayHitInfo GetCollisionRayModel(Ray ray, Model model)
for (int m = 0; m < model.meshCount; m++)
{
- // Check if meshhas vertex data on CPU for testing
- if (model.meshes[m].vertices != NULL)
- {
- // model->mesh.triangleCount may not be set, vertexCount is more reliable
- int triangleCount = model.meshes[m].vertexCount/3;
-
- // Test against all triangles in mesh
- for (int i = 0; i < triangleCount; i++)
- {
- Vector3 a, b, c;
- Vector3 *vertdata = (Vector3 *)model.meshes[m].vertices;
-
- if (model.meshes[m].indices)
- {
- a = vertdata[model.meshes[m].indices[i*3 + 0]];
- b = vertdata[model.meshes[m].indices[i*3 + 1]];
- c = vertdata[model.meshes[m].indices[i*3 + 2]];
- }
- else
- {
- a = vertdata[i*3 + 0];
- b = vertdata[i*3 + 1];
- c = vertdata[i*3 + 2];
- }
-
- a = Vector3Transform(a, model.transform);
- b = Vector3Transform(b, model.transform);
- c = Vector3Transform(c, model.transform);
+ RayHitInfo meshHitInfo = GetCollisionRayMesh(ray, model.meshes[m], model.transform);
- RayHitInfo triHitInfo = GetCollisionRayTriangle(ray, a, b, c);
-
- if (triHitInfo.hit)
- {
- // Save the closest hit triangle
- if ((!result.hit) || (result.distance > triHitInfo.distance)) result = triHitInfo;
- }
- }
+ if (meshHitInfo.hit)
+ {
+ // Save the closest hit mesh
+ if ((!result.hit) || (result.distance > meshHitInfo.distance)) result = meshHitInfo;
}
}
diff --git a/src/raylib.h b/src/raylib.h
index 3060be00..4d889e34 100644
--- a/src/raylib.h
+++ b/src/raylib.h
@@ -1377,6 +1377,7 @@ RLAPI bool CheckCollisionBoxSphere(BoundingBox box, Vector3 center, float radius
RLAPI bool CheckCollisionRaySphere(Ray ray, Vector3 center, float radius); // Detect collision between ray and sphere
RLAPI bool CheckCollisionRaySphereEx(Ray ray, Vector3 center, float radius, Vector3 *collisionPoint); // Detect collision between ray and sphere, returns collision point
RLAPI bool CheckCollisionRayBox(Ray ray, BoundingBox box); // Detect collision between ray and box
+RLAPI RayHitInfo GetCollisionRayMesh(Ray ray, Mesh mesh, Matrix transform); // Get collision info between ray and mesh
RLAPI RayHitInfo GetCollisionRayModel(Ray ray, Model model); // Get collision info between ray and model
RLAPI RayHitInfo GetCollisionRayTriangle(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3); // Get collision info between ray and triangle
RLAPI RayHitInfo GetCollisionRayGround(Ray ray, float groundHeight); // Get collision info between ray and ground plane (Y-normal plane)