Browse Source

Merge pull request #521 from TheLumaio/master

Added GetCollisionRayModel
Ray 7 years ago
parent
commit
9e7dedf5af
3 changed files with 17 additions and 13 deletions
  1. 2 2
      examples/models/models_mesh_picking.c
  2. 14 10
      src/models.c
  3. 1 1
      src/raylib.h

+ 2 - 2
examples/models/models_mesh_picking.c

@@ -101,8 +101,8 @@ int main()
         {
             hitMeshBBox = true;
             
-            // Check ray collision against mesh
-            meshHitInfo = GetCollisionRayMesh(ray, &tower.mesh);    
+            // Check ray collision against model
+            meshHitInfo = GetCollisionRayModel(ray, &tower);   
             
             if ((meshHitInfo.hit) && (meshHitInfo.distance < nearestHit.distance)) 
             {

+ 14 - 10
src/models.c

@@ -1966,28 +1966,28 @@ bool CheckCollisionRayBox(Ray ray, BoundingBox box)
     return collision;
 }
 
-// Get collision info between ray and mesh
-RayHitInfo GetCollisionRayMesh(Ray ray, Mesh *mesh)
+// Get collision info between ray and model
+RayHitInfo GetCollisionRayModel(Ray ray, Model *model)
 {
     RayHitInfo result = { 0 };
 
     // If mesh doesn't have vertex data on CPU, can't test it.
-    if (!mesh->vertices) return result;
+    if (!model->mesh.vertices) return result;
 
-    // mesh->triangleCount may not be set, vertexCount is more reliable
-    int triangleCount = mesh->vertexCount/3;
+    // 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 *)mesh->vertices;
+        Vector3 *vertdata = (Vector3 *)model->mesh.vertices;
 
-        if (mesh->indices)
+        if (model->mesh.indices)
         {
-            a = vertdata[mesh->indices[i*3 + 0]];
-            b = vertdata[mesh->indices[i*3 + 1]];
-            c = vertdata[mesh->indices[i*3 + 2]];
+            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
         {
@@ -1995,6 +1995,10 @@ RayHitInfo GetCollisionRayMesh(Ray ray, Mesh *mesh)
             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);
 

+ 1 - 1
src/raylib.h

@@ -1052,7 +1052,7 @@ RLAPI bool CheckCollisionRaySphere(Ray ray, Vector3 spherePosition, float sphere
 RLAPI bool CheckCollisionRaySphereEx(Ray ray, Vector3 spherePosition, float sphereRadius,
                                      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)