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);
    }
예제 #2
0
    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());
    }