Ejemplo n.º 1
0
        public override void ConvertFromData(ConverterContext converterContext, IndexBufferBindingData data, ref IndexBufferBinding source)
        {
            Buffer buffer = null;

            converterContext.ConvertFromData(data.Buffer, ref buffer);
            source = new IndexBufferBinding(buffer, data.Is32Bit, data.Count, data.Offset);
        }
Ejemplo n.º 2
0
            public DeviceResourceContext(GraphicsDevice device, VertexDeclaration declaration, int vertexCount, int indexStructSize, int indexCount)
            {
                var vertexSize = declaration.CalculateSize();

                VertexCount = vertexCount;
                IndexCount  = indexCount;

                // Workaround: due to graphics refactor sometimes empty emitters will try to draw 0 particles
                // TODO Avoid calling this method if LivingParticles == 0
                {
                    if (VertexCount <= 0)
                    {
                        VertexCount = 1;
                    }
                    if (IndexCount <= 0)
                    {
                        IndexCount = 1;
                    }
                }

                var vertexBuffer = Buffer.Vertex.New(device, VertexCount * vertexSize, GraphicsResourceUsage.Dynamic).DisposeBy(this);
                var indexBuffer  = Buffer.Index.New(device, IndexCount * indexStructSize, GraphicsResourceUsage.Dynamic).DisposeBy(this);

                IndexBuffer  = new IndexBufferBinding(indexBuffer, indexStructSize == sizeof(int), IndexCount);
                VertexBuffer = new VertexBufferBinding(vertexBuffer, declaration, VertexCount, vertexSize);
            }
        public void Build(RenderDrawContext context)
        {
            if (Mesh == null && TryGetHeightMapImageData(context.CommandList, out var data))
            {
                Data               = new GeometryBuilder(data).BuildTerrainData(Size, MaxHeight, UvScale);
                MeshBoundingBox    = Utils.FromPoints(Data.Vertices);
                MeshBoundingSphere = BoundingSphere.FromBox(MeshBoundingBox);
                BoundingBox        = new BoundingBoxExt(MeshBoundingBox);

                var vertexBuffer        = Buffer.Vertex.New(context.GraphicsDevice, Data.Vertices, GraphicsResourceUsage.Dynamic);
                var indexBuffer         = Buffer.Index.New(context.GraphicsDevice, Data.Indices);
                var vertexBufferBinding = new VertexBufferBinding(vertexBuffer, VertexPositionNormalTexture.Layout, vertexBuffer.ElementCount);
                var indexBufferBinding  = new IndexBufferBinding(indexBuffer, true, indexBuffer.ElementCount);

                MeshDraw = new MeshDraw
                {
                    StartLocation = 0,
                    PrimitiveType = PrimitiveType.TriangleList,
                    VertexBuffers = new[] { vertexBufferBinding },
                    IndexBuffer   = indexBufferBinding,
                    DrawCount     = indexBuffer.ElementCount
                };

                Mesh = new Mesh(MeshDraw, new ParameterCollection());
            }
        }
Ejemplo n.º 4
0
 public IndexedVertexBufferIndex(
     IndexBufferBinding indexBufferBinding, int startIndexLocation,
     VertexBufferBinding vertexBufferBinding, int startVertexLocation)
     : base(vertexBufferBinding, startVertexLocation)
 {
     _indexBufferBinding = indexBufferBinding;
     _offset             = indexBufferBinding.Offset + (startIndexLocation * FormatHelper.SizeOfInBytes(indexBufferBinding.Format));
 }
