Пример #1
0
 public void ImportObj(
     string inFile,
     ref List <TriangleGL> triangleGLs,
     ref List <TriangleGL> triangleGLAlphas,
     ref List <TextureData> TextureDataList,
     ref List <TextureData> TextureDataAlphaList,
     ref List <TextureSetting> TextureSettings,
     ref List <TextureSetting> TextureSettingsAlpha,
     ref float scale)
 {
     try
     {
         this.originalScale = scale;
         this.vertScale     = scale;
         this.dir           = Path.GetDirectoryName(inFile);
         this.dir          += "\\";
         StreamReader streamReader = new StreamReader((Stream)File.Open(inFile, FileMode.Open));
         string       end          = streamReader.ReadToEnd();
         streamReader.Close();
         this.StripLeadingSpaceAndDoubleSpaces(ref end);
         this.RipMTL(ref end);
         this.RipOBJMesh(ref end);
         this.RipFaces(ref end);
         this.RipTextureCI(ref TextureDataList, ref TextureDataAlphaList, ref TextureSettings, ref TextureSettingsAlpha);
         if (TextureDataList.Count == 0)
         {
             TextureDataList.Add(new TextureData());
         }
         this.RecenterUVs();
         this.SplitAlpha(ref TextureSettingsAlpha);
         this.CopyVerts();
         this.CalcPrecision(1);
         scale = this.vertScale;
         for (int index1 = 0; index1 < this.faceVs.Count; ++index1)
         {
             VertGL[] verts_          = new VertGL[3];
             int      num1            = 0;
             int      num2            = 0;
             int      textureSetting_ = -1;
             for (int index2 = 0; index2 < TextureSettings.Count && textureSetting_ == -1; ++index2)
             {
                 if (this.faceTextureMap[index1] == TextureSettings[index2].name)
                 {
                     textureSetting_ = index2;
                     num1            = TextureSettings[index2].width;
                     num2            = TextureSettings[index2].height;
                 }
             }
             for (int index2 = 0; index2 < 3; ++index2)
             {
                 double[] numArray1 = new double[2]
                 {
                     this.vertTs[this.faceVTs[index1][index2]][0],
                     this.vertTs[this.faceVTs[index1][index2]][1]
                 };
                 short u_ = (short)(numArray1[0] * (double)num1 * 256.0 / 4.0);
                 numArray1[1] = numArray1[1] >= 1.0 || numArray1[1] <= 0.0 ? numArray1[1] * -1.0 + 1.0 : 1.0 - numArray1[1] % 1.0;
                 short  v_        = (short)(numArray1[1] * (double)num2 * 256.0 / 4.0);
                 byte[] numArray2 = new byte[4]
                 {
                     byte.MaxValue,
                     byte.MaxValue,
                     byte.MaxValue,
                     byte.MaxValue
                 };
                 if (this.faceCs[index1][index2] != -1)
                 {
                     numArray2[0] = this.vertColours[this.faceCs[index1][index2]].red;
                     numArray2[1] = this.vertColours[this.faceCs[index1][index2]].green;
                     numArray2[2] = this.vertColours[this.faceCs[index1][index2]].blue;
                     numArray2[3] = this.vertColours[this.faceCs[index1][index2]].alpha;
                 }
                 VertGL vertGl = new VertGL(Convert.ToInt16(this.verts[this.faceVs[index1][index2]][0]), Convert.ToInt16(this.verts[this.faceVs[index1][index2]][1]), Convert.ToInt16(this.verts[this.faceVs[index1][index2]][2]), numArray2[0], numArray2[1], numArray2[2], numArray2[3], u_, v_);
                 verts_[index2] = vertGl;
             }
             triangleGLs.Add(new TriangleGL(verts_, textureSetting_));
         }
         for (int index = 0; index < triangleGLs.Count; ++index)
         {
             int textureSetting = triangleGLs[index].textureSetting;
         }
         for (int index1 = 0; index1 < this.alphaFaceVs.Count; ++index1)
         {
             VertGL[] verts_          = new VertGL[3];
             int      num1            = 0;
             int      num2            = 0;
             int      textureSetting_ = -1;
             for (int index2 = 0; index2 < TextureSettingsAlpha.Count && textureSetting_ == -1; ++index2)
             {
                 if (this.alphafaceTextureMap[index1] == TextureSettingsAlpha[index2].name)
                 {
                     textureSetting_ = index2;
                     num1            = TextureSettingsAlpha[index2].width;
                     num2            = TextureSettingsAlpha[index2].height;
                 }
             }
             for (int index2 = 0; index2 < 3; ++index2)
             {
                 double[] alphaVertT = this.alphaVertTs[this.alphaFaceVTs[index1][index2]];
                 short    u_         = (short)(alphaVertT[0] * (double)num1 * 256.0 / 4.0);
                 alphaVertT[1] = alphaVertT[1] >= 1.0 || alphaVertT[1] <= 0.0 ? alphaVertT[1] * -1.0 + 1.0 : 1.0 - alphaVertT[1] % 1.0;
                 short  v_       = (short)(alphaVertT[1] * (double)num2 * 256.0 / 4.0);
                 byte[] numArray = new byte[4]
                 {
                     byte.MaxValue,
                     byte.MaxValue,
                     byte.MaxValue,
                     byte.MaxValue
                 };
                 if (this.alphaFaceCs[index1][index2] != -1)
                 {
                     numArray[0] = this.alphaVertColours[this.alphaFaceCs[index1][index2]].red;
                     numArray[1] = this.alphaVertColours[this.alphaFaceCs[index1][index2]].green;
                     numArray[2] = this.alphaVertColours[this.alphaFaceCs[index1][index2]].blue;
                     numArray[3] = this.alphaVertColours[this.alphaFaceCs[index1][index2]].alpha;
                 }
                 VertGL vertGl = new VertGL(Convert.ToInt16(this.alphaVerts[this.alphaFaceVs[index1][index2]][0]), Convert.ToInt16(this.alphaVerts[this.alphaFaceVs[index1][index2]][1]), Convert.ToInt16(this.alphaVerts[this.alphaFaceVs[index1][index2]][2]), numArray[0], numArray[1], numArray[2], numArray[3], u_, v_);
                 verts_[index2] = vertGl;
             }
             triangleGLAlphas.Add(new TriangleGL(verts_, textureSetting_));
         }
         for (int index1 = 0; index1 < triangleGLs.Count <TriangleGL>(); ++index1)
         {
             bool flag1 = false;
             for (int index2 = 0; index2 < 3 && !flag1; ++index2)
             {
                 if (triangleGLs[index1].verts[index2].a != byte.MaxValue)
                 {
                     flag1 = true;
                 }
             }
             if (flag1)
             {
                 if (triangleGLs[index1].textureSetting != -1)
                 {
                     TextureSetting t     = TextureSetting.clone(TextureSettings[triangleGLs[index1].textureSetting]);
                     bool           flag2 = true;
                     if (TextureSettings[triangleGLs[index1].textureSetting].textureData != -1)
                     {
                         for (int index2 = 0; index2 < TextureDataAlphaList.Count & flag2; ++index2)
                         {
                             if (((IEnumerable <byte>)TextureDataList[TextureSettings[triangleGLs[index1].textureSetting].textureData].n64).SequenceEqual <byte>((IEnumerable <byte>)TextureDataAlphaList[index2].n64))
                             {
                                 t.textureData = index2;
                                 flag2         = false;
                             }
                         }
                         if (flag2)
                         {
                             TextureDataAlphaList.Add(TextureDataList[TextureSettings[triangleGLs[index1].textureSetting].textureData]);
                             t.textureData = TextureDataAlphaList.Count - 1;
                             TextureSettingsAlpha.Add(t);
                             triangleGLs[index1].textureSetting = TextureSettingsAlpha.Count - 1;
                         }
                     }
                     if (!flag2 || TextureSettings[triangleGLs[index1].textureSetting].textureData == -1)
                     {
                         bool flag3 = true;
                         for (int index2 = 0; index2 < TextureSettingsAlpha.Count & flag3; ++index2)
                         {
                             if (TextureSettingsAlpha[index2].equal(t))
                             {
                                 triangleGLs[index1].textureSetting = index2;
                                 flag3 = false;
                             }
                         }
                         if (flag3)
                         {
                             TextureSettingsAlpha.Add(t);
                             triangleGLs[index1].textureSetting = TextureSettingsAlpha.Count - 1;
                         }
                     }
                 }
                 triangleGLAlphas.Insert(0, triangleGLs[index1]);
                 triangleGLs.RemoveAt(index1);
                 --index1;
             }
         }
     }
     catch (Exception ex)
     {
         int num = (int)MessageBox.Show("Unable to convert OBJ file, visit banjosbackpack.com for more help");
     }
 }
