vrrenderer.monkey2 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. Namespace mojo3d.vr
  2. Enum VRTrackingSpace
  3. Seated
  4. Standing
  5. End
  6. Enum VRAxis
  7. Trackpad= 0
  8. Trigger= 1
  9. End
  10. Enum VRButton
  11. System= 0
  12. Menu= 1
  13. Grip= 2
  14. DPadLeft= 3
  15. DPadUp= 4
  16. DPadRight= 5
  17. DPadDown= 6
  18. A= 7
  19. ProximitySensor= 15 '31 in openvr, but lets stick to an int for now...
  20. Axis0= 16
  21. Axis1= 17
  22. Axis2= 18
  23. Axis3= 19
  24. Axis4= 20
  25. Trackpad= Axis0
  26. Trigger= Axis1
  27. DashboardBack= Grip
  28. End
  29. Class VRControllerState
  30. Field Changed:Void()
  31. Property Seq:Int()
  32. Return _seq
  33. End
  34. Property Matrix:AffineMat4f()
  35. Return Cast<AffineMat4f>( _pose.mDeviceToAbsoluteTracking )
  36. End
  37. Property ButtonPressedMask:Int()
  38. Return _pressed
  39. End
  40. Property ButtonTouchedMask:Int()
  41. Return _touched
  42. End
  43. Property Trackpad:Vec2f()
  44. Return New Vec2f( _state.rAxis[0].x,_state.rAxis[0].y )
  45. End
  46. Property Trigger:Float()
  47. Return _state.rAxis[1].x
  48. End
  49. Method GetButtonPressed:Bool( button:VRButton )
  50. Return _pressed & (1 Shl button)
  51. End
  52. Method GetButtonTouched:Bool( button:VRButton )
  53. Return _touched & (1 Shl button)
  54. End
  55. Method GetAxis:Vec2f( axis:VRAxis )
  56. Return New Vec2f( _state.rAxis[axis].x,_state.rAxis[axis].y )
  57. End
  58. Internal
  59. Method Update( index:Int,origin:ETrackingUniverseOrigin )
  60. If Not VRSystem().GetControllerStateWithPose( origin,index,Varptr _state,libc.sizeof( _state ),Varptr _pose )
  61. ' Print "OpenVR GetControllerState Failed!"
  62. Return
  63. Endif
  64. If _state.unPacketNum=_seq Return
  65. _pressed=(_state.ulButtonPressed Shr 16 & ~$7fff) | (_state.ulButtonPressed & $7fff)
  66. _touched=(_state.ulButtonTouched Shr 16 & ~$7fff) | (_state.ulButtonTouched & $7fff)
  67. _seq=_state.unPacketNum
  68. Changed()
  69. End
  70. Private
  71. Field _state:VRControllerState_t
  72. Field _pose:TrackedDevicePose_t
  73. Field _pressed:Int
  74. Field _touched:Int
  75. Field _seq:Int
  76. End
  77. Class VRRenderer Extends Renderer
  78. Field OpenvrEventFilter:Void( vrevent:VREvent_t Ptr )
  79. Method New()
  80. InitVR()
  81. InitRender()
  82. End
  83. Property Active:Bool()
  84. Return Not VROverlay().IsDashboardVisible()
  85. End
  86. Property NumControllers:Int()
  87. Return _numControllers
  88. End
  89. Property NumBaseStations:Int()
  90. Return _numBaseStations
  91. End
  92. Property HeadMatrix:AffineMat4f()
  93. Return _headMatrix
  94. End
  95. Property ControllerMatrices:AffineMat4f[]()
  96. Return _controllerMatrices
  97. End
  98. Property BaseStationMatrices:AffineMat4f[]()
  99. Return _baseStationMatrices
  100. End
  101. Property LeftEyeImage:Image()
  102. Return _leftEyeImage
  103. End
  104. Property RightEyeImage:Image()
  105. Return _rightEyeImage
  106. End
  107. Property TrackingSpace:VRTrackingSpace()
  108. Return _trackingSpace
  109. Setter( space:VRTrackingSpace )
  110. If space=_trackingSpace Return
  111. _trackingSpace=space
  112. Select _trackingSpace
  113. Case VRTrackingSpace.Seated
  114. VRCompositor().SetTrackingSpace( TrackingUniverseSeated )
  115. Case VRTrackingSpace.Standing
  116. VRCompositor().SetTrackingSpace( TrackingUniverseStanding )
  117. End
  118. End
  119. Method GetControllerState:VRControllerState( index:Int )
  120. Return _controllerStates[index]
  121. End
  122. Method Update()
  123. Local vrevent:VREvent_t
  124. While VRSystem().PollNextEvent( Varptr vrevent,libc.sizeof( vrevent ) )
  125. OpenvrEventFilter( Varptr vrevent )
  126. Wend
  127. Local poses:=New TrackedDevicePose_t[k_unMaxTrackedDeviceCount]
  128. If VRCompositor().WaitGetPoses( poses.Data,k_unMaxTrackedDeviceCount,Null,0 )<>VRCompositorError_None
  129. RuntimeError( "Compositor error for WaitGetPoses!" )
  130. Endif
  131. Local origin:=_trackingSpace=VRTrackingSpace.Seated ? TrackingUniverseSeated Else TrackingUniverseStanding
  132. _numControllers=0
  133. _numBaseStations=0
  134. _headId=-1
  135. _headMatrix=New AffineMat4f
  136. For Local i:=0 Until k_unMaxTrackedDeviceCount
  137. Local p:=poses.Data+i
  138. If Not p->bDeviceIsConnected Continue
  139. Local c:=VRSystem().GetTrackedDeviceClass( i )
  140. Select c
  141. Case TrackedDeviceClass_HMD
  142. _headId=i
  143. _headMatrix=Cast<AffineMat4f>( p->mDeviceToAbsoluteTracking )
  144. Case TrackedDeviceClass_Controller
  145. If _numControllers<2
  146. _controllerIds[_numControllers]=i
  147. _controllerStates[_numControllers].Update( i,origin )
  148. _controllerMatrices[_numControllers]=Cast<AffineMat4f>( p->mDeviceToAbsoluteTracking )
  149. _numControllers+=1
  150. Endif
  151. Case TrackedDeviceClass_TrackingReference
  152. If _numBaseStations<2
  153. _baseStationIds[_numBaseStations]=i
  154. _baseStationMatrices[_numBaseStations]=Cast<AffineMat4f>( p->mDeviceToAbsoluteTracking )
  155. _numBaseStations+=1
  156. Endif
  157. End
  158. Next
  159. For Local i:=_numControllers Until 2
  160. _controllerIds[i]=-1
  161. _controllerMatrices[i]=New AffineMat4f
  162. Next
  163. For Local i:=_numBaseStations Until 2
  164. _baseStationIds[i]=-1
  165. _baseStationMatrices[i]=New AffineMat4f
  166. Next
  167. End
  168. Method ResetSeatedPose()
  169. VRSystem().ResetSeatedZeroPose()
  170. End
  171. Method Openvr_GetHMDTrackedDeviceIndex:TrackedDeviceIndex_t()
  172. Return _headId
  173. End
  174. Method Openvr_GetControllerTrackedDeviceIndex:TrackedDeviceIndex_t( index:Int )
  175. Return _controllerIds[index]
  176. End
  177. Method Openvr_GetTrackingReferenceTrackedDeviceIndex:TrackedDeviceIndex_t( index:Int )
  178. Return _baseStationIds[index]
  179. End
  180. Protected
  181. Method Render( target:RenderTarget,targetSize:Vec2i,viewport:Recti,scene:Scene,viewMatrix:AffineMat4f,projMatrix:Mat4f,near:Float,far:Float ) Override
  182. Local ptexture:Texture_t
  183. ptexture.eType=TextureType_OpenGL
  184. ptexture.eColorSpace=ColorSpace_Auto
  185. Local tviewMatrix:AffineMat4f
  186. Local tprojMatrix:Mat4f
  187. '***** Render left eye *****
  188. '
  189. tviewMatrix=_leftEyeMatrix * viewMatrix
  190. tprojMatrix=vr.Frustum( _leftEyeFrustum.min.x,_leftEyeFrustum.max.x,_leftEyeFrustum.min.y,_leftEyeFrustum.max.y,near,far )
  191. Super.Render( _leftEyeRTarget,_eyeRect.Size,_eyeRect,scene,tviewMatrix,tprojMatrix,near,far )
  192. ptexture.handle=Cast<Void Ptr>( _leftEyeTex.ValidateGLTexture() )
  193. If VRCompositor().Submit( Eye_Left,Varptr ptexture )<>VRCompositorError_None
  194. RuntimeError( "OpenVR Compositor error for Submit left eye!" )
  195. Endif
  196. '***** Render righteye *****
  197. '
  198. tviewMatrix=_rightEyeMatrix * viewMatrix
  199. tprojMatrix=vr.Frustum( _rightEyeFrustum.min.x,_rightEyeFrustum.max.x,_rightEyeFrustum.min.y,_rightEyeFrustum.max.y,near,far )
  200. Super.Render( _rightEyeRTarget,_eyeRect.Size,_eyeRect,scene,tviewMatrix,tprojMatrix,near,far )
  201. ptexture.handle=Cast<Void Ptr>( _rightEyeTex.ValidateGLTexture() )
  202. If VRCompositor().Submit( Eye_Right,Varptr ptexture )<>VRCompositorError_None
  203. RuntimeError( "OpenVR Compositor error for Submit right eye!" )
  204. Endif
  205. '***** Finished VR *****
  206. VRCompositor().PostPresentHandoff()
  207. End
  208. Protected
  209. Method RenderCopyQuad() Override
  210. Super.RenderQuad()
  211. end
  212. Private
  213. 'VR
  214. Field _headMatrix:AffineMat4f
  215. Field _numControllers:Int
  216. Field _numBaseStations:Int
  217. Field _controllerMatrices:=New AffineMat4f[2]
  218. Field _baseStationMatrices:=New AffineMat4f[2]
  219. Field _controllerStates:=New VRControllerState[2]
  220. Field _headId:Int
  221. Field _controllerIds:=New Int[2]
  222. Field _baseStationIds:=New Int[2]
  223. Field _eyeRect:Recti
  224. Field _leftEyeMatrix:=New AffineMat4f
  225. Field _rightEyeMatrix:=New AffineMat4f
  226. Field _leftEyeFrustum:Rectf
  227. Field _rightEyeFrustum:Rectf
  228. Field _trackingSpace:VRTrackingSpace
  229. 'Render
  230. Field _leftEyeTex:Texture
  231. Field _leftEyeRTarget:RenderTarget
  232. Field _rightEyeTex:Texture
  233. Field _rightEyeRTarget:RenderTarget
  234. Field _leftEyeImage:Image
  235. Field _rightEyeImage:Image
  236. Method InitVR()
  237. local type:=VRApplication_Scene,error:HmdError
  238. VR_Init( Varptr error,type )
  239. If error<>VRInitError_None RuntimeError( "VR_Init error:"+VR_GetVRInitErrorAsSymbol( error ) )
  240. Local w:UInt,h:UInt
  241. VRSystem().GetRecommendedRenderTargetSize( Varptr w,Varptr h )
  242. _eyeRect=New Recti( 0,0,w,h )
  243. _leftEyeMatrix=-Cast<AffineMat4f>( VRSystem().GetEyeToHeadTransform( Eye_Left ) )
  244. _rightEyeMatrix=-Cast<AffineMat4f>( VRSystem().GetEyeToHeadTransform( Eye_Right ) )
  245. VRSystem().GetProjectionRaw( Eye_Left,Varptr _leftEyeFrustum.min.x,Varptr _leftEyeFrustum.max.x,Varptr _leftEyeFrustum.min.y,Varptr _leftEyeFrustum.max.y )
  246. VRSystem().GetProjectionRaw( Eye_Right,Varptr _rightEyeFrustum.min.x,Varptr _rightEyeFrustum.max.x,Varptr _rightEyeFrustum.min.y,Varptr _rightEyeFrustum.max.y )
  247. _headId=-1;_controllerIds[0]=-1;_controllerIds[1]=-1;_baseStationIds[0]=-1;_baseStationIds[1]=-1
  248. _controllerStates[0]=New VRControllerState
  249. _controllerStates[1]=New VRControllerState
  250. VRCompositor().SetTrackingSpace( TrackingUniverseSeated )
  251. _trackingSpace=VRTrackingSpace.Seated
  252. End
  253. Method InitRender()
  254. Local w:UInt,h:UInt
  255. VRSystem().GetRecommendedRenderTargetSize( Varptr w,Varptr h )
  256. _leftEyeTex=New Texture( _eyeRect.Width,_eyeRect.Height,PixelFormat.RGBA8,TextureFlags.Dynamic|TextureFlags.Filter )
  257. _leftEyeRTarget=New RenderTarget( New Texture[]( _leftEyeTex ),Null )
  258. _rightEyeTex=New Texture( _eyeRect.Width,_eyeRect.Height,PixelFormat.RGBA8,TextureFlags.Dynamic|TextureFlags.Filter )
  259. _rightEyeRTarget=New RenderTarget( New Texture[]( _rightEyeTex ),Null )
  260. _leftEyeImage=New Image( _leftEyeTex )
  261. _rightEyeImage=New Image( _rightEyeTex )
  262. End
  263. End