Пример #1
0
        /// <summary> Load project from path </summary>
        public static Project FromStream(string path)
        {
            Project result;

            using (var br = new BinaryReader(File.Open(path, FileMode.Open)))
            {
                var projectFi = new FileInfo(path);

                var projectName = br.ReadString();

                #region template image

                var templateImagePath = br.ReadString();
                if (!string.IsNullOrEmpty(templateImagePath))
                {
                    var fiName = Path.Combine(projectFi.DirectoryName, templateImagePath);
                    var fi     = new FileInfo(fiName);
                    if (!fi.Exists)
                    {
                        ProgramCore.EchoToLog("Can't find template image in project.", EchoMessageType.Warning);
                        templateImagePath = string.Empty;
                    }
                }

                #endregion

                var headModelPath = br.ReadString();

                var genesisType = (GenesisType)br.ReadInt32();
                var manType     = (ManType)br.ReadInt32();
                var textureFlip = (FlipType)br.ReadInt32();
                var shapeFlip   = (FlipType)br.ReadInt32();

                var isOpenSmile = br.ReadBoolean();

                var textureSize = 1024;
                switch (ProgramCore.CurrentProgram)
                {
                case ProgramCore.ProgramMode.HeadShop_OneClick:
                case ProgramCore.ProgramMode.HeadShop_v11:
                case ProgramCore.ProgramMode.FaceAge2_Partial:
                case ProgramCore.ProgramMode.HeadShop_OneClick_v2:
                case ProgramCore.ProgramMode.HeadShop_Rotator:
                    textureSize = 2048;              // если поставит ьу нас в проге 4096 - то все крашится к хуям. Пусть уж только на экспорте будет.
                    break;

                    /*   textureSize = 4096;
                     * break;*/
                }

                result = new Project(projectName, projectFi.DirectoryName, templateImagePath, genesisType, manType, headModelPath, false, textureSize, isOpenSmile);
                result.LoadMeshes();
                result.TextureFlip = textureFlip;
                result.ShapeFlip   = shapeFlip;

                var partsCount = br.ReadInt32(); //part's library
                for (var i = 0; i < partsCount; i++)
                {
                    var title       = br.ReadString();
                    var meshType    = br.ReadBoolean() ? MeshType.Accessory : MeshType.Hair;
                    var meshVisible = br.ReadBoolean();
                    var meshPath    = br.ReadString();

                    var meshCounts = br.ReadInt32();
                    for (var j = 0; j < meshCounts; j++)
                    {
                        var meshTitle = br.ReadString();
                        DynamicRenderMesh mesh;
                        if (meshType == MeshType.Accessory)
                        {
                            mesh = ProgramCore.MainForm.ctrlRenderControl.pickingController.AccesoryMeshes[meshTitle];
                        }
                        else
                        {
                            mesh = ProgramCore.MainForm.ctrlRenderControl.pickingController.HairMeshes[meshTitle];
                        }
                        if (mesh == null)
                        {
                            continue;
                        }

                        mesh.Title     = title + "_" + j;
                        mesh.IsVisible = meshVisible;
                        mesh.Path      = meshPath;

                        if (!ProgramCore.MainForm.ctrlRenderControl.PartsLibraryMeshes.ContainsKey(title))
                        {
                            ProgramCore.MainForm.ctrlRenderControl.PartsLibraryMeshes.Add(title, new DynamicRenderMeshes());
                        }
                        ProgramCore.MainForm.ctrlRenderControl.PartsLibraryMeshes[title].Add(mesh);
                    }
                }

                result.AutodotsUsed = br.ReadBoolean();

                result.RotatedAngle = br.ReadDouble();

                // загружаем прямоугольник лица (фронт)
                result.FaceRectRelative = new RectangleF(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle());

                result.MouthCenter    = new Vector2(br.ReadSingle(), br.ReadSingle());
                result.LeftEyeCenter  = new Vector2(br.ReadSingle(), br.ReadSingle());
                result.RightEyeCenter = new Vector2(br.ReadSingle(), br.ReadSingle());

                result.NoseUserCenter     = new Vector2(br.ReadSingle(), br.ReadSingle());
                result.MouthUserCenter    = new Vector2(br.ReadSingle(), br.ReadSingle());
                result.LeftEyeUserCenter  = new Vector2(br.ReadSingle(), br.ReadSingle());
                result.RightEyeUserCenter = new Vector2(br.ReadSingle(), br.ReadSingle());

                result.AgeCoefficient = br.ReadSingle();
                result.FatCoefficient = br.ReadSingle();

                //Сохраняем цвет головы
                result.FaceColor = new Vector4(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), 1.0f);

                #region Информация о модели головы

                var rmPath = Path.Combine(projectFi.DirectoryName, "Model", "MeshParts.rm");
                result.RenderMainHelper.headMeshesController.RenderMesh.Load(rmPath);
                foreach (var part in result.RenderMainHelper.headMeshesController.RenderMesh.Parts)
                {
                    if (!string.IsNullOrEmpty(part.TextureName))
                    {
                        part.Texture = ProgramCore.MainForm.ctrlRenderControl.GetTexture(part.TextureName);
                    }
                    if (!string.IsNullOrEmpty(part.TransparentTextureName))
                    {
                        part.TransparentTexture = ProgramCore.MainForm.ctrlRenderControl.GetTexture(part.TransparentTextureName);
                    }
                }

                var baseDotsCount = br.ReadInt32();
                for (var i = 0; i < baseDotsCount; i++)
                {
                    result.BaseDots.Add(HeadPoint.FromStream(br));
                }

                var profileBaseDotsCount = br.ReadInt32();
                for (var i = 0; i < profileBaseDotsCount; i++)
                {
                    result.ProfileBaseDots.Add(HeadPoint.FromStream(br));
                }

                result.RenderMainHelper.autodotsShapeHelper.ShapeInfo        = TexturingInfo.FromStream(br);
                result.RenderMainHelper.autodotsShapeHelper.ShapeProfileInfo = TexturingInfo.FromStream(br);

                result.RenderMainHelper.headMeshesController.TexturingInfo = TexturingInfo.FromStream(br);

                result.RenderMainHelper.headController.AutoDotsv2.Clear();
                result.RenderMainHelper.headController.ShapeDots.Clear();
                var cnt = br.ReadInt32();
                for (var i = 0; i < cnt; i++)
                {
                    result.RenderMainHelper.headController.ShapeDots.Add(MirroredHeadPoint.FromStreamW(br));
                }
                cnt = br.ReadInt32();
                for (var i = 0; i < cnt; i++)
                {
                    result.RenderMainHelper.headController.AutoDotsv2.Add(HeadPoint.FromStream(br));
                }

                result.CustomHeadNeedProfileSetup = br.ReadBoolean();

                #endregion

                result.ProfileEyeLocation   = new Vector2(br.ReadSingle(), br.ReadSingle());
                result.ProfileMouthLocation = new Vector2(br.ReadSingle(), br.ReadSingle());

                var fi1 = new FileInfo(Path.Combine(projectFi.DirectoryName, "ProfileImage.jpg"));
                if (fi1.Exists)
                {
                    using (var fs = new FileStream(fi1.FullName, FileMode.Open))
                    {
                        using (var bmp = new Bitmap(fs))
                            result.ProfileImage = (Bitmap)bmp.Clone();
                    }
                }

                try
                {
                    var hasStage = br.ReadBoolean();
                    if (hasStage)
                    {
                        ProgramCore.MainForm.ctrlRenderControl.BackgroundTexture = br.ReadString();
                    }

                    ProgramCore.MainForm.activePanel = br.ReadInt32();

                    result.projectCamera       = new Camera();
                    result.projectCamera.Scale = br.ReadSingle();
                    result.projectCamera.beta  = br.ReadDouble();
                    result.projectCamera._dy   = br.ReadSingle();
                }
                catch
                {
                }

                try
                {
                    result.MorphingScale = br.ReadSingle();
                }
                catch
                {
                }

                try
                {
                    result.TextureSize = br.ReadInt32();
                }
                catch
                {
                }
            }

            return(result);
        }
