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); }
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); } } } } }
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()); }
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); } } }
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()); } }
public DsonObjectReferenceConverter(DsonDocument document) { this.document = document; }
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); }
public void ImportFrom(DsonTypes.DsonDocument doc) { ImportFrom(doc.Root.geometry_library); }