Browse Source

WIP scene jsonification.

Mark Sibly 7 years ago
parent
commit
f579c0f700

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

@@ -82,6 +82,13 @@ Protected
 		If scene.Editing scene.Jsonifier.AddInstance( Self,New Variant[]( _entity ) )
 	End
 	
+	Method AddInstance( component:Component )
+		
+		Local scene:=_entity.Scene
+
+		If scene.Editing scene.Jsonifier.AddInstance( Self,New Variant[]( _entity,component ) )
+	End
+	
 Internal
 
 	Method OnCopy:Component( entity:Entity ) Virtual

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

@@ -19,17 +19,23 @@ Class Animator Extends Component
 	Field Finished:Void()
 	
 	Method New( entity:Entity )
+		
 		Super.New( entity,Type )
+		
+		AddInstance()
 	End
 	
 	Method New( entity:Entity,animator:Animator )
-		Self.New( entity )
+		
+		Super.New( entity,Type )
 
 		_skeleton=animator._skeleton.Slice( 0 )
 		For Local i:=0 Until _skeleton.Length
 			_skeleton[i]=_skeleton[i].LastCopy
 		End
 		_animations=animator._animations
+		
+		AddInstance( animator )
 	End
 	
 	Property Skeleton:Entity[]()

+ 107 - 26
modules/mojo3d/scene/components/collider.monkey2

@@ -84,6 +84,7 @@ End
 Class ConvexCollider Extends Collider
 	
 	Method New( Entity:Entity )
+		
 		Super.New( Entity )
 	End
 	
@@ -91,12 +92,25 @@ End
 
 Class BoxCollider Extends ConvexCollider
 	
-	Method New( Entity:Entity )
-		Super.New( Entity )
+	Method New( entity:Entity )
+		
+		Super.New( entity )
 		
 		Box=New Boxf( -1,1 )
+		
+		AddInstance()
+	End
+	
+	Method New( entity:Entity,collider:BoxCollider )
+		
+		Super.New( entity )
+		
+		Box=collider.Box
+		
+		AddInstance( collider )
 	End
 	
+	[jsonify=1]
 	Property Box:Boxf()
 		
 		Return _box
@@ -112,9 +126,7 @@ Class BoxCollider Extends ConvexCollider
 	
 	Method OnCopy:BoxCollider( entity:Entity ) Override
 		
-		Local collider:=New BoxCollider( entity )
-		
-		collider.Box=Box
+		local collider:=New BoxCollider( entity,Self )
 		
 		Return collider
 	End
@@ -133,11 +145,24 @@ End
 
 Class SphereCollider Extends ConvexCollider
 	
-	Method New( Entity:Entity )
+	Method New( entity:Entity )
 		
-		Super.New( Entity )
+		Super.New( entity )
+		
+		AddInstance()
 	End
 	
+	Method New( entity:Entity,collider:SphereCollider )
+		
+		Super.New( entity )
+		
+		Radius=collider.Radius
+		Origin=collider.Origin
+		
+		AddInstance( collider )
+	End
+	
+	[jsonify=1]
 	Property Radius:Float()
 		
 		Return _radius
@@ -149,6 +174,7 @@ Class SphereCollider Extends ConvexCollider
 		Invalidate()
 	End
 	
+	[jsonify=1]
 	Property Origin:Vec3f()
 		
 		Return _origin
@@ -164,10 +190,7 @@ Class SphereCollider Extends ConvexCollider
 	
 	Method OnCopy:SphereCollider( entity:Entity ) Override
 		
-		Local collider:=New SphereCollider( entity )
-		
-		collider.Radius=Radius
-		collider.Origin=Origin
+		Local collider:=New SphereCollider( entity,Self )
 		
 		Return collider
 	End
@@ -190,9 +213,25 @@ End
 Class CylinderCollider Extends ConvexCollider
 	
 	Method New( entity:Entity )
+		
 		Super.New( entity )
+		
+		AddInstance()
+	End
+	
+	Method New( entity:Entity,collider:CylinderCollider )
+		
+		Super.New( entity )
+		
+		Radius=collider.Radius
+		Length=collider.Length
+		Axis=collider.Axis
+		Origin=collider.Origin
+		
+		AddInstance( collider )
 	End
 	
