Browse Source

mojo3d jsonifier and envmap fixes.

Mark Sibly 7 years ago
parent
commit
d58a250238

File diff suppressed because it is too large
+ 180 - 176
ducks-scene.mojo3d


+ 1 - 1
modules/mojo3d/render/renderer.monkey2

@@ -832,7 +832,7 @@ When a new renderer is created, the config setting `MOJO3D\_RENDERER` can be use
 		_gdevice.BindUniformBlock( _runiforms )
 		_gdevice.BindUniformBlock( _iuniforms )
 		
-		_defaultEnv=Texture.Load( "asset::textures/env_default.jpg",TextureFlags.FilterMipmap|TextureFlags.Cubemap )
+		_defaultEnv=Texture.Load( "asset::textures/env_default.jpg",TextureFlags.FilterMipmap|TextureFlags.Cubemap|TextureFlags.Envmap )
 		
 		_skyboxShader=Shader.Open( "misc/skybox",ShaderDefs )
 

+ 4 - 4
modules/mojo3d/scene/entities/camera.monkey2

@@ -17,9 +17,9 @@ Class Camera Extends Entity
 		Far=100
 		FOV=90
 		
-		AddInstance()
-		
 		Visible=True
+		
+		AddInstance()
 	End
 
 	Method New( view:View,parent:Entity=Null )
@@ -32,9 +32,9 @@ Class Camera Extends Entity
 		Far=100
 		FOV=90
 		
-		AddInstance()
-		
 		Visible=True
+		
+		AddInstance()
 	End
 	
 	#rem monkeydoc Copies the camera.

+ 2 - 2
modules/mojo3d/scene/entities/light.monkey2

@@ -35,9 +35,9 @@ Class Light Extends Entity
 		OuterAngle=30
 		CastsShadow=False
 		
-		AddInstance()
-		
 		Visible=True
+		
+		AddInstance()
 	End
 	
 	#rem monkeydoc Copies the light.

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

@@ -20,9 +20,9 @@ Class Model Extends Renderable
 		
 		Name="Model"
 		
-		AddInstance()
-		
 		Visible=True
+		
+		AddInstance()
 	End
 	
 	Method New( mesh:Mesh,material:Material,parent:Entity=Null )
@@ -31,13 +31,13 @@ Class Model Extends Renderable
 		
 		Name="Model"
 		
-		AddInstance( New Variant[]( mesh,material,parent ) )
-		
 		Mesh=mesh
 		Materials=New Material[]( material )
 		Material=material
 		
 		Visible=True
+
+		AddInstance( New Variant[]( mesh,material,parent ) )
 	End
 	
 	#rem monkeydoc Copies the model.

+ 5 - 0
modules/mojo3d/scene/entities/particlesystem.monkey2

@@ -12,6 +12,8 @@ Class ParticleSystem Extends Renderable
 		_material=New ParticleMaterial
 		
 		Visible=True
+		
+		AddInstance()
 	End
 
 	Method New( particleBuffer:ParticleBuffer,material:ParticleMaterial,parent:Entity=Null )
@@ -21,6 +23,8 @@ Class ParticleSystem Extends Renderable
 		_material=material
 		
 		Visible=True
+		
+		AddInstance( New Variant[]( particleBuffer,material,parent ) )
 	End
 
 	#rem monkeydoc Copies the particle system.
@@ -83,3 +87,4 @@ Class ParticleSystem Extends Renderable
 	Field _material:ParticleMaterial
 	
 End
+

+ 46 - 51
modules/mojo3d/scene/jsonifier/jsonifier.monkey2

@@ -136,16 +136,17 @@ Public
 			jobjsById[id]=jobj
 		Next
 		
-		'copy of insts alreday created (ie: initial Scene)
-		Local tinsts:=_insts.ToArray(),id:=0
+		Local id:=0
 		
 		For Local i:=0 Until jinsts.Length
 			
 			Local jobj:=jinsts.GetObject( i )
 			If Not jobj.Contains( "ctor" ) Continue
 			
