Browse Source

Added GetCollisionRayModel

lumaio teon 7 years ago
parent
commit
d003c23ecf
3 changed files with 48 additions and 0 deletions
  1. BIN
      release/libs/win32/mingw32/libraylib.a
  2. 47 0
      src/models.c
  3. 1 0
      src/raylib.h

BIN
release/libs/win32/mingw32/libraylib.a


+ 47 - 0
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)

+ 1 - 0
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)