+	[jsonify=1]
 	Property Radius:Float()
 		
 		Return _radius
@@ -204,6 +243,7 @@ Class CylinderCollider Extends ConvexCollider
 		Invalidate()
 	End
 	
+	[jsonify=1]
 	Property Length:Float()
 		
 		Return _length
@@ -215,6 +255,7 @@ Class CylinderCollider Extends ConvexCollider
 		Invalidate()
 	End
 	
+	[jsonify=1]
 	Property Axis:Axis()
 		
 		Return _axis
@@ -226,6 +267,7 @@ Class CylinderCollider Extends ConvexCollider
 		Invalidate()
 	End
 	
+	[jsonify=1]
 	Property Origin:Vec3f()
 		
 		Return _origin
@@ -281,9 +323,25 @@ End
 Class CapsuleCollider Extends ConvexCollider
 	
 	Method New( entity:Entity )
+		
 		Super.New( entity )
+		
+		AddInstance()
 	End
 	
+	Method New( entity:Entity,collider:CapsuleCollider )
+		
+		Super.New( entity )
+		
+		Radius=collider.Radius
+		Length=collider.Length
+		Axis=collider.Axis
+		Origin=collider.Origin
+		
+		AddInstance( collider )
+	End
+	
+	[jsonify=1]
 	Property Radius:Float()
 		
 		Return _radius
@@ -295,6 +353,7 @@ Class CapsuleCollider Extends ConvexCollider
 		Invalidate()
 	End
 	
+	[jsonify=1]
 	Property Length:Float()
 		
 		Return _length
@@ -306,6 +365,7 @@ Class CapsuleCollider Extends ConvexCollider
 		Invalidate()
 	End
 	
+	[jsonify=1]
 	Property Axis:Axis()
 		
 		Return _axis
@@ -317,6 +377,7 @@ Class CapsuleCollider Extends ConvexCollider
 		Invalidate()
 	End
 	
+	[jsonify=1]
 	Property Origin:Vec3f()
 		
 		Return _origin
@@ -332,12 +393,7 @@ Class CapsuleCollider Extends ConvexCollider
 	
 	Method OnCopy:CapsuleCollider( entity:Entity ) Override
 		
-		Local collider:=New CapsuleCollider( entity )
-		
-		collider.Radius=Radius
-		collider.Length=Length
-		collider.Axis=Axis
-		collider.Origin=Origin
+		Local collider:=New CapsuleCollider( entity,Self )
 		
 		Return collider
 	End
@@ -372,9 +428,25 @@ End
 Class ConeCollider Extends ConvexCollider
 	
 	Method New( entity:Entity )
+		
+		Super.New( entity )
+		
+		AddInstance()
+	End
+
+	Method New( entity:Entity,collider:ConeCollider )
+		
 		Super.New( entity )
+		
+		Radius=collider.Radius
+		Length=collider.Length
+		Axis=collider.Axis
+		Origin=collider.Origin
+		
+		AddInstance( collider )
 	End
 	
+	[jsonify=1]
 	Property Radius:Float()
 		
 		Return _radius
@@ -386,6 +458,7 @@ Class ConeCollider Extends ConvexCollider
 		Invalidate()
 	End
 	
+	[jsonify=1]
 	Property Length:Float()
 		
 		Return _length
@@ -397,6 +470,7 @@ Class ConeCollider Extends ConvexCollider
 		Invalidate()
 	End
 	
+	[jsonify=1]
 	Property Axis:Axis()
 		
 		Return _axis
@@ -408,6 +482,7 @@ Class ConeCollider Extends ConvexCollider
 		Invalidate()
 	End
 	
+	[jsonify=1]
 	Property Origin:Vec3f()
 		
 		Return _origin
@@ -423,12 +498,7 @@ Class ConeCollider Extends ConvexCollider
 	
 	Method OnCopy:ConeCollider( entity:Entity ) Override
 		
-		Local collider:=New ConeCollider( entity )
-		
-		collider.Radius=Radius
-		collider.Length=Length
-		collider.Axis=Axis
-		collider.Origin=Origin
+		Local collider:=New ConeCollider( entity,Self )
 		
 		Return collider
 	End
@@ -463,6 +533,7 @@ End
 Class ConcaveCollider Extends Collider
 
 	Method New( entity:Entity )