-			Local ctor:=Cast<Invocation>( Dejsonify( jobj["ctor"],Typeof<Invocation> ) )
-			ctor.Execute()
+			If jobj.GetNumber( "id" )>=_insts.Length
+				Local ctor:=Cast<Invocation>( Dejsonify( jobj["ctor"],Typeof<Invocation> ) )
+				ctor.Execute()
+			Endif
 			
 			For Local j:=id Until _insts.Length
 				
@@ -255,23 +256,34 @@ Public
 	
 	Method Dejsonify:Variant( jvalue:JsonValue,type:TypeInfo )
 		
-		'handle primitive types
-		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>
-			Return Float( jvalue.ToNumber() )
-		Case Typeof<String>
-			Return jvalue.ToString()
+		Select type.Kind
+		Case "Primitive"
+			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>
+				Return Float( jvalue.ToNumber() )
+			Case Typeof<String>
+				Return jvalue.ToString()
+			End
+		Case "Array"
+			Local elemType:=type.ElementType
+			Local jarray:=Cast<JsonArray>( jvalue )
+			Local n:=jarray.Length,v:=elemType.NewArray( n )
+			For Local i:=0 Until n
+				Local elem:=Dejsonify( jarray[i],elemType )
+				v.SetArrayElement( i,elem )
+			Next
+			Return v
+		Case "Enum"
+			Return type.MakeEnum( jvalue.ToNumber() )
 		End
 		
-		'handle references
-		Select type.Kind
-		Case "Class"
+		If IsInstanceType( type )
 			If jvalue.IsNull
 				Return type.NullValue
 			Elseif jvalue.IsString
@@ -279,9 +291,7 @@ Public
 				Assert( id>=0 And id<_insts.Length,"Dejsonify error" )
 				Return _insts[id].obj
 			Endif
-		Case "Enum"
-			Return type.MakeEnum( jvalue.ToNumber() )
-		End
+		Endif
 		
 		'try custom jsonifiers
 		For Local jext:=Eachin JsonifierExt.All
@@ -289,26 +299,6 @@ Public
 			If value Return value
 		Next
 
-		Select type.Kind
-		Case "Unknown"
-			If jvalue.IsString
-				Local id:=Int( jvalue.ToString().Slice( 1 ) )
-				Assert( id>=0 And id<_insts.Length,"Dejsonify error" )
-				Return _insts[id].obj
-			Endif
-		Case "Class"
-			Return type.NullValue
-		Case "Array"
-			Local elemType:=type.ElementType
-			Local jarray:=Cast<JsonArray>( jvalue )
-			Local n:=jarray.Length,v:=elemType.NewArray( n )
-			For Local i:=0 Until n
-				Local elem:=Dejsonify( jarray[i],elemType )
-				v.SetArrayElement( i,elem )
-			Next
-			Return v
-		End
-		
 		RuntimeError( "No dejsonifier found for type '"+type+"'" )
 		
 		Return Null
@@ -343,12 +333,23 @@ Public
 		Next
 		
 	End
+	
+	Method IsInstanceType:Bool( type:TypeInfo )
+		
+		If type.Kind="Class" Return True
+		
+		If type=Typeof<Texture> Return True	'Cheeze it for now!
+		
+		If type.Kind="Array" Return IsInstanceType( type.ElementType )
+		
+		Return False
+	End
 
-	Method DejsonifyState( obj:Object,jobj:JsonObject,type:TypeInfo,insts:Bool )
+	Method DejsonifyState( obj:Object,jobj:JsonObject,type:TypeInfo,instTypes:Bool )
 		
 		If type.Kind<>"Class" Return
 		
-		If type.SuperType DejsonifyState( obj,jobj,type.SuperType,insts )
+		If type.SuperType DejsonifyState( obj,jobj,type.SuperType,instTypes )
 
 		For Local d:=Eachin type.GetDecls()
 			
@@ -358,13 +359,7 @@ Public
 			
 			If Not Int( d.GetMetaValue( "jsonify" ) ) Continue
 			