Ejemplo n.º 5
0
        void CreateDeviceObjects()
        {
            // set up a commandlist
            commandList = context.CommandList;

            // compile de shader
            imShader = new EffectInstance(effectSystem.LoadEffect("ImGuiShader").WaitForResult());
            imShader.UpdateEffect(device);

            var layout = new VertexDeclaration(
                VertexElement.Position <Vector2>(),
                VertexElement.TextureCoordinate <Vector2>(),
                VertexElement.Color(PixelFormat.R8G8B8A8_UNorm)
                );

            imVertLayout = layout;

            // de pipeline desc
            var pipeline = new PipelineStateDescription()
            {
                BlendState = BlendStates.NonPremultiplied,

                RasterizerState = new RasterizerStateDescription()
                {
                    CullMode  = CullMode.None,
                    DepthBias = 0,
                    FillMode  = FillMode.Solid,
                    MultisampleAntiAliasLine = false,
                    ScissorTestEnable        = true,
                    SlopeScaleDepthBias      = 0,
                },

                PrimitiveType     = PrimitiveType.TriangleList,
                InputElements     = imVertLayout.CreateInputElements(),
                DepthStencilState = DepthStencilStates.Default,

                EffectBytecode = imShader.Effect.Bytecode,
                RootSignature  = imShader.RootSignature,

                Output = new RenderOutputDescription(PixelFormat.R8G8B8A8_UNorm)
            };

            // finally set up the pipeline
            var pipelineState = PipelineState.New(device, ref pipeline);

            imPipeline = pipelineState;

            var is32Bits           = false;
            var indexBuffer        = Xenko.Graphics.Buffer.Index.New(device, INITIAL_INDEX_BUFFER_SIZE * sizeof(ushort), GraphicsResourceUsage.Dynamic);
            var indexBufferBinding = new IndexBufferBinding(indexBuffer, is32Bits, 0);

            indexBinding = indexBufferBinding;

            var vertexBuffer        = Xenko.Graphics.Buffer.Vertex.New(device, INITIAL_VERTEX_BUFFER_SIZE * imVertLayout.CalculateSize(), GraphicsResourceUsage.Dynamic);
            var vertexBufferBinding = new VertexBufferBinding(vertexBuffer, layout, 0);

            vertexBinding = vertexBufferBinding;
        }
Ejemplo n.º 6
0
        private VertexArrayObject(GraphicsDevice graphicsDevice, EffectInputSignature shaderSignature, IndexBufferBinding indexBufferBinding, VertexBufferBinding[] vertexBufferBindings)
            : base(graphicsDevice)
        {
            this.vertexBufferBindings = vertexBufferBindings;
            this.indexBufferBinding = indexBufferBinding;
            this.preferredInputSignature = shaderSignature;

            CreateAttributes();
        }
Ejemplo n.º 7
0
        /// <inheritdoc />
        public Mesh Create(IMeshData32 <TVertex> meshData)
        {
            Contracts.Requires.That(meshData != null);
            MeshData.VerifyContracts(meshData);

            var indexBuffer = new IndexBufferBinding(
                Buffer.Index.New(this.GraphicsDevice, meshData.Indices32, GraphicsResourceUsage.Immutable),
                is32Bit: true,
                count: meshData.IndicesCount);

            return(this.CreateMesh(indexBuffer, meshData));
        }
Ejemplo n.º 8
0
        private VertexArrayObject GetOrCreateVertexArrayObjectAEN(RenderContext context)
        {
            if (vertexArrayObjectAEN == null)
            {
                var graphicsDevice     = context.GraphicsDevice;
                var indicesAEN         = IndexExtensions.GenerateIndexBufferAEN(Mesh.Draw.IndexBuffer, Mesh.Draw.VertexBuffers[0]);
                var indexBufferBinding = new IndexBufferBinding(Buffer.Index.New(graphicsDevice, indicesAEN), true, Mesh.Draw.IndexBuffer.Count * 12 / 3);
                vertexArrayObjectAEN = VertexArrayObject.New(context.GraphicsDevice, Effect.InputSignature, indexBufferBinding, Mesh.Draw.VertexBuffers);
            }

            return(vertexArrayObjectAEN);
        }
