Namespace myapp #Import "" #Import "" #Import "" #Import "assets/duck.gltf/@/duck.gltf" Using std.. Using mojo.. Using mojo3d.. Class MyWindow Extends Window Field _scene:Scene Field _camera:Camera Field _light:Light Field _ground:Model Field _ducks:=New Stack 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 ) _camera.Move( 0,15,-20 ) New FlyBehaviour( _camera ) 'create light ' _light=New Light _light.CastsShadow=True _light.Rotate( 90,0,0 )'75,15,0 ) '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 'create ducks ' Local duck:=Model.Load( "asset::duck.gltf/Duck.gltf" ) duck.Mesh.FitVertices( New Boxf( -1,1 ) ) Local root:=duck.Copy() root.Move( 0,10,0 ) root.Scale=New Vec3f( 3 ) _ducks.Push( root ) _ducks[0].AddComponent().Speed=New Vec3f( 0,-.01,0 ) For Local m:=0.0 To 1.0 Step .125 For Local i:=0.0 Until 360.0 Step 24 Local copy:=duck.Copy( root ) copy.RotateY( i ) copy.Move( 0,0,6+m*16 ) copy.Scale=New Vec3f( 1 ) Local materials:=copy.Materials.Slice( 0 ) For Local j:=0 Until materials.Length Local material:=Cast( materials[j].Copy() ) material.MetalnessFactor=m material.RoughnessFactor=i/360.0 materials[j]=material Next copy.Materials=materials _ducks.Push( copy ) Next Next duck.Destroy() End Method OnRender( canvas:Canvas ) Override RequestRender() _scene.Update() _scene.Render( canvas ) canvas.DrawText( "FPS="+App.FPS,Width,0,1,0 ) End End Function Main() New AppInstance New MyWindow App.Run() End