Example #1
0
    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));
        }
Example #4
0
    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;
 }
Example #7
0
    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());
    }