public FigureRecipe LoadFigureRecipe(string figureName, FigureRecipe parentRecipe)
    {
        var importProperties = ImportProperties.Load(pathManager, figureName);

        var figureRecipesDirectory = CommonPaths.WorkDir.Subdirectory("recipes/figures");

        figureRecipesDirectory.Create();

        var figureRecipeFile = figureRecipesDirectory.File($"{figureName}.dat");

        if (!figureRecipeFile.Exists)
        {
            Console.WriteLine($"Reimporting {figureName}...");
            FigureRecipe recipeToPersist = FigureImporter.ImportFor(
                figureName,
                fileLocator,
                objectLocator,
                importProperties.Uris,
                parentRecipe,
                importProperties.HdCorrectionInitialValue,
                importProperties.VisibleProducts);

            Persistance.Save(figureRecipeFile, recipeToPersist);
        }

        Console.WriteLine($"Loading {figureName}...");
        FigureRecipe recipe = Persistance.Load <FigureRecipe>(figureRecipeFile);

        return(recipe);
    }
    public ShapeNormals Load(IArchiveDirectory figureDir, Shape shape)
    {
        var file = shape.Directory?.File("shape-normals.dat");

        if (file == null)
        {
            return(null);
        }

        var recipe = Persistance.Load <ShapeNormalsRecipe>(file);

        var uvSetName = recipe.UvSetName;
        IArchiveDirectory uvSetsDirectory = figureDir.Subdirectory("uv-sets");
        IArchiveDirectory uvSetDirectory  = uvSetsDirectory.Subdirectory(uvSetName);
        var texturedVertexInfos           = uvSetDirectory.File("textured-vertex-infos.array").ReadArray <TexturedVertexInfo>();

        var texturesDirectory   = dataDir.Subdirectory("textures");
        var textureLoader       = new TextureLoader(device, textureCache, texturesDirectory);
        var normalMapsBySurface = recipe.TextureNamesBySurface
                                  .Select(name => name != ShapeNormalsRecipe.DefaultTextureName ? name : null)
                                  .Select(name => textureLoader.Load(name, TextureLoader.DefaultMode.Bump))
                                  .ToArray();

        return(new ShapeNormals(textureLoader, texturedVertexInfos, normalMapsBySurface));
    }
    public static Animation Load(IArchiveFile animationFile)
    {
        string      label        = Path.GetFileNameWithoutExtension(animationFile.Name);
        List <Pose> posesByFrame = Persistance.Load <List <Pose> >(animationFile);

        return(new Animation(label, posesByFrame));
    }
    public IOccluder Load(IArchiveDirectory occlusionDirectory)
    {
        bool isMainFigure = channelSystem.Parent == null;

        if (isMainFigure)
        {
            IArchiveFile occluderParametersFile = occlusionDirectory.File("occluder-parameters.dat");
            if (occluderParametersFile == null)
            {
                throw new InvalidOperationException("expected main figure to have occlusion system");
            }

            var             occluderParameters      = Persistance.Load <OccluderParameters>(occluderParametersFile);
            OcclusionInfo[] unmorphedOcclusionInfos = OcclusionInfo.UnpackArray(unmorphedOcclusionDirectory.File("occlusion-infos.array").ReadArray <uint>());
            var             occluder = new DeformableOccluder(device, shaderCache, channelSystem, unmorphedOcclusionInfos, occluderParameters);
            return(occluder);
        }
        else
        {
            OcclusionInfo[] figureOcclusionInfos = OcclusionInfo.UnpackArray(occlusionDirectory.File("occlusion-infos.array").ReadArray <uint>());
            OcclusionInfo[] parentOcclusionInfos = OcclusionInfo.UnpackArray(occlusionDirectory.File("parent-occlusion-infos.array").ReadArray <uint>());
            var             occluder             = new StaticOccluder(device, figureOcclusionInfos, parentOcclusionInfos);
            return(occluder);
        }
    }
    public static FigureDefinition Load(IArchiveDirectory dataDir, string name, FigureDefinition parent)
    {
        IArchiveDirectory figureDir = dataDir.Subdirectory("figures").Subdirectory(name);

        var channelSystemRecipe = Persistance.Load <ChannelSystemRecipe>(figureDir.File("channel-system-recipe.dat"));
        var channelSystem       = channelSystemRecipe.Bake(parent?.ChannelSystem);

        BoneSystem boneSystem;

        RigidTransform[] childToParentBindPoseTransforms;
        if (parent != null)
        {
            boneSystem = parent.BoneSystem;
            childToParentBindPoseTransforms = Persistance.Load <RigidTransform[]>(figureDir.File("child-to-parent-bind-pose-transforms.dat"));
        }
        else
        {
            var boneSystemRecipe = Persistance.Load <BoneSystemRecipe>(figureDir.File("bone-system-recipe.dat"));
            boneSystem = boneSystemRecipe.Bake(channelSystem.ChannelsByName);
            childToParentBindPoseTransforms = null;
        }

        var shapeOptions       = Shape.LoadAllForFigure(figureDir, channelSystem);
        var materialSetOptions = MaterialSetOption.LoadAllForFigure(figureDir);

        return(new FigureDefinition(name, figureDir,
                                    channelSystem, boneSystem,
                                    childToParentBindPoseTransforms,
                                    shapeOptions, materialSetOptions));
    }
    public InverseKinematicsPerformanceDemo()
    {
        var figureDir = UnpackedArchiveDirectory.Make(new System.IO.DirectoryInfo("work/figures/genesis-3-female"));

        var channelSystemRecipe = Persistance.Load <ChannelSystemRecipe>(figureDir.File("channel-system-recipe.dat"));

        channelSystem = channelSystemRecipe.Bake(null);

        var boneSystemRecipe = Persistance.Load <BoneSystemRecipe>(figureDir.File("bone-system-recipe.dat"));

        boneSystem = boneSystemRecipe.Bake(channelSystem.ChannelsByName);

        var inverterParameters = Persistance.Load <InverterParameters>(figureDir.File("inverter-parameters.dat"));

        rigidBoneSystem = new RigidBoneSystem(boneSystem);

        goalProvider = new DemoInverseKinematicsGoalProvider(rigidBoneSystem);
        solver       = new HarmonicInverseKinematicsSolver(rigidBoneSystem, inverterParameters.BoneAttributes);

        var pose          = Persistance.Load <List <Pose> >(figureDir.File("animations/idle.dat"))[0];
        var channelInputs = channelSystem.MakeDefaultChannelInputs();

        new Poser(channelSystem, boneSystem).Apply(channelInputs, pose, DualQuaternion.Identity);
        var channelOutputs = channelSystem.Evaluate(null, channelInputs);

        rigidBoneSystem.Synchronize(channelOutputs);
        initialInputs = rigidBoneSystem.ReadInputs(channelOutputs);
    }