Ejemplo n.º 9
0
        public void GenerateChunkData()
        {
            ChunkData PrepareChunkData()
            {
                var chunkVtxCount = 16;
                var chunkIdxCount = 16;

                var vertexBuffer = Xenko.Graphics.Buffer.New <VertexPositionNormalColor>(device, chunkVtxCount, BufferFlags.VertexBuffer, GraphicsResourceUsage.Dynamic);
                var indexBuffer  = Xenko.Graphics.Buffer.New <ushort>(device, chunkIdxCount, BufferFlags.IndexBuffer, GraphicsResourceUsage.Dynamic);
                var is32Bits     = false;

                var vertexBufferBinding = new VertexBufferBinding(vertexBuffer, VertexPositionNormalColor.Layout, chunkVtxCount);
                var indexBufferBinding  = new IndexBufferBinding(indexBuffer, is32Bits, chunkIdxCount);

                var chunkData = new ChunkData()
                {
                    Mesh = new Mesh()
                    {
                        Draw = new MeshDraw()
                        {
                            PrimitiveType = PrimitiveType.TriangleList,
                            VertexBuffers = new[] { vertexBufferBinding },
                            IndexBuffer   = indexBufferBinding,
                            DrawCount     = (6 * 6) * (Chunk.SIZE * Chunk.SIZE * Chunk.SIZE)
                        }
                    }
                };

                return(chunkData);
            }

            for (int x = 0; x < world.width; ++x)
            {
                for (int y = 0; y < world.height; ++y)
                {
                    for (int z = 0; z < world.depth; ++z)
                    {
                        var key = new Int3(x, y, z);
                        if (chunkData.TryGetValue(key, out ChunkData data))
                        {
                            GenerateChunkMesh(key, ref world[x, y, z], ref data);
                        }
                        else
                        {
                            var newData = PrepareChunkData();
                            chunkData[key] = newData;
                            GenerateChunkMesh(key, ref world[x, y, z], ref newData);
                        }
                    }
                }
            }
        }
Ejemplo n.º 10
0
        public static MeshDraw ToMeshDraw <T>(this GeometricPrimitive <T> primitive) where T : struct, IVertex
        {
            var vertexBufferBinding = new VertexBufferBinding(primitive.VertexBuffer, new T().GetLayout(), primitive.VertexBuffer.ElementCount);
            var indexBufferBinding  = new IndexBufferBinding(primitive.IndexBuffer, primitive.IsIndex32Bits, primitive.IndexBuffer.ElementCount);
            var data = new MeshDraw
            {
                StartLocation = 0,
                PrimitiveType = PrimitiveType.TriangleList,
                VertexBuffers = new[] { vertexBufferBinding },
                IndexBuffer   = indexBufferBinding,
                DrawCount     = primitive.IndexBuffer.ElementCount,
            };

            return(data);
        }
Ejemplo n.º 11
0
        public static MeshDraw ToMeshDraw(this MeshDraw primitive)
        {
            var vertexBufferBinding = new VertexBufferBinding(primitive.VertexBuffers[0].Buffer, new VertexPositionNormalTexture().GetLayout(), primitive.VertexBuffers[0].Count);
            var indexBufferBinding  = new IndexBufferBinding(primitive.IndexBuffer.Buffer, primitive.IndexBuffer.Is32Bit, primitive.IndexBuffer.Buffer.ElementCount);
            var data = new MeshDraw
            {
                StartLocation = 0,
                PrimitiveType = PrimitiveType.TriangleList,
                VertexBuffers = new[] { vertexBufferBinding },
                IndexBuffer   = indexBufferBinding,
                DrawCount     = primitive.IndexBuffer.Buffer.ElementCount,
            };

            return(data);
        }
Ejemplo n.º 12
0
        private VertexArrayObject(GraphicsDevice graphicsDevice, EffectInputSignature shaderSignature, IndexBufferBinding indexBufferBinding, VertexBufferBinding[] vertexBufferBindings)
            : base(graphicsDevice)
        {
            this.vertexBufferBindings = vertexBufferBindings;
            this.indexBufferBinding = indexBufferBinding;
            this.preferredInputSignature = shaderSignature;
            
            // Increase the reference count on the provided buffers -> we do not want to take the ownership
            foreach (VertexBufferBinding vertexBufferBinding in vertexBufferBindings)
                vertexBufferBinding.Buffer.AddReferenceInternal();

            if (indexBufferBinding != null)
                indexBufferBinding.Buffer.AddReferenceInternal();

            CreateAttributes();
        }
