Namespace mojo3d Internal Struct SpriteOp Field sprite:Sprite Field distance:Float End Class RenderOp Field material:Material Field uniforms:UniformBlock 'could be in instance? Field instance:Entity Field bones:Mat4f[] 'should be in instance Field vbuffer:VertexBuffer Field ibuffer:IndexBuffer Field order:Int Field count:Int Field first:Int Field blendMode:BlendMode Field distance:Float Field shader:Shader End Public Class RenderQueue Property Time:Float() Return _time Setter( time:Float ) _time=time End Property EyePos:Vec3f() Return _eyePos Setter( eyePos:Vec3f ) _eyePos=eyePos _eyeLen=_eyePos.Length End Property CastsShadow:Bool() Return _castsShadow Setter( castsShadow:Bool ) _castsShadow=castsShadow End Property OpaqueOps:Stack() Return _opaqueOps End Property SelfIlluminatedOps:Stack() Return _selfillumOps End Property TransparentOps:Stack() Return _transparentOps End Property ShadowOps:Stack() Return _shadowOps End Property SpriteOps:Stack() Return _spriteOps End Method Clear() _opaqueOps.Clear() _selfillumOps.Clear() _transparentOps.Clear() _shadowOps.Clear() _spriteOps.Clear() End Method AddRenderOp( op:RenderOp ) op.blendMode=op.material.BlendMode If op.instance And op.instance.Alpha<1 And op.blendMode=BlendMode.Opaque op.blendMode=BlendMode.Alpha Local stack:Stack If op.blendMode=BlendMode.Opaque stack=_opaqueOps op.shader=op.material.GetRenderShader() Else stack=_transparentOps op.shader=op.material.GetRenderShader() op.distance=op.instance ? op.instance.Position.Distance( _eyePos ) Else _eyeLen Endif If op.material.SelfIlluminated Assert( False ) stack=_selfillumOps Endif If Not op.shader Return stack.Add( op ) If _castsShadow And op.material.GetRenderShader() _shadowOps.Push( op ) End Method AddSpriteOp( op:SpriteOp ) op.distance=op.sprite ? op.sprite.Position.Distance( _eyePos ) Else _eyeLen _spriteOps.Add( op ) End Method AddRenderOp( material:Material,uniforms:UniformBlock,instance:Entity,vbuffer:VertexBuffer,ibuffer:IndexBuffer,order:Int,count:Int,first:Int ) Local op:=New RenderOp op.material=material op.uniforms=uniforms op.instance=instance op.vbuffer=vbuffer op.ibuffer=ibuffer op.order=order op.count=count op.first=first AddRenderOp( op ) End Method AddRenderOp( material:Material,instance:Entity,vbuffer:VertexBuffer,ibuffer:IndexBuffer,order:Int,count:Int,first:Int ) Local op:=New RenderOp op.material=material op.instance=instance op.vbuffer=vbuffer op.ibuffer=ibuffer op.order=order op.count=count op.first=first AddRenderOp( op ) End Method AddRenderOp( material:Material,bones:Mat4f[],vbuffer:VertexBuffer,ibuffer:IndexBuffer,order:Int,count:Int,first:Int ) Local op:=New RenderOp op.material=material op.bones=bones op.vbuffer=vbuffer op.ibuffer=ibuffer op.order=order op.count=count op.first=first AddRenderOp( op ) End Method AddRenderOp( material:Material,vbuffer:VertexBuffer,ibuffer:IndexBuffer,order:Int,count:Int,first:Int ) Local op:=New RenderOp op.material=material op.vbuffer=vbuffer op.ibuffer=ibuffer op.order=order op.count=count op.first=first AddRenderOp( op ) End Method AddSpriteOp( sprite:Sprite ) DebugAssert( sprite.Material.GetRenderShader(),"Sprites must be transparent!" ) Local op:=New SpriteOp op.sprite=sprite AddSpriteOp( op ) End Private Field _time:float Field _eyePos:Vec3f Field _eyeLen:Float Field _castsShadow:Bool Field _opaqueOps:=New Stack Field _selfillumOps:=New Stack Field _transparentOps:=New Stack Field _shadowOps:=New Stack Field _spriteOps:=New Stack End