Beispiel #1
0
 public static Vector3D NormalAvg(OBJ.Face face) => (face.VA.normal + face.VB.normal + face.VC.normal) / 3;
Beispiel #2
0
        public static OBJ FixNitroUV(OBJ Input)
        {
            var mLT = new MLT(Input.MLTName);
            var oBJ = new OBJ
            {
                MLTName  = Input.MLTName,
                Vertices = Input.Vertices,
                Normals  = Input.Normals
            };
            int num = 0;

            foreach (var face2 in Input.Faces)
            {
                Vector2[] array = new Vector2[3]
                {
                    Input.TexCoords[face2.TexCoordIndieces[0]],
                    Input.TexCoords[face2.TexCoordIndieces[1]],
                    Input.TexCoords[face2.TexCoordIndieces[2]]
                };
                MLT.Material materialByName = mLT.GetMaterialByName(face2.MaterialName);
                if (materialByName.DiffuseMap != null)
                {
                    float num2 = 2047.9375f / (float)materialByName.DiffuseMap.Width;
                    float num3 = -2048f / (float)materialByName.DiffuseMap.Width;
                    float num4 = 2047.9375f / (float)materialByName.DiffuseMap.Height;
                    float num5 = -2048f / (float)materialByName.DiffuseMap.Height;
                    float num6 = array[0].X % 1f;
                    float num7 = array[0].Y % 1f;
                    array[1].X = array[1].X - array[0].X + num6;
                    array[1].Y = array[1].Y - array[0].Y + num7;
                    array[2].X = array[2].X - array[0].X + num6;
                    array[2].Y = array[2].Y - array[0].Y + num7;
                    array[0].X = num6;
                    array[0].Y = num7;
                    while (array[0].X <= num3 || array[1].X <= num3 || array[2].X <= num3)
                    {
                        array[0].X += 1f;
                        array[1].X += 1f;
                        array[2].X += 1f;
                    }
                    while (array[0].X >= num2 || array[1].X >= num2 || array[2].X >= num2)
                    {
                        array[0].X -= 1f;
                        array[1].X -= 1f;
                        array[2].X -= 1f;
                    }
                    while (array[0].Y <= num5 || array[1].Y <= num5 || array[2].Y <= num5)
                    {
                        array[0].Y += 1f;
                        array[1].Y += 1f;
                        array[2].Y += 1f;
                    }
                    while (array[0].Y >= num4 || array[1].Y >= num4 || array[2].Y >= num4)
                    {
                        array[0].Y -= 1f;
                        array[1].Y -= 1f;
                        array[2].Y -= 1f;
                    }
                    if (array[0].X <= num3 || array[1].X <= num3 || array[2].X <= num3 || array[0].X >= num2 || array[1].X >= num2 || array[2].X >= num2 || array[0].Y <= num5 || array[1].Y <= num5 || array[2].Y <= num5 || array[0].Y >= num4 || array[1].Y >= num4 || array[2].Y >= num4)
                    {
                        // MessageBox.Show("Your model seems to contain a face which texture is repeated too many to fix. Try splitting the face up, or less repeating the texture before trying again.\r\nMaterial Name: " + face2.MaterialName + "\r\nThere may be more though.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                        return(null);
                    }
                }
                oBJ.TexCoords.AddRange(array);
                var face = new OBJ.Face();
                face.MaterialName   = face2.MaterialName;
                face.NormalIndieces = face2.NormalIndieces;
                face.TexCoordIndieces.AddRange(new int[3]
                {
                    num,
                    num + 1,
                    num + 2
                });
                num += 3;
                face.VertexIndieces = face2.VertexIndieces;
                oBJ.Faces.Add(face);
            }
            return(oBJ);
        }