Example #7
0
    public FigureRenderer Load(IArchiveDirectory figureDir, MaterialSetAndVariantOption materialSetOption)
    {
        SurfaceProperties surfaceProperties = Persistance.Load <SurfaceProperties>(figureDir.File("surface-properties.dat"));

        var refinementDirectory = figureDir.Subdirectory("refinement");

        var controlMeshDirectory = refinementDirectory.Subdirectory("control");

        int[] surfaceMap = controlMeshDirectory.File("surface-map.array").ReadArray <int>();

        var             refinedMeshDirectory = refinementDirectory.Subdirectory("level-" + surfaceProperties.SubdivisionLevel);
        SubdivisionMesh mesh = SubdivisionMeshPersistance.Load(refinedMeshDirectory);

        int[] controlFaceMap = refinedMeshDirectory.File("control-face-map.array").ReadArray <int>();

        var materialSet = MaterialSet.LoadActive(device, shaderCache, textureCache, dataDir, figureDir, materialSetOption, surfaceProperties);
        var materials   = materialSet.Materials;

        Scatterer scatterer = surfaceProperties.PrecomputeScattering ? Scatterer.Load(device, shaderCache, figureDir, materialSetOption.MaterialSet.Label) : null;

        var uvSetName = materials[0].UvSet;
        IArchiveDirectory uvSetDirectory = figureDir.Subdirectory("uv-sets").Subdirectory(uvSetName);

        var texturedVertexInfos = uvSetDirectory.File("textured-vertex-infos.array").ReadArray <TexturedVertexInfo>();

        Quad[] texturedFaces = uvSetDirectory.File("textured-faces.array").ReadArray <Quad>();

        var vertexRefiner = new VertexRefiner(device, shaderCache, mesh, texturedVertexInfos);

        FigureSurface[] surfaces = FigureSurface.MakeSurfaces(device, materials.Length, texturedFaces, controlFaceMap, surfaceMap, materialSet.FaceTransparencies);

        HashSet <int> visitedSurfaceIndices = new HashSet <int>();
        List <int>    surfaceOrder          = new List <int>(surfaces.Length);

        bool[] areUnorderedTransparent = new bool[surfaces.Length];

        //first add surfaces with an explicity-set render order
        foreach (int surfaceIdx in surfaceProperties.RenderOrder)
        {
            visitedSurfaceIndices.Add(surfaceIdx);
            surfaceOrder.Add(surfaceIdx);
            areUnorderedTransparent[surfaceIdx] = false;
        }

        //then add any remaining surfaces
        for (int surfaceIdx = 0; surfaceIdx < surfaces.Length; ++surfaceIdx)
        {
            if (visitedSurfaceIndices.Contains(surfaceIdx))
            {
                continue;
            }
            surfaceOrder.Add(surfaceIdx);
            areUnorderedTransparent[surfaceIdx] = true;
        }

        var isOneSided = figureDir.Name == "genesis-3-female";         //hack

        return(new FigureRenderer(device, shaderCache, scatterer, vertexRefiner, materialSet, surfaces, isOneSided, surfaceOrder.ToArray(), areUnorderedTransparent));
    }
