vrducks.monkey2 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. Namespace myapp
  2. #Import "<std>"
  3. #Import "<mojo>"
  4. #Import "<mojo3d>"
  5. #Import "<mojo3d-vr>"
  6. '#Import "../../mojo3d/tests/assets/bluspark.png"
  7. #Import "../../mojo3d/tests/assets/duck.gltf/@/duck.gltf"
  8. #Import "assets/vivecontroller.gltf"
  9. Using std..
  10. Using mojo..
  11. Using mojo3d..
  12. Class DuckBehaviour Extends Behaviour
  13. Field _speed:Float
  14. Field _yawsp:Float
  15. Field _timer:Float
  16. Method New( entity:Entity )
  17. Super.New( entity )
  18. Reset()
  19. End
  20. Method Reset()
  21. _speed=Rnd( .001,.002 )
  22. _yawsp=Rnd( -1,1 )
  23. _timer=Rnd( 1,3 )
  24. End
  25. Method OnUpdate( elapsed:Float ) Override
  26. _timer-=elapsed
  27. If _timer<=0 Reset()
  28. Entity.RotateY( _yawsp )
  29. Entity.MoveZ( _speed )
  30. End
  31. End
  32. Class MyWindow Extends Window
  33. Field _renderer:VRRenderer
  34. Field _scene:Scene
  35. Field _camera:Camera
  36. Field _light:Light
  37. Field _ground:Model
  38. Field _particles:ParticleSystem
  39. Field _ctrlModel:Model
  40. Field _bases:=New Model[2]
  41. Field _ctrls:=New Model[2]
  42. Field _ducks:=New Stack<Model>
  43. Method New( title:String="Simple mojo app",width:Int=640,height:Int=480,flags:WindowFlags=WindowFlags.Resizable )
  44. Super.New( title,width,height,flags )
  45. SwapInterval=0
  46. Print "GL_VERSION="+opengl.glGetString( opengl.GL_VERSION )
  47. 'Enables VR
  48. '
  49. _renderer=New VRRenderer
  50. _renderer.TrackingSpace=VRTrackingSpace.Standing
  51. _scene=New Scene
  52. 'Use more detailed CSM shadow split distances to compensate for the much nearer near clip plane.
  53. '
  54. _scene.CSMSplits=New Float[]( 2,4,16,256 )
  55. 'create camera
  56. '
  57. _camera=New Camera
  58. _camera.Near=.01 'near clip plane 1 centimeter from camera so we can look at things nice and close up.
  59. _camera.Far=100 'camera far/near ratio is probably a bit much here, might give FP precision problems...
  60. 'create light
  61. '
  62. _light=New Light
  63. _light.Rotate( 75,15,0 )
  64. _light.CastsShadow=True
  65. 'create ground
  66. '
  67. Local groundMaterial:=New PbrMaterial( Color.Green,0,1 )
  68. Local groundBox:=New Boxf( -50,-.1,-50,50,0,50 )
  69. _ground=Model.CreateBox( groundBox,1,1,1,groundMaterial )
  70. _ground.CastsShadow=False
  71. 'create particles - a bit crappy, need to offer particle algorithms.
  72. '
  73. _particles=New ParticleSystem( 15000 )
  74. _particles.Move( 0,2,0 )
  75. _particles.RotateX( -90 ) 'point upwards
  76. Local pmaterial:=_particles.Material
  77. ' pmaterial.ColorTexture=Texture.Load( "asset::bluspark.png",TextureFlags.FilterMipmap )
  78. Local pbuffer:=_particles.ParticleBuffer
  79. pbuffer.Gravity=New Vec3f( 0,-.1,0 ) 'gravity in world space in m/s^2.
  80. pbuffer.Duration=60.0 'how long a single particle lasts in seconds.
  81. pbuffer.Fade=0.0 'how long before paticle starts fading out in seconds.
  82. pbuffer.Colors=New Color[]( Color.White,Color.Yellow,Color.Orange,Color.Red )
  83. pbuffer.ConeAngle=120 'angle of particle emission cone.
  84. pbuffer.MinVelocity=1.0 'min particle velocity.
  85. pbuffer.MaxVelocity=1.0 'max particle velocity.
  86. pbuffer.MinSize=24.0 'min particle size.
  87. pbuffer.MaxSize=32.0 'max particle size.
  88. 'create ducks
  89. '
  90. Local duck:=Model.Load( "asset::duck.gltf/Duck.gltf" )
  91. duck.Mesh.FitVertices( New Boxf( -.05,.05 ) )
  92. ' duck.Mesh.FitVertices( New Boxf( -.5,.5 ) )
  93. duck.Mesh.TransformVertices( AffineMat4f.Rotation( 0,Pi/2,0 ) )
  94. duck.Rotate( 0,-Pi/2,0 )
  95. For Local i:=0 Until 100
  96. Local copy:=duck.Copy()
  97. New DuckBehaviour( copy )
  98. copy.Position=Null
  99. copy.RotateY( Rnd( 360 ) )
  100. copy.Move( 0,Rnd( .5,1.5 ),Rnd( -1,1 ) )
  101. _ducks.Add( copy )
  102. Next
  103. New FlyBehaviour( duck ).Speed=.01
  104. duck.Move( 0,.7,.5 )
  105. Local baseBox:=New Boxf( -.042,-.042,-.042,.042,.042,.042 )
  106. Local baseMaterial:=New PbrMaterial( Color.Aluminum,1.0,1.0 )
  107. _bases[0]=Model.CreateBox( baseBox,1,1,1,baseMaterial )
  108. _bases[1]=_bases[0].Copy()'Model.CreateBox( baseBox,1,1,1,baseMaterial )
  109. Local ctrlModel:=Model.Load( "asset::vivecontroller.gltf" )
  110. ctrlModel.Mesh.TransformVertices( AffineMat4f.Rotation( -Pi/2,0,0 ) )
  111. _ctrls[0]=ctrlModel
  112. _ctrls[1]=ctrlModel.Copy()
  113. End
  114. Method OnRender( canvas:Canvas ) Override
  115. RequestRender()
  116. 'need to call this for VRRenderer before renderer or you'll get an error.
  117. '
  118. _renderer.Update()
  119. _camera.Matrix=_renderer.HeadMatrix
  120. _ctrls[0].Visible=_renderer.Active
  121. _ctrls[1].Visible=_renderer.Active
  122. _ctrls[0].Matrix=_renderer.ControllerMatrices[0]
  123. _ctrls[1].Matrix=_renderer.ControllerMatrices[1]
  124. _bases[0].Matrix=_renderer.BaseStationMatrices[0]
  125. _bases[1].Matrix=_renderer.BaseStationMatrices[1]
  126. If _renderer.Active _scene.Update()
  127. _camera.Render( canvas )
  128. 'Done!
  129. canvas.DrawRect( 0,Height,Width,-Height,_renderer.LeftEyeImage )
  130. canvas.Scale( Width/640.0,Height/480.0 )
  131. ' canvas.DrawText( "Camera.Position="+_camera.Position+", FPS="+App.FPS,0,0 )
  132. canvas.DrawText( "FPS="+App.FPS,0,0 )
  133. End
  134. End
  135. Function Main()
  136. New AppInstance
  137. New MyWindow
  138. App.Run()
  139. End