public static FigureRecipe ImportFor(string figureName, DsonObjectLocator locator, FigureUris figureUris, FigureRecipe parentRecipe, double hdCorrectionInitialValue) { var geometryRecipe = GeometryImporter.ImportForFigure(locator, figureUris); FigureRecipe recipe = new FigureRecipe { Name = figureName, Geometry = geometryRecipe, Channels = ChannelImporter.ImportForFigure(locator, figureUris).ToList(), Formulas = FormulaImporter.ImportForFigure(locator, figureUris).ToList(), Bones = BoneImporter.ImportForFigure(locator, figureUris).ToList(), Morphs = MorphImporter.ImportForFigure(locator, figureUris).ToList(), SkinBinding = SkinBindingImporter.ImportForFigure(locator, figureUris), UvSets = UvSetImporter.ImportForFigure(locator, figureUris, geometryRecipe).ToList() }; Geometry geometry = recipe.Geometry.Bake(); var correctionSynthesizer = new HdCorrectionMorphSynthesizer(figureName, geometry); recipe.Channels.Add(correctionSynthesizer.SynthesizeChannel(hdCorrectionInitialValue)); recipe.Morphs.Add(correctionSynthesizer.SynthesizeMorph()); if (parentRecipe != null) { Geometry parentGeometry = parentRecipe.Geometry.Bake(); recipe.Automorpher = AutomorpherRecipe.Make(parentGeometry, geometry); } return(recipe); }
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 static Reindexer Make(FigureRecipe parent, FigureRecipe[] children) { int childCount = children.Length; //build hidden face set int parentFaceCount = parent.Geometry.Faces.Length; bool[] hiddenFaceSet = new bool[parentFaceCount]; for (int childIdx = 0; childIdx < children.Length; ++childIdx) { Graft graft = children[childIdx].Geometry.Graft; if (graft != null) { foreach (int hiddenFace in graft.HiddenFaces) { hiddenFaceSet[hiddenFace] = true; } } } //build parent face map int[] parentFaceMap = new int[parent.Geometry.Faces.Length]; int nonHiddenParentFaceCount = 0; for (int faceIdx = 0; faceIdx < parentFaceCount; ++faceIdx) { if (hiddenFaceSet[faceIdx]) { parentFaceMap[faceIdx] = -1; } else { parentFaceMap[faceIdx] = nonHiddenParentFaceCount; nonHiddenParentFaceCount += 1; } } //build child offsets and totals Offset[] offsets = new Offset[childCount]; Offset currentOffset = new Offset( parent.Geometry.GetVertexCount(), nonHiddenParentFaceCount, parent.Geometry.GetSurfaceCount() ); for (int i = 0; i < childCount; ++i) { offsets[i] = currentOffset; FigureRecipe currentFigure = children[i]; currentOffset = currentOffset.Add( currentFigure.Geometry.GetVertexCount(), currentFigure.Geometry.Faces.Length, currentFigure.Geometry.GetSurfaceCount()); } Offset totals = currentOffset; return(new Reindexer(parentFaceMap, offsets, totals)); }
private void Run(string[] args) { ImportSettings settings; if (args.Length > 0 && args[0] == "release") { settings = ImportSettings.MakeReleaseSettings(); } else { settings = ImportSettings.MakeFromViewerInitialSettings(); } new UiImporter().Run(); new EnvironmentCubeGenerator().Run(settings); OutfitImporter.ImportAll(); var loader = new FigureRecipeLoader(objectLocator); FigureRecipe genesis3FemaleRecipe = loader.LoadFigureRecipe("genesis-3-female", null); FigureRecipe genitaliaRecipe = loader.LoadFigureRecipe("genesis-3-female-genitalia", genesis3FemaleRecipe); FigureRecipe genesis3FemaleWithGenitaliaRecipe = new FigureRecipeMerger(genesis3FemaleRecipe, genitaliaRecipe).Merge(); Figure genesis3FemaleWithGenitalia = genesis3FemaleWithGenitaliaRecipe.Bake(null); Figure parentFigure = genesis3FemaleWithGenitalia; List <Figure> childFigures = settings.FiguresToImport .Where(figureName => figureName != parentFigure.Name) .Select(figureName => loader.LoadFigureRecipe(figureName, genesis3FemaleRecipe).Bake(parentFigure)) .ToList(); List <Figure> figuresToDump = Enumerable.Repeat(parentFigure, 1) .Concat(childFigures) .ToList(); Console.WriteLine($"Dumping parent..."); AnimationDumper.DumpAllAnimations(parentFigure); var textureProcessorSharer = new TextureProcessorSharer(device, shaderCache, settings.CompressTextures); foreach (Figure figure in figuresToDump) { bool[] channelsToInclude = figure != parentFigure?ChannelShaker.MakeChannelsToIncludeFromShapes(figure) : null; Console.WriteLine($"Dumping {figure.Name}..."); SystemDumper.DumpFigure(figure, channelsToInclude); GeometryDumper.DumpFigure(figure); UVSetDumper.DumpFigure(figure); MaterialSetDumper.DumpAllForFigure(settings, device, shaderCache, fileLocator, objectLocator, figure, textureProcessorSharer); ShapeDumper.DumpAllForFigure(settings, fileLocator, device, shaderCache, parentFigure, figure); } textureProcessorSharer.Finish(); }
public FigureRecipeMerger(FigureRecipe parent, params FigureRecipe[] children) { this.parent = parent; this.children = children; this.reindexer = Reindexer.Make(parent, children); childControlChannels = children .Select(child => new ChannelRecipe { Name = $"CTRL{child.Name}?value", InitialValue = 0, Min = 0, Max = 1, Clamped = true, }).ToArray(); }
public Figure(string name, Figure parent, FigureRecipe recipe, Geometry geometry, ChannelSystem channelSystem, BoneSystem boneSystem, RigidTransform[] childToParentBindPoseTransforms, Morpher morpher, Automorpher automorpher, SkinBinding skinBinding, Dictionary <string, UvSet> uvSets, UvSet defaultUvSet, OcclusionBinding occlusionBinding) { this.name = name; this.parent = parent; this.recipe = recipe; this.geometry = geometry; this.channelSystem = channelSystem; this.boneSystem = boneSystem; this.childToParentBindPoseTransforms = childToParentBindPoseTransforms; this.morpher = morpher; this.automorpher = automorpher; this.skinBinding = skinBinding; this.uvSets = uvSets; this.defaultUvSet = defaultUvSet; this.occlusionBinding = occlusionBinding; }
public FigureDumperLoader(ContentFileLocator fileLocator, DsonObjectLocator objectLocator, ImporterPathManager pathManager, Device device, ShaderCache shaderCache) { this.fileLocator = fileLocator; this.objectLocator = objectLocator; this.pathManager = pathManager; this.device = device; this.shaderCache = shaderCache; figureRecipeLoader = new FigureRecipeLoader(objectLocator, pathManager); FigureRecipe genesis3FemaleRecipe = figureRecipeLoader.LoadFigureRecipe("genesis-3-female", null); FigureRecipe genitaliaRecipe = figureRecipeLoader.LoadFigureRecipe("genesis-3-female-genitalia", genesis3FemaleRecipe); FigureRecipe genesis3FemaleWithGenitaliaRecipe = new FigureRecipeMerger(genesis3FemaleRecipe, genitaliaRecipe).Merge(); Figure genesis3FemaleWithGenitalia = genesis3FemaleWithGenitaliaRecipe.Bake(null); SurfaceProperties genesis3FemaleSurfaceProperties = SurfacePropertiesJson.Load(pathManager, genesis3FemaleWithGenitalia); float[] genesis3FemaleFaceTransparencies = FaceTransparencies.For(genesis3FemaleWithGenitalia, genesis3FemaleSurfaceProperties, null); parentFigureRecipe = genesis3FemaleRecipe; parentFigure = genesis3FemaleWithGenitalia; parentFaceTransparencies = genesis3FemaleFaceTransparencies; }
public void Run() { var loader = new FigureRecipeLoader(fileLocator, objectLocator, pathManager); FigureRecipe genesis3FemaleRecipe = loader.LoadFigureRecipe("genesis-3-female", null); FigureRecipe genitaliaRecipe = loader.LoadFigureRecipe("genesis-3-female-genitalia", genesis3FemaleRecipe); FigureRecipe genesis3FemaleWithGenitaliaRecipe = new FigureRecipeMerger(genesis3FemaleRecipe, genitaliaRecipe).Merge(); Figure genesis3FemaleWithGenitalia = genesis3FemaleWithGenitaliaRecipe.Bake(fileLocator, null); Figure parentFigure = genesis3FemaleWithGenitalia; FigureRecipe livHairRecipe = loader.LoadFigureRecipe("liv-hair", null); var livHairFigure = livHairRecipe.Bake(fileLocator, parentFigure); var surfaceProperties = SurfacePropertiesJson.Load(pathManager, livHairFigure); var processor = new FaceTransparencyProcessor(device, shaderCache, livHairFigure, surfaceProperties); for (int surfaceIdx = 0; surfaceIdx < livHairFigure.Geometry.SurfaceCount; ++surfaceIdx) { string surfaceName = livHairFigure.Geometry.SurfaceNames[surfaceIdx]; FileInfo textureFile; if (surfaceName == "Hairband") { continue; } else if (surfaceName == "Cap") { textureFile = fileLocator.Locate("/Runtime/Textures/outoftouch/!hair/OOTHairblending2/Liv/OOTUtilityLivCapT.jpg").File; } else { textureFile = fileLocator.Locate("/Runtime/Textures/outoftouch/!hair/OOTHairblending2/Liv/OOTUtilityLivHairT.png").File; } RawFloatTexture opacityTexture = new RawFloatTexture { value = 1, image = new RawImageInfo { file = textureFile, gamma = 1 } }; processor.ProcessSurface(surfaceIdx, livHairFigure.DefaultUvSet.Name, opacityTexture); } var transparencies = processor.FaceTransparencies; for (int i = 0; i < 10; ++i) { int faceIdx = i * 3000; int surfaceIdx = livHairFigure.Geometry.SurfaceMap[faceIdx]; string surfaceName = livHairFigure.Geometry.SurfaceNames[surfaceIdx]; var uvSet = livHairFigure.DefaultUvSet; Quad face = uvSet.Faces[faceIdx]; Console.WriteLine("face {0}: ", faceIdx); Console.WriteLine(" transparency: " + transparencies[faceIdx]); Console.WriteLine(" surface: " + surfaceName); Console.WriteLine(" uv 0: {0}", uvSet.Uvs[face.Index0]); Console.WriteLine(" uv 1: {0}", uvSet.Uvs[face.Index1]); Console.WriteLine(" uv 2: {0}", uvSet.Uvs[face.Index2]); Console.WriteLine(" uv 3: {0}", uvSet.Uvs[face.Index3]); Console.WriteLine(); } Console.WriteLine("min = " + transparencies.Min()); Console.WriteLine("avg = " + transparencies.Average()); Console.WriteLine("max = " + transparencies.Max()); }