public bool Export() { var nsbmd = new NSBMD(NSBMD); if (nsbmd == null) { return(false); } if (HasTexture) { var nsbtx = new NSBTX(NSBTX); if (nsbtx == null) { return(false); } nsbmd.TexPlttSet = nsbtx.TexPlttSet; } var path = IOPath.Combine(Utils.PrepareTempDirectory(), "model.obj"); GlNitro.glNitroBindTextures(nsbmd, 1); nsbmd.modelSet.models[0].ExportMesh(nsbmd.TexPlttSet, path, "PNG"); Path = path; return(true); }
public MTX44 GetMatrix() { MTX44 mtX44 = new MTX44(); return((MTX44)GlNitro.glNitroPivot(new float[2] { this.A, this.B }, (int)this.info & 15, (int)this.info >> 4 & 15)); }
public static void glNitroBindTextures(HBDF.TEXSBlock b, int offset) { int num = 0; foreach (HBDF.TEXSBlock.TEXOBlock texoBlock in b.TEXOBlocks) { if (texoBlock.PalName != null) { GlNitro.glNitroTexImage2D(b.GetIMGOByName(texoBlock.TexName.Name).ToBitmap(b.GetPLTOByName(texoBlock.PalName.Name)), num + offset, 10496, 9728); } else { GlNitro.glNitroTexImage2D(b.GetIMGOByName(texoBlock.TexName.Name).ToBitmap((HBDF.TEXSBlock.PLTOBlock)null), num + offset, 10496, 9728); } ++num; } }
public void Render(BCA Bca, int BcaFrame) { bool flag1 = Bca != null; Matrix4[] matrix4Array = (Matrix4[])null; if (flag1) { matrix4Array = Bca.GetMatrices(this.Bones, BcaFrame, (int)this.Header.PosScale); } int num1 = 0; while (true) { GlNitro.Nitro3DContext Context = new GlNitro.Nitro3DContext(); foreach (BMD.BMDBone bone in this.Bones) { for (int index1 = 0; (long)index1 < (long)bone.NrDLMatPairs; ++index1) { BMD.BMDMaterial material = this.Materials[(int)bone.PolyMat.Values.ToArray <byte>()[index1]]; BMD.BMDDisplayList displayList = this.DisplayLists[(int)bone.PolyMat.Keys.ToArray <byte>()[index1]]; byte num2 = bone.PolyMat.Values.ToArray <byte>()[index1]; bool flag2; if (material.TexID != -1 && this.Textures[material.TexID].Fmt != Graphic.GXTexFmt.GX_TEXFMT_NONE) { flag2 = true; if ((this.Textures[material.TexID].Fmt == Graphic.GXTexFmt.GX_TEXFMT_A3I5 || this.Textures[material.TexID].Fmt == Graphic.GXTexFmt.GX_TEXFMT_A5I3 || ((int)(material.polyAttr >> 16) & 31) != 31) && num1 != 1) { flag2 = false; } if ((this.Textures[material.TexID].Fmt == Graphic.GXTexFmt.GX_TEXFMT_NONE || this.Textures[material.TexID].Fmt == Graphic.GXTexFmt.GX_TEXFMT_PLTT4 || (this.Textures[material.TexID].Fmt == Graphic.GXTexFmt.GX_TEXFMT_PLTT16 || this.Textures[material.TexID].Fmt == Graphic.GXTexFmt.GX_TEXFMT_PLTT256) || (this.Textures[material.TexID].Fmt == Graphic.GXTexFmt.GX_TEXFMT_COMP4x4 || this.Textures[material.TexID].Fmt == Graphic.GXTexFmt.GX_TEXFMT_DIRECT)) && ((int)(material.polyAttr >> 16) & 31) == 31 && num1 != 0) { flag2 = false; } } else { flag2 = true; } if (flag2) { Gl.glBindTexture(3553, (int)num2 + 1); Gl.glMatrixMode(5890); if (material.TexID == -1) { Gl.glLoadIdentity(); } else { Gl.glLoadMatrixf(material.GetMatrix((int)this.Textures[material.TexID].S, (int)this.Textures[material.TexID].T)); } Gl.glEnable(3008); Gl.glAlphaFunc(516, 0.0f); Context.LightEnabled[0] = ((int)material.polyAttr & 1) == 1; Context.LightEnabled[1] = ((int)(material.polyAttr >> 1) & 1) == 1; Context.LightEnabled[2] = ((int)(material.polyAttr >> 2) & 1) == 1; Context.LightEnabled[3] = ((int)(material.polyAttr >> 3) & 1) == 1; Color color1 = Graphic.ConvertABGR1555((short)((int)material.diffAmb & (int)short.MaxValue)); Color color2 = Graphic.ConvertABGR1555((short)((int)(material.diffAmb >> 16) & (int)short.MaxValue)); Context.DiffuseColor = color1; Context.AmbientColor = color2; Color color3 = Graphic.ConvertABGR1555((short)((int)material.specEmi & (int)short.MaxValue)); Color color4 = Graphic.ConvertABGR1555((short)((int)(material.specEmi >> 16) & (int)short.MaxValue)); Context.SpecularColor = color3; Context.EmissionColor = color4; switch (material.polyAttr >> 14 & 1U) { case 0: Gl.glDepthFunc(513); break; case 1: Gl.glDepthFunc(514); break; } int num3 = -1; switch (material.polyAttr >> 4 & 3U) { case 0: num3 = 8448; break; case 1: num3 = 8449; break; case 2: num3 = 8448; break; case 3: num3 = 8448; break; } Gl.glTexEnvi(8960, 8704, num3); Context.Alpha = (int)(material.polyAttr >> 16) & 31; if (((int)(material.diffAmb >> 15) & 1) == 1) { Gl.glColor4f((float)color1.R / (float)byte.MaxValue, (float)color1.G / (float)byte.MaxValue, (float)color1.B / (float)byte.MaxValue, (float)Context.Alpha / 31f); } else { Gl.glColor4f(0.0f, 0.0f, 0.0f, (float)Context.Alpha / 31f); } Context.UseSpecularReflectionTable = ((int)(material.specEmi >> 15) & 1) == 1; int mode = -1; switch (material.polyAttr >> 6 & 3U) { case 0: mode = 1032; break; case 1: mode = 1028; break; case 2: mode = 1029; break; case 3: mode = 0; break; } Gl.glCullFace(mode); Gl.glMatrixMode(5888); Gl.glDisable(3168); Gl.glDisable(3169); } MTX44[] mtX44Array = new MTX44[31]; int index2 = 0; foreach (ushort boneId in displayList.DL.BoneIDs) { if (!flag1) { mtX44Array[index2] = (MTX44)this.Bones[(int)boneId].GetMatrix(); ++index2; } else { mtX44Array[index2] = this.Matrix4ToMTX44(matrix4Array[(int)boneId]); ++index2; } } Context.MatrixStack = mtX44Array; if (flag2) { GlNitro.glNitroGx(displayList.DL.Data, new MTX44(), ref Context, (int)this.Header.PosScale, false); Gl.glEnd(); } } } if (num1 == 0) { ++num1; } else { break; } } }
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;
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(); }