aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorlumaio teon <lumaioteon@gmail.com>2018-04-06 12:04:09 -0400
committerlumaio teon <lumaioteon@gmail.com>2018-04-06 12:04:09 -0400
commitd003c23ecf6ec22f4811d07cb30fd2c86cf1d190 (patch)
tree37236fec162d95da97baad65d6edb4968a056012 /src
parentb8bd1d2ea68adbf85b05a273df42eab42352a7c2 (diff)
downloadraylib-d003c23ecf6ec22f4811d07cb30fd2c86cf1d190.tar.gz
raylib-d003c23ecf6ec22f4811d07cb30fd2c86cf1d190.zip
Added GetCollisionRayModel
Diffstat (limited to 'src')
-rw-r--r--src/models.c47
-rw-r--r--src/raylib.h1
2 files changed, 48 insertions, 0 deletions
diff --git a/src/models.c b/src/models.c
index ae1fc968..0db46fc1 100644
--- a/src/models.c
+++ b/src/models.c
@@ -2008,6 +2008,53 @@ RayHitInfo GetCollisionRayMesh(Ray ray, Mesh *mesh)
return result;
}
+// Get collision info between ray and model
+// NOTE: This is an exact clone of GetCollisionRayMesh but applies transformation matrix from the model to the vertices
+RayHitInfo GetCollisionRayModel(Ray ray, Model *model)
+{
+ RayHitInfo result = { 0 };
+
+ // If mesh doesn't have vertex data on CPU, can't test it.
+ if (!model->mesh.vertices) return result;
+
+ // model->mesh.triangleCount may not be set, vertexCount is more reliable
+ int triangleCount = model->mesh.vertexCount/3;
+
+ // Test against all triangles in mesh
+ for (int i = 0; i < triangleCount; i++)
+ {
+ Vector3 a, b, c;
+ Vector3 *vertdata = (Vector3 *)model->mesh.vertices;
+
+ if (model->mesh.indices)
+ {
+ a = vertdata[model->mesh.indices[i*3 + 0]];
+ b = vertdata[model->mesh.indices[i*3 + 1]];
+ c = vertdata[model->mesh.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 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 triangle
// NOTE: Based on https://en.wikipedia.org/wiki/M%C3%B6ller%E2%80%93Trumbore_intersection_algorithm
RayHitInfo GetCollisionRayTriangle(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3)
diff --git a/src/raylib.h b/src/raylib.h
index 3986ebcf..12ec5e24 100644
--- a/src/raylib.h
+++ b/src/raylib.h
@@ -1053,6 +1053,7 @@ RLAPI bool CheckCollisionRaySphereEx(Ray ray, Vector3 spherePosition, float sphe
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); // 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)