Ejemplo n.º 13
0
        private void CreateMesh()
        {
            var vbo = Xenko.Graphics.Buffer.Vertex.New(
                GraphicsDevice,
                verts,
                GraphicsResourceUsage.Dynamic
                );

            var ibo = Xenko.Graphics.Buffer.Index.New(
                GraphicsDevice,
                tris,
                GraphicsResourceUsage.Dynamic
                );

            _vertexBufferBinding =
                new VertexBufferBinding(vbo, VertexPositionNormalTexture.Layout, verts.Length);
            _indexBufferBinding = new IndexBufferBinding(ibo, is32Bit: true, count: tris.Length);
            _mesh = new Mesh()
            {
                Draw = new MeshDraw()
                {
                    PrimitiveType = PrimitiveType.TriangleList,
                    VertexBuffers = new[]
                    {
                        _vertexBufferBinding
                    },
                    IndexBuffer = _indexBufferBinding,
                    DrawCount   = tris.Length
                }
            };

            _modelComponent = new ModelComponent()
            {
                Model = new Model()
                {
                    _mesh,
                    Material
                }
            };

            Entity.Add(_modelComponent);

            // Bounding box for culling (stops rendering the mesh when the camera isn't looking at it)
            _mesh.BoundingBox    = MathHelpers.FromPoints(verts);
            _mesh.BoundingSphere = BoundingSphere.FromBox(_mesh.BoundingBox);
            CreateCollider();
        }
Ejemplo n.º 14
0
        private void CreateMesh()
        {
            var vbo = Xenko.Graphics.Buffer.Vertex.New(
                GraphicsDevice,
                vertices,
                GraphicsResourceUsage.Default
                );

            var ibo = Xenko.Graphics.Buffer.Index.New(
                GraphicsDevice,
                indices,
                GraphicsResourceUsage.Default
                );

            _vertexBufferBinding = new VertexBufferBinding(vbo, VertexPositionNormalColor.Layout, vertices.Length);
            _indexBufferBinding  = new IndexBufferBinding(ibo, is32Bit: true, count: indices.Length);

            _mesh = new Mesh()
            {
                Draw = new MeshDraw()
                {
                    PrimitiveType = PrimitiveType.TriangleList,
                    VertexBuffers = new[]
                    {
                        _vertexBufferBinding
                    },
                    IndexBuffer = _indexBufferBinding,
                    DrawCount   = indices.Length
                }
            };

            _modelComponent = new ModelComponent()
            {
                Model = new Model()
                {
                    _mesh,
                    material
                }
            };

            Entity.Add(_modelComponent);

            // Bounding box for culling
            _mesh.BoundingBox    = Helpers.FromPoints(vertices);
            _mesh.BoundingSphere = BoundingSphere.FromBox(_mesh.BoundingBox);
        }
            public void CreateVAO(GraphicsDevice device, Effect effect, VertexDeclaration declaration, int indexStructSize)
            {
                if (!dirty)
                {
                    return;
                }
                dirty = false;

                var vertexSize = declaration.CalculateSize();

                EffectInputSignature = effect.InputSignature;

                var indexBufferBinding  = new IndexBufferBinding(IndexBuffer, indexStructSize == sizeof(int), IndexBuffer.Description.SizeInBytes / indexStructSize);
                var vertexBufferBinding = new VertexBufferBinding(VertexBuffer, declaration, VertexCount, vertexSize);

                // Creates a VAO
                VertexArrayObject = VertexArrayObject.New(device, effect.InputSignature, indexBufferBinding, vertexBufferBinding).DisposeBy(this);
            }
