예제 #1
0
        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));
        }
예제 #2
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));
        }