As I understand “Mesh.ControlPoints” is represent mesh’s vertex.
Also “VertexElementUV.Data” represent mesh’s UV value for each vertex.
then I think those count always same but UV count is different with mesh vertex count many cases.
which way is best way to get each mesh’s vertex position, and corresponding UV values?
foreach (var entity in node.Entities)
{
switch (entity)
{
case Mesh mesh:
var vertices = new List<UnityEngine.Vector3>();
var triangles = new List<int>();
var polygons = mesh.Polygons;
var controlPoints = mesh.ControlPoints;
var triangleFaces = PolygonModifier.Triangulate(controlPoints, mesh.Polygons);
var transform = node.GlobalTransform.TransformMatrix;
var pointCount = controlPoints.Count;
for (var i = 0; i < pointCount; i++)
{
var vertex = controlPoints[i];
vertices.Add(new Vector3((float)vertex.x, (float)vertex.y, (float)vertex.z));
}
var triangleCount = triangleFaces.Length;
for (var i = 0; i < triangleCount; i++)
{
triangles.Add(triangleFaces[i][0]);
triangles.Add(triangleFaces[i][1]);
triangles.Add(triangleFaces[i][2]);
}
var normals = new List<Vector3>();
var uvs = new List<Vector2>();
foreach (var vertexElement in mesh.VertexElements)
{
var elementType = vertexElement.VertexElementType;
switch (elementType)
{
case VertexElementType.Binormal:
break;
case VertexElementType.Normal:
{
var vertexElementNormal = vertexElement as VertexElementNormal;
normals = vertexElementNormal.Data
.Select(v =>
new Vector3((float) v.x, (float) v.y, (float) v.z))
.ToList();
break;
}
case VertexElementType.Tangent:
break;
case VertexElementType.Material:
{
var vertexElementMaterial = vertexElement as VertexElementMaterial;
break;
}
case VertexElementType.PolygonGroup:
break;
case VertexElementType.UV:
{
var vertexElementUV = vertexElement as VertexElementUV;
uvs = vertexElementUV.Data.Select(v => new Vector2((float) v.x, (float) v.y))
.ToList();
break;
}
case VertexElementType.VertexColor:
break;
case VertexElementType.SmoothingGroup:
break;
case VertexElementType.VertexCrease:
break;
case VertexElementType.EdgeCrease:
break;
case VertexElementType.UserData:
break;
case VertexElementType.Visibility:
break;
case VertexElementType.Specular:
break;
case VertexElementType.Weight:
break;
case VertexElementType.Hole:
break;
default:
break;
}
}
// TODO: some of cases are not equal uv count and vertex count
var uvDataList = new List<Vector2[]>(){ uvs.ToArray() };
if (uvs.Count != vertices.Count)
{
uvDataList = null;
}
var meshData = new MeshData(vertices.ToArray(), triangles.ToArray(), uvDataList, texturePacks.Count > 0 ? texturePacks: null,
null, normals.ToArray(), null);
meshes.Add(meshData);
break;
default:
break;
}
}