+		
 		Super.New( entity )
 	End
 	
@@ -471,7 +542,19 @@ End
 Class MeshCollider Extends ConcaveCollider
 	
 	Method New( entity:Entity )
+		
 		Super.New( entity )
+		
+		AddInstance()
+	End
+	
+	Method New( entity:Entity,collider:MeshCollider )
+		
+		Super.New( entity )
+		
+		Mesh=collider.Mesh
+		
+		AddInstance( collider )
 	End
 	
 	Property Mesh:Mesh()
@@ -489,9 +572,7 @@ Class MeshCollider Extends ConcaveCollider
 	
 	Method OnCopy:MeshCollider( entity:Entity ) Override
 		
-		Local collider:=New MeshCollider( entity )
-		
-		collider.Mesh=Mesh
+		Local collider:=New MeshCollider( entity,Self )
 		
 		Return collider
 	End

+ 10 - 0
modules/mojo3d/scene/components/flybehaviour.monkey2

@@ -10,6 +10,16 @@ Class FlyBehaviour Extends Behaviour
 		AddInstance()
 	End
 	
+	Method New( entity:Entity,fly:FlyBehaviour )
+		
+		Super.New( entity )
+		
+		Speed=fly.Speed
+		RotSpeed=fly.RotSpeed
+		
+		AddInstance( fly )
+	End
+	
 	[jsonify=1]
 	Property Speed:Float()
 		

+ 9 - 0
modules/mojo3d/scene/components/movebehaviour.monkey2

@@ -9,6 +9,15 @@ Class MoveBehaviour Extends Behaviour
 		AddInstance()
 	End
 	
+	Method New( entity:Entity,move:MoveBehaviour )
+		
+		Super.New( entity )
+		
+		Speed=move.Speed
+		
+		AddInstance( move )
+	End
+	
 	[jsonify=1]
 	Property Speed:Vec3f()
 		

+ 41 - 27
modules/mojo3d/scene/components/rigidbody.monkey2

@@ -59,23 +59,26 @@ Class RigidBody Extends Component
 		
 		_btbody=New btRigidBody( _mass,_btmotion,collider?.Validate(),inertia )
 
-'		If Cast<MeshCollider>( collider )
-'			_btbody.setCollisionFlags( _btbody.getCollisionFlags() | btCollisionObject.CF_CUSTOM_MATERIAL_CALLBACK )
-'		Else
-'			_btbody.setCollisionFlags( _btbody.getCollisionFlags() & ~btCollisionObject.CF_CUSTOM_MATERIAL_CALLBACK )
-'		Endif
-		
 		Restitution=0
-		RollingFriction=0
 		Friction=1
+		RollingFriction=0
 		CollisionGroup=1
 		CollisionMask=1
+		
+		AddInstance()
 	End
 	
 	Method New( entity:Entity,body:RigidBody )
 		
-		Self.New( entity )
+		Super.New( entity,Type )
+		
+		_btmotion=New MotionState( entity )
 		
+		Local collider:=entity.Collider
+		Local inertia:btVector3=collider?.CalculateLocalInertia( _mass )
+		
+		_btbody=New btRigidBody( _mass,_btmotion,collider?.Validate(),inertia )
+
 		Kinematic=body.Kinematic
 		Mass=body.Mass
 		Restitution=body.Restitution
@@ -83,8 +86,11 @@ Class RigidBody Extends Component
 		RollingFriction=body.RollingFriction
 		CollisionGroup=body.CollisionGroup
 		CollisionMask=body.CollisionMask
+		
+		AddInstance( body )
 	End
 
+	[jsonify=1]
 	Property Kinematic:Bool()
 		
 		Return _kinematic
@@ -104,6 +110,7 @@ Class RigidBody Extends Component
 		Endif
 	End
 	
+	[jsonify=1]
 	Property Mass:Float()
 		
 		Return _mass
@@ -120,6 +127,7 @@ Class RigidBody Extends Component
 		_btbody.setMassProps( _mass,inertia )
 	End
 
+	[jsonify=1]
 	Property Restitution:Float()
 		
 		Return _btbody.getRestitution()
@@ -129,6 +137,7 @@ Class RigidBody Extends Component
 		_btbody.setRestitution( restitution )
 	End
 	
