コード例 #1
0
        //public static void FlipUVs()
        //{
        //	//ToDo : сделать FlipUv для всех mesh, и во всех Materials развернуть UVTransform
        //}

        public static void FlipUVs(VertexInfo[] vertices, StandardVertex.Components components)
        {
            if (components.HasFlag(StandardVertex.Components.TexCoord0))
            {
                for (int i = 0; i < vertices.Length; i++)
                {
                    vertices[i].Vertex.TexCoord0.Y = 1.0f - vertices[i].Vertex.TexCoord0.Y;
                }
            }
            if (components.HasFlag(StandardVertex.Components.TexCoord1))
            {
                for (int i = 0; i < vertices.Length; i++)
                {
                    vertices[i].Vertex.TexCoord1.Y = 1.0f - vertices[i].Vertex.TexCoord1.Y;
                }
            }
            if (components.HasFlag(StandardVertex.Components.TexCoord2))
            {
                for (int i = 0; i < vertices.Length; i++)
                {
                    vertices[i].Vertex.TexCoord2.Y = 1.0f - vertices[i].Vertex.TexCoord2.Y;
                }
            }
            if (components.HasFlag(StandardVertex.Components.TexCoord3))
            {
                for (int i = 0; i < vertices.Length; i++)
                {
                    vertices[i].Vertex.TexCoord3.Y = 1.0f - vertices[i].Vertex.TexCoord3.Y;
                }
            }
        }
コード例 #2
0
        public void SetVertexDataWithRemovingHoles(StandardVertex[] vertices, StandardVertex.Components vertexComponents)
        {
            int vertexSize;
            var structure = StandardVertex.MakeStructure(vertexComponents, true, out vertexSize);

            int destNormalOffset       = 0;
            int destTangentOffset      = 0;
            int destColorOffset        = 0;
            int destTexCoord0Offset    = 0;
            int destTexCoord1Offset    = 0;
            int destTexCoord2Offset    = 0;
            int destTexCoord3Offset    = 0;
            int destBlendIndicesOffset = 0;
            int destBlendWeightsOffset = 0;

            {
                foreach (var c in structure)
                {
                    switch (c.Semantic)
                    {
                    case VertexElementSemantic.Normal: destNormalOffset = c.Offset; break;

                    case VertexElementSemantic.Tangent: destTangentOffset = c.Offset; break;

                    case VertexElementSemantic.Color0: destColorOffset = c.Offset; break;

                    case VertexElementSemantic.TextureCoordinate0: destTexCoord0Offset = c.Offset; break;

                    case VertexElementSemantic.TextureCoordinate1: destTexCoord1Offset = c.Offset; break;

                    case VertexElementSemantic.TextureCoordinate2: destTexCoord2Offset = c.Offset; break;

                    case VertexElementSemantic.TextureCoordinate3: destTexCoord3Offset = c.Offset; break;

                    case VertexElementSemantic.BlendIndices: destBlendIndicesOffset = c.Offset; break;

                    case VertexElementSemantic.BlendWeights: destBlendWeightsOffset = c.Offset; break;
                    }
                }
            }

            byte[] destArray = new byte[vertices.Length * vertexSize];
            unsafe
            {
                fixed(byte *pDestArray = destArray)
                {
                    byte *destVertex = pDestArray;

                    for (int n = 0; n < vertices.Length; n++)
                    {
                        StandardVertex vertex = vertices[n];

                        *(Vector3F *)(destVertex + 0) = vertex.Position;

                        if ((vertexComponents & StandardVertex.Components.Normal) != 0)
                        {
                            *(Vector3F *)(destVertex + destNormalOffset) = vertex.Normal;
                        }
                        if ((vertexComponents & StandardVertex.Components.Tangent) != 0)
                        {
                            *(Vector4F *)(destVertex + destTangentOffset) = vertex.Tangent;
                        }
                        if ((vertexComponents & StandardVertex.Components.Color) != 0)
                        {
                            *(ColorValue *)(destVertex + destColorOffset) = vertex.Color;
                        }
                        if ((vertexComponents & StandardVertex.Components.TexCoord0) != 0)
                        {
                            *(Vector2F *)(destVertex + destTexCoord0Offset) = vertex.TexCoord0;
                        }
                        if ((vertexComponents & StandardVertex.Components.TexCoord1) != 0)
                        {
                            *(Vector2F *)(destVertex + destTexCoord1Offset) = vertex.TexCoord1;
                        }
                        if ((vertexComponents & StandardVertex.Components.TexCoord2) != 0)
                        {
                            *(Vector2F *)(destVertex + destTexCoord2Offset) = vertex.TexCoord2;
                        }
                        if ((vertexComponents & StandardVertex.Components.TexCoord3) != 0)
                        {
                            *(Vector2F *)(destVertex + destTexCoord3Offset) = vertex.TexCoord3;
                        }
                        if ((vertexComponents & StandardVertex.Components.BlendIndices) != 0)
                        {
                            *(Vector4I *)(destVertex + destBlendIndicesOffset) = vertex.BlendIndices;
                        }
                        if ((vertexComponents & StandardVertex.Components.BlendWeights) != 0)
                        {
                            *(Vector4F *)(destVertex + destBlendWeightsOffset) = vertex.BlendWeights;
                        }
                        destVertex += vertexSize;
                    }
                }
            }

            VertexStructure = structure;
            Vertices        = destArray;
        }
