예제 #1
0
 public void UpdateProfileShape(ref TexturingInfo shapeInfo)
 {
     foreach (var p in RenderMesh.Parts)
     {
         p.UpdateProfileShape(ref shapeInfo);
     }
 }
예제 #2
0
 public void InitializeShaping(ref TexturingInfo shapeInfo)
 {
     foreach (var p in RenderMesh.Parts)
     {
         p.FillPointsInfo(ref shapeInfo, true, false);
     }
 }
예제 #3
0
        public void UpdateTexCoords(ref TexturingInfo t)
        {
            foreach (var p in Points)
            {
                if (p.TextureTrinagleInfo.TrinagleIndex < 0)
                {
                    continue;
                }
                var ti = p.TextureTrinagleInfo.TrinagleIndex * 3;
                var v1 = t.TexCoords[t.Indices[ti]];
                var v2 = t.TexCoords[t.Indices[ti + 1]];
                var v3 = t.TexCoords[t.Indices[ti + 2]];
                foreach (var i in p.Indices)
                {
                    var v = Vertices[i];
                    v.AutodotsTexCoord.X = p.TextureTrinagleInfo.U * v1.X + p.TextureTrinagleInfo.V * v2.X + p.TextureTrinagleInfo.W * v3.X;
                    v.AutodotsTexCoord.Y = p.TextureTrinagleInfo.U * v1.Y + p.TextureTrinagleInfo.V * v2.Y + p.TextureTrinagleInfo.W * v3.Y;
                    if (IsBaseTexture)
                    {
                        v.TexCoord = v.AutodotsTexCoord.Xy;
                    }

                    Vertices[i] = v;
                }
            }
            UpdateVertexBuffer();
        }
예제 #4
0
        public HistoryHeadShapeLines(Dictionary <Guid, MeshUndoInfo> partsInfo, IEnumerable <HeadLine> lines, TexturingInfo texturingInfo, bool isProfile)
        {
            if (partsInfo != null)
            {
                foreach (var info in partsInfo)
                {
                    this.partsInfo.Add(info.Key, info.Value.Clone());
                }
            }
            else
            {
                this.partsInfo = null;
            }

            if (lines != null)
            {
                foreach (var line in lines)
                {
                    var currentLine = new HeadLine();
                    Lines.Add(currentLine);
                    foreach (var point in line)
                    {
                        currentLine.Add(point.Clone() as MirroredHeadPoint);
                    }
                }
            }

            TexturingInfo  = texturingInfo.Clone();
            this.isProfile = isProfile;
        }
예제 #5
0
        private bool GetStartPoint(Vector3 point)
        {
            startTriangle = null;
            var depth = -99999f;

            foreach (var triangle in triangles)
            {
                triangle.IsProcessed = false;
                if (triangle.Max.X < point.X || triangle.Min.X > point.X ||
                    triangle.Max.Y < point.Y || triangle.Min.Y > point.Y)
                {
                    continue;
                }

                var p0 = triangle.Points[0].ViewSpacePosition;
                var p1 = triangle.Points[1].ViewSpacePosition;
                var p2 = triangle.Points[2].ViewSpacePosition;

                var a = p0.Xy;
                var b = p1.Xy;
                var c = p2.Xy;

                if (TexturingInfo.PointInTriangle(ref a, ref b, ref c, ref point))
                {
                    var aup = a.X - point.X;
                    var bup = b.X - point.X;
                    var cup = c.X - point.X;
                    var avp = a.Y - point.Y;
                    var bvp = b.Y - point.Y;
                    var cvp = c.Y - point.Y;

                    var f = 1.0f / ((b.X - a.X) * (c.Y - a.Y) - (b.Y - a.Y) * (c.X - a.X));
                    var u = (bup * cvp - bvp * cup) * f;
                    var v = (cup * avp - cvp * aup) * f;
                    var w = 1.0f - (u + v);

                    var z = u * p0.Z + v * p1.Z + w * p2.Z;
                    if (depth < z)
                    {
                        startTriangle = triangle;
                        depth         = z;
                    }
                }
            }

            SphereCenter   = point;
            SphereCenter.Z = depth;
            SphereCenter   = Vector3.Transform(SphereCenter, viewMatrix.Inverted());

            return(startTriangle != null);
        }