Пример #2
0
        private void RipTextureCI(
            ref List <TextureData> TextureDataList,
            ref List <TextureData> TextureDataAlphaList,
            ref List <TextureSetting> TextureSettingsList,
            ref List <TextureSetting> TextureSettingsAlphaList)
        {
            string str = "";

            try
            {
                this.texturePalSize = new List <int>();
                this.isAlpha        = new bool[this.textureFiles.Length];
                for (int index = 0; index < this.textureFiles.Length; ++index)
                {
                    this.isAlpha[index] = false;
                    if (this.textureFiles[index] != "" && this.textureFiles[index] != null)
                    {
                        str = this.dir + this.textureFiles[index];
                        Bitmap image = new Bitmap(this.dir + this.textureFiles[index]);
                        ImageHandler.CorrectSize(ref image);
                        int          width        = image.Width;
                        int          height       = image.Height;
                        List <Color> uniqueColors = ImageHandler.GetUniqueColors(ref image);
                        bool         alpha        = false;
                        if (uniqueColors.Count <= 22 || width * height >= 4096)
                        {
                            if (uniqueColors.Count > 16)
                            {
                                image = ImageHandler.ConvertTo16Colour(image);
                            }
                            TextureData textureData = new TextureData(ImageHandler.ConvertImageToCI4(image, ref alpha), ImageHandler.ConvertImageToRGBA8888(image), image.Width, image.Height);
                            if (alpha)
                            {
                                TextureDataAlphaList.Add(textureData);
                                TextureSetting textureSetting = new TextureSetting(textureData.width, textureData.height, 0, 0, TextureDataAlphaList.Count <TextureData>() - 1);
                                textureSetting.name = this.textureNames[index];
                                textureSetting.setRatio(0.5f, 0.5f);
                                textureSetting.palSize   = 16;
                                textureSetting.ISALPHA   = true;
                                textureSetting.cull_back = true;
                                TextureSettingsAlphaList.Add(textureSetting);
                            }
                            else
                            {
                                TextureDataList.Add(textureData);
                                TextureSetting textureSetting = new TextureSetting(textureData.width, textureData.height, 0, 0, TextureDataList.Count <TextureData>() - 1);
                                textureSetting.name = this.textureNames[index];
                                textureSetting.setRatio(0.5f, 0.5f);
                                textureSetting.palSize   = 16;
                                textureSetting.cull_back = true;
                                TextureSettingsList.Add(textureSetting);
                            }
                            this.texturePalSize.Add(16);
                        }
                        else if (width * height < 4096)
                        {
                            this.texturePalSize.Add(256);
                            if (uniqueColors.Count > 256)
                            {
                                image = ImageHandler.ConvertTo256Colour(image);
                            }
                            TextureData textureData = new TextureData(ImageHandler.ConvertImageToCI8(image, ref alpha, false), ImageHandler.ConvertImageToRGBA8888(image), image.Width, image.Height);
                            if (alpha)
                            {
                                TextureDataAlphaList.Add(textureData);
                                TextureSetting textureSetting = new TextureSetting(textureData.width, textureData.height, 0, 0, TextureDataAlphaList.Count <TextureData>() - 1);
                                textureSetting.name = this.textureNames[index];
                                textureSetting.setRatio(0.5f, 0.5f);
                                textureSetting.palSize   = 256;
                                textureSetting.ISALPHA   = true;
                                textureSetting.cull_back = true;
                                TextureSettingsAlphaList.Add(textureSetting);
                            }
                            else
                            {
                                TextureDataList.Add(textureData);
                                TextureSetting textureSetting = new TextureSetting(textureData.width, textureData.height, 0, 0, TextureDataList.Count <TextureData>() - 1);
                                textureSetting.name = this.textureNames[index];
                                textureSetting.setRatio(0.5f, 0.5f);
                                textureSetting.palSize   = 256;
                                textureSetting.cull_back = true;
                                TextureSettingsList.Add(textureSetting);
                            }
                        }
                    }
                    else
                    {
                        TextureDataList.Add(new TextureData());
                        TextureSetting textureSetting = new TextureSetting(0, 0, 0, 0, -1);
                        textureSetting.name = this.textureNames[index];
                        textureSetting.setRatio(0.5f, 0.5f);
                        textureSetting.cull_back = true;
                        TextureSettingsList.Add(textureSetting);
                        this.texturePalSize.Add(0);
                    }
                }
            }
            catch (Exception ex)
            {
                int num = (int)MessageBox.Show("An error occured while converting texture " + str + ", please check all files are present and try again.");
            }
        }