コード例 #3
0
        /////////////////////////////////////////

        void DrawUV(Viewport viewport)
        {
            var meshData = GetSelectedLOD();

            if (Mesh.EditorDisplayUV >= 0 && Mesh.EditorDisplayUV < 4)
            {
                StandardVertex.Components component = StandardVertex.Components.TexCoord0;
                if (Mesh.EditorDisplayUV == 0)
                {
                    component = StandardVertex.Components.TexCoord0;
                }
                else if (Mesh.EditorDisplayUV == 1)
                {
                    component = StandardVertex.Components.TexCoord1;
                }
                else if (Mesh.EditorDisplayUV == 2)
                {
                    component = StandardVertex.Components.TexCoord2;
                }
                else if (Mesh.EditorDisplayUV == 3)
                {
                    component = StandardVertex.Components.TexCoord3;
                }

                if ((meshData.ExtractedVerticesComponents & component) != 0)
                {
                    var uvArray = (Vector2F[])StandardVertex.ExtractOneComponentArray(meshData.ExtractedVertices, component);

                    //bool valid = Array.Exists( uvArray, item => item != Vec2F.Zero );
                    //if( valid )
                    //{

                    //check old cache
                    if (cachedDisplayUV_Triangles != null)
                    {
                        if (cachedDisplayUV != Mesh.EditorDisplayUV || cachedDisplayUV_MeshData != meshData)
                        {
                            cachedDisplayUV_Triangles = null;
                            cachedDisplayUV_Lines     = null;
                        }
                    }

                    Vector2F screenMultiplier = new Vector2F(viewport.CanvasRenderer.AspectRatioInv * .8f, 0.8f);
                    Vector2F screenOffset     = new Vector2F(1.0f - screenMultiplier.X - 0.01f, 1.0f - screenMultiplier.Y - 0.01f);

                    Vector2F Convert(Vector2F v)
                    {
                        return(v * screenMultiplier + screenOffset);
                    };

                    //update
                    if (cachedDisplayUV_Triangles == null)
                    {
                        cachedDisplayUV          = Mesh.EditorDisplayUV;
                        cachedDisplayUV_MeshData = meshData;

                        var indices = meshData.ExtractedIndices;

                        //!!!!показывать те, которые за границами 0-1.


                        var uvArrayConverted = new Vector2F[uvArray.Length];
                        for (int n = 0; n < uvArrayConverted.Length; n++)
                        {
                            uvArrayConverted[n] = Convert(uvArray[n]);
                        }

                        var trianglesColor = new ColorValue(0, 1, 0, 0.5);
                        var linesColor     = new ColorValue(1, 1, 1);

                        //triangles
                        {
                            var triangles = new List <CanvasRenderer.TriangleVertex>(indices.Length / 3);

                            for (int triangle = 0; triangle < indices.Length / 3; triangle++)
                            {
                                int index0 = indices[triangle * 3 + 0];
                                int index1 = indices[triangle * 3 + 1];
                                int index2 = indices[triangle * 3 + 2];

                                Vector2F v0 = uvArrayConverted[index0];
                                Vector2F v1 = uvArrayConverted[index1];
                                Vector2F v2 = uvArrayConverted[index2];

                                triangles.Add(new CanvasRenderer.TriangleVertex(v0, trianglesColor));
                                triangles.Add(new CanvasRenderer.TriangleVertex(v1, trianglesColor));
                                triangles.Add(new CanvasRenderer.TriangleVertex(v2, trianglesColor));
                            }

                            cachedDisplayUV_Triangles = triangles.ToArray();
                        }

                        //lines
                        {
                            int[] lineIndices = MathAlgorithms.TriangleListToLineList(indices);

                            var lines = new List <CanvasRenderer.LineItem>(lineIndices.Length / 2);
                            for (int nLine = 0; nLine < lineIndices.Length / 2; nLine++)
                            {
                                var v0 = uvArrayConverted[lineIndices[nLine * 2 + 0]];
                                var v1 = uvArrayConverted[lineIndices[nLine * 2 + 1]];
                                lines.Add(new CanvasRenderer.LineItem(v0, v1, linesColor));
                            }

                            var vertices = new CanvasRenderer.TriangleVertex[lines.Count * 2];
                            for (int n = 0; n < lines.Count; n++)
                            {
                                var line = lines[n];
                                vertices[n * 2 + 0] = new CanvasRenderer.TriangleVertex(line.start, line.color, Vector2F.Zero);
                                vertices[n * 2 + 1] = new CanvasRenderer.TriangleVertex(line.end, line.color, Vector2F.Zero);
                            }

                            cachedDisplayUV_Lines = vertices;
                        }
                    }

                    //draw
                    if (cachedDisplayUV_Triangles != null)
                    {
                        viewport.CanvasRenderer.AddQuad(new RectangleF(Convert(Vector2F.Zero), Convert(Vector2F.One)), new ColorValue(0, 0, 0, .5));
                        viewport.CanvasRenderer.AddTriangles(cachedDisplayUV_Triangles);
                        viewport.CanvasRenderer.AddLines(cachedDisplayUV_Lines);
                    }
                }
            }
        }