/// <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); }
/// <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); } }