void FillStreamWithTerrainBatch(int materialId, int vertexMaterialIndex, int indexCount, int startIndex, int baseVertex) { MyGPUFoliageGenerating implementation = MyGPUFoliageGenerating.GetInstance(); // all necessary data should be same - geometry and input layout var renderable = m_owner.GetRenderable(); var proxy = renderable.m_lods[0].RenderableProxies[0]; // get shader for streaming var bundle = MyMaterialShaders.Get(X.TEXT(MyVoxelMesh.MULTI_MATERIAL_TAG), X.TEXT("foliage_streaming"), MyMeshes.VoxelLayout, MyShaderUnifiedFlags.NONE); //var bundle = MyShaderBundleFactory.Get(renderable.GetMesh().LODs[0].m_meshInfo.VertexLayout, MyVoxelMesh.MULTI_MATERIAL_TAG, // "foliage_streaming", renderable.m_vsFlags | MyShaderUnifiedFlags.NONE); //var scaleMat = Matrix.CreateScale(renderable.m_voxelScale); //proxy.ObjectData.LocalMatrix = scaleMat; //var worldMat = proxy.WorldMatrix; //worldMat.Translation -= MyEnvironment.CameraPosition; //proxy.ObjectData.LocalMatrix = worldMat; implementation.RecordCommands(proxy, m_streams[materialId], materialId, bundle.VS, bundle.IL, vertexMaterialIndex, indexCount, startIndex, baseVertex); }
private static void UpdateSceneFrame() { var desc = new RasterizerStateDescription(); desc.FillMode = FillMode.Solid; desc.CullMode = CullMode.None; desc.IsFrontCounterClockwise = true; desc.DepthBias = 25000; desc.DepthBiasClamp = 2; desc.SlopeScaledDepthBias = 1; MyPipelineStates.Modify(m_shadowRasterizerState, desc); MyMeshes.Load(); QueryTexturesFromEntities(); MyTextures.Load(); GatherTextures(); MyComponents.UpdateCullProxies(); MyComponents.ProcessEntities(); MyComponents.SendVisible(); MyBillboardRenderer.OnFrameStart(); MyRender11.GetRenderProfiler().StartProfilingBlock("RebuildProxies"); foreach (var renderable in MyComponentFactory <MyRenderableComponent> .GetAll()) { renderable.RebuildRenderProxies(); } MyRender11.GetRenderProfiler().EndProfilingBlock(); MyRender11.GetRenderProfiler().StartProfilingBlock("UpdateProxies"); UpdateActors(); MyRender11.GetRenderProfiler().EndProfilingBlock(); MyBigMeshTable.Table.MoveToGPU(); MyRender11.GetRenderProfiler().StartProfilingBlock("Update merged groups"); MyRender11.GetRenderProfiler().StartProfilingBlock("UpdateBeforeDraw"); foreach (var r in MyComponentFactory <MyGroupRootComponent> .GetAll()) { r.UpdateBeforeDraw(); } MyRender11.GetRenderProfiler().EndProfilingBlock(); MyRender11.GetRenderProfiler().StartProfilingBlock("MoveToGPU"); foreach (var r in MyComponentFactory <MyGroupRootComponent> .GetAll()) { foreach (var val in r.m_materialGroups.Values) { // optimize: keep list+set for updating val.MoveToGPU(); } } MyRender11.GetRenderProfiler().EndProfilingBlock(); MyRender11.GetRenderProfiler().EndProfilingBlock(); MyRender11.GetRenderProfiler().StartProfilingBlock("Fill foliage streams"); MyGpuProfiler.IC_BeginBlock("Fill foliage streams"); MyGPUFoliageGenerating.GetInstance().PerFrame(); MyGPUFoliageGenerating.GetInstance().Begin(); foreach (var foliage in MyComponentFactory <MyFoliageComponent> .GetAll()) { if (foliage.m_owner.CalculateCameraDistance() < MyRender11.RenderSettings.FoliageDetails.GrassDrawDistance()) { foliage.FillStreams(); } else { foliage.InvalidateStreams(); } } MyGPUFoliageGenerating.GetInstance().End(); MyGpuProfiler.IC_EndBlock(); MyRender11.GetRenderProfiler().EndProfilingBlock(); MyCommon.MoveToNextFrame(); }