예제 #1
0
        public void Render()
        {
            float num1 = (float)this.simpleOpenGlControl1.Width / (float)this.simpleOpenGlControl1.Height;

            Gl.glMatrixMode(5889);
            Gl.glLoadIdentity();
            Gl.glViewport(0, 0, this.simpleOpenGlControl1.Width, this.simpleOpenGlControl1.Height);
            Glu.gluPerspective(30.0, (double)num1, 0.100000001490116, 500000.0);
            Gl.glMatrixMode(5888);
            Gl.glLoadIdentity();
            Gl.glBindTexture(3553, 0);
            Gl.glColor3f(1f, 1f, 1f);
            Gl.glClear(16640);
            Gl.glRotatef(OBJ.elev, 1f, 0.0f, 0.0f);
            Gl.glRotatef(-OBJ.elev, 1f, 0.0f, 0.0f);
            Gl.glTranslatef(OBJ.X, OBJ.Y, -OBJ.dist);
            Gl.glRotatef(OBJ.elev, 1f, 0.0f, 0.0f);
            Gl.glRotatef(OBJ.ang, 0.0f, 1f, 0.0f);
            Gl.glPushMatrix();
            MLT.Material material = (MLT.Material)null;
            foreach (MKDS_Course_Modifier._3D_Formats.OBJ.Face face in this.Obj.Faces)
            {
                float alpha = 1f;
                if ((material == null || material.Name != face.MaterialName) && this.Mlt != null)
                {
                    material = this.Mlt.GetMaterialByName(face.MaterialName);
                    alpha    = material.Alpha;
                    Gl.glBindTexture(3553, this.Mlt.Materials.IndexOf(material) + 1);
                }
                if (face.VertexIndieces.Count == 3)
                {
                    Gl.glBegin(4);
                }
                else if (face.VertexIndieces.Count == 4)
                {
                    Gl.glBegin(7);
                }
                else
                {
                    continue;
                }
                for (int index = 0; index < face.VertexIndieces.Count; ++index)
                {
                    if (face.TexCoordIndieces.Count != 0)
                    {
                        Gl.glTexCoord2f(this.Obj.TexCoords[face.TexCoordIndieces[index]].X, -this.Obj.TexCoords[face.TexCoordIndieces[index]].Y);
                    }
                    if (face.VertexColorIndieces.Count != 0)
                    {
                        Color  vertexColor = this.Obj.VertexColors[face.VertexColorIndieces[index]];
                        double num2        = (double)vertexColor.R / (double)byte.MaxValue;
                        vertexColor = this.Obj.VertexColors[face.VertexColorIndieces[index]];
                        double num3 = (double)vertexColor.G / (double)byte.MaxValue;
                        vertexColor = this.Obj.VertexColors[face.VertexColorIndieces[index]];
                        double num4 = (double)vertexColor.B / (double)byte.MaxValue;
                        double num5 = (double)alpha;
                        Gl.glColor4f((float)num2, (float)num3, (float)num4, (float)num5);
                    }
                    else
                    {
                        Gl.glColor4f(1f, 1f, 1f, alpha);
                    }
                    Gl.glVertex3f(this.Obj.Vertices[face.VertexIndieces[index]].X, this.Obj.Vertices[face.VertexIndieces[index]].Y, this.Obj.Vertices[face.VertexIndieces[index]].Z);
                }
                Gl.glEnd();
            }
            Gl.glPopMatrix();
            this.simpleOpenGlControl1.Refresh();
        }
예제 #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);
        }
