uniformblock.monkey2 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. Namespace mojo.graphics
  2. #rem monkeydoc The UniformBlock class.
  3. #end
  4. Class UniformBlock Extends Resource
  5. #rem monkeydoc Sets a scalar uniform.
  6. #end
  7. Method SetScalar( uniform:String,scalar:Float )
  8. Local id:=GetUniformId( uniform )
  9. _scalars[id]=scalar
  10. _seq=_gseq
  11. _gseq+=1
  12. End
  13. #rem monkeydoc Gets a scalar uniform.
  14. #end
  15. Method GetScalar:Float( uniform:String )
  16. Local id:=GetUniformId( uniform )
  17. Return _scalars[id]
  18. End
  19. Method GetScalar:Float( id:Int )
  20. Return _scalars[id]
  21. End
  22. #rem monkeydoc Sets a vector uniform.
  23. #end
  24. Method SetVector( uniform:String,color:Color )
  25. Local id:=GetUniformId( uniform )
  26. _vectors[id]=New Vec4f( color.r,color.g,color.b,color.a )
  27. _seq=_gseq
  28. _gseq+=1
  29. End
  30. Method SetVector( uniform:String,vector:Vec2f )
  31. Local id:=GetUniformId( uniform )
  32. _vectors[id]=New Vec4f( vector.x,vector.y,0,0 )
  33. _seq=_gseq
  34. _gseq+=1
  35. End
  36. Method SetVector( uniform:String,vector:Vec3f )
  37. Local id:=GetUniformId( uniform )
  38. _vectors[id]=New Vec4f( vector.x,vector.y,vector.z,0 )
  39. _seq=_gseq
  40. _gseq+=1
  41. End
  42. Method SetVector( uniform:String,vector:Vec4f )
  43. Local id:=GetUniformId( uniform )
  44. _vectors[id]=vector
  45. _seq=_gseq
  46. _gseq+=1
  47. End
  48. #rem monkeydoc Gets a vector uniform.
  49. #end
  50. Method GetVector:Vec4f( uniform:String )
  51. Local id:=GetUniformId( uniform )
  52. Return _vectors[id]
  53. End
  54. Method GetVector:Vec4f( id:Int )
  55. Return _vectors[id]
  56. End
  57. #rem monkeydoc @hidden
  58. #end
  59. Method GetVector4fv:Float Ptr( id:Int )
  60. Return Varptr _vectors[id].x
  61. End
  62. #rem monkeydoc Sets a matrix uniform.
  63. #end
  64. Method SetMatrix( uniform:String,matrix:Mat4f )
  65. Local id:=GetUniformId( uniform )
  66. _matrices[id]=matrix
  67. _seq=_gseq
  68. _gseq+=1
  69. End
  70. #rem monkeydoc Gets a matrix uniform.
  71. #end
  72. Method GetMatrix:Mat4f( uniform:String )
  73. Local id:=GetUniformId( uniform )
  74. Return _matrices[id]
  75. End
  76. Method GetMatrix:Mat4f( id:Int )
  77. Return _matrices[id]
  78. End
  79. #rem monkeydoc @hidden
  80. #end
  81. Method GetMatrix4fv:Float Ptr( id:Int )
  82. Return Varptr _matrices[id].i.x
  83. End
  84. #rem monkeydoc Set a texture uniform.
  85. #end
  86. Method SetTexture( uniform:String,texture:Texture )
  87. Local id:=GetUniformId( uniform )
  88. If texture texture.Retain()
  89. If _textures[id] _textures[id].Release()
  90. _textures[id]=texture
  91. _seq=_gseq
  92. _gseq+=1
  93. End
  94. #rem monkeydoc Gets a texture uniform.
  95. #end
  96. Method GetTexture:Texture( uniform:String )
  97. Local id:=GetUniformId( uniform )
  98. Return _textures[id]
  99. End
  100. Method GetTexture:Texture( id:Int )
  101. Return _textures[id]
  102. End
  103. #rem monkeydoc Gets the id of a uniform name.
  104. #end
  105. Function GetUniformId:Int( uniform:String )
  106. Init()
  107. Local id:=_uniformIds[uniform]
  108. If Not id
  109. id=_uniformIds.Count()+1
  110. _uniformIds[uniform]=id
  111. Endif
  112. Return id
  113. End
  114. #rem monkeydoc @hidden
  115. #end
  116. Property Seq:Int()
  117. Return _seq
  118. End
  119. #rem monkeydoc @hidden
  120. #end
  121. Function BindUniformsToBlockId( uniforms:String[],index:Int )
  122. For Local uniform:=Eachin uniforms
  123. _blockIds[ GetUniformId( uniform ) ]=index
  124. Next
  125. End
  126. #rem monkeydoc @hidden
  127. #end
  128. Function GetUniformBlockId:Int( uniform:String )
  129. Return _blockIds[ GetUniformId( uniform ) ]
  130. End
  131. Protected
  132. Method OnDiscard() Override
  133. For Local t:=Eachin _textures
  134. If t t.Release()
  135. Next
  136. End
  137. Private
  138. Field _seq:Int
  139. Global _gseq:Int
  140. Field _scalars:=New Float[MaxUniforms]
  141. Field _vectors:=New Vec4f[MaxUniforms]
  142. Field _matrices:=New Mat4f[MaxUniforms]
  143. Field _textures:=New Texture[MaxUniforms]
  144. Global _uniformIds:=New StringMap<Int>
  145. Global _blockIds:=New Int[MaxUniforms]
  146. Const MaxUniforms:=32
  147. Function Init()
  148. Global inited:=False
  149. If inited Return
  150. inited=True
  151. UniformBlock.BindUniformsToBlockId( New String[]( "mx2_ViewportSize","mx2_ViewportOrigin","mx2_ViewportClip" ),0 )
  152. UniformBlock.BindUniformsToBlockId( New String[]( "mx2_AmbientLight" ),0 )
  153. UniformBlock.BindUniformsToBlockId( New String[]( "mx2_ModelViewProjectionMatrix" ),0 )
  154. UniformBlock.BindUniformsToBlockId( New String[]( "mx2_GBuffer0","GBuffer1","GBufferScale" ),0 )
  155. UniformBlock.BindUniformsToBlockId( New String[]( "mx2_ImageTexture0","mx2_ImageTexture1" ),1 )
  156. UniformBlock.BindUniformsToBlockId( New String[]( "mx2_ImageColor","mx2_LightDepth" ),1 )
  157. End
  158. End