-			Local type:=d.Type
-			
-			Local isinst:=type.Kind="Class" Or type.Kind="Unknown"
-			
-			If Not isinst And type.Kind="Array" And type.ElementType.Kind="Class" isinst=True
-				
-			If isinst<>insts Continue
+			If IsInstanceType( d.Type )<>instTypes Continue
 			
 			d.Set( obj,Dejsonify( jobj.GetValue( d.Name ),d.Type ) )
 		Next

+ 1 - 4
modules/mojo3d/scene/scene.monkey2

@@ -14,7 +14,7 @@ Class Scene
 		
 		If Not _current _current=Self
 			
-		_editable=editable
+		_editable=editable And TypeInfo.GetType( "mojo3d.Scene" )<>Null
 		
 		_clearColor=Color.Sky
 
@@ -25,13 +25,10 @@ Class Scene
 		_world=New World( Self )
 		
 		If _editable
-			Local type:=TypeInfo.GetType( "mojo3d.Scene" )
-			Assert( type And type.Kind="Class","mojo3d reflection must be enabled for editable scenes" )
 			_jsonifier=New Jsonifier
 			_jsonifier.AddInstance( Self,New Variant[]( true ) )
 			_editing=True
 		Endif
-		
 	End
 	
 	Property World:World()

+ 0 - 2
modules/mojo3d/tests/alphacubes.monkey2

@@ -22,8 +22,6 @@ Class MyWindow Extends Window
 
 		Super.New( title,width,height,flags )
 		
-		SetConfig( "MOJO3D_RENDERER","forward" )
-
 		'create scene
 		'		
 		_scene=New Scene

+ 45 - 38
modules/mojo3d/tests/ducks.monkey2

@@ -5,6 +5,9 @@ Namespace myapp
 #Import "<mojo>"
 #Import "<mojo3d>"
 
+'uncomment this to create a mojo3d scene file in monkey2 dir!
+#Reflect mojo3d
+
 #Import "assets/duck.gltf/@/duck.gltf"
 
 Using std..
@@ -15,47 +18,27 @@ Class MyWindow Extends Window
 	
 	Field _scene:Scene
 	
-	Field _camera:Camera
-	
-	Field _light:Light
-	
-	Field _ground:Model
-	
-	Field _ducks:=New Stack<Model>
-	
 	Method New( title:String="Simple mojo app",width:Int=640,height:Int=480,flags:WindowFlags=WindowFlags.Resizable )
 
 		Super.New( title,width,height,flags )
 		
-		'create scene
-		'		
-		_scene=New Scene
-		
-		'for softer shadows
-		'
-		_scene.ShadowAlpha=.6
-		
-		'create camera
-		'
-		_camera=New Camera( Self )
+		CreateScene()
+	End
+	
+	Method CreateGround()
 		
-		_camera.Move( 0,15,-20 )
+		Local box:=New Boxf( -50,-1,-50,50,0,50 )
 		
-		New FlyBehaviour( _camera )
+		Local material:=New PbrMaterial( Color.Green,0,1 )
 		
-		'create light
-		'
-		_light=New Light
-		_light.CastsShadow=True
-		_light.Rotate( 90,0,0 )'75,15,0 )
+		Local model:=Model.CreateBox( box,1,1,1,material )
 		
-		'create ground
-		'
-		_ground=Model.CreateBox( New Boxf( -50,-1,-50,50,0,50 ),1,1,1,New PbrMaterial( Color.Green,0,1 ) )
-		_ground.CastsShadow=False
+		model.CastsShadow=False
 		
-		'create ducks
-		'		
+	End
+	
+	Method CreateDucks()
+
 		Local duck:=Model.Load( "asset::duck.gltf/Duck.gltf" )
 		duck.Mesh.FitVertices( New Boxf( -1,1 ) )
 		
@@ -63,9 +46,7 @@ Class MyWindow Extends Window
 		root.Move( 0,10,0 )
 		root.Scale=New Vec3f( 3 )
 		
