device.monkey2 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. Namespace mojo.graphics
  2. #rem monkeydoc Blend modes.
  3. Blend modes are used with the [[Canvas.BlendMode]] property.
  4. | BlendMode | Description
  5. |:----------|:-----------
  6. | Opaque | Blending disabled.
  7. | Alpha | Alpha blending.
  8. | Multiply | Multiply blending.
  9. | Additive | Additive blending.
  10. #end
  11. Enum BlendMode
  12. Opaque=0
  13. Alpha=1
  14. Additive=2
  15. Multiply=3
  16. End
  17. #rem monkeydoc @hidden
  18. #end
  19. Class GraphicsDevice
  20. Method New()
  21. RenderTarget=Null
  22. Viewport=New Recti( 0,0,640,480 )
  23. Scissor=New Recti( 0,0,16384,16384 )
  24. BlendMode=BlendMode.Alpha
  25. End
  26. Property RenderTarget:Texture()
  27. Return _target
  28. Setter( renderTarget:Texture )
  29. FlushTarget()
  30. _target=renderTarget
  31. _dirty|=Dirty.Target
  32. End
  33. Property Viewport:Recti()
  34. Return _viewport
  35. Setter( viewport:Recti )
  36. FlushTarget()
  37. _viewport=viewport
  38. _dirty|=Dirty.Viewport|Dirty.Scissor
  39. End
  40. Property Scissor:Recti()
  41. Return _scissor
  42. Setter( scissor:Recti )
  43. FlushTarget()
  44. _scissor=scissor
  45. _dirty|=Dirty.Scissor
  46. End
  47. Property BlendMode:BlendMode()
  48. Return _blendMode
  49. Setter( blendMode:BlendMode )
  50. _blendMode=blendMode
  51. _dirty|=Dirty.BlendMode
  52. End
  53. Property ShaderEnv:ShaderEnv()
  54. Return _shaderEnv
  55. Setter( shaderEnv:ShaderEnv )
  56. _shaderEnv=shaderEnv
  57. _dirty|=Dirty.Shader|Dirty.EnvParams|Dirty.Params
  58. End
  59. Property EnvParams:ParamBuffer()
  60. Return _envParams
  61. Setter( envParams:ParamBuffer )
  62. _envParams=envParams
  63. _dirty|=Dirty.EnvParams
  64. End
  65. Property Shader:Shader()
  66. Return _shader
  67. Setter( shader:Shader )
  68. _shader=shader
  69. _dirty|=Dirty.Shader|Dirty.EnvParams|Dirty.Params
  70. End
  71. Property Params:ParamBuffer()
  72. Return _params
  73. Setter( params:ParamBuffer )
  74. _params=params
  75. _dirty|=Dirty.Params
  76. End
  77. Property FilteringEnabled:Bool()
  78. Return _filter
  79. Setter( filteringEnabled:Bool )
  80. If filteringEnabled=_filter Return
  81. _filter=filteringEnabled
  82. _dirty|=Dirty.Params
  83. End
  84. Method Clear( color:Color )
  85. Validate()
  86. If _rscissor<>_windowRect
  87. glEnable( GL_SCISSOR_TEST )
  88. glScissor( _rscissor.X,_rscissor.Y,_rscissor.Width,_rscissor.Height )
  89. Else
  90. glDisable( GL_SCISSOR_TEST )
  91. Endif
  92. glClearColor( color.r,color.g,color.b,color.a )
  93. glClear( GL_COLOR_BUFFER_BIT )
  94. If _rscissor<>_viewport
  95. glEnable( GL_SCISSOR_TEST )
  96. glScissor( _rscissor.X,_rscissor.Y,_rscissor.Width,_rscissor.Height )
  97. Else
  98. glDisable( GL_SCISSOR_TEST )
  99. Endif
  100. _modified=True
  101. End
  102. Method Render( vertices:Vertex2f Ptr,order:Int,count:Int )
  103. Validate()
  104. Local n:=order*count
  105. If n>_vertices.Length
  106. _vertices=New Vertex2f[n]
  107. Local p:=Cast<UByte Ptr>( _vertices.Data )
  108. glEnableVertexAttribArray( 0 ) ; glVertexAttribPointer( 0,2,GL_FLOAT,False,BYTES_PER_VERTEX,p )
  109. glEnableVertexAttribArray( 1 ) ; glVertexAttribPointer( 1,2,GL_FLOAT,False,BYTES_PER_VERTEX,p+8 )
  110. glEnableVertexAttribArray( 2 ) ; glVertexAttribPointer( 2,2,GL_FLOAT,False,BYTES_PER_VERTEX,p+16 )
  111. glEnableVertexAttribArray( 3 ) ; glVertexAttribPointer( 3,4,GL_UNSIGNED_BYTE,True,BYTES_PER_VERTEX,p+24 )
  112. Endif
  113. libc.memcpy( _vertices.Data,vertices,n*BYTES_PER_VERTEX )
  114. Select order
  115. Case 1
  116. glDrawArrays( GL_POINTS,0,n )
  117. Case 2
  118. glDrawArrays( GL_LINES,0,n )
  119. Case 3
  120. glDrawArrays( GL_TRIANGLES,0,n )
  121. Case 4
  122. Local n:=count*6
  123. If n>_qindices.Length
  124. _qindices=New UShort[n]
  125. For Local i:=0 Until count
  126. _qindices[i*6+0]=i*4
  127. _qindices[i*6+1]=i*4+1
  128. _qindices[i*6+2]=i*4+2
  129. _qindices[i*6+3]=i*4
  130. _qindices[i*6+4]=i*4+2
  131. _qindices[i*6+5]=i*4+3
  132. Next
  133. Endif
  134. glDrawElements( GL_TRIANGLES,n,GL_UNSIGNED_SHORT,_qindices.Data )
  135. Default
  136. For Local i:=0 Until count
  137. glDrawArrays( GL_TRIANGLE_FAN,i*order,order )
  138. Next
  139. End
  140. _modified=True
  141. End
  142. Method CopyPixmap:Pixmap( rect:Recti )
  143. Validate()
  144. Local pixmap:=New Pixmap( rect.Width,rect.Height,PixelFormat.RGBA32 )
  145. glReadPixels( rect.X,rect.Y,rect.Width,rect.Height,GL_RGBA,GL_UNSIGNED_BYTE,pixmap.Data )
  146. Return pixmap
  147. End
  148. Private
  149. Enum Dirty
  150. Target= $0001
  151. Viewport= $0002
  152. Scissor= $0004
  153. BlendMode= $0008
  154. Shader= $0010
  155. EnvParams= $0020
  156. Params= $0040
  157. All= $007f
  158. End
  159. Field _dirty:Dirty=Dirty.All
  160. Field _modified:Bool
  161. Field _target:Texture
  162. Field _windowRect:Recti
  163. Field _viewport:Recti
  164. Field _scissor:Recti
  165. Field _blendMode:BlendMode
  166. Field _shaderEnv:ShaderEnv
  167. Field _envParams:ParamBuffer
  168. Field _shader:Shader
  169. Field _params:ParamBuffer
  170. Field _filter:Bool=True
  171. Field _rscissor:Recti
  172. Global _seq:Int
  173. Global _current:GraphicsDevice
  174. Global _defaultFbo:GLint
  175. Global _vertices:Vertex2f[]
  176. Global _qindices:UShort[]
  177. Const BYTES_PER_VERTEX:=28
  178. Function InitGLState()
  179. glDisable( GL_CULL_FACE )
  180. glDisable( GL_DEPTH_TEST )
  181. glGetIntegerv( GL_FRAMEBUFFER_BINDING,Varptr _defaultFbo )
  182. End
  183. Method FlushTarget()
  184. If Not _modified Return
  185. If _target _target.Modified( Self )
  186. _modified=False
  187. End
  188. Method Validate()
  189. If _seq<>glGraphicsSeq
  190. _seq=glGraphicsSeq
  191. _current=Null
  192. InitGLState()
  193. Endif
  194. If _current=Self
  195. If Not _dirty Return
  196. Else
  197. If _current _current.FlushTarget()
  198. _current=Self
  199. _dirty=Dirty.All
  200. Endif
  201. If _dirty & Dirty.Target
  202. If _target
  203. glBindFramebuffer( GL_FRAMEBUFFER,_target.GLFramebuffer )
  204. Else
  205. glBindFramebuffer( GL_FRAMEBUFFER,_defaultFbo )
  206. Endif
  207. Endif
  208. If _dirty & Dirty.Viewport
  209. glViewport( _viewport.X,_viewport.Y,_viewport.Width,_viewport.Height )
  210. Endif
  211. If _dirty & Dirty.Scissor
  212. _rscissor=_scissor & _viewport
  213. If _rscissor<>_viewport
  214. glEnable( GL_SCISSOR_TEST )
  215. glScissor( _rscissor.X,_rscissor.Y,_rscissor.Width,_rscissor.Height )
  216. Else
  217. glDisable( GL_SCISSOR_TEST )
  218. Endif
  219. Endif
  220. If _dirty & Dirty.BlendMode
  221. Select _blendMode
  222. Case BlendMode.Opaque
  223. glDisable( GL_BLEND )
  224. Case BlendMode.Alpha
  225. glEnable( GL_BLEND )
  226. glBlendFunc( GL_ONE,GL_ONE_MINUS_SRC_ALPHA )
  227. Case BlendMode.Additive
  228. glEnable( GL_BLEND )
  229. glBlendFunc( GL_ONE,GL_ONE )
  230. Case BlendMode.Multiply
  231. glEnable( GL_BLEND )
  232. glBlendFunc( GL_DST_COLOR,GL_ONE_MINUS_SRC_ALPHA )
  233. End
  234. Endif
  235. If _shader And _shaderEnv And _envParams And _params
  236. If _dirty & Dirty.Shader
  237. _shader.Bind( _shaderEnv )
  238. Endif
  239. If _dirty & Dirty.EnvParams
  240. _shader.BindEnvParams( _envParams )
  241. Endif
  242. If _dirty & Dirty.Params
  243. _shader.BindParams( _params,_filter )
  244. End
  245. Endif
  246. _dirty=Null
  247. End
  248. End