//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)); } }
//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); } } }