+	[jsonify=1]
 	Property Friction:Float()
 		
 		Return _btbody.getFriction()
@@ -138,6 +147,7 @@ Class RigidBody Extends Component
 		_btbody.setFriction( friction )
 	End
 	
+	[jsonify=1]
 	Property RollingFriction:Float()
 		
 		Return _btbody.getRollingFriction()
@@ -147,24 +157,7 @@ Class RigidBody Extends Component
 		_btbody.setRollingFriction( friction )
 	End
 	
-	Property LinearVelocity:Vec3f()
-		
-		Return _btbody.getLinearVelocity()
-		
-	Setter( velocity:Vec3f )
-		
-		_btbody.setLinearVelocity( velocity )
-	End
-	
-	Property AngularVelocity:Vec3f()
-		
-		Return _btbody.getAngularVelocity()
-	
-	Setter( avelocity:Vec3f )
-		
-		_btbody.setAngularVelocity( avelocity )
-	End
-
+	[jsonify=1]
 	Property CollisionGroup:Short()
 		
 		Return _collGroup
@@ -176,6 +169,7 @@ Class RigidBody Extends Component
 		_dirty|=Dirty.Collisions
 	End
 	
+	[jsonify=1]
 	Property CollisionMask:Short()
 		
 		Return _collMask
@@ -187,6 +181,24 @@ Class RigidBody Extends Component
 		_dirty|=Dirty.Collisions
 	End
 	
+	Property LinearVelocity:Vec3f()
+		
+		Return _btbody.getLinearVelocity()
+		
+	Setter( velocity:Vec3f )
+		
+		_btbody.setLinearVelocity( velocity )
+	End
+	
+	Property AngularVelocity:Vec3f()
+		
+		Return _btbody.getAngularVelocity()
+	
+	Setter( avelocity:Vec3f )
+		
+		_btbody.setAngularVelocity( avelocity )
+	End
+
 	Property btBody:btRigidBody()
 	
 		Return _btbody
@@ -243,7 +255,9 @@ Class RigidBody Extends Component
 	
 	Method OnCopy:RigidBody( entity:Entity ) Override
 		
-		Return New RigidBody( entity,Self )
+		Local body:=New RigidBody( entity,Self )
+		
+		Return body
 	End
 
 	Method OnBeginUpdate() Override

+ 7 - 0
modules/mojo3d/scene/components/rotatebehaviour.monkey2

@@ -9,6 +9,13 @@ Class RotateBehaviour Extends Behaviour
 		AddInstance()
 	End
 	
+	Method New( entity:Entity,rotate:RotateBehaviour )
+		
+		Super.New( entity )
+		
+		AddInstance( rotate )
+	End
+	
 	[jsonify=1]
 	Property Speed:Vec3f()
 		

+ 1 - 1
modules/mojo3d/scene/entities/model.monkey2

@@ -72,6 +72,7 @@ Class Model Extends Renderable
 	
 	#rem monkeydoc The materials to use for rendering.
 	#end
+	[jsonify=1]
 	Property Materials:Material[]()
 		
 		Return _materials
@@ -83,7 +84,6 @@ Class Model Extends Renderable
 	
 	#rem monkeydoc The default material to use for rendering.
 	#end
-	[jsonify=1]
 	Property Material:Material()
 		
 		Return _material

+ 23 - 7
modules/mojo3d/scene/jsonifier/jsonifier.monkey2

@@ -86,6 +86,8 @@ Class Jsonifier
 		
 		For Local i:=0 Until jinsts.Length
 			
+			Local jobj:=jinsts.GetObject( i )
+			
 			Local obj:Object
 						
 			If i<_insts.Length
@@ -93,23 +95,25 @@ Class Jsonifier
 				obj=_insts[i].obj
 				
 			Else
-				Local jobj:=jinsts.GetObject( i )
-				
 				Local ctor:=Cast<Invocation>( Dejsonify( jobj["ctor"],Typeof<Invocation> ) )
 			
 				obj=Cast<Object>( ctor.Execute() )
 			Endif
 			
 			_dejsonified.Add( obj )
+			
+			'set value type state only on this pass.
+			DejsonifyState( obj,jobj.GetObject( "state" ),obj.DynamicType,False )
 		Next