Example #8
0
    public static List <Character> LoadList(IArchiveDirectory dataDir)
    {
        var dir        = dataDir.Subdirectory("characters");
        var characters = dir.GetFiles()
                         .Select(file => Persistance.Load <Character>(file))
                         .ToList();

        return(characters);
    }
    public static List <Outfit> LoadList(IArchiveDirectory dataDir)
    {
        var outfitsDir = dataDir.Subdirectory("outfits");
        var outfits    = outfitsDir.GetFiles()
                         .Select(outfitFile => Persistance.Load <Outfit>(outfitFile))
                         .Concat(new List <Outfit> {
            Naked
        })
                         .ToList();

        return(outfits);
    }
        private void HandleOnLoadOutputDataReceived(object sender, DataReceivedEventArgs dataReceivedEventArgs)
        {
            string fileName = dataReceivedEventArgs.Data;

            if (!string.IsNullOrEmpty(fileName))
            {
                Dispatcher.Invoke(() =>
                {
                    _persistanceScript.Load(fileName);
                });
            }
        }
Example #11
0
    public static ControlVertexProvider Load(Device device, ShaderCache shaderCache, FigureDefinition definition)
    {
        var shaperParameters = Persistance.Load <ShaperParameters>(definition.Directory.File("shaper-parameters.dat"));

        var occluderLoader = new OccluderLoader(device, shaderCache, definition);

        var provider = new ControlVertexProvider(
            device, shaderCache, occluderLoader,
            definition,
            shaperParameters);

        return(provider);
    }
Example #12
0
    public void login()
    {
        User newUser = new User(username, password);

        Persistance.Load();
        foreach (User user in Persistance.users)
        {
            if (newUser.Equals(user))
            {
                Debug.Log("Hello " + user);
            }
        }
    }
Example #13
0
    private static ChannelInputs LoadChannelInputs(ChannelSystem channelSystem, IArchiveFile channelInputsFile)
    {
        var shapeInputsByName = Persistance.Load <Dictionary <string, double> >(channelInputsFile);

        ChannelInputs channelInputs = channelSystem.MakeDefaultChannelInputs();

        foreach (var entry in shapeInputsByName)
        {
            Channel channel = channelSystem.ChannelsByName[entry.Key];
            channel.SetValue(channelInputs, entry.Value);
        }

        return(channelInputs);
    }
Example #14
0
    public static void DumpFigure(Figure figure, SurfaceProperties surfaceProperties, DirectoryInfo figureDestDir)
    {
        DirectoryInfo refinementDirectory = figureDestDir.Subdirectory("refinement").Subdirectory("level-" + surfaceProperties.SubdivisionLevel);

        Quad[] spatialFaces = refinementDirectory.File("faces.array").ReadArray <Quad>();
        SubdivisionTopologyInfo spatialTopologyInfo = Persistance.Load <SubdivisionTopologyInfo>(UnpackedArchiveFile.Make(refinementDirectory.File("topology-info.dat")));

        DirectoryInfo uvSetsDirectory = figureDestDir.Subdirectory("uv-sets");
        UVSetDumper   dumper          = new UVSetDumper(figure, surfaceProperties, uvSetsDirectory, spatialFaces, spatialTopologyInfo);

        foreach (var pair in figure.UvSets)
        {
            dumper.Dump(pair.Key, pair.Value);
        }
    }