Пример #2
0
        /// <summary> Save current project to file </summary>
        public void ToStream()
        {
            try
            {
                if (ProgramCore.Project.AutodotsUsed)
                {
                    ProgramCore.MainForm.ctrlRenderControl.SaveSmoothedTextures(false);
                    ProgramCore.MainForm.ctrlRenderControl.SaveBrushTextures();
                }

                var path = Path.Combine(ProjectPath, string.Format("{0}.hds", ProjectName));
                using (var bw = new BinaryWriter(File.Open(path, FileMode.OpenOrCreate)))
                {
                    bw.Write(ProjectName);
                    bw.Write(FrontImagePath);

                    bw.Write(HeadModelPath);

                    bw.Write((int)GenesisType);
                    bw.Write((int)ManType);
                    bw.Write((int)TextureFlip);
                    bw.Write((int)ShapeFlip);

                    bw.Write(IsOpenSmile);

                    var fiName = Path.Combine(ProjectPath, "OBJ", "hair.obj");
                    FolderEx.CreateDirectory(Path.GetDirectoryName(fiName));
                    if (ProgramCore.MainForm.ctrlRenderControl.pickingController.HairMeshes.Count > 0) // save hair file
                    {
                        ObjSaver.SaveObjFile(fiName, ProgramCore.MainForm.ctrlRenderControl.pickingController.HairMeshes,
                                             MeshType.Hair, 1.0f, ManType, ProgramCore.Project.ProjectName);
                    }
                    else
                    {
                        FolderEx.DeleteSafety(fiName);      // если раньше были волосы , а сейчас удалили - надо их грохнуть из папки тоже
                    }
                    var acDirPath     = Path.GetDirectoryName(fiName);
                    var acName        = Path.GetFileNameWithoutExtension(fiName) + "_accessory.obj";
                    var accessoryPath = Path.Combine(acDirPath, acName);
                    if (ProgramCore.MainForm.ctrlRenderControl.pickingController.AccesoryMeshes.Count > 0)
                    {
                        // save accessory file
                        ObjSaver.SaveObjFile(accessoryPath,
                                             ProgramCore.MainForm.ctrlRenderControl.pickingController.AccesoryMeshes, MeshType.Accessory, 1.0f, ManType, ProgramCore.Project.ProjectName);
                    }
                    else
                    {
                        FolderEx.DeleteSafety(accessoryPath);
                    }

                    var partsLibraryPath = Path.Combine(ProjectPath, "Parts Library");
                    FolderEx.CreateDirectory(partsLibraryPath);

                    bw.Write(ProgramCore.MainForm.ctrlRenderControl.PartsLibraryMeshes.Count(x => x.Value.Count > 0)); // save list of meshes to part's library
                    foreach (var part in ProgramCore.MainForm.ctrlRenderControl.PartsLibraryMeshes)
                    {
                        if (part.Value.Count == 0)
                        {
                            continue;
                        }

                        bw.Write(part.Key);
                        bw.Write(part.Value[0].meshType == MeshType.Accessory);
                        bw.Write(part.Value[0].IsVisible);
                        bw.Write(part.Value[0].Path);

                        bw.Write(part.Value.Count);
                        foreach (var selMesh in part.Value)
                        {
                            bw.Write(selMesh.Title);
                        }

                        var fileName = part.Key + ".obj";
                        ObjSaver.SaveObjFile(Path.Combine(partsLibraryPath, fileName), part.Value, part.Value[0].meshType, 1.0f, ManType, ProgramCore.Project.ProjectName);
                    }

                    bw.Write(AutodotsUsed);

                    bw.Write(RotatedAngle);

                    // сохраняем прямоугольник лица
                    bw.Write(FaceRectRelative.X);
                    bw.Write(FaceRectRelative.Y);
                    bw.Write(FaceRectRelative.Width);
                    bw.Write(FaceRectRelative.Height);

                    // сохраняем центры рта и глаз распознаные
                    bw.Write(MouthCenter.X);
                    bw.Write(MouthCenter.Y);

                    bw.Write(LeftEyeCenter.X);
                    bw.Write(LeftEyeCenter.Y);
                    bw.Write(RightEyeCenter.X);
                    bw.Write(RightEyeCenter.Y);

                    // сохраняем центры рта и глаз пользовательские (после таскания и прочего)
                    bw.Write(NoseUserCenter.X);
                    bw.Write(NoseUserCenter.Y);
                    bw.Write(MouthUserCenter.X);
                    bw.Write(MouthUserCenter.Y);

                    bw.Write(LeftEyeUserCenter.X);
                    bw.Write(LeftEyeUserCenter.Y);
                    bw.Write(RightEyeUserCenter.X);
                    bw.Write(RightEyeUserCenter.Y);

                    bw.Write(AgeCoefficient);
                    bw.Write(FatCoefficient);

                    //Сохраняем цвет головы
                    bw.Write(FaceColor.X);
                    bw.Write(FaceColor.Y);
                    bw.Write(FaceColor.Z);

                    #region Информация о модели головы

                    var rmPath = Path.Combine(ProjectPath, "Model", "MeshParts.rm");

                    #region Сохранение RenderMesh

                    if (ManType != ManType.Custom)
                    {
                        foreach (var m in ProgramCore.MainForm.ctrlRenderControl.OldMorphing) // перед сохранением сбрасываем морфинги на 0.
                        {
                            m.Value.Delta = 0;
                        }
                        foreach (var m in ProgramCore.MainForm.ctrlRenderControl.FatMorphing)
                        {
                            m.Value.Delta = 0;
                        }
                        //     ProgramCore.MainForm.ctrlRenderControl.DoMorth();
                    }

                    ProgramCore.Project.RenderMainHelper.headMeshesController.RenderMesh.Save(rmPath);

                    if (ManType != ManType.Custom)
                    {
                        foreach (var m in ProgramCore.MainForm.ctrlRenderControl.OldMorphing) // перед сохранением сбрасываем морфинги на 0.
                        {
                            m.Value.Delta = AgeCoefficient;
                        }
                        foreach (var m in ProgramCore.MainForm.ctrlRenderControl.FatMorphing)
                        {
                            m.Value.Delta = FatCoefficient;
                        }
                        //   ProgramCore.MainForm.ctrlRenderControl.DoMorth();
                    }

                    #endregion

                    if (BaseDots != null)
                    {
                        bw.Write(BaseDots.Count);
                        foreach (var point in BaseDots)
                        {
                            point.ToStream(bw);
                        }
                    }
                    else
                    {
                        bw.Write(0);
                    }

                    if (ProfileBaseDots != null)
                    {
                        bw.Write(ProfileBaseDots.Count);
                        foreach (var point in ProfileBaseDots)
                        {
                            point.ToStream(bw);
                        }
                    }
                    else
                    {
                        bw.Write(0);
                    }

                    RenderMainHelper.autodotsShapeHelper.ShapeInfo.ToStream(bw);
                    RenderMainHelper.autodotsShapeHelper.ShapeProfileInfo.ToStream(bw);

                    ProgramCore.Project.RenderMainHelper.headMeshesController.TexturingInfo.ToStream(bw);


                    bw.Write(ProgramCore.Project.RenderMainHelper.headController.ShapeDots.Count);
                    foreach (var dot in ProgramCore.Project.RenderMainHelper.headController.ShapeDots)
                    {
                        dot.ToStreamM(bw);
                    }
                    bw.Write(ProgramCore.Project.RenderMainHelper.headController.AutoDotsv2.Count);
                    foreach (var dot in ProgramCore.Project.RenderMainHelper.headController.AutoDotsv2)
                    {
                        dot.ToStream(bw);
                    }

                    bw.Write(CustomHeadNeedProfileSetup);

                    #endregion

                    bw.Write(ProfileEyeLocation.X);
                    bw.Write(ProfileEyeLocation.Y);
                    bw.Write(ProfileMouthLocation.X);
                    bw.Write(ProfileMouthLocation.Y);

                    if (!string.IsNullOrEmpty(ProgramCore.MainForm.ctrlRenderControl.BackgroundTexture))
                    {
                        bw.Write(true);
                        bw.Write(ProgramCore.MainForm.ctrlRenderControl.BackgroundTexture);
                    }
                    else
                    {
                        bw.Write(false);
                    }
                    bw.Write(ProgramCore.MainForm.activePanel);

                    bw.Write(ProgramCore.MainForm.ctrlRenderControl.camera.Scale);
                    bw.Write(ProgramCore.MainForm.ctrlRenderControl.camera.beta);
                    bw.Write(ProgramCore.MainForm.ctrlRenderControl.camera._dy);

                    bw.Write(MorphingScale);

                    bw.Write(TextureSize);
                }
            }
            catch (Exception e)
            {
                ProgramCore.EchoToLog(e, true);
            }
        }