//private void UpdateFaceRect() //{ // var indicies = ProgramCore.Project.RenderMainHelper.headController.GetFaceIndexes(); // List<MirroredHeadPoint> faceDots; // switch (ProgramCore.MainForm.ctrlRenderControl.Mode) // { // // case Mode.HeadShapedots: // case Mode.HeadLine: // case Mode.HeadShapeFirstTime: // case Mode.HeadShape: // faceDots = ProgramCore.Project.RenderMainHelper.headController.GetSpecialShapedots(indicies); // break; // default: // faceDots = ProgramCore.Project.RenderMainHelper.headController.GetSpecialAutodots(indicies); // break; // } // if (faceDots.Count == 0) // return; // { // var minX1 = faceDots.Min(point => point.ValueMirrored.X); // var maxX1 = faceDots.Max(point => point.ValueMirrored.X); // var minY1 = faceDots.Min(point => point.ValueMirrored.Y); // var maxY1 = faceDots.Max(point => point.ValueMirrored.Y); // var rrr = new RectangleF((float)minX1, (float)minY1, (float)(maxX1 - minX1), (float)(maxY1 - minY1)); // } // var minX = faceDots.Min(point => point.ValueMirrored.X) * ImageTemplateWidth + ImageTemplateOffsetX; // var maxX = faceDots.Max(point => point.ValueMirrored.X) * ImageTemplateWidth + ImageTemplateOffsetX; // var minY = faceDots.Min(point => point.ValueMirrored.Y) * ImageTemplateHeight + ImageTemplateOffsetY; // var maxY = faceDots.Max(point => point.ValueMirrored.Y) * ImageTemplateHeight + ImageTemplateOffsetY; // FaceRectTransformed = new Rectangle((int)minX, (int)minY, (int)(maxX - minX), (int)(maxY - minY)); // CentralFacePoint = new Vector2(minX + (maxX - minX) * 0.5f, minY + (maxY - minY) / 3f); //} //private void RecalcUserCenters() //{ // MouthTransformed = new Vector2(ProgramCore.Project.MouthUserCenter.X * ImageTemplateWidth + ImageTemplateOffsetX, // ProgramCore.Project.MouthUserCenter.Y * ImageTemplateHeight + ImageTemplateOffsetY); // LeftEyeTransformed = new Vector2(ProgramCore.Project.LeftEyeUserCenter.X * ImageTemplateWidth + ImageTemplateOffsetX, // ProgramCore.Project.LeftEyeUserCenter.Y * ImageTemplateHeight + ImageTemplateOffsetY); // RightEyeTransformed = new Vector2(ProgramCore.Project.RightEyeUserCenter.X * ImageTemplateWidth + ImageTemplateOffsetX, // ProgramCore.Project.RightEyeUserCenter.Y * ImageTemplateHeight + ImageTemplateOffsetY); // NoseTransformed = new Vector2(ProgramCore.Project.NoseUserCenter.X * ImageTemplateWidth + ImageTemplateOffsetX, // ProgramCore.Project.NoseUserCenter.Y * ImageTemplateHeight + ImageTemplateOffsetY); //} public void AttachHair(string hairObjPath, string materialPath, ManType manType) { var objModel = ObjLoader.LoadObjFile(hairObjPath, false); if (objModel == null) { return; } var temp = 0; var meshes = PickingController.LoadHairMeshes(objModel, null, true, manType, MeshType.Hair, ref temp); foreach (var mesh in meshes) { if (mesh == null || mesh.vertexArray.Length == 0) //ТУТ! { continue; } mesh.Material.DiffuseTextureMap = materialPath; } var objName = Path.GetFileNameWithoutExtension(hairObjPath); if (HairPositions.ContainsKey(objName)) { var meshSize = HairPositions[objName].Item2; var s = HairPositions[objName].Item1 * ProgramCore.Project.RenderMainHelper.headMeshesController.RenderMesh.MorphScale; // домножаем на 8 для веб версии. все на 8 домножаем! любим 8! for (var i = 0; i < meshes.Count; i++) { var mesh = meshes[i]; if (mesh == null || mesh.vertexArray.Length == 0) //ТУТ! { continue; } mesh.Position += new Vector3(s[0], s[1], s[2]); mesh.Transform[3, 0] += s[0]; mesh.Transform[3, 1] += s[1]; mesh.Transform[3, 2] += s[2]; if (!float.IsNaN(meshSize)) { mesh.InterpolateMesh(meshSize); } } } ProgramCore.Project.RenderMainHelper.pickingController.HairMeshes.Clear(); ProgramCore.Project.RenderMainHelper.pickingController.HairMeshes.AddRange(meshes); }
public void AttachAccessory(string accessoryObjPath, string accessoryMaterialPath, ManType manType) { var objModel = ObjLoader.LoadObjFile(accessoryObjPath, false); if (objModel == null) { return; } var mesh = PickingController.LoadAccessoryMesh(objModel); if (string.IsNullOrEmpty(accessoryMaterialPath)) { mesh.Material.DiffuseColor = new Vector4(0.5f, 0.4f, 0.3f, 1); } else { mesh.Material.DiffuseTextureMap = accessoryMaterialPath; } var objName = Path.GetFileNameWithoutExtension(accessoryObjPath); if (AccessoryPositions.ContainsKey(objName)) { var meshSize = AccessoryPositions[objName].Item2; var s = AccessoryPositions[objName].Item1 * ProgramCore.Project.RenderMainHelper.headMeshesController.RenderMesh.MorphScale; // домножаем на 8 для веб версии. все на 8 домножаем! любим 8! mesh.Position += new Vector3(s[0], s[1], s[2]); mesh.Transform[3, 0] += s[0]; mesh.Transform[3, 1] += s[1]; mesh.Transform[3, 2] += s[2]; if (!float.IsNaN(meshSize)) { mesh.Transform[3, 0] -= s[0]; // применяем изменение размера mesh.Transform[3, 1] -= s[1]; mesh.Transform[3, 2] -= s[2]; mesh.Transform *= Matrix4.CreateScale(meshSize / mesh.MeshSize); mesh.Transform[3, 0] += s[0]; mesh.Transform[3, 1] += s[1]; mesh.Transform[3, 2] += s[2]; mesh.IsChanged = true; mesh.MeshSize = meshSize; } } ProgramCore.Project.RenderMainHelper.pickingController.AccesoryMeshes.Add(mesh); }
public MeshInfo(DynamicRenderMesh parent, Vertex[] vertices, Matrix4 transformMatrix, ManType manType) { Material = parent.Material; Title = parent.Title; var positionsMapping = new Dictionary <Vector3, int>(new VectorEqualityComparer()); var texCoordsMapping = new Dictionary <Vector2, int>(new VectorEqualityComparer()); var normalsMapping = new Dictionary <Vector3, int>(new VectorEqualityComparer()); if (transformMatrix != Matrix4.Zero) { var scaleCoef = 1f; if (parent.meshType == MeshType.Accessory) { scaleCoef = 246f; } else if (parent.meshType == MeshType.Head) { scaleCoef = PickingController.GetHeadScale(manType); } else { scaleCoef = PickingController.GetHairScale(manType); } //ProgramCore.PluginMode && var useExporter = ProgramCore.MainForm.ctrlRenderControl.pickingController.ObjExport != null; var invScale = Matrix4.CreateScale(useExporter ? 1.0f : 1.0f / scaleCoef); TempTransform = transformMatrix; TempTransform *= invScale; if (useExporter) { var d = ProgramCore.MainForm.ctrlRenderControl.pickingController.ObjExport.Delta; d.Y -= 0.0060975609f; DeltaTransform = d * scaleCoef; TempTransform *= Matrix4.CreateTranslation(d * scaleCoef); } } else { TempTransform = Matrix4.Identity; DeltaTransform = Vector3.Zero; } foreach (var vertex in vertices) { // var index = i * 3; var position = vertex.Position; var texCoord = vertex.TexCoord; texCoord.Y = 1.0f - texCoord.Y; var normal = vertex.Normal; position = Vector3.Transform(position, TempTransform); normal = Vector3.Transform(normal, TempTransform); int id; if (!positionsMapping.TryGetValue(position, out id)) { id = Positions.Count; Positions.Add(position); positionsMapping.Add(position, id); } IndicesPositions.Add(id); if (!normalsMapping.TryGetValue(normal, out id)) { id = Normals.Count; Normals.Add(normal); normalsMapping.Add(normal, id); } IndicesNormals.Add(id); if (!texCoordsMapping.TryGetValue(texCoord, out id)) { id = TexCoords.Count; TexCoords.Add(texCoord); texCoordsMapping.Add(texCoord, id); } IndicesTexCoords.Add(id); } }
public static void SaveObjFile(string filePath, List <MeshInfo> meshInfos, MeshType type, ObjExport objExport, bool saveBrushesToTexture, bool isCollada, string sessionId) { if (objExport == null) { SaveObjFile(filePath, meshInfos, type, saveBrushesToTexture, isCollada, sessionId); return; } var fi = new FileInfo(filePath); if (fi.Exists) { fi.Delete(); } if (fi.DirectoryName == null) { return; } var mtlPath = Path.Combine(fi.DirectoryName, Path.GetFileNameWithoutExtension(fi.Name) + ".mtl"); var fiMtl = new FileInfo(mtlPath); //if (fiMtl.Exists) // fiMtl.Delete(); var groupIndex = 0; var materials = new Dictionary <string, ObjMaterial>(); var startPositionIndex = 1; var startTexIndex = 1; var startNormalIndex = 1; var indicesPositions = new List <int>(); var indicesTexCoords = new List <int>(); var indicesNormals = new List <int>(); var positions = new List <Vector3>(); var normals = new List <Vector3>(); var texCoords = new List <Vector2>(); Vector3 A = new Vector3(99999.0f, 99999.0f, 99999.0f); Vector3 B = new Vector3(-99999.0f, -99999.0f, -99999.0f); foreach (var meshPartInfo in meshInfos) { PickingController.GetAABB(ref A, ref B, meshPartInfo.Positions); } objExport.SetObjectAABB(A, B); foreach (var meshInfo in meshInfos) // faces should write differently { if (meshInfo.IndicesNormals.Count == 0) { continue; } String groupTitle; if (string.IsNullOrEmpty(meshInfo.Title)) { groupTitle = "Element_" + groupIndex; while (materials.ContainsKey(groupTitle)) { ++groupIndex; groupTitle = "Element_" + groupIndex; } ++groupIndex; } else { groupTitle = meshInfo.Title; } materials.Add(groupTitle, meshInfo.Material); for (var i = 0; i < meshInfo.IndicesTexCoords.Count; i++) { indicesPositions.Add(startPositionIndex + meshInfo.IndicesPositions[i]); indicesTexCoords.Add(startTexIndex + meshInfo.IndicesTexCoords[i]); indicesNormals.Add(startNormalIndex + meshInfo.IndicesNormals[i]); } startPositionIndex += (meshInfo.IndicesPositions.Max() + 1); startTexIndex += (meshInfo.IndicesTexCoords.Max() + 1); startNormalIndex += (meshInfo.IndicesNormals.Max() + 1); positions.AddRange(meshInfo.Positions); normals.AddRange(meshInfo.Normals); texCoords.AddRange(meshInfo.TexCoords); } foreach (var face in objExport.Faces) { var index = face.TriangleIndex0 * 3; for (var l = 0; l < 3; l++) { var v = positions[indicesPositions[index + l] - 1]; var vn = normals[indicesNormals[index + l] - 1]; var vt = texCoords[indicesTexCoords[index + l] - 1]; objExport.SetData(v, vt, vn, face, l); } if (face.VertexCount == 4) { index = face.TriangleIndex1 * 3; var v = positions[indicesPositions[index + 1] - 1]; var vn = normals[indicesNormals[index + 1] - 1]; var vt = texCoords[indicesTexCoords[index + 1] - 1]; objExport.SetData(v, vt, vn, face, 3); } } using (var sw = new StreamWriter(filePath, false, Encoding.Default)) { sw.WriteLine("#Produced by HeadShop"); sw.WriteLine(type == MeshType.Accessory ? "#Accessories" : "#HeadShop Model"); sw.WriteLine("#" + DateTime.Now.ToShortDateString()); sw.WriteLine("mtllib " + fiMtl.Name); sw.WriteLine(); foreach (var v in objExport.Vertices) { var resStr = "v " + v.X.ToString(ProgramCore.Nfi) + " " + v.Y.ToString(ProgramCore.Nfi) + " " + v.Z.ToString(ProgramCore.Nfi); sw.WriteLine(resStr); } foreach (var vt in objExport.TexCoords) { var resStr = "vt " + vt.X.ToString(ProgramCore.Nfi) + " " + vt.Y.ToString(ProgramCore.Nfi); sw.WriteLine(resStr); } foreach (var vn in objExport.Normals) { var resStr = "vn " + vn.X.ToString(ProgramCore.Nfi) + " " + vn.Y.ToString(ProgramCore.Nfi) + " " + vn.Z.ToString(ProgramCore.Nfi); sw.WriteLine(resStr); } var prevGroup = String.Empty; foreach (var materialGroup in objExport.MaterialsGroups) { if (materialGroup.Groups.Count == 0 || !materialGroup.Groups[0].IsValid) { continue; } for (var i = 0; i < materialGroup.Groups.Count; i++) { var group = materialGroup.Groups[i]; if (!group.IsValid) { continue; } if (!prevGroup.Equals(group.Group)) { sw.WriteLine("g " + group.Group); prevGroup = group.Group; } if (i == 0) { sw.WriteLine("usemtl " + materialGroup.Material); } for (var j = group.StartFaceIndex; j <= group.EndFaceIndex; j++) { var face = objExport.Faces[j]; var resStr = "f "; foreach (var vertex in face.FaceVertices) { resStr += (vertex.VertexIndex).ToString(ProgramCore.Nfi); if (objExport.TexCoords.Count > 0) { resStr += "/" + (vertex.TextureIndex).ToString(ProgramCore.Nfi); } if (objExport.Normals.Count > 0) { resStr += "/" + (vertex.NormalIndex).ToString(ProgramCore.Nfi); } resStr += " "; } sw.WriteLine(resStr.Remove(resStr.Length - 1)); } } } } SaveMaterial(mtlPath, materials, type, fi, saveBrushesToTexture, isCollada, string.Empty); }