-		
+
+		'set reference type state - do this on a second pass 'coz of forward refs. Probably wont always work?
 		For Local i:=0 Until _dejsonified.Length
 			
 			Local jobj:=jinsts.GetObject( i )
 			
 			Local obj:=_dejsonified[i]
 			
-			DejsonifyState( obj,jobj.GetObject( "state" ),obj.DynamicType )
+			DejsonifyState( obj,jobj.GetObject( "state" ),obj.DynamicType,True )
 		Next
 	End
 	
@@ -124,6 +128,8 @@ Class Jsonifier
 		Select type
 		Case Typeof<Bool>
 			Return New JsonBool( Cast<Bool>( value ) )
+		Case Typeof<Short>
+			Return New JsonNumber( Cast<Short>( value ) )
 		Case Typeof<Int>
 			Return New JsonNumber( Cast<Int>( value ) )
 		Case Typeof<Float>
@@ -167,6 +173,8 @@ Class Jsonifier
 		Select type
 		Case Typeof<Bool>
 			Return jvalue.ToBool()
+		Case Typeof<Short>
+			Return Short( jvalue.ToNumber() )
 		Case Typeof<Int>
 			Return Int( jvalue.ToNumber() )
 		Case Typeof<Float>
@@ -274,12 +282,12 @@ Class Jsonifier
 		Next
 		
 	End
-	
-	Method DejsonifyState( obj:Object,jobj:JsonObject,type:TypeInfo  )
+
+	Method DejsonifyState( obj:Object,jobj:JsonObject,type:TypeInfo,refs:Bool )
 		
 		If type.Kind<>"Class" Return
 		
-		If type.SuperType DejsonifyState( obj,jobj,type.SuperType )
+		If type.SuperType DejsonifyState( obj,jobj,type.SuperType,refs )
 
 		For Local d:=Eachin type.GetDecls()
 			
@@ -289,6 +297,14 @@ Class Jsonifier
 			
 			If Not Int( d.GetMetaValue( "jsonify" ) ) Continue
 			
+			Local type:=d.Type
+			
+			Local isref:=type.Kind="Class"
+			
+			If Not isref And type.Kind="Array" And type.ElementType.Kind="Class" isref=True
+				
+			If isref<>refs Continue
+			
 			d.Set( obj,Dejsonify( jobj.GetValue( d.Name ),d.Type ) )
 		Next
 	

+ 37 - 0
modules/mojo3d/scene/jsonifier/jsonifierexts.monkey2

@@ -31,6 +31,8 @@ Class StdJsonifierExt Extends JsonifierExt
 		Case Typeof<Color>
 			Local v:=Cast<Color>( value )
 			Return jsonifier.JsonifyArray( New Float[]( v.r,v.g,v.b,v.a ) )
+		Case typeof<Axis>
+			Return New JsonNumber( Int( Cast<Axis>( value ) ) )
 		End
 		
 		Return Null
@@ -63,6 +65,8 @@ Class StdJsonifierExt Extends JsonifierExt
 		Case Typeof<Color>
 			Local v:=jsonifier.DejsonifyArray<Float>( jvalue )
 			Return New Color( v[0],v[1],v[2],v[3] )
+		Case Typeof<Axis>
+			Return Cast<Axis>( Int( jvalue.ToNumber() ) )
 		End
 		
 		Return Null
@@ -161,4 +165,37 @@ Class InvocationJsonifierExt Extends JsonifierExt
 	
 End
 
+'need to fix array handling!
+ 
+Class Mojo3dJsonifierExt Extends JsonifierExt
+	
+	Const instance:=New Mojo3dJsonifierExt
+	
+	Method Jsonify:JsonValue( value:Variant,jsonifier:Jsonifier ) Override
+		
+		Select value.Type
+		Case Typeof<Material[]>
+			Return jsonifier.JsonifyArray( Cast<Material[]>( value ) )
+		End
+		
+		Return Null
+	End
+	
+	Method Dejsonify:Variant( jvalue:JsonValue,type:TypeInfo,jsonifier:Jsonifier ) Override
+		
+		Select type
+		Case Typeof<Material[]>
+			Return jsonifier.DejsonifyArray<Material>( jvalue )
+		End
+
+		Return Null
+	End
+
+End	
+	
+			
+			
+	
+	
+