Beispiel #1
0
        private void BindMesh(ModelEntity modelEntity, int index, Matrix4?matrix = null, TextureBinder textureBinder = null, bool updateMeshData = true)
        {
            var mesh = GetMesh(index);

            if (mesh == null)
            {
                return;
            }
            if (updateMeshData)
            {
                var numTriangles = modelEntity.Triangles.Length;
                var elementCount = numTriangles * 3 * 3;
                var baseIndex    = 0;
                var positionList = new float[elementCount];
                var normalList   = new float[elementCount];
                var colorList    = new float[elementCount];
                var uvList       = new float[elementCount];
                for (var t = 0; t < numTriangles; t++)
                {
                    var triangle = modelEntity.Triangles[t];
                    for (var i = 0; i < 3; i++)
                    {
                        var index1 = baseIndex++;
                        var index2 = baseIndex++;
                        var index3 = baseIndex++;

                        var vertex = triangle.Vertices[i];
                        positionList[index1] = vertex.X;
                        positionList[index2] = vertex.Y;
                        positionList[index3] = vertex.Z;

                        var normal = triangle.Normals[i];
                        normalList[index1] = normal.X;
                        normalList[index2] = normal.Y;
                        normalList[index3] = normal.Z;

                        var color = triangle.Colors[i];
                        colorList[index1] = color.R;
                        colorList[index2] = color.G;
                        colorList[index3] = color.B;

                        var uv = triangle.Uv[i];
                        uvList[index1] = uv.X;
                        uvList[index2] = uv.Y;
                        uvList[index3] = uv.Z;
                    }
                }
                mesh.SetData(numTriangles * 3, positionList, normalList, colorList, uvList);
            }
            mesh.WorldMatrix = matrix ?? modelEntity.WorldMatrix;
            if (textureBinder != null)
            {
                mesh.Texture = modelEntity.Texture != null?textureBinder.GetTexture(modelEntity.TexturePage) : 0;
            }
        }
Beispiel #2
0
        private void BindMesh(ModelEntity modelEntity, Matrix4?matrix = null, TextureBinder textureBinder = null, bool updateMeshData = true, Vector3[] initialVertices = null, Vector3[] initialNormals = null, Vector3[] finalVertices = null, Vector3[] finalNormals = null, float?interpolator = null)
        {
            if (!modelEntity.Visible)
            {
                return;
            }
            var mesh = GetMesh(_modelIndex++);

            if (mesh == null)
            {
                return;
            }
            //var rootEntity = modelEntity.ParentEntity as RootEntity; //todo
            mesh.WorldMatrix = matrix ?? modelEntity.WorldMatrix;
            if (updateMeshData)
            {
                var numTriangles = modelEntity.Triangles.Length;
                var elementCount = numTriangles * 3 * 3;
                var baseIndex    = 0;
                var positionList = new float[elementCount];
                var normalList   = new float[elementCount];
                var colorList    = new float[elementCount];
                var uvList       = new float[elementCount];
                for (var t = 0; t < numTriangles; t++)
                {
                    var lastVertex = Vector3.Zero;
                    var lastNormal = Vector3.Zero;
                    var lastColor  = Color.White;
                    var lastUv     = Vector3.Zero;
                    var triangle   = modelEntity.Triangles[t];
                    for (var i = 0; i < 3; i++)
                    {
                        var index1 = baseIndex++;
                        var index2 = baseIndex++;
                        var index3 = baseIndex++;

                        var sourceVertex = triangle.Vertices[i];
                        if (triangle.AttachedIndices != null)
                        {
                            var attachedIndex = triangle.AttachedIndices[i];
                            if (attachedIndex != uint.MaxValue)
                            {
                                if (!_scene.AutoAttach)
                                {
                                    sourceVertex = new Vector3(DiscardValue, DiscardValue, DiscardValue);
                                }
                            }
                        }

                        Vector3 vertex;
                        if (_scene.VibRibbonWireframe && i == 2)
                        {
                            vertex = lastVertex;
                        }
                        else
                        {
                            if (initialVertices != null && finalVertices != null && triangle.OriginalVertexIndices[i] < finalVertices.Length)
                            {
                                var initialVertex = sourceVertex + initialVertices[triangle.OriginalVertexIndices[i]];
                                var finalVertex   = sourceVertex + finalVertices[triangle.OriginalVertexIndices[i]];
                                vertex = Vector3.Lerp(initialVertex, finalVertex, interpolator.GetValueOrDefault());
                            }
                            else
                            {
                                vertex = sourceVertex;
                            }
                        }

                        positionList[index1] = vertex.X;
                        positionList[index2] = vertex.Y;
                        positionList[index3] = vertex.Z;

                        Vector3 normal;
                        if (_scene.VibRibbonWireframe && i == 2)
                        {
                            normal = lastNormal;
                        }
                        else
                        {
                            if (initialNormals != null && finalNormals != null && triangle.OriginalNormalIndices[i] < finalNormals.Length)
                            {
                                var initialNormal = triangle.Normals[i] + initialNormals[triangle.OriginalNormalIndices[i]] / 4096f;
                                var finalNormal   = triangle.Normals[i] + finalNormals[triangle.OriginalNormalIndices[i]] / 4096f;
                                normal = Vector3.Lerp(initialNormal, finalNormal, interpolator.GetValueOrDefault());
                            }
                            else
                            {
                                normal = triangle.Normals[i];
                            }
                        }

                        normalList[index1] = normal.X;
                        normalList[index2] = normal.Y;
                        normalList[index3] = normal.Z;

                        Color color;
                        if (_scene.VibRibbonWireframe && i == 2)
                        {
                            color = lastColor;
                        }
                        else
                        {
                            color = triangle.Colors[i];
                        }
                        colorList[index1] = color.R;
                        colorList[index2] = color.G;
                        colorList[index3] = color.B;

                        Vector3 uv;
                        if (_scene.VibRibbonWireframe && i == 2)
                        {
                            uv = lastUv;
                        }
                        else
                        {
                            uv = triangle.Uv[i];
                        }
                        uvList[index1] = uv.X;
                        uvList[index2] = uv.Y;
                        uvList[index3] = uv.Z;

                        lastVertex = vertex;
                        lastNormal = normal;
                        lastColor  = color;
                        lastUv     = uv;
                    }
                }
                mesh.SetData(numTriangles * 3, positionList, normalList, colorList, uvList);
            }
            if (textureBinder != null)
            {
                mesh.Texture = modelEntity.Texture != null?textureBinder.GetTexture((int)modelEntity.TexturePage) : 0;
            }
        }
