Bladeren bron

Simplified mojo3d Component. Added Component.Destroy().

Mark Sibly 7 jaren geleden
bovenliggende
commit
aba470d7e2

+ 1 - 1
modules/mojo3d/components/animator.monkey2

@@ -5,7 +5,7 @@ Class Entity Extension
 	
 	Property Animator:Animator()
 		
-		Return GetComponent<Animator>()
+		Return Cast<Animator>( GetComponent( Animator.Type ) )
 	End
 	
 End

+ 1 - 1
modules/mojo3d/components/collider.monkey2

@@ -14,7 +14,7 @@ Class Entity Extension
 	
 	Property Collider:Collider()
 		
-		Return GetComponent<Collider>()
+		Return Cast<Collider>( GetComponent( Collider.Type ) )
 	End
 	
 End

+ 1 - 1
modules/mojo3d/components/rigidbody.monkey2

@@ -39,7 +39,7 @@ Class Entity Extension
 	
 	Property RigidBody:RigidBody()
 		
-		Return GetComponent<RigidBody>()
+		Return Cast<RigidBody>( GetComponent( RigidBody.Type ) )
 	End
 	
 End

+ 13 - 0
modules/mojo3d/scene/component.monkey2

@@ -46,7 +46,9 @@ Class Component
 	Method New( entity:Entity,type:ComponentType )
 		
 		_entity=entity
+		
 		_type=type
+		
 		_entity.AddComponent( Self )
 	End
 	
@@ -60,6 +62,17 @@ Class Component
 		Return _type
 	End
 	
+	Method Destroy()
+		
+		OnDestroy()
+		
+		_entity.RemoveComponent( Self )
+		
+		_entity=Null
+		
+		_type=Null
+	End
+	
 Internal
 
 	Method OnCopy:Component( entity:Entity ) Virtual

+ 18 - 54
modules/mojo3d/scene/entity.monkey2

@@ -328,9 +328,9 @@ Class Entity Extends DynamicObject
 			_children.Top.Destroy()
 		Wend
 		
-		For Local c:=Eachin _components
-			c.OnDestroy()
-		Next
+		While Not _components.Empty
+			_components.Top.Destroy()
+		Wend
 
 		_visible=False
 		
@@ -348,59 +348,15 @@ Class Entity Extends DynamicObject
 		Destroyed()
 	End
 	
-	#rem monkeydoc @hidden
-	#end
-	Method NumComponents:Int( type:ComponentType )
+	Method GetComponent:Component( type:ComponentType )
 		
-		Local n:=0
 		For Local c:=Eachin _components
-			If c.Type=type n+=1
+			If c.Type=type Return c
 		Next
-		Return n
-	End
-
-	Method NumComponents<T>:Int()
 		
-		Local n:=0
-		For Local c:=Eachin _components
-			If c.Type=T.Type n+=1
-		Next
-		Return n
-	End
-
-	Method AddComponent<T>:T() Where T Extends Component
-		
-		Local c:=New T( Self )
-		
-		Return c
-	End
-	
-	Method GetComponent<T>:T( index:Int=0 ) Where T Extends Component
-	
-		For Local c:=Eachin _components
-			If c.Type<>T.Type Continue
-			
-			If index=0 Return Cast<T>( c )
-			index-=1
-		Next
 		Return Null
 	End
 	
-	Method DestroyComponent<T>( index:Int=0 ) Where T Extends Component
-		
-		For Local i:=0 Until _components.Length
-			
-			Local c:=_components[i]
-			If c.Type<>T.Type Continue
-			
-			If index=0
-				_components.Erase( i )
-				Return
-			Endif
-			index-=1
-		Next
-	End
-	
 	Protected
 
 	Method New( entity:Entity,parent:Entity )
@@ -451,13 +407,16 @@ Class Entity Extends DynamicObject
 	Internal
 	
 	Method AddComponent( c:Component )
-
-		If c.Type.Flags & ComponentTypeFlags.Singleton 
-			If NumComponents( c.Type ) RuntimeError( "Duplicate component" )
-		Endif
+		
+		Local type:=c.Type
 			
 		For Local i:=0 Until _components.Length
-			If c.Type.Priority>_components[i].Type.Priority
+			
+			If type.Flags & ComponentTypeFlags.Singleton And _components[i].Type=type
+				RuntimeError( "Duplicate component" )
+			Endif
+			
+			If type.Priority>_components[i].Type.Priority
 				_components.Insert( i,c )
 				Return
 			Endif
@@ -465,6 +424,11 @@ Class Entity Extends DynamicObject
 
 		_components.Add( c )
 	End
+	
+	Method RemoveComponent( c:Component )
+		
+		_components.Remove( c )
+	End
 
 	'bottom up
 	Method BeginUpdate()