shapes.monkey2 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. Namespace myapp
  2. #Import "<std>"
  3. #Import "<mojo>"
  4. #Import "<mojo3d>"
  5. 'uncomment this to create a mojo3d scene file in monkey2 dir!
  6. '#Reflect mojo3d
  7. Using std..
  8. Using mojo..
  9. Using mojo3d..
  10. Class MyWindow Extends Window
  11. Field _scene:Scene
  12. Field _camera:Camera
  13. Field _marker:Model
  14. Method New( title:String="Simple mojo app",width:Int=640,height:Int=480,flags:WindowFlags=WindowFlags.Resizable )
  15. Super.New( title,width,height,flags )
  16. CreateScene()
  17. End
  18. Method CreateGround()
  19. Local box:=New Boxf( -60,-1,-60,60,0,60 )
  20. Local material:=New PbrMaterial( Color.Green )
  21. Local model:=Model.CreateBox( box,16,16,16,material )
  22. model.Name="Ground"
  23. Local collider:=model.AddComponent<BoxCollider>()
  24. collider.Box=box
  25. Local body:=model.AddComponent<RigidBody>()
  26. body.CollisionGroup=64
  27. body.CollisionMask=127
  28. body.Mass=0
  29. model.RigidBody.Collided+=Lambda( body:RigidBody )
  30. ' Print "Ground hit: "+body.Entity.Name
  31. End
  32. End
  33. Method CreateBodies()
  34. Local material:=New PbrMaterial( Color.White )
  35. Local box0:=New Boxf( -1,-5,-1,1,5,1 )
  36. Local model0:=Model.CreateBox( box0,1,1,1,material )
  37. model0.Name="Box"
  38. Local collider0:=New BoxCollider( model0 )
  39. collider0.Box=box0
  40. Local body0:=New RigidBody( model0 )
  41. body0.CollisionGroup=1
  42. body0.CollisionMask=127
  43. Local model1:=Model.CreateSphere( 1,32,16,material )
  44. model1.Name="Sphere"
  45. Local collider1:=New SphereCollider( model1 )
  46. Local body1:=New RigidBody( model1 )
  47. body1.CollisionGroup=2
  48. body1.CollisionMask=127
  49. Local model2:=Model.CreateCylinder( 1,8,Axis.Y,32,material )
  50. model2.Name="Cylinder"
  51. Local collider2:=New CylinderCollider( model2 )
  52. collider2.Radius=1
  53. collider2.Length=8
  54. Local body2:=New RigidBody( model2 )
  55. body2.CollisionGroup=4
  56. body2.CollisionMask=127
  57. Local model3:=Model.CreateCapsule( 1,10,Axis.Y,32,material )
  58. model3.Name="Capsule"
  59. Local collider3:=New CapsuleCollider( model3 )
  60. collider3.Radius=1
  61. collider3.Length=10
  62. Local body3:=New RigidBody( model3 )
  63. body3.CollisionGroup=8
  64. body3.CollisionMask=127
  65. Local model4:=Model.CreateCone( 2.5,5,Axis.Y,32,material )
  66. model4.Name="Cone"
  67. Local collider4:=New ConeCollider( model4 )
  68. collider4.Radius=2.5
  69. collider4.Length=5
  70. Local body4:=New RigidBody( model4 )
  71. body4.CollisionGroup=16
  72. body4.CollisionMask=127
  73. Local models:=New Model[]( model0,model1,model2,model3,model4 )
  74. For Local x:=-40 To 40 Step 8
  75. For Local z:=-40 To 40 Step 8
  76. Local i:=Int( Rnd( models.Length ) )
  77. Local model:=models[i].Copy()
  78. model.Materials=New Material[]( New PbrMaterial( New Color( Rnd(),Rnd(),Rnd() ) ) )
  79. model.Move( x,10,z )
  80. Next
  81. Next
  82. For Local model:=Eachin models
  83. model.Visible=False
  84. 'model.Destroy()
  85. Next
  86. End
  87. Method CreateMarker()
  88. _marker=Model.CreateCone( 1,2,Axis.Y,12,New PbrMaterial( Color.Red ),Null )
  89. _marker.Mesh.FitVertices( New Boxf( -.125,0,-.125,.125,1,.125 ),False )
  90. End
  91. Method CreateScene()
  92. _scene=New Scene( True )
  93. 'create camera
  94. '
  95. _camera=New Camera( Self )
  96. _camera.Name="Camera"
  97. _camera.Near=.1
  98. _camera.Far=60
  99. _camera.Move( 0,10,-10 )
  100. _camera.AddComponent<FlyBehaviour>()
  101. Local collider:=_camera.AddComponent<SphereCollider>()
  102. collider.Radius=1
  103. Local body:=_camera.AddComponent<RigidBody>()
  104. body.CollisionGroup=32
  105. body.CollisionMask=127
  106. body.Kinematic=True
  107. body.Friction=0 'no friction best for kinematic bodies?
  108. body.Mass=0
  109. 'create light
  110. '
  111. Local light:=New Light
  112. light.RotateX( 75,15 )
  113. light.CastsShadow=true
  114. CreateGround()
  115. CreateBodies()
  116. If _scene.Editable
  117. _scene.Save( "shapes-scene.mojo3d","modules/mojo3d/tests/assets/" )
  118. _scene=Scene.Load( "shapes-scene.mojo3d" )
  119. _camera=Cast<Camera>( _scene.FindEntity( "Camera" ) )
  120. Endif
  121. CreateMarker()
  122. End
  123. Method OnRender( canvas:Canvas ) Override
  124. RequestRender()
  125. If Keyboard.KeyHit(Key.Space) _scene.UpdateRate=_scene.UpdateRate ? 0 Else 60
  126. _scene.Update()
  127. If _marker
  128. Local raycast:=_camera.MousePick( 127 )
  129. Local picked:=""
  130. If raycast
  131. Local j:=raycast.normal,i:Vec3f,k:Vec3f
  132. If Abs( j.x )>.5
  133. k=New Vec3f( 0,0,1 )
  134. i=j.Cross( k ).Normalize()
  135. k=i.Cross( j ).Normalize()
  136. Else
  137. i=New Vec3f( 1,0,0 )
  138. k=i.Cross( j ).Normalize()
  139. i=j.Cross( k ).Normalize()
  140. Endif
  141. _marker.Position=raycast.point
  142. _marker.Basis=New Mat3f( i,j,k )
  143. _marker.Visible=True
  144. picked=raycast.body.Entity.Name+" "+_marker.Basis.j
  145. Else
  146. _marker.Visible=False
  147. Endif
  148. Endif
  149. _scene.Render( canvas )
  150. canvas.DrawText( "FPS="+App.FPS,0,0 )
  151. End
  152. End
  153. Function Main()
  154. New AppInstance
  155. New MyWindow
  156. App.Run()
  157. End