shapes.monkey2 4.3 KB

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