renderqueue.monkey2 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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 AddShadowOps:Bool()
  35. Return _addShadowOps
  36. Setter( addShadowOps:Bool )
  37. _addShadowOps=addShadowOps
  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. If _addShadowOps _shadowOps.Add( op )
  69. Else
  70. stack=_transparentOps
  71. op.shader=op.material.GetRenderShader()
  72. op.distance=op.instance ? op.instance.Position.Distance( _eyePos ) Else _eyeLen
  73. Endif
  74. stack.Add( op )
  75. End
  76. Method AddSpriteOp( op:SpriteOp )
  77. op.distance=op.sprite ? op.sprite.Position.Distance( _eyePos ) Else _eyeLen
  78. _spriteOps.Add( op )
  79. End
  80. Method AddRenderOp( material:Material,uniforms:UniformBlock,instance:Entity,vbuffer:VertexBuffer,ibuffer:IndexBuffer,order:Int,count:Int,first:Int )
  81. Local op:=New RenderOp
  82. op.material=material
  83. op.uniforms=uniforms
  84. op.instance=instance
  85. op.vbuffer=vbuffer
  86. op.ibuffer=ibuffer
  87. op.order=order
  88. op.count=count
  89. op.first=first
  90. AddRenderOp( op )
  91. End
  92. Method AddRenderOp( material:Material,instance:Entity,vbuffer:VertexBuffer,ibuffer:IndexBuffer,order:Int,count:Int,first:Int )
  93. Local op:=New RenderOp
  94. op.material=material
  95. op.instance=instance
  96. op.vbuffer=vbuffer
  97. op.ibuffer=ibuffer
  98. op.order=order
  99. op.count=count
  100. op.first=first
  101. AddRenderOp( op )
  102. End
  103. Method AddRenderOp( material:Material,bones:Mat4f[],vbuffer:VertexBuffer,ibuffer:IndexBuffer,order:Int,count:Int,first:Int )
  104. Local op:=New RenderOp
  105. op.material=material
  106. op.bones=bones
  107. op.vbuffer=vbuffer
  108. op.ibuffer=ibuffer
  109. op.order=order
  110. op.count=count
  111. op.first=first
  112. AddRenderOp( op )
  113. End
  114. Method AddRenderOp( material:Material,vbuffer:VertexBuffer,ibuffer:IndexBuffer,order:Int,count:Int,first:Int )
  115. Local op:=New RenderOp
  116. op.material=material
  117. op.vbuffer=vbuffer
  118. op.ibuffer=ibuffer
  119. op.order=order
  120. op.count=count
  121. op.first=first
  122. AddRenderOp( op )
  123. End
  124. Method AddSpriteOp( sprite:Sprite )
  125. DebugAssert( sprite.Material.GetRenderShader(),"Sprites must be transparent!" )
  126. Local op:=New SpriteOp
  127. op.sprite=sprite
  128. AddSpriteOp( op )
  129. End
  130. Private
  131. Field _time:float
  132. Field _eyePos:Vec3f
  133. Field _eyeLen:Float
  134. Field _addShadowOps:Bool
  135. Field _opaqueOps:=New Stack<RenderOp>
  136. Field _selfillumOps:=New Stack<RenderOp>
  137. Field _transparentOps:=New Stack<RenderOp>
  138. Field _shadowOps:=New Stack<RenderOp>
  139. Field _spriteOps:=New Stack<SpriteOp>
  140. End