Beispiel #3
0
        public void BindCube(Matrix4 matrix, Color color, Vector3 center, Vector3 size, int index, TextureBinder textureBinder = null, bool updateMeshData = true)
        {
            var mesh = GetMesh(index);

            if (mesh == null)
            {
                return;
            }
            if (updateMeshData)
            {
                const int numTriangles = 12;
                const int elementCount = numTriangles * 3 * 3;
                var       baseIndex    = 0;
                var       positionList = new float[elementCount];
                var       normalList   = new float[elementCount];
                var       colorList    = new float[elementCount];
                var       uvList       = new float[elementCount];
                var       vertices     = new[]
                {
                    center.X - size.X, center.Y - size.Y, center.Z - size.Z,
                    center.X - size.X, center.Y - size.Y, center.Z + size.Z,
                    center.X + size.X, center.Y - size.Y, center.Z + size.Z,
                    center.X - size.X, center.Y - size.Y, center.Z - size.Z,
                    center.X + size.X, center.Y - size.Y, center.Z + size.Z,
                    center.X + size.X, center.Y - size.Y, center.Z - size.Z,
                    center.X - size.X, center.Y + size.Y, center.Z - size.Z,
                    center.X + size.X, center.Y + size.Y, center.Z - size.Z,
                    center.X + size.X, center.Y + size.Y, center.Z + size.Z,
                    center.X - size.X, center.Y + size.Y, center.Z - size.Z,
                    center.X + size.X, center.Y + size.Y, center.Z + size.Z,
                    center.X - size.X, center.Y + size.Y, center.Z + size.Z,
                    center.X + size.X, center.Y - size.Y, center.Z + size.Z,
                    center.X - size.X, center.Y - size.Y, center.Z + size.Z,
                    center.X - size.X, center.Y + size.Y, center.Z + size.Z,
                    center.X + size.X, center.Y - size.Y, center.Z + size.Z,
                    center.X - size.X, center.Y + size.Y, center.Z + size.Z,
                    center.X + size.X, center.Y + size.Y, center.Z + size.Z,
                    center.X - size.X, center.Y - size.Y, center.Z - size.Z,
                    center.X + size.X, center.Y - size.Y, center.Z - size.Z,
                    center.X + size.X, center.Y + size.Y, center.Z - size.Z,
                    center.X - size.X, center.Y - size.Y, center.Z - size.Z,
                    center.X + size.X, center.Y + size.Y, center.Z - size.Z,
                    center.X - size.X, center.Y + size.Y, center.Z - size.Z,
                    center.X + size.X, center.Y - size.Y, center.Z - size.Z,
                    center.X + size.X, center.Y - size.Y, center.Z + size.Z,
                    center.X + size.X, center.Y + size.Y, center.Z + size.Z,
                    center.X + size.X, center.Y - size.Y, center.Z - size.Z,
                    center.X + size.X, center.Y + size.Y, center.Z + size.Z,
                    center.X + size.X, center.Y + size.Y, center.Z - size.Z,
                    center.X - size.X, center.Y - size.Y, center.Z + size.Z,
                    center.X - size.X, center.Y - size.Y, center.Z - size.Z,
                    center.X - size.X, center.Y + size.Y, center.Z - size.Z,
                    center.X - size.X, center.Y - size.Y, center.Z + size.Z,
                    center.X - size.X, center.Y + size.Y, center.Z - size.Z,
                    center.X - size.X, center.Y + size.Y, center.Z + size.Z
                };
                for (var t = 0; t < numTriangles; t++)
                {
                    for (var i = 0; i < 3; i++)
                    {
                        var index1 = baseIndex++;
                        var index2 = baseIndex++;
                        var index3 = baseIndex++;

                        positionList[index1] = vertices[index1];
                        positionList[index2] = vertices[index2];
                        positionList[index3] = vertices[index3];

                        normalList[index1] = 0f;
                        normalList[index2] = 0f;
                        normalList[index3] = 0f;

                        colorList[index1] = color.R;
                        colorList[index2] = color.G;
                        colorList[index3] = color.B;

                        uvList[index1] = 0f;
                        uvList[index2] = 0f;
                        uvList[index3] = 0f;
                    }
                }
                mesh.SetData(numTriangles * 3, positionList, normalList, colorList, uvList);
            }
            mesh.WorldMatrix = matrix;
            if (textureBinder != null)
            {
                mesh.Texture = textureBinder.GetTexture(0);
            }
        }