public RectangleAABB InitializeShapedotsHelper(bool isNew = false) { autodotsShapeHelper.headMeshesController = headMeshesController; autodotsShapeHelper.SetType((int)ProgramCore.Project.ManType); autodotsShapeHelper.Initialise(HeadController.GetDots(ProgramCore.Project.ManType), isNew); if (!isNew) { autodotsShapeHelper.TransformRects(); } var result = new RectangleAABB(); if (isNew && ProgramCore.Project.ManType != ManType.Custom) { Vector3 min = result.A, max = result.B; for (var i = 8; i < autodotsShapeHelper.ShapeInfo.Points.Count; ++i) { var p = autodotsShapeHelper.ShapeInfo.Points[i]; min.X = Math.Min(p.Value.X, min.X); min.Y = Math.Min(p.Value.Y, min.Y); max.X = Math.Max(p.Value.X, max.X); max.Y = Math.Max(p.Value.Y, max.Y); } result.A = min; result.B = max; } return(result); }
public float FinishCreating(float widthToHeight, RectangleAABB aabb) { var result = RenderMesh.Transform(widthToHeight, aabb); UpdateBuffers(); return(result); }
public float UpdateMeshProportions(RectangleAABB aabb) { var widthToHeight = 0.669f; // подгоняем размер модели под размер еблища if (ProgramCore.Project.FaceRectRelative != RectangleF.Empty) { widthToHeight = (ProgramCore.Project.FaceRectRelative.Width * ProgramCore.Project.FrontImage.Width) / (ProgramCore.Project.FaceRectRelative.Height * ProgramCore.Project.FrontImage.Height); } return(headMeshesController.FinishCreating(widthToHeight, aabb)); }
public void LoadProject(bool newProject, RectangleAABB aabb) { tempBitmaps.Clear(); var headTexturePath = Path.Combine(ProgramCore.Project.ProjectPath, ProgramCore.Project.FrontImagePath); HeadTextureId = 0; if (!string.IsNullOrEmpty(headTexturePath)) { using (var ms = new MemoryStream(File.ReadAllBytes(headTexturePath))) // Don't use using!! HeadTexture = (Bitmap)Bitmap.FromStream(ms); HeadTextureId = GetTexture(headTexturePath); if (ProgramCore.Project.FaceRectRelative == RectangleF.Empty) { var fileName = Path.Combine(ProgramCore.Project.ProjectPath, ProgramCore.Project.FrontImagePath); var faceRecognition = new OpenCvFaceRecognition(); faceRecognition.Recognize(ref fileName, false); ProgramCore.Project.FaceRectRelative = faceRecognition.FaceRectRelative; ProgramCore.Project.MouthCenter = faceRecognition.MouthCenter; ProgramCore.Project.LeftEyeCenter = faceRecognition.LeftEyeCenter; ProgramCore.Project.RightEyeCenter = faceRecognition.RightEyeCenter; ProgramCore.Project.FaceColor = faceRecognition.FaceColor; } } baseProfilePoints.Clear(); if (newProject) { var modelPath = ProgramCore.Project.HeadModelPath; pickingController.AddMehes(modelPath, MeshType.Head, false, ProgramCore.Project.ManType, ProgramCore.PluginMode); float scale = 0; if (ProgramCore.Project.ManType == ManType.Custom) { scale = headMeshesController.SetSize(29.3064537f); // подгонка размера для произвольной башки customBasePointsSprites.Clear(); } else if (ProgramCore.PluginMode) { switch (ProgramCore.Project.ManType) { case ManType.Male: scale = headMeshesController.SetSize(29.9421043f); // подгонка размера break; case ManType.Female: scale = headMeshesController.SetSize(29.3064537f); // подгонка размера break; case ManType.Child: scale = headMeshesController.SetSize(25.6209984f); // подгонка размера break; } } if (pickingController.ObjExport != null) pickingController.ObjExport.Scale = scale; } HeadShapeController.Initialize(headMeshesController); brushTool.InitializeBrush(headMeshesController); if (ProgramCore.Project.ManType != ManType.Custom) { var oldMorphingPath = Path.Combine(Application.StartupPath, "Stages\\Morphing", ProgramCore.Project.ManType.GetCaption(), "Old.obj"); // загружаем трансформации для старения OldMorphing = pickingController.LoadPartsMorphInfo(oldMorphingPath, headMeshesController.RenderMesh); var fatMorphingPath = Path.Combine(Application.StartupPath, "Stages\\Morphing", ProgramCore.Project.ManType.GetCaption(), "Fat.obj"); // загружаем трансформации для толстения FatMorphing = pickingController.LoadPartsMorphInfo(fatMorphingPath, headMeshesController.RenderMesh); } var baseDots = HeadController.GetBaseDots(ProgramCore.Project.ManType); headMeshesController.RenderMesh.SetBlendingInfo(baseDots[0], baseDots[1], baseDots[2], baseDots[3]); #region Сглаживание текстур SmoothedTextures.Clear(); for (var i = 0; i < headMeshesController.RenderMesh.Parts.Count; i++) { var part = headMeshesController.RenderMesh.Parts[i]; if (part.Texture == -1) continue; var oldTexture = GetTexture(part.DefaultTextureName); if (!SmoothedTextures.ContainsKey(oldTexture)) { if (part.Texture == 0 || part.IsBaseTexture) { part.IsBaseTexture = true; part.Texture = 0; } else { var path = part.DefaultTextureName;//GetTexturePath(part.Texture); var newImagePath = Path.Combine(ProgramCore.Project.ProjectPath, "SmoothedModelTextures"); var di = new DirectoryInfo(newImagePath); if (!di.Exists) di.Create(); var brushImagePath = Path.Combine(newImagePath, Path.GetFileNameWithoutExtension(path) + "_brush.png"); var smoothedImagePath = Path.Combine(newImagePath, Path.GetFileNameWithoutExtension(path) + "_smoothed" + Path.GetExtension(path)); if (!File.Exists(smoothedImagePath)) File.Copy(path, smoothedImagePath, true); //newImagePath = Path.Combine(newImagePath, Path.GetFileNameWithoutExtension(path) + Path.GetExtension(path)); //File.Copy(path, newImagePath, true); var smoothedTexture = GetTexture(smoothedImagePath); // по старому пути у нас будут храниться сглаженные текстуры (что бы сохранение модельки сильно не менять) part.Texture = oldTexture; SmoothedTextures.Add(oldTexture, smoothedTexture); // связка - айди старой-новой текстур if (File.Exists(brushImagePath) && !brushTextures.ContainsKey(part.Texture)) { var texture = GetTexture(brushImagePath); Bitmap bitmap; using (var ms = new MemoryStream(File.ReadAllBytes(brushImagePath))) bitmap = (Bitmap)Image.FromStream(ms); brushTextures.Add(smoothedTexture, new BrushTextureInfo { Texture = texture, TextureData = bitmap, LinkedTextureName = smoothedImagePath }); } } } else { part.Texture = oldTexture; } if (part.Texture != 0) //все кроме отсутствующих. после первых автоточек - станет фоткой { part.Texture = SmoothedTextures[part.Texture]; // переприсваиваем текстуры на сглаженные part.TextureName = GetTexturePath(part.Texture); } } ProgramCore.Project.SmoothedTextures = true; #endregion if (newProject) { if (ProgramCore.Project.ManType != ManType.Custom) { var scaleX = UpdateMeshProportions(aabb); UpdatePointsProportion(scaleX, (aabb.A.X + aabb.B.X) * 0.5f); //headMeshesController.InitializeTexturing(autodotsShapeHelper.GetBaseDots(), HeadController.GetIndices()); //autodotsShapeHelper.Transform(headMeshesController.TexturingInfo.Points.ToArray()); autodotsShapeHelper.TransformRects(); autodotsShapeHelper.InitializeShaping(); var points = autodotsShapeHelper.GetBaseDots(); SpecialCenterUpdate(points, headController.GetLeftEyeIndexes(), ProgramCore.Project.LeftEyeCenter); SpecialCenterUpdate(points, headController.GetRightEyeIndexes(), ProgramCore.Project.RightEyeCenter); //SpecialMouthEyesUpdate(points, headController.GetMouthIndexes(), ProgramCore.Project.MouthCenter, // new List<Vector2> { ProgramCore.Project.DetectedPoints[0], ProgramCore.Project.DetectedPoints[1] }); //var noseBottomPoint = new Vector2(ProgramCore.Project.MouthCenter.X, ((eyesDiff.Y - ProgramCore.Project.MouthUserCenter.Y) * 0.4f) + ProgramCore.Project.MouthUserCenter.Y); //SpecialMouthEyesUpdate(points, headController.GetNoseBottomIndexes(), noseBottomPoint, // new List<Vector2> { ProgramCore.Project.DetectedPoints[2], ProgramCore.Project.DetectedPoints[3] }); SpecialLipsPointsUpdate(points, ProgramCore.Project.MouthCenter); SpecialNosePointsUpdate(points); SpecialCenterUpdate(points, headController.GetNoseTopIndexes(), ProgramCore.Project.DetectedNosePoints[4]); SpecialBottomPointsUpdate(points); SpecialTopHaedWidth(points); //autodotsShapeHelper.TransformRects(); //headMeshesController.UpdateBuffers(); } else { camera.ResetCamera(true); } } else { autodotsShapeHelper.TransformRects(); headMeshesController.UpdateBuffers(); } RenderTimer.Start(); }
public RectangleAABB InitializeShapedotsHelper(bool isNew = false) { autodotsShapeHelper.headMeshesController = headMeshesController; autodotsShapeHelper.SetType((int)ProgramCore.Project.ManType); autodotsShapeHelper.Initialise(HeadController.GetDots(ProgramCore.Project.ManType), isNew); baseProfilePoints = autodotsShapeHelper.InitializeProfile(HeadController.GetProfileBaseDots(ProgramCore.Project.ManType), isNew); if (!isNew) autodotsShapeHelper.TransformRects(); var result = new RectangleAABB(); if (isNew && ProgramCore.Project.ManType != ManType.Custom) { Vector3 min = result.A, max = result.B; for (int i = 8; i < autodotsShapeHelper.ShapeInfo.Points.Count; ++i) { var p = autodotsShapeHelper.ShapeInfo.Points[i]; min.X = Math.Min(p.Value.X, min.X); min.Y = Math.Min(p.Value.Y, min.Y); max.X = Math.Max(p.Value.X, max.X); max.Y = Math.Max(p.Value.Y, max.Y); } result.A = min; result.B = max; } return result; }
//temp private void InitializeCustomHead() { var aabb = new RectangleAABB(); Vector3 min = aabb.A, max = aabb.B; for (int i = 8; i < autodotsShapeHelper.ShapeInfo.Points.Count; ++i) { var p = autodotsShapeHelper.ShapeInfo.Points[i]; min.X = Math.Min(p.Value.X, min.X); min.Y = Math.Min(p.Value.Y, min.Y); max.X = Math.Max(p.Value.X, max.X); max.Y = Math.Max(p.Value.Y, max.Y); } aabb.A = min; aabb.B = max; var scaleX = UpdateMeshProportions(aabb); UpdatePointsProportion(scaleX, (aabb.A.X + aabb.B.X) * 0.5f); //headMeshesController.InitializeTexturing(autodotsShapeHelper.GetBaseDots(), HeadController.GetIndices()); //autodotsShapeHelper.Transform(headMeshesController.TexturingInfo.Points.ToArray()); autodotsShapeHelper.TransformRects(); autodotsShapeHelper.InitializeShaping(); var points = autodotsShapeHelper.GetBaseDots(); SpecialCenterUpdate(points, headController.GetMouthIndexes(), ProgramCore.Project.MouthCenter); SpecialCenterUpdate(points, headController.GetLeftEyeIndexes(), ProgramCore.Project.LeftEyeCenter); SpecialCenterUpdate(points, headController.GetRightEyeIndexes(), ProgramCore.Project.RightEyeCenter); var eyesDiff = (ProgramCore.Project.LeftEyeCenter + ProgramCore.Project.RightEyeCenter) * 0.5f; var noseBottomPoint = new Vector2(ProgramCore.Project.MouthCenter.X, ((eyesDiff.Y - ProgramCore.Project.MouthUserCenter.Y) * 0.4f) + ProgramCore.Project.MouthUserCenter.Y); SpecialCenterUpdate(points, headController.GetNoseBottomIndexes(), noseBottomPoint); SpecialCenterUpdate(points, headController.GetNoseTopIndexes(), eyesDiff); }
public float UpdateMeshProportions(RectangleAABB aabb) { var widthToHeight = 0.669f; // подгоняем размер модели под размер еблища if (ProgramCore.Project.FaceRectRelative != RectangleF.Empty) widthToHeight = (ProgramCore.Project.FaceRectRelative.Width * ProgramCore.Project.FrontImage.Width) / (ProgramCore.Project.FaceRectRelative.Height * ProgramCore.Project.FrontImage.Height); return headMeshesController.FinishCreating(widthToHeight, aabb); }
public void LoadProject(bool newProject, RectangleAABB aabb, string headTexturePath, bool isOpenSmile) { HeadTextureId = 0; if (!string.IsNullOrEmpty(headTexturePath)) { HeadTextureId = GetTexture(headTexturePath); } if (newProject) { var modelPath = ProgramCore.Project.HeadModelPath; //ProgramCore.PluginMode pickingController.AddMehes(modelPath, MeshType.Head, false, ProgramCore.Project.GenesisType, ProgramCore.Project.ManType, true, isOpenSmile); } HeadShapeController.Initialize(headMeshesController); var baseDots = HeadController.GetBaseDots(ProgramCore.Project.ManType); headMeshesController.RenderMesh.SetBlendingInfo(baseDots[0], baseDots[1], baseDots[2], baseDots[3]); #region Сглаживание текстур SmoothedTextures.Clear(); var index = 1; for (var i = 0; i < headMeshesController.RenderMesh.Parts.Count; i++) { var part = headMeshesController.RenderMesh.Parts[i]; if (part.Texture == -1) { continue; } var oldTexture = GetTexture(part.DefaultTextureName); if (!SmoothedTextures.ContainsKey(oldTexture)) { if (part.Texture == 0 || part.IsBaseTexture) { part.IsBaseTexture = true; part.Texture = 0; } else { var path = part.DefaultTextureName;//GetTexturePath(part.Texture); var newImagePath = @"ftp://108.167.164.209/public_html/printahead.online/PrintAhead_models/" + ProgramCore.Project.ProjectName + "/Textures/"; var smoothedImagePath = newImagePath + Path.GetFileNameWithoutExtension(path) + "_smoothed" + Path.GetExtension(path); var smoothedTexture = GetTexture(smoothedImagePath); // GetTexture(smoothedImagePath); // по старому пути у нас будут храниться сглаженные текстуры (что бы сохранение модельки сильно не менять) part.Texture = oldTexture; SmoothedTextures.Add(oldTexture, smoothedTexture); // связка - айди старой-новой текстур } } else { part.Texture = oldTexture; } if (part.Texture != 0) //все кроме отсутствующих. после первых автоточек - станет фоткой { part.Texture = SmoothedTextures[part.Texture]; // переприсваиваем текстуры на сглаженные part.TextureName = GetTexturePath(part.Texture); } } ProgramCore.Project.SmoothedTextures = true; #endregion if (newProject) { if (ProgramCore.Project.ManType != ManType.Custom) { var scaleX = UpdateMeshProportions(aabb); UpdatePointsProportion(scaleX, (aabb.A.X + aabb.B.X) * 0.5f); autodotsShapeHelper.TransformRects(); autodotsShapeHelper.InitializeShaping(); var points = autodotsShapeHelper.GetBaseDots(); SpecialEyePointsUpdate(points, true); SpecialEyePointsUpdate(points, false); SpecialLipsPointsUpdate(points, ProgramCore.Project.MouthCenter); SpecialNosePointsUpdate(points); SpecialCenterUpdate(points, headController.GetNoseTopIndexes(), ProgramCore.Project.DetectedNosePoints[3].Xy); SpecialBottomPointsUpdate(points); SpecialTopHaedWidth(points); } } else { autodotsShapeHelper.TransformRects(); headMeshesController.UpdateBuffers(); } }
public void UpdateProjectControls(bool newProject, RectangleAABB aabb = null) { if (ProgramCore.Project == null) { ProgramCore.MainForm.ctrlTemplateImage.SetTemplateImage(null); } else { ctrlRenderControl.LoadProject(newProject, aabb); ctrlRenderControl.camera.UpdateDy(); if (panelCut != null && panelStyles != null) { if (ProgramCore.MainForm.ctrlRenderControl.pickingController.HairMeshes.Count == 0) panelMenuStyle_Click(null, EventArgs.Empty); else panelMenuCut_Click(null, EventArgs.Empty); } if (frmStages != null) frmStages.InitializeListView(); if (ProgramCore.Project.FrontImage == null) ProgramCore.MainForm.ctrlTemplateImage.SetTemplateImage(null); else { using (var bmp = new Bitmap(ProgramCore.Project.FrontImage)) ProgramCore.MainForm.ctrlTemplateImage.SetTemplateImage((Bitmap)bmp.Clone()); } if (newProject && ProgramCore.Project.ManType == ManType.Custom) ctrlRenderControl.camera.ResetCamera(true); } if (frmStages != null) { ctrlRenderControl.StagesActivate(false); // for recalc ctrlRenderControl.StagesDeactivate(0); } if (frmParts != null) frmParts.UpdateList(); }
public float Transform(float k, RectangleAABB aabb) { if (Parts.Count == 0) return 0.0f; AABB = aabb; var newWidht = aabb.Height * k; var scaleX = newWidht / aabb.Width; //Scale.X = scaleX; //Scale.X = 1.0f;//(float)Math.Sqrt(Math.Abs(k * AABB.Size.Y / AABB.Size.X)); //Scale.Y = 1.0f / Scale.X; var centerX = (aabb.B.X + aabb.A.X) * 0.5f; //var count = 0.0f; //foreach (var part in Parts) // foreach (var v in part.Vertices) // { // count += 1.0f; // center += v.Position; // } //center /= count; //Center = center.Xy; foreach (var part in Parts) { for (var i = 0; i < part.Vertices.Length; i++) { var vertex = part.Vertices[i]; vertex.OriginalPosition = vertex.Position; vertex.Position.X -= centerX; vertex.Position.X *= scaleX; //vertex.Position.Y *= Scale.Y; vertex.Position.X += centerX; part.Vertices[i] = vertex; } foreach (var p in part.Points) { var pos = p.Position; pos.X -= centerX; pos.X *= scaleX; //pos.Y *= Scale.Y; pos.X += centerX; p.Position = pos; } } AABB.A = new Vector3((AABB.A.X - centerX) * scaleX + centerX, AABB.A.Y, AABB.A.Z); AABB.B = new Vector3((AABB.B.X - centerX) * scaleX + centerX, AABB.B.Y, AABB.B.Z); return scaleX; }
public void SetBlendingInfo(Vector2 leye, Vector2 reye, Vector2 lip, Vector2 face) { var aabb = new RectangleAABB(); var a = aabb.A; var b = aabb.B; a.Y = Math.Min(Math.Min(leye.Y, lip.Y), reye.Y); b.Y = Math.Max(Math.Max(leye.Y, lip.Y), reye.Y); a.X = Math.Min(Math.Min(leye.X, lip.X), reye.X); b.X = Math.Max(Math.Max(leye.X, lip.X), reye.X); aabb.A = a; aabb.B = b; BlendingInfos.Clear(); var radius = Math.Abs(leye.X - reye.X) * 0.35f; BlendingInfos.Add(new BlendingInfo { Position = leye, Radius = radius }); BlendingInfos.Add(new BlendingInfo { Position = reye, Radius = radius }); BlendingInfos.Add(new BlendingInfo { Position = aabb.Center.Xy, Radius = (aabb.Center.Xy - aabb.B.Xy).Length * 0.8f }); BlendingInfos.Add(new BlendingInfo { Position = lip, Radius = (aabb.Center.Xy - lip).Length * 0.75f }); BlendingInfos.Add(new BlendingInfo { Position = (leye + reye) * 0.5f, Radius = (aabb.B.Xy - face).Length * 0.75f }); foreach (var part in Parts) part.FillBlendingData(BlendingInfos); }
public void Load(string path) { if (!File.Exists(path)) return; Parts.Clear(); using (var br = new BinaryReader(File.Open(path, FileMode.Open))) { AABB = RectangleAABB.FromStream(br); Scale = Vector2Ex.FromStream(br); Center = Vector2Ex.FromStream(br); MorphScale = br.ReadSingle(); var cnt = br.ReadInt32(); for (var i = 0; i < cnt; i++) Parts.Add(RenderMeshPart.FromStream(br)); } }
public float FinishCreating(float widthToHeight, RectangleAABB aabb) { var result = RenderMesh.Transform(widthToHeight, aabb); UpdateBuffers(); return result; }