Browse Source

Added ConvexHullCollider + physics fixes.

Mark Sibly 7 years ago
parent
commit
10cc341529
1 changed files with 99 additions and 24 deletions
  1. 99 24
      modules/mojo3d/scene/components/collider.monkey2

+ 99 - 24
modules/mojo3d/scene/components/collider.monkey2

@@ -28,6 +28,11 @@ Class Collider Extends Component
 		Super.New( entity,Type )
 	End
 	
+	Method New( entity:Entity,collider:Collider )
+		
+		Super.New( entity,Type )
+	End
+
 	Property Margin:Float()
 		
 		Return Validate().getMargin()
@@ -43,9 +48,11 @@ Class Collider Extends Component
 	End
 	
 	Method Validate:btCollisionShape()
-
-		If Not _btshape _btshape=OnCreate()
-	
+		
+		If _btshape Return _btshape
+		
+		_btshape=OnCreate()
+		
 		Return _btshape
 	End
 	
@@ -55,10 +62,9 @@ Protected
 	
 	Method Invalidate()
 		
-		If Not _btshape Return
+		If Not _btshape  Return
 		
 		_btshape.destroy()
-		
 		_btshape=Null
 		
 		Entity.RigidBody?.ColliderInvalidated()
@@ -88,6 +94,11 @@ Class ConvexCollider Extends Collider
 		Super.New( Entity )
 	End
 	
+	Method New( entity:Entity,collider:ConvexCollider )
+		
+		Super.New( entity,collider )
+	End
+	
 End
 
 Class BoxCollider Extends ConvexCollider
@@ -103,7 +114,7 @@ Class BoxCollider Extends ConvexCollider
 	
 	Method New( entity:Entity,collider:BoxCollider )
 		
-		Super.New( entity )
+		Super.New( entity,collider )
 		
 		Box=collider.Box
 		
@@ -154,7 +165,7 @@ Class SphereCollider Extends ConvexCollider
 	
 	Method New( entity:Entity,collider:SphereCollider )
 		
-		Super.New( entity )
+		Super.New( entity,collider )
 		
 		Radius=collider.Radius
 		Origin=collider.Origin
@@ -221,7 +232,7 @@ Class CylinderCollider Extends ConvexCollider
 	
 	Method New( entity:Entity,collider:CylinderCollider )
 		
-		Super.New( entity )
+		Super.New( entity,collider )
 		
 		Radius=collider.Radius
 		Length=collider.Length
@@ -331,7 +342,7 @@ Class CapsuleCollider Extends ConvexCollider
 	
 	Method New( entity:Entity,collider:CapsuleCollider )
 		
-		Super.New( entity )
+		Super.New( entity,collider )
 		
 		Radius=collider.Radius
 		Length=collider.Length
@@ -436,7 +447,7 @@ Class ConeCollider Extends ConvexCollider
 
 	Method New( entity:Entity,collider:ConeCollider )
 		
-		Super.New( entity )
+		Super.New( entity,collider )
 		
 		Radius=collider.Radius
 		Length=collider.Length
@@ -530,6 +541,59 @@ Class ConeCollider Extends ConvexCollider
 	
 End
 
+Class ConvexHullCollider Extends ConvexCollider
+	
+	Method New( entity:Entity )
+		
+		Super.New( entity )
+		
+		AddInstance()
+	End
+	
+	Method New( entity:Entity,collider:ConvexHullCollider )
+		
+		Super.New( entity,collider )
+		
+		Mesh=collider.Mesh
+		
+		AddInstance( collider )
+	End
+	
+	Property Mesh:Mesh()
+		
+		Return _mesh
+	
+	Setter( mesh:Mesh ) 
+		
+		If mesh=_mesh Return
+		
+		_mesh=mesh
+		
+		Invalidate()
+	End
+
+	Private
+	
+	Field _mesh:Mesh	
+	Field _vertices:btScalar[]
+	
+	Method OnCreate:btCollisionShape() Override
+		
+		Local vertices:=_mesh.GetVertices()
+		
+		Local points:=New btScalar[vertices.Length*3]
+		
+		For Local i:=0 Until vertices.Length
+			libc.memcpy( points.Data+i*3,Varptr( vertices[i].position ),12 )
+		Next
+		
+		Local shape:=New btConvexHullShape( points.Data,points.Length/3,12 )
+		
+		Return shape
+	End
+	
+End
+
 Class ConcaveCollider Extends Collider
 
 	Method New( entity:Entity )
@@ -537,6 +601,11 @@ Class ConcaveCollider Extends Collider
 		Super.New( entity )
 	End
 	
+	Method New( entity:Entity,collider:ConcaveCollider )
+		
+		Super.New( entity,collider )
+	End
+		
 End
 
 Class MeshCollider Extends ConcaveCollider
@@ -550,18 +619,32 @@ Class MeshCollider Extends ConcaveCollider
 	
 	Method New( entity:Entity,collider:MeshCollider )
 		
-		Super.New( entity )
+		Super.New( entity,collider )
 		
+		UseInternalEdgeInfo=collider.UseInternalEdgeInfo
 		Mesh=collider.Mesh
 		
 		AddInstance( collider )
 	End
 	
+	Property UseInternalEdgeInfo:Bool()
+		
+		Return _internalEdgeInfo
+	
+	Setter( internalEdgeInfo:Bool )
+		If internalEdgeInfo=_internalEdgeInfo Return
+		
+		_internalEdgeInfo=internalEdgeInfo
+		
+		Invalidate()
+	End
+	
 	Property Mesh:Mesh()
 		
 		Return _mesh
 	
-	Setter( mesh:Mesh ) 
+	Setter( mesh:Mesh )
+		If mesh=_mesh Return
 		
 		_mesh=mesh
 		
@@ -581,27 +664,19 @@ Class MeshCollider Extends ConcaveCollider
 		
 		Local vertices:=_mesh.GetVertices()
 		_vertices=New btScalar[vertices.Length*3]
-		
 		For Local i:=0 Until vertices.Length
-			_vertices[i*3]=vertices[i].position.x
-			_vertices[i*3+1]=vertices[i].position.y
-			_vertices[i*3+2]=vertices[i].position.z
+			libc.memcpy( _vertices.Data+i*3,Varptr( vertices[i].position ),12 )
 		Next
 		
 		Local indices:=_mesh.GetAllIndices()
 		_indices=New Int[indices.Length]
-		
-		For Local i:=0 Until indices.Length Step 3
-			_indices[i+0]=indices[1]
-			_indices[i+1]=indices[i+1]
-			_indices[i+2]=indices[i+2]
-		Next
+		libc.memcpy( _indices.Data,indices.Data,_indices.Length*4 )
 		
 		_btmesh=New btTriangleIndexVertexArray( _indices.Length/3,_indices.Data,12,_vertices.Length,_vertices.Data,12 )
 		
 		Local shape:=New btBvhTriangleMeshShape( _btmesh,True,True )
 		
-'		CreateInternalEdgeInfo( shape )
+		If _internalEdgeInfo CreateInternalEdgeInfo( shape )
 		
 		Return shape
 	End
@@ -610,9 +685,9 @@ Class MeshCollider Extends ConcaveCollider
 	
 	Field _mesh:Mesh
 	Field _vertices:btScalar[]
-	'Field _vertices:btVector3[]
 	Field _indices:Int[]
 	Field _btmesh:btTriangleIndexVertexArray
+	Field _internalEdgeInfo:Bool
 	
 End