예제 #6
0
 public void UpdateProfileShape(ref TexturingInfo s)
 {
     foreach (var p in Points)
     {
         if (p.ProfileShapeTrinagleInfo.TrinagleIndex < 0)
         {
             continue;
         }
         var ti = p.ProfileShapeTrinagleInfo.TrinagleIndex * 3;
         var v1 = s.Points[s.Indices[ti]].Value;
         var v2 = s.Points[s.Indices[ti + 1]].Value;
         var v3 = s.Points[s.Indices[ti + 2]].Value;
         p.Position.Z = p.ProfileShapeTrinagleInfo.U * v1.X + p.ProfileShapeTrinagleInfo.V * v2.X + p.ProfileShapeTrinagleInfo.W * v3.X;
         p.Position.Y = p.ProfileShapeTrinagleInfo.U * v1.Y + p.ProfileShapeTrinagleInfo.V * v2.Y + p.ProfileShapeTrinagleInfo.W * v3.Y;
         foreach (var i in p.Indices)
         {
             var v = Vertices[i];
             v.Position  = p.Position;
             Vertices[i] = v;
         }
     }
 }
예제 #7
0
        public void FillPointsInfo(ref TexturingInfo t, bool isShape, bool isProfile)
        {
            for (var i = 0; i < t.Indices.Length; i += 3)
            {
                var a = t.Points[t.Indices[i]];
                var b = t.Points[t.Indices[i + 1]];
                var c = t.Points[t.Indices[i + 2]];
                for (var index = 0; index < Points.Count; index++)
                {
                    var point    = Points[index];
                    var triangle = isShape ? isProfile ? point.ProfileShapeTrinagleInfo : point.ShapeTrinagleInfo : point.TextureTrinagleInfo;
                    if (triangle.TrinagleIndex > 0)
                    {
                        continue;
                    }
                    var p = Vertices[point.Indices[0]].OriginalPosition;
                    if (TexturingInfo.PointInTriangle(ref a.Value, ref b.Value, ref c.Value, isProfile ? p.Zy : p.Xy))
                    {
                        triangle.TrinagleIndex = i / 3;
                        var x   = isProfile ? p.Z : p.X;
                        var aup = a.Value.X - x;
                        var bup = b.Value.X - x;
                        var cup = c.Value.X - x;
                        var avp = a.Value.Y - p.Y;
                        var bvp = b.Value.Y - p.Y;
                        var cvp = c.Value.Y - p.Y;

                        var f = 1.0f / ((b.Value.X - a.Value.X) * (c.Value.Y - a.Value.Y) - (b.Value.Y - a.Value.Y) * (c.Value.X - a.Value.X));
                        triangle.U = (bup * cvp - bvp * cup) * f;
                        triangle.V = (cup * avp - cvp * aup) * f;
                        triangle.W = 1.0f - (triangle.U + triangle.V);
                    }
                    Points[index] = point;
                }
            }
        }
        public HistoryHeadShapeLines(Dictionary<Guid, MeshUndoInfo> partsInfo, IEnumerable<HeadLine> lines, TexturingInfo texturingInfo, bool isProfile)
        {
            if (partsInfo != null)
                foreach (var info in partsInfo)
                    this.partsInfo.Add(info.Key, info.Value.Clone());
            else this.partsInfo = null;

            if (lines != null)
                foreach (var line in lines)
                {
                    var currentLine = new HeadLine();
                    Lines.Add(currentLine);
                    foreach (var point in line)
                        currentLine.Add(point.Clone() as MirroredHeadPoint);
                }

            TexturingInfo = texturingInfo.Clone();
            this.isProfile = isProfile;
        }