예제 #3
0
        public static void ConvertToNsbmd(string infile, string outfile)
        {
            OBJ obj = OBJ.FixNitroUV(new OBJ(infile));

            if (obj == null)
            {
                return;
            }
            MLT           mlt           = new MLT(obj.MLTName);
            NSBMDSettings nsbmdSettings = new NSBMDSettings();
            int           num1          = (int)nsbmdSettings.ShowDialog();
            List <string> stringList    = new List <string>();
            float         scale1        = nsbmdSettings.Scale;
            bool          createNsbtx   = nsbmdSettings.CreateNSBTX;
            Vector3       vector3_1     = new Vector3(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity);
            Vector3       vector3_2     = new Vector3(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity);

            for (int index = 0; index < obj.Vertices.Count; ++index)
            {
                obj.Vertices[index] = Vector3.Multiply(obj.Vertices[index], scale1);
                if ((double)obj.Vertices[index].X < (double)vector3_1.X)
                {
                    vector3_1.X = obj.Vertices[index].X;
                }
                if ((double)obj.Vertices[index].X > (double)vector3_2.X)
                {
                    vector3_2.X = obj.Vertices[index].X;
                }
                if ((double)obj.Vertices[index].Y < (double)vector3_1.Y)
                {
                    vector3_1.Y = obj.Vertices[index].Y;
                }
                if ((double)obj.Vertices[index].Y > (double)vector3_2.Y)
                {
                    vector3_2.Y = obj.Vertices[index].Y;
                }
                if ((double)obj.Vertices[index].Z < (double)vector3_1.Z)
                {
                    vector3_1.Z = obj.Vertices[index].Z;
                }
                if ((double)obj.Vertices[index].Z > (double)vector3_2.Z)
                {
                    vector3_2.Z = obj.Vertices[index].Z;
                }
            }
            Vector3 vector3_3 = vector3_2 - vector3_1;
            float   num2      = Helpers.max(vector3_3.X, vector3_3.Y, vector3_3.Z);
            float   scale2    = 1f;
            int     num3      = 0;

            for (; (double)num2 > 7.999755859375; num2 /= 2f)
            {
                ++num3;
                scale2 /= 2f;
            }
            for (int index = 0; index < obj.Vertices.Count; ++index)
            {
                obj.Vertices[index] = Vector3.Multiply(obj.Vertices[index], scale2);
            }
            NSBMD nsbmd = new NSBMD(!createNsbtx);

            nsbmd.modelSet = new NSBMD.ModelSet();
            string Name1 = Path.GetFileNameWithoutExtension(infile);

            if (Name1.Length > 16)
            {
                Name1 = Name1.Remove(16);
            }
            nsbmd.modelSet.dict = new Dictionary <NSBMD.ModelSet.MDL0Data>();
            nsbmd.modelSet.dict.Add(Name1, new NSBMD.ModelSet.MDL0Data());
            nsbmd.modelSet.models                 = new NSBMD.ModelSet.Model[1];
            nsbmd.modelSet.models[0]              = new NSBMD.ModelSet.Model();
            nsbmd.modelSet.models[0].info         = new NSBMD.ModelSet.Model.ModelInfo();
            nsbmd.modelSet.models[0].info.numNode = (byte)1;
            foreach (OBJ.Face face in obj.Faces)
            {
                if (!stringList.Contains(face.MaterialName))
                {
                    stringList.Add(face.MaterialName);
                }
                ++nsbmd.modelSet.models[0].info.numTriangle;
            }
            nsbmd.modelSet.models[0].info.numMat = (byte)stringList.Count;
            nsbmd.modelSet.models[0].info.numShp = (byte)stringList.Count;
            nsbmd.modelSet.models[0].info.firstUnusedMtxStackID = (byte)1;
            nsbmd.modelSet.models[0].info.posScale       = (float)(1 << num3);
            nsbmd.modelSet.models[0].info.invPosScale    = 1f / nsbmd.modelSet.models[0].info.posScale;
            nsbmd.modelSet.models[0].info.numVertex      = (ushort)(byte)obj.Vertices.Count;
            nsbmd.modelSet.models[0].info.numPolygon     = (ushort)(byte)obj.Faces.Count;
            nsbmd.modelSet.models[0].info.boxX           = vector3_1.X * scale2;
            nsbmd.modelSet.models[0].info.boxY           = vector3_1.Y * scale2;
            nsbmd.modelSet.models[0].info.boxZ           = vector3_1.Z * scale2;
            nsbmd.modelSet.models[0].info.boxW           = vector3_3.X * scale2;
            nsbmd.modelSet.models[0].info.boxH           = vector3_3.Y * scale2;
            nsbmd.modelSet.models[0].info.boxD           = vector3_3.Z * scale2;
            nsbmd.modelSet.models[0].info.boxPosScale    = (float)(1 << num3);
            nsbmd.modelSet.models[0].info.boxInvPosScale = 1f / nsbmd.modelSet.models[0].info.boxPosScale;
            nsbmd.modelSet.models[0].nodes      = new NSBMD.ModelSet.Model.NodeSet();
            nsbmd.modelSet.models[0].nodes.dict = new Dictionary <NSBMD.ModelSet.Model.NodeSet.NodeSetData>();
            nsbmd.modelSet.models[0].nodes.dict.Add("world_root", new NSBMD.ModelSet.Model.NodeSet.NodeSetData());
            nsbmd.modelSet.models[0].nodes.data                  = new NSBMD.ModelSet.Model.NodeSet.NodeData[1];
            nsbmd.modelSet.models[0].nodes.data[0]               = new NSBMD.ModelSet.Model.NodeSet.NodeData();
            nsbmd.modelSet.models[0].nodes.data[0].flag          = (ushort)7;
            nsbmd.modelSet.models[0].materials                   = new NSBMD.ModelSet.Model.MaterialSet();
            nsbmd.modelSet.models[0].materials.dictTexToMatList  = new Dictionary <NSBMD.ModelSet.Model.MaterialSet.TexToMatData>();
            nsbmd.modelSet.models[0].materials.dictPlttToMatList = new Dictionary <NSBMD.ModelSet.Model.MaterialSet.PlttToMatData>();
            nsbmd.modelSet.models[0].materials.dict              = new Dictionary <NSBMD.ModelSet.Model.MaterialSet.MaterialSetData>();
            nsbmd.modelSet.models[0].materials.materials         = new NSBMD.ModelSet.Model.MaterialSet.Material[stringList.Count];
            int index1 = 0;
            int index2 = 0;

            foreach (string Name2 in stringList)
            {
                MLT.Material materialByName = mlt.GetMaterialByName(Name2);
                if (materialByName.DiffuseMap != null)
                {
                    nsbmd.modelSet.models[0].materials.dictTexToMatList.Add(index1.ToString() + "_t", new NSBMD.ModelSet.Model.MaterialSet.TexToMatData());
                    nsbmd.modelSet.models[0].materials.dictPlttToMatList.Add(index1.ToString() + "_p", new NSBMD.ModelSet.Model.MaterialSet.PlttToMatData());
                    nsbmd.modelSet.models[0].materials.dictTexToMatList[index2].Value.NrMat     = (byte)1;
                    nsbmd.modelSet.models[0].materials.dictTexToMatList[index2].Value.Materials = new int[1]
                    {
                        index1
                    };
                    KeyValuePair <string, NSBMD.ModelSet.Model.MaterialSet.PlttToMatData> dictPlttToMat = nsbmd.modelSet.models[0].materials.dictPlttToMatList[index2];
                    dictPlttToMat.Value.NrMat     = (byte)1;
                    dictPlttToMat                 = nsbmd.modelSet.models[0].materials.dictPlttToMatList[index2];
                    dictPlttToMat.Value.Materials = new int[1]
                    {
                        index1
                    };
                    ++index2;
                }
                nsbmd.modelSet.models[0].materials.dict.Add(index1.ToString() + "_m", new NSBMD.ModelSet.Model.MaterialSet.MaterialSetData());
                nsbmd.modelSet.models[0].materials.materials[index1] = new NSBMD.ModelSet.Model.MaterialSet.Material();
                NSBMD.ModelSet.Model.MaterialSet.Material material1 = nsbmd.modelSet.models[0].materials.materials[index1];
                Color color = Color.Black;
                int   num4  = (Graphic.encodeColor(color.ToArgb()) & (int)short.MaxValue) << 16 | 32768;
                int   argb;
                if (materialByName.DiffuseMap == null)
                {
                    argb = materialByName.DiffuseColor.ToArgb();
                }
                else
                {
                    color = Color.FromArgb(200, 200, 200);
                    argb  = color.ToArgb();
                }
                int num5 = Graphic.encodeColor(argb) & (int)short.MaxValue;
                int num6 = num4 | num5;
                material1.diffAmb = (uint)num6;
                NSBMD.ModelSet.Model.MaterialSet.Material material2 = nsbmd.modelSet.models[0].materials.materials[index1];
                color = Color.Black;
                int num7 = (Graphic.encodeColor(color.ToArgb()) & (int)short.MaxValue) << 16;
                color = Color.Black;
                int num8 = Graphic.encodeColor(color.ToArgb()) & (int)short.MaxValue;
                int num9 = num7 | num8;
                material2.specEmi = (uint)num9;
                uint num10 = (uint)((double)materialByName.Alpha * 31.0);
                nsbmd.modelSet.models[0].materials.materials[index1].polyAttr          = 0U;
                nsbmd.modelSet.models[0].materials.materials[index1].polyAttr         |= 192U;
                nsbmd.modelSet.models[0].materials.materials[index1].polyAttr         |= num10 << 16;
                nsbmd.modelSet.models[0].materials.materials[index1].polyAttrMask      = 1059059967U;
                nsbmd.modelSet.models[0].materials.materials[index1].texImageParam     = 196608U;
                nsbmd.modelSet.models[0].materials.materials[index1].texImageParamMask = uint.MaxValue;
                nsbmd.modelSet.models[0].materials.materials[index1].texPlttBase       = (ushort)0;
                nsbmd.modelSet.models[0].materials.materials[index1].flag = NSBMD.ModelSet.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_TEXMTX_SCALEONE | NSBMD.ModelSet.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_TEXMTX_ROTZERO | NSBMD.ModelSet.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_TEXMTX_TRANSZERO | NSBMD.ModelSet.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_DIFFUSE | NSBMD.ModelSet.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_AMBIENT | NSBMD.ModelSet.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_VTXCOLOR | NSBMD.ModelSet.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_SPECULAR | NSBMD.ModelSet.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_EMISSION | NSBMD.ModelSet.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_SHININESS;
                if (materialByName.DiffuseMap != null)
                {
                    nsbmd.modelSet.models[0].materials.materials[index1].origWidth  = (ushort)materialByName.DiffuseMap.Width;
                    nsbmd.modelSet.models[0].materials.materials[index1].origHeight = (ushort)materialByName.DiffuseMap.Height;
                }
                nsbmd.modelSet.models[0].materials.materials[index1].magW = 1f;
                nsbmd.modelSet.models[0].materials.materials[index1].magH = 1f;
                ++index1;
            }
            nsbmd.modelSet.models[0].shapes       = new NSBMD.ModelSet.Model.ShapeSet();
            nsbmd.modelSet.models[0].shapes.dict  = new Dictionary <NSBMD.ModelSet.Model.ShapeSet.ShapeSetData>();
            nsbmd.modelSet.models[0].shapes.shape = new NSBMD.ModelSet.Model.ShapeSet.Shape[stringList.Count];
            int index3 = 0;

            foreach (string Name2 in stringList)
            {
                int          num4           = 1;
                int          num5           = 1;
                MLT.Material materialByName = mlt.GetMaterialByName(Name2);
                List <Color> colorList      = (List <Color>)null;
                if (materialByName.DiffuseMap != null)
                {
                    num4 = materialByName.DiffuseMap.Width;
                    num5 = -materialByName.DiffuseMap.Height;
                }
                else
                {
                    colorList = new List <Color>();
                }
                nsbmd.modelSet.models[0].shapes.dict.Add(index3.ToString() + "_py", new NSBMD.ModelSet.Model.ShapeSet.ShapeSetData());
                List <Vector3> vector3List1 = new List <Vector3>();
                List <Vector2> vector2List  = new List <Vector2>();
                List <Vector3> vector3List2 = new List <Vector3>();
                foreach (OBJ.Face face in obj.Faces)
                {
                    if (face.MaterialName == Name2)
                    {
                        vector3List1.AddRange((IEnumerable <Vector3>) new Vector3[3]
                        {
                            obj.Vertices[face.VertexIndieces[0]],
                            obj.Vertices[face.VertexIndieces[1]],
                            obj.Vertices[face.VertexIndieces[2]]
                        });
                        Vector2[] vector2Array = new Vector2[3]
                        {
                            obj.TexCoords[face.TexCoordIndieces[0]],
                            obj.TexCoords[face.TexCoordIndieces[1]],
                            obj.TexCoords[face.TexCoordIndieces[2]]
                        };
                        vector2Array[0].X *= (float)num4;
                        vector2Array[0].Y *= (float)num5;
                        vector2Array[1].X *= (float)num4;
                        vector2Array[1].Y *= (float)num5;
                        vector2Array[2].X *= (float)num4;
                        vector2Array[2].Y *= (float)num5;
                        vector2List.AddRange((IEnumerable <Vector2>)vector2Array);
                        if (face.NormalIndieces.Count != 0)
                        {
                            vector3List2.AddRange((IEnumerable <Vector3>) new Vector3[3]
                            {
                                obj.Normals[face.NormalIndieces[0]],
                                obj.Normals[face.NormalIndieces[1]],
                                obj.Normals[face.NormalIndieces[2]]
                            });
                        }
                        colorList?.AddRange((IEnumerable <Color>) new Color[3]
                        {
                            materialByName.DiffuseColor,
                            materialByName.DiffuseColor,
                            materialByName.DiffuseColor
                        });
                    }
                }
                nsbmd.modelSet.models[0].shapes.shape[index3]        = new NSBMD.ModelSet.Model.ShapeSet.Shape();
                nsbmd.modelSet.models[0].shapes.shape[index3].DL     = GlNitro.GenerateDl(vector3List1.ToArray(), vector2List.ToArray(), vector3List2.ToArray(), colorList?.ToArray());
                nsbmd.modelSet.models[0].shapes.shape[index3].sizeDL = (uint)nsbmd.modelSet.models[0].shapes.shape[index3].DL.Length;
                nsbmd.modelSet.models[0].shapes.shape[index3].flag   = NSBMD.ModelSet.Model.ShapeSet.Shape.NNS_G3D_SHPFLAG.NNS_G3D_SHPFLAG_USE_NORMAL | NSBMD.ModelSet.Model.ShapeSet.Shape.NNS_G3D_SHPFLAG.NNS_G3D_SHPFLAG_USE_COLOR | NSBMD.ModelSet.Model.ShapeSet.Shape.NNS_G3D_SHPFLAG.NNS_G3D_SHPFLAG_USE_TEXCOORD;
                ++index3;
            }
            Obj2Nsbmd.SBCWriter sbcWriter = new Obj2Nsbmd.SBCWriter();
            sbcWriter.NODEDESC((byte)0, (byte)0, false, false, 0, -1);
            sbcWriter.NODE((byte)0, true);
            sbcWriter.POSSCALE(true);
            for (int index4 = 0; index4 < stringList.Count; ++index4)
            {
                sbcWriter.MAT((byte)index4);
                sbcWriter.SHP((byte)index4);
            }
            sbcWriter.POSSCALE(false);
            sbcWriter.RET();
            sbcWriter.NOP();
            nsbmd.modelSet.models[0].sbc = sbcWriter.GetData();
            NSBTX.TexplttSet texplttSet = new NSBTX.TexplttSet();
            texplttSet.TexInfo    = new NSBTX.TexplttSet.texInfo();
            texplttSet.Tex4x4Info = new NSBTX.TexplttSet.tex4x4Info();
            texplttSet.PlttInfo   = new NSBTX.TexplttSet.plttInfo();
            texplttSet.dictTex    = new Dictionary <NSBTX.TexplttSet.DictTexData>();
            texplttSet.dictPltt   = new Dictionary <NSBTX.TexplttSet.DictPlttData>();
            int num11  = 0;
            int index5 = 0;

            foreach (string Name2 in stringList)
            {
                MLT.Material materialByName = mlt.GetMaterialByName(Name2);
                if (materialByName.DiffuseMap != null)
                {
                    BitmapData   bitmapdata = materialByName.DiffuseMap.LockBits(new Rectangle(0, 0, materialByName.DiffuseMap.Width, materialByName.DiffuseMap.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
                    List <Color> source     = new List <Color>();
                    bool         flag       = false;
                    for (int index4 = 0; index4 < materialByName.DiffuseMap.Width * materialByName.DiffuseMap.Height; ++index4)
                    {
                        source.Add(Color.FromArgb(Marshal.ReadInt32(bitmapdata.Scan0, index4 * 4)));
                        Color color = source.Last <Color>();
                        int   num4;
                        if (color.A != (byte)0)
                        {
                            color = source.Last <Color>();
                            if (color.A != byte.MaxValue)
                            {
                                num4 = flag ? 1 : 0;
                                goto label_74;
                            }
                        }
                        num4 = 1;
label_74:
                        if (num4 == 0)
                        {
                            flag = true;
                        }
                    }
                    materialByName.DiffuseMap.UnlockBits(bitmapdata);
                    List <Color> list = source.Distinct <Color>().ToList <Color>();
                    texplttSet.dictTex.Add(num11.ToString() + "_t", new NSBTX.TexplttSet.DictTexData());
                    texplttSet.dictPltt.Add(num11.ToString() + "_p", new NSBTX.TexplttSet.DictPlttData());
                    KeyValuePair <string, NSBTX.TexplttSet.DictTexData> keyValuePair = texplttSet.dictTex[index5];
                    keyValuePair.Value.S = (ushort)materialByName.DiffuseMap.Width;
                    keyValuePair         = texplttSet.dictTex[index5];
                    keyValuePair.Value.T = (ushort)materialByName.DiffuseMap.Height;
                    if (flag && list.Count <= 8)
                    {
                        keyValuePair           = texplttSet.dictTex[index5];
                        keyValuePair.Value.Fmt = Graphic.GXTexFmt.GX_TEXFMT_A5I3;
                    }
                    else if (flag)
                    {
                        keyValuePair           = texplttSet.dictTex[index5];
                        keyValuePair.Value.Fmt = Graphic.GXTexFmt.GX_TEXFMT_A3I5;
                    }
                    else if (list.Count <= 16)
                    {
                        keyValuePair           = texplttSet.dictTex[index5];
                        keyValuePair.Value.Fmt = Graphic.GXTexFmt.GX_TEXFMT_PLTT16;
                    }
                    else
                    {
                        keyValuePair           = texplttSet.dictTex[index5];
                        keyValuePair.Value.Fmt = Graphic.GXTexFmt.GX_TEXFMT_COMP4x4;
                    }
                    System.Drawing.Bitmap diffuseMap = materialByName.DiffuseMap;
                    keyValuePair = texplttSet.dictTex[index5];
                    ref byte[] local1 = ref keyValuePair.Value.Data;
                    ref byte[] local2 = ref texplttSet.dictPltt[index5].Value.Data;
                    keyValuePair = texplttSet.dictTex[index5];
                    ref byte[] local3 = ref keyValuePair.Value.Data4x4;
예제 #4
0
        public static void GenerateNSBMD(string obj_path, float scale, bool has_texture, out byte[] nsbmd, out byte[] nsbtx)
        {
            var oBJ = FixNitroUV(new OBJ(obj_path));

            if (oBJ == null)
            {
                throw new Exception();
            }
            MLT           mLT   = new MLT(oBJ.MLTName);
            List <string> list  = new List <string>();
            Vector3       right = new Vector3(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity);
            Vector3       left  = new Vector3(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity);
            int           i;

            for (i = 0; i < oBJ.Vertices.Count; i++)
            {
                oBJ.Vertices[i] = Vector3.Multiply(oBJ.Vertices[i], scale);
                if (oBJ.Vertices[i].X < right.X)
                {
                    right.X = oBJ.Vertices[i].X;
                }
                if (oBJ.Vertices[i].X > left.X)
                {
                    left.X = oBJ.Vertices[i].X;
                }
                if (oBJ.Vertices[i].Y < right.Y)
                {
                    right.Y = oBJ.Vertices[i].Y;
                }
                if (oBJ.Vertices[i].Y > left.Y)
                {
                    left.Y = oBJ.Vertices[i].Y;
                }
                if (oBJ.Vertices[i].Z < right.Z)
                {
                    right.Z = oBJ.Vertices[i].Z;
                }
                if (oBJ.Vertices[i].Z > left.Z)
                {
                    left.Z = oBJ.Vertices[i].Z;
                }
            }
            Vector3 vector = left - right;
            float   num    = HelpersMax(vector.X, vector.Y, vector.Z);
            float   num2   = 1f;
            int     num3   = 0;

            while (num > 7.999756f)
            {
                num3++;
                num2 /= 2f;
                num  /= 2f;
            }
            for (i = 0; i < oBJ.Vertices.Count; i++)
            {
                oBJ.Vertices[i] = Vector3.Multiply(oBJ.Vertices[i], num2);
            }
            NSBMD nSBMD = new NSBMD(!has_texture);

            nSBMD.modelSet = new NSBMD.ModelSet();
            string text = Path.GetFileNameWithoutExtension(obj_path);

            if (text.Length > 16)
            {
                text = text.Remove(16);
            }
            nSBMD.modelSet.dict = new Dictionary <NSBMD.ModelSet.MDL0Data>();
            nSBMD.modelSet.dict.Add(text, new NSBMD.ModelSet.MDL0Data());
            nSBMD.modelSet.models                 = new NSBMD.ModelSet.Model[1];
            nSBMD.modelSet.models[0]              = new NSBMD.ModelSet.Model();
            nSBMD.modelSet.models[0].info         = new NSBMD.ModelSet.Model.ModelInfo();
            nSBMD.modelSet.models[0].info.numNode = 1;
            foreach (OBJ.Face face in oBJ.Faces)
            {
                if (!list.Contains(face.MaterialName))
                {
                    list.Add(face.MaterialName);
                }
                nSBMD.modelSet.models[0].info.numTriangle++;
            }
            nSBMD.modelSet.models[0].info.numMat = (byte)list.Count;
            nSBMD.modelSet.models[0].info.numShp = (byte)list.Count;
            nSBMD.modelSet.models[0].info.firstUnusedMtxStackID = 1;
            nSBMD.modelSet.models[0].info.posScale       = 1 << num3;
            nSBMD.modelSet.models[0].info.invPosScale    = 1f / nSBMD.modelSet.models[0].info.posScale;
            nSBMD.modelSet.models[0].info.numVertex      = (byte)oBJ.Vertices.Count;
            nSBMD.modelSet.models[0].info.numPolygon     = (byte)oBJ.Faces.Count;
            nSBMD.modelSet.models[0].info.boxX           = right.X * num2;
            nSBMD.modelSet.models[0].info.boxY           = right.Y * num2;
            nSBMD.modelSet.models[0].info.boxZ           = right.Z * num2;
            nSBMD.modelSet.models[0].info.boxW           = vector.X * num2;
            nSBMD.modelSet.models[0].info.boxH           = vector.Y * num2;
            nSBMD.modelSet.models[0].info.boxD           = vector.Z * num2;
            nSBMD.modelSet.models[0].info.boxPosScale    = 1 << num3;
            nSBMD.modelSet.models[0].info.boxInvPosScale = 1f / nSBMD.modelSet.models[0].info.boxPosScale;
            nSBMD.modelSet.models[0].nodes      = new NSBMD.ModelSet.Model.NodeSet();
            nSBMD.modelSet.models[0].nodes.dict = new Dictionary <NSBMD.ModelSet.Model.NodeSet.NodeSetData>();
            nSBMD.modelSet.models[0].nodes.dict.Add("world_root", new NSBMD.ModelSet.Model.NodeSet.NodeSetData());
            nSBMD.modelSet.models[0].nodes.data                  = new NSBMD.ModelSet.Model.NodeSet.NodeData[1];
            nSBMD.modelSet.models[0].nodes.data[0]               = new NSBMD.ModelSet.Model.NodeSet.NodeData();
            nSBMD.modelSet.models[0].nodes.data[0].flag          = 7;
            nSBMD.modelSet.models[0].materials                   = new NSBMD.ModelSet.Model.MaterialSet();
            nSBMD.modelSet.models[0].materials.dictTexToMatList  = new Dictionary <NSBMD.ModelSet.Model.MaterialSet.TexToMatData>();
            nSBMD.modelSet.models[0].materials.dictPlttToMatList = new Dictionary <NSBMD.ModelSet.Model.MaterialSet.PlttToMatData>();
            nSBMD.modelSet.models[0].materials.dict              = new Dictionary <NSBMD.ModelSet.Model.MaterialSet.MaterialSetData>();
            nSBMD.modelSet.models[0].materials.materials         = new NSBMD.ModelSet.Model.MaterialSet.Material[list.Count];
            i = 0;
            int num4 = 0;

            foreach (string item in list)
            {
                MLT.Material materialByName = mLT.GetMaterialByName(item);
                if (materialByName.DiffuseMap != null)
                {
                    nSBMD.modelSet.models[0].materials.dictTexToMatList.Add(i.ToString() + "_t", new NSBMD.ModelSet.Model.MaterialSet.TexToMatData());
                    nSBMD.modelSet.models[0].materials.dictPlttToMatList.Add(i.ToString() + "_p", new NSBMD.ModelSet.Model.MaterialSet.PlttToMatData());
                    nSBMD.modelSet.models[0].materials.dictTexToMatList[num4].Value.NrMat     = 1;
                    nSBMD.modelSet.models[0].materials.dictTexToMatList[num4].Value.Materials = new int[1]
                    {
                        i
                    };
                    nSBMD.modelSet.models[0].materials.dictPlttToMatList[num4].Value.NrMat     = 1;
                    nSBMD.modelSet.models[0].materials.dictPlttToMatList[num4].Value.Materials = new int[1]
                    {
                        i
                    };
                    num4++;
                }
                nSBMD.modelSet.models[0].materials.dict.Add(i.ToString() + "_m", new NSBMD.ModelSet.Model.MaterialSet.MaterialSetData());
                nSBMD.modelSet.models[0].materials.materials[i]         = new NSBMD.ModelSet.Model.MaterialSet.Material();
                nSBMD.modelSet.models[0].materials.materials[i].diffAmb = (uint)(((Graphic.encodeColor(Color.Black.ToArgb()) & 0x7FFF) << 16) | 0x8000 | (Graphic.encodeColor((materialByName.DiffuseMap != null) ? Color.FromArgb(200, 200, 200).ToArgb() : materialByName.DiffuseColor.ToArgb()) & 0x7FFF));
                nSBMD.modelSet.models[0].materials.materials[i].specEmi = (uint)(((Graphic.encodeColor(Color.Black.ToArgb()) & 0x7FFF) << 16) | (Graphic.encodeColor(Color.Black.ToArgb()) & 0x7FFF));
                uint num5 = (uint)(materialByName.Alpha * 31f);
                nSBMD.modelSet.models[0].materials.materials[i].polyAttr          = 0u;
                nSBMD.modelSet.models[0].materials.materials[i].polyAttr         |= 192u;
                nSBMD.modelSet.models[0].materials.materials[i].polyAttr         |= num5 << 16;
                nSBMD.modelSet.models[0].materials.materials[i].polyAttrMask      = 1059059967u;
                nSBMD.modelSet.models[0].materials.materials[i].texImageParam     = 196608u;
                nSBMD.modelSet.models[0].materials.materials[i].texImageParamMask = uint.MaxValue;
                nSBMD.modelSet.models[0].materials.materials[i].texPlttBase       = 0;
                nSBMD.modelSet.models[0].materials.materials[i].flag = (NSBMD.ModelSet.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_TEXMTX_SCALEONE | NSBMD.ModelSet.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_TEXMTX_ROTZERO | NSBMD.ModelSet.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_TEXMTX_TRANSZERO | NSBMD.ModelSet.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_DIFFUSE | NSBMD.ModelSet.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_AMBIENT | NSBMD.ModelSet.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_VTXCOLOR | NSBMD.ModelSet.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_SPECULAR | NSBMD.ModelSet.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_EMISSION | NSBMD.ModelSet.Model.MaterialSet.Material.NNS_G3D_MATFLAG.NNS_G3D_MATFLAG_SHININESS);
                if (materialByName.DiffuseMap != null)
                {
                    nSBMD.modelSet.models[0].materials.materials[i].origWidth  = (ushort)materialByName.DiffuseMap.Width;
                    nSBMD.modelSet.models[0].materials.materials[i].origHeight = (ushort)materialByName.DiffuseMap.Height;
                }
                nSBMD.modelSet.models[0].materials.materials[i].magW = 1f;
                nSBMD.modelSet.models[0].materials.materials[i].magH = 1f;
                i++;
            }
            nSBMD.modelSet.models[0].shapes       = new NSBMD.ModelSet.Model.ShapeSet();
            nSBMD.modelSet.models[0].shapes.dict  = new Dictionary <NSBMD.ModelSet.Model.ShapeSet.ShapeSetData>();
            nSBMD.modelSet.models[0].shapes.shape = new NSBMD.ModelSet.Model.ShapeSet.Shape[list.Count];
            i = 0;
            foreach (string item2 in list)
            {
                int          num6           = 1;
                int          num7           = 1;
                MLT.Material materialByName = mLT.GetMaterialByName(item2);
                List <Color> list2          = null;
                if (materialByName.DiffuseMap != null)
                {
                    num6 = materialByName.DiffuseMap.Width;
                    num7 = -materialByName.DiffuseMap.Height;
                }
                else
                {
                    list2 = new List <Color>();
                }
                nSBMD.modelSet.models[0].shapes.dict.Add(i.ToString() + "_py", new NSBMD.ModelSet.Model.ShapeSet.ShapeSetData());
                List <Vector3> list3 = new List <Vector3>();
                List <Vector2> list4 = new List <Vector2>();
                List <Vector3> list5 = new List <Vector3>();
                foreach (OBJ.Face face2 in oBJ.Faces)
                {
                    if (face2.MaterialName == item2)
                    {
                        list3.AddRange(new Vector3[3]
                        {
                            oBJ.Vertices[face2.VertexIndieces[0]],
                            oBJ.Vertices[face2.VertexIndieces[1]],
                            oBJ.Vertices[face2.VertexIndieces[2]]
                        });
                        Vector2[] array = new Vector2[3]
                        {
                            oBJ.TexCoords[face2.TexCoordIndieces[0]],
                            oBJ.TexCoords[face2.TexCoordIndieces[1]],
                            oBJ.TexCoords[face2.TexCoordIndieces[2]]
                        };
                        array[0].X *= num6;
                        array[0].Y *= num7;
                        array[1].X *= num6;
                        array[1].Y *= num7;
                        array[2].X *= num6;
                        array[2].Y *= num7;
                        list4.AddRange(array);
                        if (face2.NormalIndieces.Count != 0)
                        {
                            list5.AddRange(new Vector3[3]
                            {
                                oBJ.Normals[face2.NormalIndieces[0]],
                                oBJ.Normals[face2.NormalIndieces[1]],
                                oBJ.Normals[face2.NormalIndieces[2]]
                            });
                        }
                        list2?.AddRange(new Color[3]
                        {
                            materialByName.DiffuseColor,
                            materialByName.DiffuseColor,
                            materialByName.DiffuseColor
                        });
                    }
                }
                nSBMD.modelSet.models[0].shapes.shape[i]        = new NSBMD.ModelSet.Model.ShapeSet.Shape();
                nSBMD.modelSet.models[0].shapes.shape[i].DL     = GlNitro.GenerateDl(list3.ToArray(), list4.ToArray(), list5.ToArray(), list2?.ToArray());
                nSBMD.modelSet.models[0].shapes.shape[i].sizeDL = (uint)nSBMD.modelSet.models[0].shapes.shape[i].DL.Length;
                nSBMD.modelSet.models[0].shapes.shape[i].flag   = (NSBMD.ModelSet.Model.ShapeSet.Shape.NNS_G3D_SHPFLAG.NNS_G3D_SHPFLAG_USE_NORMAL | NSBMD.ModelSet.Model.ShapeSet.Shape.NNS_G3D_SHPFLAG.NNS_G3D_SHPFLAG_USE_COLOR | NSBMD.ModelSet.Model.ShapeSet.Shape.NNS_G3D_SHPFLAG.NNS_G3D_SHPFLAG_USE_TEXCOORD);
                i++;
            }
            var sBCWriter = new Obj2Nsbmd.SBCWriter();

            sBCWriter.NODEDESC(0, 0, S: false, P: false, 0);
            sBCWriter.NODE(0, V: true);
            sBCWriter.POSSCALE(OPT: true);
            for (i = 0; i < list.Count; i++)
            {
                sBCWriter.MAT((byte)i);
                sBCWriter.SHP((byte)i);
            }
            sBCWriter.POSSCALE(OPT: false);
            sBCWriter.RET();
            sBCWriter.NOP();
            nSBMD.modelSet.models[0].sbc = sBCWriter.GetData();
            NSBTX.TexplttSet texplttSet = new NSBTX.TexplttSet();
            texplttSet.TexInfo    = new NSBTX.TexplttSet.texInfo();
            texplttSet.Tex4x4Info = new NSBTX.TexplttSet.tex4x4Info();
            texplttSet.PlttInfo   = new NSBTX.TexplttSet.plttInfo();
            texplttSet.dictTex    = new Dictionary <NSBTX.TexplttSet.DictTexData>();
            texplttSet.dictPltt   = new Dictionary <NSBTX.TexplttSet.DictPlttData>();
            i    = 0;
            num4 = 0;
            foreach (string item3 in list)
            {
                MLT.Material materialByName = mLT.GetMaterialByName(item3);
                if (materialByName.DiffuseMap != null)
                {
                    BitmapData   bitmapData = materialByName.DiffuseMap.LockBits(new Rectangle(0, 0, materialByName.DiffuseMap.Width, materialByName.DiffuseMap.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
                    List <Color> list6      = new List <Color>();
                    bool         flag       = false;
                    for (int j = 0; j < materialByName.DiffuseMap.Width * materialByName.DiffuseMap.Height; j++)
                    {
                        list6.Add(Color.FromArgb(Marshal.ReadInt32(bitmapData.Scan0, j * 4)));
                        if (list6.Last().A != 0 && list6.Last().A != byte.MaxValue && !flag)
                        {
                            flag = true;
                        }
                    }
                    materialByName.DiffuseMap.UnlockBits(bitmapData);
                    list6 = list6.Distinct().ToList();
                    texplttSet.dictTex.Add(i.ToString() + "_t", new NSBTX.TexplttSet.DictTexData());
                    texplttSet.dictPltt.Add(i.ToString() + "_p", new NSBTX.TexplttSet.DictPlttData());
                    texplttSet.dictTex[num4].Value.S = (ushort)materialByName.DiffuseMap.Width;
                    texplttSet.dictTex[num4].Value.T = (ushort)materialByName.DiffuseMap.Height;
                    if (flag && list6.Count <= 8)
                    {
                        texplttSet.dictTex[num4].Value.Fmt = Graphic.GXTexFmt.GX_TEXFMT_A5I3;
                    }
                    else if (flag)
                    {
                        texplttSet.dictTex[num4].Value.Fmt = Graphic.GXTexFmt.GX_TEXFMT_A3I5;
                    }
                    else if (list6.Count <= 16)
                    {
                        texplttSet.dictTex[num4].Value.Fmt = Graphic.GXTexFmt.GX_TEXFMT_PLTT16;
                    }
                    else
                    {
                        texplttSet.dictTex[num4].Value.Fmt = Graphic.GXTexFmt.GX_TEXFMT_COMP4x4;
                    }
                    Graphic.ConvertBitmap(materialByName.DiffuseMap, out texplttSet.dictTex[num4].Value.Data, out texplttSet.dictPltt[num4].Value.Data, out texplttSet.dictTex[num4].Value.Data4x4, texplttSet.dictTex[num4].Value.Fmt, Graphic.NNSG2dCharacterFmt.NNS_G2D_CHARACTER_FMT_BMP, out texplttSet.dictTex[num4].Value.TransparentColor);
                    num4++;
                }
                i++;
            }
            nsbtx = null;
            if (!has_texture)
            {
                nSBMD.TexPlttSet = texplttSet;
            }
            else
            {
                var nSBTX = new NSBTX
                {
                    TexPlttSet = texplttSet
                };
                nsbtx = nSBTX.Write();
            }
            nsbmd = nSBMD.Write();
        }