public override void preparePerPass(Renderable r, Pass p) { ParticleSystem ps = r as ParticleSystem; PipelineState pipeline = createPipeline(); RenderQueue <ParticleSystemInfo> rq = p.findRenderQueue(pipeline.id) as RenderQueue <ParticleSystemInfo>; if (rq == null) { rq = Renderer.device.createRenderQueue <ParticleSystemInfo>(pipeline); rq.name = "particle system"; rq.visualizer = this; p.registerQueue(rq); } ParticleSystemInfo info = rq.nextInfo(); float dist = (p.view.camera.position - r.position).Length; info.distToCamera = dist; info.count = ps.particles.Count; info.renderState.setVertexBuffer(ps.vbo.id, 0, 0, V3C4S3R.stride); info.renderState.alphaToCoverage.enabled = true; info.renderState.setUniform(new UniformData(0, Uniform.UniformType.Mat4, Matrix4.CreateTranslation(ps.position))); info.renderState.setTexture(ps.material.id(), 0, TextureTarget.Texture2D); info.renderState.setUniform(new UniformData(20, Uniform.UniformType.Int, 0)); }
// public override void preparePerPassFinalize(Pass p) { } // public override void prepareFrameFinalize() { } #endregion #region generate command phase // public override void generateRenderCommandsBegin(BaseRenderQueue q) { } public override void generateRenderCommand(RenderInfo r, BaseRenderQueue q) { ParticleSystemInfo psi = r as ParticleSystemInfo; q.addCommand(new SetRenderStateCommand(r.renderState)); q.addCommand(new DrawArraysCommand(PrimitiveType.Points, 0, psi.count)); }