Ejemplo n.º 16
0
        void CheckBuffers(ImDrawDataPtr drawData)
        {
            uint totalVBOSize = (uint)(drawData.TotalVtxCount * Unsafe.SizeOf <ImDrawVert>());

            if (totalVBOSize > vertexBinding.Buffer.SizeInBytes)
            {
                var vertexBuffer = Xenko.Graphics.Buffer.Vertex.New(device, (int)(totalVBOSize * 1.5f));
                vertexBinding = new VertexBufferBinding(vertexBuffer, imVertLayout, 0);
            }

            uint totalIBOSize = (uint)(drawData.TotalIdxCount * sizeof(ushort));

            if (totalIBOSize > indexBinding.Buffer.SizeInBytes)
            {
                var is32Bits    = false;
                var indexBuffer = Xenko.Graphics.Buffer.Index.New(device, (int)(totalIBOSize * 1.5f));
                indexBinding = new IndexBufferBinding(indexBuffer, is32Bits, 0);
            }
        }
Ejemplo n.º 17
0
        /// <summary>
        /// Gets a MeshDraw that will be prepared when needed with the given index buffer & vertex buffer.
        /// </summary>
        /// <typeparam name="T">Type of vertex buffer used</typeparam>
        /// <param name="indexBuffer">Array of vertex indicies</param>
        /// <param name="vertexBuffer">Vertex buffer</param>
        /// <returns></returns>
        public static StagedMeshDraw MakeStagedMeshDraw <T>(ref uint[] indexBuffer, ref T[] vertexBuffer, VertexDeclaration vertexBufferLayout) where T : struct
        {
            // sanity checks
            if (indexBuffer.Length == 0 || vertexBuffer.Length == 0)
            {
                throw new ArgumentException("Trying to make a StagedMeshDraw with empty index or vertex buffer!");
            }

            StagedMeshDraw smd = new StagedMeshDraw();

            smd.PrimitiveType = PrimitiveType.TriangleList;
            smd.DrawCount     = indexBuffer.Length;
            smd.Indicies      = indexBuffer;
            smd.Verticies     = vertexBuffer;
            smd.performStage  = (GraphicsDevice graphicsDevice, StagedMeshDraw _smd) => {
                lock (_smd)
                {
                    if (_smd.VertexBuffers == null)
                    {
                        _smd._vertexBuffer = Xenko.Graphics.Buffer.Vertex.New <T>(
                            graphicsDevice,
                            (T[])_smd.Verticies,
                            GraphicsResourceUsage.Default
                            );
                        _smd._indexBuffer = Xenko.Graphics.Buffer.Index.New <uint>(
                            graphicsDevice,
                            _smd.Indicies,
                            GraphicsResourceUsage.Default
                            );
                        Created++;
                        VertexBufferBinding[] vbb = new[] {
                            new VertexBufferBinding(_smd._vertexBuffer, vertexBufferLayout, _smd.DrawCount)
                        };
                        IndexBufferBinding ibb = new IndexBufferBinding(_smd._indexBuffer, true, _smd.DrawCount);
                        _smd.VertexBuffers = vbb;
                        _smd.IndexBuffer   = ibb;
                        _smd.performStage  = null;
                    }
                }
            };
            return(smd);
        }
        private VertexArrayObject(GraphicsDevice graphicsDevice, EffectInputSignature shaderSignature, IndexBufferBinding indexBufferBinding, VertexBufferBinding[] vertexBufferBindings)
            : base(graphicsDevice)
        {
            this.vertexBufferBindings = vertexBufferBindings;
            this.indexBufferBinding = indexBufferBinding;
            this.EffectInputSignature = shaderSignature;

            // Calculate Direct3D11 InputElement
            int inputElementCount = vertexBufferBindings.Sum(t => t.Declaration.VertexElements.Length);
            var inputElements = new InputElement[inputElementCount];

            int j = 0;
            for (int i = 0; i < vertexBufferBindings.Length; i++)
            {
                var declaration = vertexBufferBindings[i].Declaration;
                vertexBufferBindings[i].Buffer.AddReferenceInternal();
                foreach (var vertexElementWithOffset in declaration.EnumerateWithOffsets())
                {
                    var vertexElement = vertexElementWithOffset.VertexElement;
                    inputElements[j++] = new InputElement
                        {
                            Slot = i,
                            SemanticName = vertexElement.SemanticName,
                            SemanticIndex = vertexElement.SemanticIndex,
                            AlignedByteOffset = vertexElementWithOffset.Offset,
                            Format = (SharpDX.DXGI.Format)vertexElement.Format,
                        };
                }
            }

            Layout = VertexArrayLayout.GetOrCreateLayout(new VertexArrayLayout(inputElements));

            if (indexBufferBinding != null)
            {
                indexBufferBinding.Buffer.AddReferenceInternal();
                indexBufferOffset = indexBufferBinding.Offset;
                indexFormat = (indexBufferBinding.Is32Bit ? SharpDX.DXGI.Format.R32_UInt : SharpDX.DXGI.Format.R16_UInt);
            }

            CreateResources();
        }