Example #15
0
        public void Execute()
        {
            var persistance = new Persistance();

            var addSourceTmConfiguration = persistance.Load();

            if (addSourceTmConfiguration != null)
            {
                return;
            }

            persistance.Save(new AddSourceTmConfigurations()
            {
                Configurations = new List <AddSourceTmConfiguration>()
            });
        }
Example #16
0
    public BoneSystemPerformanceDemo()
    {
        var figureDir = UnpackedArchiveDirectory.Make(new System.IO.DirectoryInfo("work/figures/genesis-3-female"));

        var channelSystemRecipe = Persistance.Load <ChannelSystemRecipe>(figureDir.File("channel-system-recipe.dat"));

        channelSystem = channelSystemRecipe.Bake(null);

        var boneSystemRecipe = Persistance.Load <BoneSystemRecipe>(figureDir.File("bone-system-recipe.dat"));

        boneSystem = boneSystemRecipe.Bake(channelSystem.ChannelsByName);

        var pose = Persistance.Load <List <Pose> >(figureDir.File("animations/idle.dat"))[0];

        inputs = channelSystem.MakeDefaultChannelInputs();
        new Poser(channelSystem, boneSystem).Apply(inputs, pose, DualQuaternion.Identity);
    }
Example #17
0
    public void Run()
    {
        var figureDir = UnpackedArchiveDirectory.Make(new System.IO.DirectoryInfo("work/figures/genesis-3-female"));

        var channelSystemRecipe = Persistance.Load <ChannelSystemRecipe>(figureDir.File("channel-system-recipe.dat"));
        var channelSystem       = channelSystemRecipe.Bake(null);

        var boneSystemRecipe = Persistance.Load <BoneSystemRecipe>(figureDir.File("bone-system-recipe.dat"));
        var boneSystem       = boneSystemRecipe.Bake(channelSystem.ChannelsByName);

        bonesByParent = boneSystem.Bones.ToLookup(bone => bone.Parent);

        foreach (var rootBone in bonesByParent[null])
        {
            PrintBone(rootBone, 0);
        }
    }
Example #18
0
    private static ParentOverride[] LoadParentOverrides(ChannelSystem channelSystem, IArchiveFile parentOverridesFile)
    {
        if (parentOverridesFile == null)
        {
            return(null);
        }

        var parentChannelSystem   = channelSystem.Parent;
        var parentOverridesByName = Persistance.Load <Dictionary <string, double> >(parentOverridesFile);
        var parentOverrides       = parentOverridesByName
                                    .Select(entry => new ParentOverride {
            channel = parentChannelSystem.ChannelsByName[entry.Key],
            value   = entry.Value
        })
                                    .ToArray();

        return(parentOverrides);
    }
Example #19
0
    public static MaterialSet LoadActive(Device device, ShaderCache shaderCache, TextureCache textureCache, IArchiveDirectory dataDir, IArchiveDirectory figureDir, string materialSetName, SurfaceProperties surfaceProperties)
    {
        var materialsDirectory = figureDir
                                 .Subdirectory("material-sets")
                                 .Subdirectory(materialSetName);

        var texturesDirectory = surfaceProperties.ShareTextures != null?
                                dataDir.Subdirectory("textures").Subdirectory(surfaceProperties.ShareTextures) :
                                    materialsDirectory;

        var textureLoader         = new TextureLoader(device, textureCache, texturesDirectory);
        var multiMaterialSettings = Persistance.Load <MultiMaterialSettings>(materialsDirectory.File("material-settings.dat"));
        var materials             = multiMaterialSettings.PerMaterialSettings.Select(settings => settings.Load(device, shaderCache, textureLoader)).ToArray();

        float[] faceTransparencies = materialsDirectory.File("face-transparencies.array").ReadArray <float>();

        return(new MaterialSet(textureLoader, materials, faceTransparencies));
    }