-		_ducks.Push( root )
-		
-		_ducks[0].AddComponent<RotateBehaviour>().Speed=New Vec3f( 0,-.01,0 )
+		root.AddComponent<RotateBehaviour>().Speed=New Vec3f( 0,-.01,0 )
 		
 		For Local m:=0.0 To 1.0 Step .125
 		
@@ -92,15 +73,41 @@ Class MyWindow Extends Window
 				Next
 				
 				copy.Materials=materials
-				
-				_ducks.Push( copy )
-			
 			Next
 		Next
 		
 		duck.Destroy()
 	End
 	
+	Method CreateScene()
+		
+		'create scene
+		'		
+		_scene=New Scene( True )
+		
+		'for softer shadows
+		'
+		_scene.ShadowAlpha=.6
+		
+		'create camera
+		'
+		Local camera:=New Camera( Self )
+		camera.AddComponent<FlyBehaviour>()
+		camera.Move( 0,15,-20 )
+		
+		'create light
+		'
+		Local light:=New Light
+		light.CastsShadow=True
+		light.Rotate( 90,0,0 )
+		
+		CreateGround()
+		
+		CreateDucks()
+		
+		If _scene.Editable _scene.Save( "ducks-scene.mojo3d" ) ; _scene=Scene.Load( "ducks-scene.mojo3d" )
+	End
+	
 	Method OnRender( canvas:Canvas ) Override
 
 		RequestRender()

+ 99 - 84
modules/mojo3d/tests/shapes.monkey2

@@ -5,7 +5,8 @@ Namespace myapp
 #Import "<mojo>"
 #Import "<mojo3d>"
 
-#Import "assets/"
+'uncomment this to create a mojo3d scene file in monkey2 dir!
+#Reflect mojo3d
 
 Using std..
 Using mojo..
@@ -17,70 +18,38 @@ Class MyWindow Extends Window
 	
 	Field _camera:Camera
 	
-	Field _light:Light
-	
-	Field _ground:Model
-	
 	Field _marker:Model
 	
-'	Method OnMeasure:Vec2i() Override
-		
-'		Return New Vec2i( 640,480 )
-'	End
-	
 	Method New( title:String="Simple mojo app",width:Int=640,height:Int=480,flags:WindowFlags=WindowFlags.Resizable )
 
 		Super.New( title,width,height,flags )
 		
-'		Layout="letterbox"
-		
-		_scene=Scene.GetCurrent()
-		
-		'create camera
-		'
-		_camera=New Camera
-		_camera.Name="Camera"
-		_camera.Near=.1
-		_camera.Far=60
-		_camera.Move( 0,10,-10 )
-		New FlyBehaviour( _camera )
-		
-		Local camCollider:=New SphereCollider( _camera )
-		camCollider.Radius=1
-		Local camBody:=New RigidBody( _camera )
-		camBody.Kinematic=True
-		camBody.Mass=0
-		camBody.CollisionGroup=32
-		camBody.CollisionMask=127
-		
-		'create light
-		'
-		_light=New Light
-		_light.RotateX( 75,15 )
-		_light.CastsShadow=true
-		
-		'create ground
-		'
-		Local groundBox:=New Boxf( -60,-1,-60,60,0,60 )
+		CreateScene()
+	End
+
+	Method CreateGround()
+
+		Local box:=New Boxf( -60,-1,-60,60,0,60 )
 		
-		_ground=Model.CreateBox( groundBox,16,16,16,New PbrMaterial( Color.Green ) )
-		_ground.Name="Ground"
+		Local material:=New PbrMaterial( Color.Green )
 		
-		_ground.Collided+=Lambda( body:RigidBody )
+		Local model:=Model.CreateBox( box,16,16,16,material )
+		model.Name="Ground"
 		
+		model.Collided+=Lambda( body:RigidBody )
 '			Print "Ground hit: "+body.Entity.Name
 		End