Ejemplo n.º 19
0
        /// <summary>
        /// Determines whether the specified index buffer binding data is simple.
        /// A index buffer binding data is simple if:
        /// * Offset is 0.
        /// * Is32Bit is true.
        /// * Buffer.Content.Length is equal to sizeof(int) * Count.
        /// </summary>
        /// <param name="indexBufferBindingData">The index buffer binding data.</param>
        /// <returns></returns>
        public static bool IsSimple(this IndexBufferBinding indexBufferBindingData)
        {
            if (indexBufferBindingData.Offset != 0)
            {
                return(false);
            }

            if (!indexBufferBindingData.Is32Bit)
            {
                return(false);
            }

            var buffer = indexBufferBindingData.Buffer.GetSerializationData();

            if (buffer.Content.Length != sizeof(int) * indexBufferBindingData.Count)
            {
                return(false);
            }

            return(true);
        }
Ejemplo n.º 20
0
        protected Mesh CreateMesh(IndexBufferBinding indexBuffer, IMeshData <TVertex> meshData)
        {
            Contracts.Requires.That(indexBuffer != null);
            Contracts.Requires.That(meshData != null);

            var vertexBuffers = new[]
            {
                new VertexBufferBinding(
                    Buffer.Vertex.New(this.GraphicsDevice, meshData.Vertices, GraphicsResourceUsage.Immutable),
                    this.Format.Layout,
                    meshData.VerticesCount),
            };

            var meshDraw = new MeshDraw()
            {
                IndexBuffer   = indexBuffer,
                VertexBuffers = vertexBuffers,
                DrawCount     = meshData.IndicesCount,
                PrimitiveType = PrimitiveType.TriangleList,
            };

            // create the bounding volumes
            var boundingBox = BoundingBox.Empty;

            for (int index = 0; index < meshData.VerticesCount; index++)
            {
                var position = this.Format.GetPosition(meshData.Vertices[index]);
                BoundingBox.Merge(ref boundingBox, ref position, out boundingBox);
            }

            var boundingSphere = BoundingSphere.FromBox(boundingBox);

            return(new Mesh
            {
                Draw = meshDraw,
                BoundingBox = boundingBox,
                BoundingSphere = boundingSphere,
            });
        }
Ejemplo n.º 21
0
        private Model CreateModel()
        {
            // https://doc.xenko.com/latest/en/manual/scripts/create-a-model-from-code.html
            var indexBuffer = new Buffer();

            var indexBufferBinding  = new IndexBufferBinding(indexBuffer, true, 10);
            var vertexBufferBinding = new VertexBufferBinding();

            VertexBufferBinding[] vertexBufferBindings = { vertexBufferBinding };

            var meshDraw = new MeshDraw
            {
                VertexBuffers = vertexBufferBindings,
                IndexBuffer   = indexBufferBinding
            };
            ParameterCollection parms = null;
            var mesh = new Xenko.Rendering.Mesh(meshDraw, parms);

            var model = new Model {
                mesh
            };

            return(model);
        }