Example #20
0
        public void Init(Uri providerUri)
        {
            var builder
                = new SQLiteConnectionStringBuilder
                {
                SyncMode   = SynchronizationModes.Off,
                DataSource = _tmDatabasePath,
                Enlist     = false,
                Pooling    = false
                };

            _db = Database.OpenConnection(builder.ToString());

            var persistance = new Persistance();
            var addSourceTmConfigurations = persistance.Load();

            _addSourceTmConfiguration = addSourceTmConfigurations.Configurations.FirstOrDefault(x => x.ProviderUri == providerUri) ??
                                        addSourceTmConfigurations.Default;
        }
    private static MultiMaterialSettings DumpMaterialSet(ImportSettings settings, Device device, ShaderCache shaderCache, ContentFileLocator fileLocator, DsonObjectLocator objectLocator, Figure figure, MaterialSetImportConfiguration baseConfiguration, MaterialSetImportConfiguration configuration, TextureProcessor sharedTextureProcessor)
    {
        DirectoryInfo figuresDirectory           = CommonPaths.WorkDir.Subdirectory("figures");
        DirectoryInfo figureDirectory            = figuresDirectory.Subdirectory(figure.Name);
        DirectoryInfo materialsSetsDirectory     = figureDirectory.Subdirectory("material-sets");
        DirectoryInfo materialSetDirectory       = materialsSetsDirectory.Subdirectory(configuration.name);
        FileInfo      materialSettingsFileInfo   = materialSetDirectory.File("material-settings.dat");
        FileInfo      faceTransparenciesFileInfo = materialSetDirectory.File("face-transparencies.array");

        if (materialSettingsFileInfo.Exists && faceTransparenciesFileInfo.Exists)
        {
            return(Persistance.Load <MultiMaterialSettings>(UnpackedArchiveFile.Make(materialSettingsFileInfo)));
        }

        var aggregator = new DsonMaterialAggregator(fileLocator, objectLocator);
        IEnumerable <string> dufPaths = Enumerable.Concat(baseConfiguration.materialsDufPaths, configuration.materialsDufPaths);

        foreach (string path in dufPaths)
        {
            DsonTypes.DsonDocument doc = objectLocator.LocateRoot(path);
            aggregator.IncludeDuf(doc.Root);
        }

        TextureProcessor localTextureProcessor;

        if (sharedTextureProcessor == null)
        {
            localTextureProcessor = new TextureProcessor(device, shaderCache, materialSetDirectory, settings.CompressTextures);
        }
        else
        {
            localTextureProcessor = null;
        }

        var textureProcessor = sharedTextureProcessor ?? localTextureProcessor;

        var faceTransparencyProcessor = new FaceTransparencyProcessor(device, shaderCache, figure);

        IMaterialImporter materialImporter;

        if (figure.Name.EndsWith("-hair"))
        {
            materialImporter = new HairMaterialImporter(figure, textureProcessor, faceTransparencyProcessor);
        }
        else
        {
            materialImporter = new UberMaterialImporter(figure, textureProcessor, faceTransparencyProcessor);
        }

        var perMaterialSettings = Enumerable.Range(0, figure.Geometry.SurfaceCount)
                                  .Select(surfaceIdx => {
            string surfaceName   = figure.Geometry.SurfaceNames[surfaceIdx];
            var bag              = aggregator.GetBag(surfaceName);
            var materialSettings = materialImporter.Import(surfaceIdx, bag);
            return(materialSettings);
        })
                                  .ToArray();

        var multiMaterialSettings = new MultiMaterialSettings(perMaterialSettings);

        materialSetDirectory.CreateWithParents();

        textureProcessor.RegisterAction(() => {
            Persistance.Save(materialSettingsFileInfo, multiMaterialSettings);
        });

        localTextureProcessor?.ImportAll();

        var faceTranparencies = faceTransparencyProcessor.FaceTransparencies;

        faceTransparenciesFileInfo.WriteArray(faceTranparencies);

        faceTransparencyProcessor.Dispose();

        return(multiMaterialSettings);
    }
