예제 #1
0
        //public override void generateRenderCommandsBegin(BaseRenderQueue q) { }
        //public override void generateRenderCommand(RenderInfo r, BaseRenderQueue q) { }
        public override void generateRenderCommandsFinalize(BaseRenderQueue q)
        {
            RenderQueue <TerrainRenderInfo> rq = q as RenderQueue <TerrainRenderInfo>;

            if (rq.myInfoCount > 0)
            {
                //these should all have the same renderstate
                TerrainRenderInfo firstTi = rq.myInfos[0] as TerrainRenderInfo;
                firstTi.renderState.setUniformBuffer(myInstanceMatrixBuffer.id, 2);
                setVertexBuffer(firstTi.renderState);
                q.addCommand(new SetRenderStateCommand(firstTi.renderState));
                q.commands.Add(new MultiDrawArraysCommand(PrimitiveType.Triangles, myOffset, myCount, myDrawCount));
            }
        }
예제 #2
0
        //public override void preparePerFrame(Renderable r) { }
        //public override void preparePerViewBegin(View v) { }
        //public override void preparePerView(Renderable r, View v) { }
        //public override void preparePerViewFinalize(View v) { }
        //public override void preparePerPassBegin(Pass p) { }

        public override void preparePerPass(Renderable r, Pass p)
        {
            TerrainRenderable tr = r as TerrainRenderable;
            Chunk             c  = tr.myChunk;

            if (myRenderManager.isLoaded(c, bufferChunk) == false)
            {
                myRenderManager.loadChunk(c, bufferChunk);
                return;
            }

            //DebugRenderer.addOffsetCube(c.myLocation, c.mySize, Color4.Blue, Fill.WIREFRAME, false, 0.0f);

            DrawChunk dc = myRenderManager.findDrawChunk(c);

            if (dc != null)
            {
                Matrix4 m = Matrix4.CreateTranslation(c.myLocation);

                //add solid render info
                if (dc.solidCount > 0)
                {
                    MaterialEffect effect              = getEffect(p.technique, 1);
                    PipelineState  pipeline            = effect.createPipeline(MaterialManager.visualMaterial);
                    RenderQueue <TerrainRenderInfo> rq = p.findRenderQueue(pipeline.id) as RenderQueue <TerrainRenderInfo>;
                    if (rq == null)
                    {
                        rq            = Renderer.device.createRenderQueue <TerrainRenderInfo>(effect.createPipeline(MaterialManager.visualMaterial));
                        rq.name       = rq.myPipeline.shaderState.shaderProgram.name + "-" + "opaque";
                        rq.visualizer = this;
                        p.registerQueue(rq);
                    }

                    TerrainRenderInfo info = rq.nextInfo();
                    info.distToCamera = (p.view.camera.position - c.myLocation).Length;
                    info.model        = m;
                    info.myType       = TerrainRenderInfo.Type.SOLID;
                    info.count        = dc.solidCount;
                    info.offset       = dc.solidOffset;
                    info.sortId       = getSortId(info);
                    effect.updateRenderState(MaterialManager.visualMaterial, info.renderState);

                    addDraw(info.offset, info.count, info.model);
                }

                //add transparent render info
                if (dc.transCount > 0)
                {
                    MaterialEffect effect              = getEffect(p.technique, 2);
                    PipelineState  pipeline            = effect.createPipeline(MaterialManager.visualMaterial);
                    RenderQueue <TerrainRenderInfo> rq = p.findRenderQueue(pipeline.id) as RenderQueue <TerrainRenderInfo>;
                    if (rq == null)
                    {
                        rq            = Renderer.device.createRenderQueue <TerrainRenderInfo>(effect.createPipeline(MaterialManager.visualMaterial));
                        rq.name       = rq.myPipeline.shaderState.shaderProgram.name + "-" + "transparent";
                        rq.visualizer = this;
                        p.registerQueue(rq);
                    }

                    TerrainRenderInfo info = rq.nextInfo();
                    info.distToCamera = (p.view.camera.position - c.myLocation).Length;
                    info.model        = m;
                    info.myType       = TerrainRenderInfo.Type.TRANS;
                    info.count        = dc.transCount;
                    info.offset       = dc.transOffset;
                    info.sortId       = getSortId(info);
                    effect.updateRenderState(MaterialManager.visualMaterial, info.renderState);

                    addDraw(info.offset, info.count, info.model);
                }

                //add water renderinfo
                if (dc.waterCount > 0)
                {
                    MaterialEffect effect              = getEffect(p.technique, 3);
                    PipelineState  pipeline            = effect.createPipeline(MaterialManager.visualMaterial);
                    RenderQueue <TerrainRenderInfo> rq = p.findRenderQueue(pipeline.id) as RenderQueue <TerrainRenderInfo>;
                    if (rq == null)
                    {
                        rq            = Renderer.device.createRenderQueue <TerrainRenderInfo>(effect.createPipeline(MaterialManager.visualMaterial));
                        rq.name       = rq.myPipeline.shaderState.shaderProgram.name + "-" + "water";
                        rq.visualizer = this;
                        p.registerQueue(rq);
                    }

                    TerrainRenderInfo info = rq.nextInfo();
                    info.distToCamera = (p.view.camera.position - c.myLocation).Length;
                    info.model        = m;
                    info.myType       = TerrainRenderInfo.Type.WATER;
                    info.count        = dc.waterCount;
                    info.offset       = dc.waterOffset;
                    info.sortId       = getSortId(info);
                    effect.updateRenderState(MaterialManager.visualMaterial, info.renderState);

                    addDraw(info.offset, info.count, info.model);
                }
            }
        }