| 
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -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) | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
				
				 | 
			
			 | 
			
			
 |