-		
-'		Local groundCollider:=New BoxCollider( _ground )
-'		groundCollider.Box=groundBox
 
-		Local groundCollider:=New MeshCollider( _ground )
-		groundCollider.Mesh=_ground.Mesh
-		
-		Local groundBody:=New RigidBody( _ground )
-		groundBody.Mass=0
-		groundBody.CollisionGroup=64
-		groundBody.CollisionMask=127
+		Local collider:=model.AddComponent<BoxCollider>()
+		collider.Box=box
+
+		Local body:=model.AddComponent<RigidBody>()
+		body.CollisionGroup=64
+		body.CollisionMask=127
+		body.Mass=0
+	End
+
+	Method CreateBodies()		
 		
 		Local material:=New PbrMaterial( Color.White )
 
@@ -133,68 +102,114 @@ Class MyWindow Extends Window
 			
 			For Local z:=-40 To 40 Step 8
 				
-				Local i:=Int( Rnd(5) )
+				Local i:=Int( Rnd( models.Length ) )
 				
 				Local model:=models[i].Copy()
 				
 				model.Materials=New Material[]( New PbrMaterial( New Color( Rnd(),Rnd(),Rnd() ) ) )
 				
 				model.Move( x,10,z )
+				
 			Next
-		
+			
 		Next
 		
 		For Local model:=Eachin models
 			
-			model.Destroy()
+			model.Visible=False
+			
+			'model.Destroy()
 		Next
-		
+	End
+
+	Method CreateMarker()
+					
 		_marker=Model.CreateCone( 1,2,Axis.Y,12,New PbrMaterial( Color.Red ),Null )
 		
 		_marker.Mesh.FitVertices( New Boxf( -.125,0,-.125,.125,1,.125 ),False )
+	End
+	
+	Method CreateScene()
+		
+		_scene=New Scene( True )
+		
+		'create camera
+		'
+		_camera=New Camera( Self )
+		_camera.Name="Camera"
+		_camera.Near=.1
+		_camera.Far=60
+		_camera.Move( 0,10,-10 )
+		_camera.AddComponent<FlyBehaviour>()
 		
+		Local collider:=_camera.AddComponent<SphereCollider>()
+		collider.Radius=1
+		
+		Local body:=_camera.AddComponent<RigidBody>()
+		body.CollisionGroup=32
+		body.CollisionMask=127
+		body.Kinematic=True
+		body.Mass=0
+		
+		'create light
+		'
+		Local light:=New Light
+		light.RotateX( 75,15 )
+		light.CastsShadow=true
+		
+		CreateGround()
+		
+		CreateBodies()
+		
+		If _scene.Editable 
+			_scene.Save( "shapes-scene.mojo3d" )
+			_scene=Scene.Load( "shapes-scene.mojo3d" )
+			_camera=Cast<Camera>( _scene.FindEntity( "Camera" ) )
+		Endif
+
+		CreateMarker()
 	End
 	
 	Method OnRender( canvas:Canvas ) Override
 		
 		RequestRender()
 		
-		_camera.Viewport=Rect
-		
 		_scene.Update()
 		
-		Local raycast:=_camera.MousePick( 127 )
-		
-		Local picked:=""
-		
-		If raycast
+		If _marker
+			Local raycast:=_camera.MousePick( 127 )
 			
-			Local j:=raycast.normal,i:Vec3f,k:Vec3f
+			Local picked:=""
 			
-			If Abs( j.x )>.5
-				k=New Vec3f( 0,0,1 )
-				i=j.Cross( k ).Normalize()
-				k=i.Cross( j ).Normalize()
+			If raycast
+				
+				Local j:=raycast.normal,i:Vec3f,k:Vec3f
+				
+				If Abs( j.x )>.5
+					k=New Vec3f( 0,0,1 )
+					i=j.Cross( k ).Normalize()
+					k=i.Cross( j ).Normalize()
+				Else
+					i=New Vec3f( 1,0,0 )
+					k=i.Cross( j ).Normalize()
+					i=j.Cross( k ).Normalize()
+				Endif
+				
+				_marker.Position=raycast.point
+				_marker.Basis=New Mat3f( i,j,k )
+				_marker.Visible=True
+				picked=raycast.body.Entity.Name+" "+_marker.Basis.j
+				
 			Else
