renderqueue.monkey2 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. Namespace mojo3d
  2. Internal
  3. Struct SpriteOp
  4. Field sprite:Sprite
  5. Field distance:Float
  6. End
  7. Class RenderOp
  8. Field material:Material
  9. Field uniforms:UniformBlock 'could be in instance?
  10. Field instance:Entity
  11. Field bones:Mat4f[] 'should be in instance
  12. Field vbuffer:VertexBuffer
  13. Field ibuffer:IndexBuffer
  14. Field order:Int
  15. Field count:Int
  16. Field first:Int
  17. Field blendMode:BlendMode
  18. Field distance:Float
  19. Field shader:Shader
  20. End
  21. Public
  22. Class RenderQueue
  23. Property Time:Float()
  24. Return _time
  25. Setter( time:Float )
  26. _time=time
  27. End
  28. Property EyePos:Vec3f()
  29. Return _eyePos
  30. Setter( eyePos:Vec3f )
  31. _eyePos=eyePos
  32. _eyeLen=_eyePos.Length
  33. End
  34. Property CastsShadow:Bool()
  35. Return _castsShadow
  36. Setter( castsShadow:Bool )
  37. _castsShadow=castsShadow
  38. End
  39. Property OpaqueOps:Stack<RenderOp>()
  40. Return _opaqueOps
  41. End
  42. Property SelfIlluminatedOps:Stack<RenderOp>()
  43. Return _selfillumOps
  44. End
  45. Property TransparentOps:Stack<RenderOp>()
  46. Return _transparentOps
  47. End
  48. Property ShadowOps:Stack<RenderOp>()
  49. Return _shadowOps
  50. End
  51. Property SpriteOps:Stack<SpriteOp>()
  52. Return _spriteOps
  53. End
  54. Method Clear()
  55. _opaqueOps.Clear()
  56. _selfillumOps.Clear()
  57. _transparentOps.Clear()
  58. _shadowOps.Clear()
  59. _spriteOps.Clear()
  60. End
  61. Method AddRenderOp( op:RenderOp )
  62. op.blendMode=op.material.BlendMode
  63. If op.instance And op.instance.Alpha<1 And op.blendMode=BlendMode.Opaque op.blendMode=BlendMode.Alpha
  64. Local stack:Stack<RenderOp>
  65. If op.blendMode=BlendMode.Opaque
  66. stack=_opaqueOps
  67. op.shader=op.material.GetRenderShader()
  68. Else
  69. stack=_transparentOps
  70. op.shader=op.material.GetRenderShader()
  71. op.distance=op.instance ? op.instance.Position.Distance( _eyePos ) Else _eyeLen
  72. Endif
  73. If op.material.SelfIlluminated
  74. Assert( False )
  75. stack=_selfillumOps
  76. Endif
  77. If Not op.shader Return
  78. stack.Add( op )
  79. If _castsShadow And op.material.GetRenderShader() _shadowOps.Push( op )
  80. End
  81. Method AddSpriteOp( op:SpriteOp )
  82. op.distance=op.sprite ? op.sprite.Position.Distance( _eyePos ) Else _eyeLen
  83. _spriteOps.Add( op )
  84. End
  85. Method AddRenderOp( material:Material,uniforms:UniformBlock,instance:Entity,vbuffer:VertexBuffer,ibuffer:IndexBuffer,order:Int,count:Int,first:Int )
  86. Local op:=New RenderOp
  87. op.material=material
  88. op.uniforms=uniforms
  89. op.instance=instance
  90. op.vbuffer=vbuffer
  91. op.ibuffer=ibuffer
  92. op.order=order
  93. op.count=count
  94. op.first=first
  95. AddRenderOp( op )
  96. End
  97. Method AddRenderOp( material:Material,instance:Entity,vbuffer:VertexBuffer,ibuffer:IndexBuffer,order:Int,count:Int,first:Int )
  98. Local op:=New RenderOp
  99. op.material=material
  100. op.instance=instance
  101. op.vbuffer=vbuffer
  102. op.ibuffer=ibuffer
  103. op.order=order
  104. op.count=count
  105. op.first=first
  106. AddRenderOp( op )
  107. End
  108. Method AddRenderOp( material:Material,bones:Mat4f[],vbuffer:VertexBuffer,ibuffer:IndexBuffer,order:Int,count:Int,first:Int )
  109. Local op:=New RenderOp
  110. op.material=material
  111. op.bones=bones
  112. op.vbuffer=vbuffer
  113. op.ibuffer=ibuffer
  114. op.order=order
  115. op.count=count
  116. op.first=first
  117. AddRenderOp( op )
  118. End
  119. Method AddRenderOp( material:Material,vbuffer:VertexBuffer,ibuffer:IndexBuffer,order:Int,count:Int,first:Int )
  120. Local op:=New RenderOp
  121. op.material=material
  122. op.vbuffer=vbuffer
  123. op.ibuffer=ibuffer
  124. op.order=order
  125. op.count=count
  126. op.first=first
  127. AddRenderOp( op )
  128. End
  129. Method AddSpriteOp( sprite:Sprite )
  130. DebugAssert( sprite.Material.GetRenderShader(),"Sprites must be transparent!" )
  131. Local op:=New SpriteOp
  132. op.sprite=sprite
  133. AddSpriteOp( op )
  134. End
  135. Private
  136. Field _time:float
  137. Field _eyePos:Vec3f
  138. Field _eyeLen:Float
  139. Field _castsShadow:Bool
  140. Field _opaqueOps:=New Stack<RenderOp>
  141. Field _selfillumOps:=New Stack<RenderOp>
  142. Field _transparentOps:=New Stack<RenderOp>
  143. Field _shadowOps:=New Stack<RenderOp>
  144. Field _spriteOps:=New Stack<SpriteOp>
  145. End