예제 #9
0
        public float StartShaping(Vector3 point, Matrix4 vm, bool isMirror, float radius, ShapeCoefType type)
        {
            EndShape();
            var depth = -10000.0f;

            foreach (var part in headMeshController.RenderMesh.Parts)
            {
                for (var i = 0; i < part.Indices.Count; i += 3)
                {
                    var p0 = Vector3.Transform(part.Vertices[part.Indices[i]].Position, vm);
                    var p1 = Vector3.Transform(part.Vertices[part.Indices[i + 1]].Position, vm);
                    var p2 = Vector3.Transform(part.Vertices[part.Indices[i + 2]].Position, vm);

                    var a = p0.Xy;
                    var b = p1.Xy;
                    var c = p2.Xy;

                    if (TexturingInfo.PointInTriangle(ref a, ref b, ref c, ref point))
                    {
                        var aup = a.X - point.X;
                        var bup = b.X - point.X;
                        var cup = c.X - point.X;
                        var avp = a.Y - point.Y;
                        var bvp = b.Y - point.Y;
                        var cvp = c.Y - point.Y;

                        var f = 1.0f / ((b.X - a.X) * (c.Y - a.Y) - (b.Y - a.Y) * (c.X - a.X));
                        var u = (bup * cvp - bvp * cup) * f;
                        var v = (cup * avp - cvp * aup) * f;
                        var w = 1.0f - (u + v);

                        var z = u * p0.Z + v * p1.Z + w * p2.Z;
                        if (depth < z)
                        {
                            startPart     = part;
                            startTriangle = i;
                            depth         = z;
                        }
                    }
                }
            }

            if (startPart == null || startTriangle < 0)
            {
                return(0.0f);
            }

            ShapePoint          = point;
            ShapePoint.Z        = depth;
            ShapePoint          = Vector3.Transform(ShapePoint, vm.Inverted());
            startTriangleMirror = -1;
            if (isMirror)
            {
                //Ищем точку в оригинальных координатах
                var triangle = new[] { startPart.Indices[startTriangle], startPart.Indices[startTriangle + 1], startPart.Indices[startTriangle + 2] };
                var a        = startPart.Vertices[triangle[0]].OriginalPosition;
                var b        = startPart.Vertices[triangle[1]].OriginalPosition;
                var c        = startPart.Vertices[triangle[2]].OriginalPosition;
                a.X   *= -1.0f;
                b.X   *= -1.0f;
                c.X   *= -1.0f;
                isLeft = ShapePoint.X < 0.0f ? 1.0f : -1.0f;
                int idA = -1, idB = -1, idC = -1;
                for (int i = 0; i < startPart.Vertices.Length; i++)
                {
                    if (idA >= 0 && idB >= 0 && idC >= 0)
                    {
                        break;
                    }
                    var position = startPart.Vertices[i].OriginalPosition;
                    if (position.X * isLeft >= 0.0f)
                    {
                        if (idA < 0 && VectorEqualityComparer.EqualsVector3(position, a))
                        {
                            idA = i;
                            continue;
                        }
                        if (idB < 0 && VectorEqualityComparer.EqualsVector3(position, b))
                        {
                            idB = i;
                            continue;
                        }
                        if (idC < 0 && VectorEqualityComparer.EqualsVector3(position, c))
                        {
                            idC = i;
                            continue;
                        }
                    }
                }
                if (idA >= 0 && idB >= 0 && idC >= 0)
                {
                    for (int i = 0; i < startPart.Indices.Count; i += 3)
                    {
                        var v0 = startPart.Indices[i];
                        var v1 = startPart.Indices[i + 1];
                        var v2 = startPart.Indices[i + 2];
                        if ((v0 == idA || v0 == idB || v0 == idC) && (v1 == idA || v1 == idB || v1 == idC) && (v2 == idA || v2 == idB || v2 == idC))
                        {
                            startTriangleMirror = i;
                            break;
                        }
                    }
                }
            }
            if (!UpdateRadius(radius))
            {
                return(0.0f);
            }
            UpdateCoef(type, radius);
            return(depth);
        }
예제 #10
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);
        }
예제 #11
0
파일: Project.cs 프로젝트: wiplug/HeadShop
        /// <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 manType     = (ManType)br.ReadInt32();
                var textureFlip = (FlipType)br.ReadInt32();
                var shapeFlip   = (FlipType)br.ReadInt32();

                result             = new Project(projectName, projectFi.DirectoryName, templateImagePath, manType, headModelPath, false);
                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 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;

                        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.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();

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


                var rmPath = Path.Combine(projectFi.DirectoryName, "Model", "MeshParts.rm");
                ProgramCore.MainForm.ctrlRenderControl.headMeshesController.RenderMesh.Load(rmPath);
                foreach (var part in ProgramCore.MainForm.ctrlRenderControl.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));
                }

                ProgramCore.MainForm.ctrlRenderControl.autodotsShapeHelper.ShapeInfo        = TexturingInfo.FromStream(br);
                ProgramCore.MainForm.ctrlRenderControl.autodotsShapeHelper.ShapeProfileInfo = TexturingInfo.FromStream(br);

                ProgramCore.MainForm.ctrlRenderControl.headMeshesController.TexturingInfo = TexturingInfo.FromStream(br);

                ProgramCore.MainForm.ctrlRenderControl.headController.AutoDots.Clear();
                ProgramCore.MainForm.ctrlRenderControl.headController.ShapeDots.Clear();
                var cnt = br.ReadInt32();
                for (var i = 0; i < cnt; i++)
                {
                    ProgramCore.MainForm.ctrlRenderControl.headController.ShapeDots.Add(MirroredHeadPoint.FromStreamW(br));
                }
                cnt = br.ReadInt32();
                for (var i = 0; i < cnt; i++)
                {
                    ProgramCore.MainForm.ctrlRenderControl.headController.AutoDots.Add(MirroredHeadPoint.FromStreamW(br));
                }

                result.CustomHeadNeedProfileSetup = br.ReadBoolean();

                #endregion

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

            return(result);
        }
 public void InitializeShapingProfile(ref TexturingInfo shapeInfo)
 {
     foreach (var p in RenderMesh.Parts)
         p.FillPointsInfo(ref shapeInfo, true, true);
 }
 public void UpdateShape(ref TexturingInfo shapeInfo)
 {
     foreach (var p in RenderMesh.Parts)
         p.UpdateShape(ref shapeInfo);
 }