Пример #1
0
        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);
        }
Пример #2
0
        public float FinishCreating(float widthToHeight, RectangleAABB aabb)
        {
            var result = RenderMesh.Transform(widthToHeight, aabb);

            UpdateBuffers();
            return(result);
        }
Пример #3
0
        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);
 }
Пример #8
0
        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();
            }
        }
Пример #9
0
        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();
        }
Пример #10
0
        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;
        }
Пример #11
0
        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);
        }
Пример #12
0
        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;
 }