Пример #1
0
        //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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
        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);
        }