//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; } } }
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; }
///////////////////////////////////////// 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); } } } }