-				i=New Vec3f( 1,0,0 )
-				k=i.Cross( j ).Normalize()
-				i=j.Cross( k ).Normalize()
+				
+				_marker.Visible=False
+				
 			Endif
-			
-			_marker.Position=raycast.point
-			_marker.Basis=New Mat3f( i,j,k )
-			_marker.Visible=True
-			picked=raycast.body.Entity.Name+" "+_marker.Basis.j
-			
-		Else
-			
-			_marker.Visible=False
-			
 		Endif
-		
+				
 		_scene.Render( canvas )
 		
-		canvas.DrawText( "Camera pos="+_camera.Position+", Picked="+picked+", FPS="+App.FPS,0,0 )
+		canvas.DrawText( "FPS="+App.FPS,0,0 )
 	End
 	
 End

+ 30 - 30
modules/mojo3d/tests/sprites.monkey2

@@ -5,6 +5,9 @@ Namespace myapp
 #Import "<mojo>"
 #Import "<mojo3d>"
 
+'uncomment this to create a mojo3d scene file in monkey2 dir!
+#Reflect mojo3d
+
 #Import "assets/miramar-skybox.jpg"
 #Import "assets/Acadia-Tree-Sprite.png"
 
@@ -12,53 +15,42 @@ Using std..
 Using mojo..
 Using mojo3d..
 
-Function Main()
-	
-	New AppInstance
-	
-	New MyWindow
-	
-	App.Run()
-End
-
 Class MyWindow Extends Window
 	
 	Field _scene:Scene
 	
-	Field _camera:Camera
-	
-	Field _light:Light
-	
-	Field _ground:Model
-	
-	Field _sprites:=New Stack<Sprite>
-	
 	Method New( title:String="Simple mojo app",width:Int=640,height:Int=480,flags:WindowFlags=WindowFlags.Resizable )
 
 		Super.New( title,width,height,flags )
 		
-		_scene=New Scene
-		_scene.SkyTexture=_scene.LoadTexture( "asset::miramar-skybox.jpg",TextureFlags.FilterMipmap|TextureFlags.Cubemap )
+		CreateScene()
+	End
+	
+	Method CreateScene()
+		
+		_scene=New Scene( True )
+		
+		_scene.SkyTexture=_scene.LoadTexture( "asset::miramar-skybox.jpg",TextureFlags.FilterMipmap|TextureFlags.Cubemap~TextureFlags.Envmap )
 		_scene.FogColor=Color.Sky
 		_scene.FogNear=10
 		_scene.FogFar=30
 		
 		'create camera
 		'
-		_camera=New Camera( Self )
-		_camera.Near=.1
-		_camera.Far=100
-		_camera.Move( 0,10,-10 )
-		New FlyBehaviour( _camera )
+		Local camera:=New Camera( Self )
+		camera.Near=.1
+		camera.Far=100
+		camera.Move( 0,10,-10 )
+		camera.AddComponent<FlyBehaviour>()
 		
 		'create light
 		'
-		_light=New Light
-		_light.Rotate( 60,45,0 )
+		Local light:=New Light
+		light.Rotate( 60,45,0 )
 		
 		'create ground
 		'
-		_ground=Model.CreateBox( New Boxf( -50,-1,-50,50,0,50 ),1,1,1,New PbrMaterial( Color.Green ) )
+		Local ground:=Model.CreateBox( New Boxf( -50,-1,-50,50,0,50 ),1,1,1,New PbrMaterial( Color.Green ) )
 		
 		'create sprites
 		'
@@ -76,8 +68,6 @@ Class MyWindow Extends Window
 			sprite.Handle=New Vec2f( .5,0 )
 			
 			sprite.Mode=SpriteMode.Upright
