Exemple #1
0
    public void ImportFormula(DsonTypes.DsonDocument doc, DsonTypes.Formula formula)
    {
        FormulaRecipe recipe = new FormulaRecipe {
            Output     = ConvertChannelUri(doc, formula.output),
            Operations = new List <OperationRecipe>()
        };

        SplineOperationBuilder splineOperationBuilder = new SplineOperationBuilder();

        foreach (DsonTypes.Operation operation in formula.operations)
        {
            ImportOperation(splineOperationBuilder, recipe.Operations, doc, operation);
        }

        if (formula.stage == DsonTypes.Stage.Sum)
        {
            recipe.Stage = FormulaRecipe.FormulaStage.Sum;
        }
        else if (formula.stage == DsonTypes.Stage.Multiply)
        {
            recipe.Stage = FormulaRecipe.FormulaStage.Multiply;
        }
        else
        {
            throw new InvalidOperationException();
        }

        formulaRecipes.Add(recipe);
    }
Exemple #2
0
 public void ImportFrom(DsonTypes.DsonDocument document)
 {
     if (document.Root.node_library != null)
     {
         foreach (var node in document.Root.node_library)
         {
             if (node.formulas != null)
             {
                 foreach (var formula in node.formulas)
                 {
                     ImportFormula(document, formula);
                 }
             }
         }
     }
     if (document.Root.modifier_library != null)
     {
         foreach (var modifier in document.Root.modifier_library)
         {
             if (modifier.formulas != null)
             {
                 foreach (var formula in modifier.formulas)
                 {
                     ImportFormula(document, formula);
                 }
             }
         }
     }
 }
Exemple #3
0
    private string ConvertChannelUri(DsonTypes.DsonDocument doc, string uri)
    {
        string scope;
        int    colonIdx = uri.IndexOf(':');

        if (colonIdx >= 0)
        {
            scope = Uri.UnescapeDataString(uri.Substring(0, colonIdx));
            uri   = uri.Substring(colonIdx + 1);
        }
        else
        {
            scope = null;
        }

        string objectUri, query;

        int questionIdx = uri.IndexOf('?');

        if (questionIdx >= 0)
        {
            objectUri = uri.Substring(0, questionIdx);
            query     = uri.Substring(questionIdx + 1);
        }
        else
        {
            objectUri = uri;
            query     = null;
        }

        string resolvedObjectUri = doc.ResolveUri(objectUri);

        DsonTypes.DsonObject obj = doc.Locator.Locate(resolvedObjectUri);
        string objectName        = obj.name;

        if (obj.id == scope)
        {
            //leave out the scope if it's redundant
            scope = null;
        }

        StringBuilder builder = new StringBuilder();

        if (scope != null && scope != rootScope)
        {
            builder.Append(scope).Append(":");
        }
        builder.Append(objectName);
        if (query != null)
        {
            builder.Append("?").Append(query);
        }
        return(builder.ToString());
    }
Exemple #4
0
        public static DsonDocument LoadFromFile(DsonObjectLocator locator, string contentPath, string documentPath)
        {
            using (StreamReader reader = File.OpenText(contentPath)) {
                using (JsonReader jsonReader = new JsonTextReader(reader)) {
                    DsonDocument document = new DsonDocument(locator, documentPath);

                    var serializer = JsonSerializer.CreateDefault();
                    serializer.Converters.Add(new DsonObjectReferenceConverter(document));
                    DsonRoot root = serializer.Deserialize <DsonRoot>(jsonReader);

                    document.root = root;

                    return(document);
                }
            }
        }
Exemple #5
0
    private void ImportOperation(SplineOperationBuilder splineOperationBuilder, List <OperationRecipe> operations, DsonTypes.DsonDocument doc, DsonTypes.Operation operation)
    {
        if (operation.op == DsonTypes.Operator.Push)
        {
            if (operation.url != null)
            {
                splineOperationBuilder.ConfirmInactive();
                string channelRef = ConvertChannelUri(doc, operation.url);
                operations.Add(OperationRecipe.MakePushChannel(channelRef));
            }
            else
            {
                Object val = operation.val;
                switch (val)
                {
                case JArray arrayValue:
                    float[] values = arrayValue.ToObject <float[]>();
                    splineOperationBuilder.AddValueArray(values);
                    break;

                default:
                    if (splineOperationBuilder.Active)
                    {
                        splineOperationBuilder.AddSize(Convert.ToInt32(operation.val));
                    }
                    else
                    {
                        float value = Convert.ToSingle(operation.val);
                        operations.Add(OperationRecipe.MakePushConstant(value));
                    }
                    break;
                }
            }
        }
        else if (operation.op == DsonTypes.Operator.Add)
        {
            splineOperationBuilder.ConfirmInactive();
            operations.Add(OperationRecipe.Make(OperationRecipe.OperationKind.Add));
        }
        else if (operation.op == DsonTypes.Operator.Sub)
        {
            splineOperationBuilder.ConfirmInactive();
            operations.Add(OperationRecipe.Make(OperationRecipe.OperationKind.Sub));
        }
        else if (operation.op == DsonTypes.Operator.Mult)
        {
            splineOperationBuilder.ConfirmInactive();
            operations.Add(OperationRecipe.Make(OperationRecipe.OperationKind.Mul));
        }
        else if (operation.op == DsonTypes.Operator.Div)
        {
            splineOperationBuilder.ConfirmInactive();
            operations.Add(OperationRecipe.Make(OperationRecipe.OperationKind.Div));
        }
        else if (operation.op == DsonTypes.Operator.SplineTcb)
        {
            operations.Add(splineOperationBuilder.Build());
        }
    }
Exemple #6
0
 public DsonObjectReferenceConverter(DsonDocument document)
 {
     this.document = document;
 }
Exemple #7
0
 public DsonObjectReference(DsonDocument document, string relativeUri)
 {
     Document    = document;
     RelativeUri = relativeUri ?? throw new ArgumentNullException("relativeUri");
 }
 public void ImportFrom(DsonTypes.DsonDocument doc)
 {
     ImportFrom(doc.Root.modifier_library);
 }
    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 void ImportFrom(DsonTypes.DsonDocument doc)
 {
     ImportFrom(doc.Root.node_library);
 }
 public void ImportFrom(DsonTypes.DsonDocument doc, bool forceModifiersHidden)
 {
     ImportFrom(doc.Root.node_library);
     ImportFrom(doc.Root.modifier_library, forceModifiersHidden);
 }
    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);
    }
Exemple #13
0
 public void ImportFrom(DsonTypes.DsonDocument doc)
 {
     ImportFrom(doc.Root.geometry_library);
 }