Ejemplo n.º 22
0
        public static unsafe int[] GenerateIndexBufferAEN(IndexBufferBinding indexBuffer, VertexBufferBinding vertexBuffer, CommandList commandList = null)
        {
            // More info at http://developer.download.nvidia.com/whitepapers/2010/PN-AEN-Triangles-Whitepaper.pdf
            // This implementation might need some performance improvements

            var triangleCount = indexBuffer.Count / 3;
            var newIndices    = new int[triangleCount * 12];

            var positionMapping  = GenerateIndexMapping(vertexBuffer, commandList, "POSITION");
            var dominantEdges    = new Dictionary <EdgeKeyAEN, EdgeAEN>();
            var dominantVertices = new Dictionary <int, int>();
            var indexSize        = indexBuffer.Is32Bit? 4: 2;

            fixed(byte *indexBufferStart = &indexBuffer.Buffer.GetDataSafe(commandList)[indexBuffer.Offset])
            {
                var triangleIndices = stackalloc int[3];
                var positionIndices = stackalloc int[3];

                // Step 2: prepare initial data
                for (int i = 0; i < triangleCount; ++i)
                {
                    var oldIndices = indexBufferStart + i * 3 * indexSize;
                    if (indexSize == 2)
                    {
                        var oldIndicesShort = (short *)oldIndices;
                        triangleIndices[0] = oldIndicesShort[0];
                        triangleIndices[1] = oldIndicesShort[1];
                        triangleIndices[2] = oldIndicesShort[2];
                    }
                    else
                    {
                        var oldIndicesShort = (int *)oldIndices;
                        triangleIndices[0] = oldIndicesShort[0];
                        triangleIndices[1] = oldIndicesShort[1];
                        triangleIndices[2] = oldIndicesShort[2];
                    }

                    positionIndices[0] = positionMapping.Indices[triangleIndices[0]];
                    positionIndices[1] = positionMapping.Indices[triangleIndices[1]];
                    positionIndices[2] = positionMapping.Indices[triangleIndices[2]];

                    newIndices[i * 12 + 0]  = triangleIndices[0];
                    newIndices[i * 12 + 1]  = triangleIndices[1];
                    newIndices[i * 12 + 2]  = triangleIndices[2];
                    newIndices[i * 12 + 3]  = triangleIndices[0];
                    newIndices[i * 12 + 4]  = triangleIndices[1];
                    newIndices[i * 12 + 5]  = triangleIndices[1];
                    newIndices[i * 12 + 6]  = triangleIndices[2];
                    newIndices[i * 12 + 7]  = triangleIndices[2];
                    newIndices[i * 12 + 8]  = triangleIndices[0];
                    newIndices[i * 12 + 9]  = triangleIndices[0];
                    newIndices[i * 12 + 10] = triangleIndices[1];
                    newIndices[i * 12 + 11] = triangleIndices[2];

                    // Step 2b/2c: Build dominant vertex/edge list
                    for (int j = 0; j < 3; ++j)
                    {
                        dominantVertices[positionIndices[j]] = triangleIndices[j];

                        var edge = new EdgeAEN(
                            triangleIndices[((j + 0) % 3)],
                            triangleIndices[((j + 1) % 3)],
                            positionIndices[((j + 0) % 3)],
                            positionIndices[((j + 1) % 3)]);

                        dominantEdges[new EdgeKeyAEN(edge)] = edge;

                        edge = edge.Reverse();
                        dominantEdges[new EdgeKeyAEN(edge)] = edge;
                    }
                }

                // Step3: Find dominant vertex/edge
                for (int i = 0; i < triangleCount; ++i)
                {
                    var oldIndices = indexBufferStart + i * 3 * indexSize;
                    if (indexSize == 2)
                    {
                        var oldIndicesShort = (short *)oldIndices;
                        triangleIndices[0] = oldIndicesShort[0];
                        triangleIndices[1] = oldIndicesShort[1];
                        triangleIndices[2] = oldIndicesShort[2];
                    }
                    else
                    {
                        var oldIndicesShort = (int *)oldIndices;
                        triangleIndices[0] = oldIndicesShort[0];
                        triangleIndices[1] = oldIndicesShort[1];
                        triangleIndices[2] = oldIndicesShort[2];
                    }

                    positionIndices[0] = positionMapping.Indices[triangleIndices[0]];
                    positionIndices[1] = positionMapping.Indices[triangleIndices[1]];
                    positionIndices[2] = positionMapping.Indices[triangleIndices[2]];

                    for (int j = 0; j < 3; ++j)
                    {
                        // Dominant edge
                        int vertexKey;
                        if (dominantVertices.TryGetValue(positionIndices[j], out vertexKey))
                        {
                            newIndices[i * 12 + 9 + j] = vertexKey;
                        }

                        // Dominant vertex
                        EdgeAEN edge;
                        var     edgeKey = new EdgeKeyAEN(positionIndices[((j + 0) % 3)], positionIndices[((j + 1) % 3)]);
                        if (dominantEdges.TryGetValue(edgeKey, out edge))
                        {
                            newIndices[i * 12 + 3 + j * 2 + 0] = edge.Index0;
                            newIndices[i * 12 + 3 + j * 2 + 1] = edge.Index1;
                        }
                    }
                }
            }

            return(newIndices);
        }