-
-			_sprites.Push( sprite )
 		Next
 		
 		For Local i:=0 Until 100
@@ -88,6 +78,8 @@ Class MyWindow Extends Window
 			
 			box.Move( Rnd(-50,50),0,Rnd(-50,50) )
 		next	
+
+		If _scene.Editable _scene.Save( "sprites-scene.mojo3d" ) ; _scene=Scene.Load( "sprites-scene.mojo3d" )
 		
 	End
 	
@@ -99,8 +91,16 @@ Class MyWindow Extends Window
 		
 		_scene.Render( canvas )
 		
-		canvas.DrawText( "Width="+Width+", Height="+Height+", FPS="+App.FPS,0,0 )
+		canvas.DrawText( "FPS="+App.FPS,0,0 )
 	End
 	
 End
 
+Function Main()
+	
+	New AppInstance
+	
+	New MyWindow
+	
+	App.Run()
+End

+ 1 - 1
modules/mojo3d/tests/terrain.monkey2

@@ -75,7 +75,7 @@ Class MyWindow Extends Window
 	Method CreateScene()
 
 		_scene=New Scene
-		_scene.SkyTexture=Texture.Load( "asset::miramar-skybox.jpg",TextureFlags.FilterMipmap|TextureFlags.Cubemap )
+		_scene.SkyTexture=Texture.Load( "asset::miramar-skybox.jpg",TextureFlags.FilterMipmap|TextureFlags.Cubemap|TextureFlags.Envmap )
 		_scene.FogColor=New Color( .75,1,0 )*.25
 		_scene.FogNear=75
 		_scene.FogFar=100

+ 84 - 0
modules/mojo3d/tests/test-scene.monkey2

@@ -0,0 +1,84 @@
+Namespace myapp3d
+
+#Import "<std>"
+#Import "<mojo>"
+#Import "<mojo3d>"
+
+#Reflect mojo3d
+
+Using std..
+Using mojo..
+Using mojo3d..
+
+Class MyWindow Extends Window
+	
+	Field _scene:Scene
+	Field _camera:Camera
+	Field _light:Light
+	Field _ground:Model
+	Field _donut:Model
+	
+	Method New( title:String="Simple mojo3d app",width:Int=640,height:Int=480,flags:WindowFlags=WindowFlags.Resizable )
+		
+		Super.New( title,width,height,flags )
+	End
+	
+	Method OnCreateWindow() Override
+		
+		'create editable scene
+		_scene=New Scene( True )
+		
+		_scene.ClearColor = New Color( 0.2, 0.6, 1.0 )
+		_scene.AmbientLight = _scene.ClearColor * 0.25
+		_scene.FogColor = _scene.ClearColor
+		_scene.FogFar = 1.0
+		_scene.FogFar = 200.0
+		
+		'create camera
+		_camera=New Camera( Self )
+		_camera.AddComponent<FlyBehaviour>()
+		_camera.Move( 0,2.5,-5 )
+		
+		'create light
+		_light=New Light
+		_light.CastsShadow=True
+		_light.Rotate( 45, 45, 0 )
+		
+		'create ground
+		Local groundBox:=New Boxf( -100,-1,-100,100,0,100 )
+		Local groundMaterial:=New PbrMaterial( Color.Lime )
+		_ground=Model.CreateBox( groundBox,1,1,1,groundMaterial )
+		_ground.CastsShadow=False
+		
+		'create donut
+		Local donutMaterial:=New PbrMaterial( Color.Red, 0.05, 0.2 )
+		_donut=Model.CreateTorus( 2,.5,48,24,donutMaterial )
+		_donut.Move( 0,2.5,0 )
+		_donut.AddComponent<RotateBehaviour>().Speed=New Vec3f( .1,.2,.3 )
+		
+		_scene.Save( "test-scene.mojo3d","modules/mojo3d/tests/assets/" )
+		
+		_scene=Scene.Load( "test-scene.mojo3d" )
+	End
+	
+	Method OnRender( canvas:Canvas ) Override
+		
+		RequestRender()
+		
+		_scene.Update()
+		
+		_scene.Render( canvas )
+		
+		canvas.DrawText( "FPS="+App.FPS,0,0 )
+	End
+	
+End
+
+Function Main()
+
+	New AppInstance
+	
+	New MyWindow
+	
+	App.Run()
+End

