public void ImportFrom(DsonTypes.UvSet uvSet) { string name = uvSet.name; var uvs = uvSet.uvs.values .Select(values => new Vector2(values[0], values[1])) .ToArray(); Quad[] uvFaces = (Quad[])geometry.Faces.Clone(); foreach (int[] values in uvSet.polygon_vertex_indices) { int faceIdx = values[0]; int vertexIdx = values[1]; int uvIdx = values[2]; Quad face = uvFaces[faceIdx]; if (!face.Contains(vertexIdx)) { throw new InvalidOperationException("face doesn't contain vertex to override"); } Quad replacementFace = face.Map(idx => idx == vertexIdx ? uvIdx : idx); uvFaces[faceIdx] = replacementFace; } var recipe = new UvSetRecipe(name, uvs, uvFaces); recipes.Add(recipe); }
public static UvSetRecipe Merge(FigureRecipeMerger.Reindexer reindexer, UvSetRecipe parentUvSet, UvSetRecipe[] childUvSets) { List <Vector2> mergedUvs = new List <Vector2>(); List <Quad> mergedFaces = new List <Quad>(); mergedUvs.AddRange(parentUvSet.Uvs); Quad[] parentFaces = parentUvSet.Faces; for (int faceIdx = 0; faceIdx < parentFaces.Length; ++faceIdx) { if (reindexer.IsParentFaceHidden(faceIdx)) { continue; } mergedFaces.Add(parentFaces[faceIdx]); } for (int childIdx = 0; childIdx < childUvSets.Length; ++childIdx) { UvSetRecipe childUvSet = childUvSets[childIdx]; int uvOffset = mergedUvs.Count; mergedUvs.AddRange(childUvSet.Uvs); mergedFaces.AddRange(childUvSet.Faces.Select(face => face.Reindex(uvOffset))); } return(new UvSetRecipe( parentUvSet.Name, mergedUvs.ToArray(), mergedFaces.ToArray())); }
public List <UvSetRecipe> MergeUvSets() { UvSetRecipe[] childUvSets = children .Select(child => { if (child.UvSets.Count > 1) { throw new InvalidOperationException("expected child to have only a single UV set"); } return(child.UvSets[0]); }) .ToArray(); return(parent.UvSets .Select(parentUvSet => { return UvSetRecipe.Merge(reindexer, parentUvSet, childUvSets); }) .ToList()); }