Ejemplo n.º 23
0
        private VertexArrayObject GetOrCreateVertexArrayObjectAEN(RenderContext context)
        {
            if (vertexArrayObjectAEN == null)
            {
                var graphicsDevice = context.GraphicsDevice;
                var indicesAEN = IndexExtensions.GenerateIndexBufferAEN(Mesh.Draw.IndexBuffer, Mesh.Draw.VertexBuffers[0]);
                var indexBufferBinding = new IndexBufferBinding(Buffer.Index.New(graphicsDevice, indicesAEN), true, Mesh.Draw.IndexBuffer.Count * 12 / 3);
                vertexArrayObjectAEN = VertexArrayObject.New(context.GraphicsDevice, Effect.InputSignature, indexBufferBinding, Mesh.Draw.VertexBuffers);
            }

            return vertexArrayObjectAEN;
        }
Ejemplo n.º 24
0
        private IndexBufferBinding UpdateIndexBuffer(GraphicsContext graphicsContext, IndexBufferBinding indexBufferBinding)
        {
            int indexStructSize = Utilities.SizeOf <short>();

            if (indexBufferBinding.Count != indexBuffer.Length)
            {
                indexBufferBinding.Buffer.Dispose();
                return(new IndexBufferBinding(SiliconStudio.Xenko.Graphics.Buffer.Index.New <short>(graphicsContext.CommandList.GraphicsDevice, indexBuffer, GraphicsResourceUsage.Default), indexStructSize == sizeof(Int32), indexBuffer.Length));
            }
            else
            {
                //var mappedIndices = graphicsContext.CommandList.MapSubresource(indexBufferBinding.Buffer, 0, MapMode.WriteNoOverwrite, false, 0, indexStructSize * indexBufferBinding.Count);
                //var indexPointer = mappedIndices.DataBox.DataPointer;

                //for (int i = 0; i < indexBuffer.Length; i++)
                //{


                //    indexPointer += indexStructSize;
                //}

                //graphicsContext.CommandList.UnmapSubresource(mappedIndices);
                indexBufferBinding.Buffer.SetData(graphicsContext.CommandList, indexBuffer);

                return(indexBufferBinding);
            }
        }
Ejemplo n.º 25
0
 private VertexArrayObject(GraphicsDevice graphicsDevice, object shaderSignature, IndexBufferBinding indexBufferBinding, VertexBufferBinding[] vertexBuffers)
 {
     throw new NotImplementedException();
 }