+ 1 - 1
modules/mojo3d/tests/water.monkey2

@@ -28,7 +28,7 @@ Class MyWindow Extends Window
 		
 		_scene=New Scene
 		
-		_scene.SkyTexture=Texture.Load( "asset::miramar-skybox.jpg",TextureFlags.FilterMipmap|TextureFlags.Cubemap )
+		_scene.SkyTexture=Texture.Load( "asset::miramar-skybox.jpg",TextureFlags.FilterMipmap|TextureFlags.Cubemap|TextureFlags.Envmap )
 		
 		'create camera
 		'

File diff suppressed because it is too large
+ 203 - 230
shapes-scene.mojo3d


File diff suppressed because it is too large
+ 110 - 120
sprites-scene.mojo3d


+ 7 - 17
test-scene.mojo3d

@@ -22,8 +22,7 @@
 		},
 		"id":1,
 		"state":{
-			"LocalMatrix":[1,0,0,0,1,0,0,0,1,0,2.5,-5],
-			"Visible":true
+			"LocalMatrix":[1,0,0,0,1,0,0,0,1,0,2.5,-5]
 		},
 		"type":"mojo3d.Camera"
 	},{
@@ -43,15 +42,14 @@
 		"id":3,
 		"state":{
 			"CastsShadow":true,
-			"LocalMatrix":[0.70710676908493042,0,0.70710676908493042,-0.49999997019767761,0.70710676908493042,0.49999997019767761,-0.49999997019767761,-0.70710676908493042,0.49999997019767761,0,0,0],
-			"Visible":true
+			"LocalMatrix":[0.70710676908493042,0,0.70710676908493042,-0.49999997019767761,0.70710676908493042,0.49999997019767761,-0.49999997019767761,-0.70710676908493042,0.49999997019767761,0,0,0]
 		},
 		"type":"mojo3d.Light"
 	},{
 		"ctor":{
-			"args":[[0.69999998807907104,1,0,1],1,1,false],
+			"args":[[0.69999998807907104,1,0,1],1,1],
 			"decl":"mojo3d.PbrMaterial.New",
-			"type":"Void(std.graphics.Color,Float,Float,Bool)"
+			"type":"Void(std.graphics.Color,Float,Float)"
 		},
 		"id":4,
 		"type":"mojo3d.PbrMaterial"
@@ -70,17 +68,12 @@
 			"type":"Void(mojo3d.Mesh,mojo3d.Material,mojo3d.Entity)"
 		},
 		"id":6,
-		"state":{
-			"Materials":["@4"],
-			"Mesh":"@5",
-			"Visible":true
-		},
 		"type":"mojo3d.Model"
 	},{
 		"ctor":{
-			"args":[[1,0,0,1],0.05000000074505806,0.20000000298023224,false],
+			"args":[[1,0,0,1],0.05000000074505806,0.20000000298023224],
 			"decl":"mojo3d.PbrMaterial.New",
-			"type":"Void(std.graphics.Color,Float,Float,Bool)"
+			"type":"Void(std.graphics.Color,Float,Float)"
 		},
 		"id":7,
 		"type":"mojo3d.PbrMaterial"
@@ -100,10 +93,7 @@
 		},
 		"id":9,
 		"state":{
-			"LocalMatrix":[1,0,0,0,1,0,0,0,1,0,2.5,0],
-			"Materials":["@7"],
-			"Mesh":"@8",
-			"Visible":true
+			"LocalMatrix":[1,0,0,0,1,0,0,0,1,0,2.5,0]
 		},
 		"type":"mojo3d.Model"
 	},{

Some files were not shown because too many files changed in this diff