public void UpdateProfileShape(ref TexturingInfo shapeInfo) { foreach (var p in RenderMesh.Parts) { p.UpdateProfileShape(ref shapeInfo); } }
public void InitializeShaping(ref TexturingInfo shapeInfo) { foreach (var p in RenderMesh.Parts) { p.FillPointsInfo(ref shapeInfo, true, false); } }
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(); }
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; }
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); }
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; } } }
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; }
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); }
/// <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> 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); }