Example #22
0
    public static ActorBehavior Load(ControllerManager controllerManager, IArchiveDirectory figureDir, ActorModel model)
    {
        InverterParameters inverterParameters = Persistance.Load <InverterParameters>(figureDir.File("inverter-parameters.dat"));

        return(new ActorBehavior(controllerManager, model, inverterParameters));
    }
    private static MultiMaterialSettings DumpMaterialSet(ImportSettings settings, Device device, ShaderCache shaderCache, ContentFileLocator fileLocator, DsonObjectLocator objectLocator, Figure figure, SurfaceProperties surfaceProperties, MaterialSetImportConfiguration baseConfiguration, DirectoryInfo figureDestDir, MaterialSetImportConfiguration configuration, TextureProcessor textureProcessor)
    {
        DirectoryInfo materialsSetsDirectory     = figureDestDir.Subdirectory("material-sets");
        DirectoryInfo materialSetDirectory       = materialsSetsDirectory.Subdirectory(configuration.name);
        FileInfo      materialSettingsFileInfo   = materialSetDirectory.File("material-settings.dat");
        FileInfo      faceTransparenciesFileInfo = materialSetDirectory.File("face-transparencies.array");

        if (materialSettingsFileInfo.Exists && faceTransparenciesFileInfo.Exists)
        {
            return(Persistance.Load <MultiMaterialSettings>(UnpackedArchiveFile.Make(materialSettingsFileInfo)));
        }

        var aggregator = new DsonMaterialAggregator(fileLocator, objectLocator);
        IEnumerable <string> dufPaths = Enumerable.Concat(baseConfiguration.materialsDufPaths, configuration.materialsDufPaths);

        foreach (string path in dufPaths)
        {
            DsonTypes.DsonDocument doc = objectLocator.LocateRoot(path);
            aggregator.IncludeDuf(doc.Root);
        }

        var faceTransparencyProcessor = new FaceTransparencyProcessor(device, shaderCache, figure, surfaceProperties);

        IMaterialImporter materialImporter;

        if (figure.Name.EndsWith("-hair"))
        {
            materialImporter = new HairMaterialImporter(figure, textureProcessor, faceTransparencyProcessor);
        }
        else
        {
            materialImporter = new UberMaterialImporter(figure, textureProcessor, faceTransparencyProcessor);
        }

        string[] surfaceNames = figure.Geometry.SurfaceNames;
        Dictionary <string, int> surfaceNameToIdx = Enumerable.Range(0, surfaceNames.Length)
                                                    .ToDictionary(idx => surfaceNames[idx], idx => idx);

        var perMaterialSettings = Enumerable.Range(0, figure.Geometry.SurfaceCount)
                                  .Select(surfaceIdx => {
            string surfaceName   = figure.Geometry.SurfaceNames[surfaceIdx];
            var bag              = aggregator.GetBag(surfaceName);
            var materialSettings = materialImporter.Import(surfaceIdx, bag);
            return(materialSettings);
        })
                                  .ToArray();

        var variantCategories = configuration.variantCategories
                                .Select(variantCategoryConf => {
            int[] surfaceIdxs = variantCategoryConf.surfaces
                                .Select(surfaceName => surfaceNameToIdx[surfaceName])
                                .ToArray();

            var variants = variantCategoryConf.variants
                           .Select(variantConf => {
                var variantAggregator = aggregator.Branch();
                foreach (string path in variantConf.materialsDufPaths)
                {
                    DsonTypes.DsonDocument doc = objectLocator.LocateRoot(path);
                    variantAggregator.IncludeDuf(doc.Root);
                }

                var settingsBySurface = variantCategoryConf.surfaces
                                        .Select(surfaceName => {
                    int surfaceIdx       = surfaceNameToIdx[surfaceName];
                    var bag              = variantAggregator.GetBag(surfaceName);
                    var materialSettings = materialImporter.Import(surfaceIdx, bag);
                    return(materialSettings);
                })
                                        .ToArray();

                return(new MultiMaterialSettings.Variant(variantConf.name, settingsBySurface));
            })
                           .ToArray();

            return(new MultiMaterialSettings.VariantCategory(variantCategoryConf.name, surfaceIdxs, variants));
        })
                                .ToArray();

        var multiMaterialSettings = new MultiMaterialSettings(perMaterialSettings, variantCategories);

        materialSetDirectory.CreateWithParents();

        textureProcessor.RegisterAction(() => {
            Persistance.Save(materialSettingsFileInfo, multiMaterialSettings);
        });

        var faceTranparencies = faceTransparencyProcessor.FaceTransparencies;

        faceTransparenciesFileInfo.WriteArray(faceTranparencies);

        faceTransparencyProcessor.Dispose();

        return(multiMaterialSettings);
    }
    public static MaterialSetOption Load(IArchiveDirectory materialSetDirectory)
    {
        var settings = Persistance.Load <MultiMaterialSettings>(materialSetDirectory.File("material-settings.dat"));

        return(new MaterialSetOption(materialSetDirectory.Name, materialSetDirectory, settings));
    }