Example #1
0
        public static void RenderCells(GraphicsDevice graphics, Frustum frustum,
                                       TerrainGeometryCellsComponent geo, D3DTerrainRenderComponent render, TransformComponent transform)
        {
            var context = graphics.ImmediateContext;

            if (render.TransformWorldBuffer.HasValue)
            {
                context.VertexShader.SetConstantBuffer(TransforStructBuffer.RegisterResourceSlot, render.TransformWorldBuffer.Get());
            }

            context.InputAssembler.InputLayout       = render.Layout.Get();
            context.InputAssembler.PrimitiveTopology = render.PrimitiveTopology;
            graphics.UpdateRasterizerState(render.RasterizerState.GetDescription());

            context.OutputMerger.SetDepthStencilState(render.DepthStencilState.Get(), 0);
            var blendFactor = new SharpDX.Mathematics.Interop.RawColor4(0, 0, 0, 0);

            context.OutputMerger.SetBlendState(render.BlendingState.Get(), blendFactor, -1);


            for (var index = 0; index < geo.Cells.Length; ++index)
            {
                var cell = geo.Cells[index];
                var box  = cell.Tree.GetBounds().Transform(transform.MatrixWorld);

                if (cell.Tree.IsBuilt && frustum.Contains(ref box) != Frustum.ContainmentType.Disjoint)
                {
                    context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(render.VertexBuffers.Get()[index], TerrainVertex.Size, 0));
                    context.InputAssembler.SetIndexBuffer(render.IndexBuffers.Get()[index], SharpDX.DXGI.Format.R32_UInt, 0);

                    graphics.ImmediateContext.DrawIndexed(cell.IndexCount, 0, 0);
                }
            }
        }
Example #2
0
        void UpdateCellBuffers(GraphicsDevice graphics,
                               TerrainGeometryCellsComponent geo, D3DTerrainRenderComponent render)
        {
            var vbuff = new SharpDX.Direct3D11.Buffer[geo.Cells.Length];
            var ibuff = new SharpDX.Direct3D11.Buffer[geo.Cells.Length];

            for (var cellIndex = 0; cellIndex < geo.Cells.Length; cellIndex++)
            {
                var cell = geo.Cells[cellIndex];
                var pool = ArrayPool <TerrainClipmapsVertex> .Shared;
                TerrainClipmapsVertex[] vertex = null;
                try {
                    //vertex = new TerrainVertex[pos.Length];
                    vertex = pool.Rent(cell.VertexCount);//
                    for (var i = 0; i < cell.VertexCount; i++)
                    {
                        vertex[i] = new TerrainClipmapsVertex {
                            texcoor = cell.TextureCoordinates[i],
                        };
                    }

                    vbuff[cellIndex] = graphics.CreateBuffer(BindFlags.VertexBuffer, vertex);
                    ibuff[cellIndex] = graphics.CreateBuffer(BindFlags.IndexBuffer, cell.Indices);
                } finally {
                    pool.Return(vertex);
                }
            }
            render.VertexBuffers.Set(vbuff);
            render.IndexBuffers.Set(ibuff);
        }
Example #3
0
        public static void UpdateCellBuffers(GraphicsDevice graphics,
                                             TerrainGeometryCellsComponent geo, D3DTerrainRenderComponent render)
        {
            var vbuff = new SharpDX.Direct3D11.Buffer[geo.Cells.Length];
            var ibuff = new SharpDX.Direct3D11.Buffer[geo.Cells.Length];

            for (var cellIndex = 0; cellIndex < geo.Cells.Length; cellIndex++)
            {
                var             cell   = geo.Cells[cellIndex];
                var             pool   = ArrayPool <TerrainVertex> .Shared;
                TerrainVertex[] vertex = null;
                try {
                    //vertex = new TerrainVertex[pos.Length];
                    vertex = pool.Rent(cell.VertexCount);//
                    for (var i = 0; i < cell.VertexCount; i++)
                    {
                        var weight = new Vector4(
                            SharpDX.MathUtil.Clamp(1.0f - (float)Math.Abs(cell.Positions[i].Y - 0f) / 8.0f, 0f, 1f),
                            SharpDX.MathUtil.Clamp(1.0f - (float)Math.Abs(cell.Positions[i].Y - 10) / 6.0f, 0f, 1f),
                            SharpDX.MathUtil.Clamp(1.0f - (float)Math.Abs(cell.Positions[i].Y - 15) / 6.0f, 0f, 1f),
                            SharpDX.MathUtil.Clamp(1.0f - (float)Math.Abs(cell.Positions[i].Y - geo.MaxHeight) / 4.0f, 0f, 1f)
                            );
                        var total = weight.X + weight.Y + weight.Z + weight.W;
                        weight.X /= total;
                        weight.Y /= total;
                        weight.Z /= total;
                        weight.W /= total;

                        vertex[i] = new TerrainVertex {
                            position         = cell.Positions[i],
                            normal           = cell.Normals[i],
                            tangent          = cell.Tangents[i],
                            binormal         = cell.Binormal[i],
                            color            = cell.Colors[i],
                            texcoor          = cell.TextureCoordinates[i],
                            normapMapTexCoor = cell.NormalMapTexCoordinates[i],
                            texWeights       = weight,
                        };
                    }

                    vbuff[cellIndex] = graphics.CreateBuffer(BindFlags.VertexBuffer, vertex);
                    ibuff[cellIndex] = graphics.CreateBuffer(BindFlags.IndexBuffer, cell.Indices);
                } finally {
                    pool.Return(vertex);
                }
            }
            render.VertexBuffers.Set(vbuff);
            render.IndexBuffers.Set(ibuff);
        }