/** * Import **/ public bool ImportFromFile(string filename) { //Try to open & read the file. try { //Open file in a binary reader. BinaryReader b = new BinaryReader(File.Open(filename, FileMode.Open)); //Varify TMD File. uint mN = b.ReadUInt32(); if (mN != 0x00000041) { //File is wrong, close buffer and throw exception. b.Close(); throw new Exception("Not a TMD file!"); } //Read Header uint flags = b.ReadUInt32(); uint nObj = b.ReadUInt32(); //Print Header [Debug] Console.WriteLine("TMDFile -> Starting Import..."); Console.WriteLine(" ID: " + mN.ToString()); Console.WriteLine(" Flags: " + flags.ToString()); Console.WriteLine(" NumObj: " + nObj.ToString()); //Read Object Table Console.WriteLine(); Console.WriteLine("TMDFile -> Reading Object Table..."); TMDOBJ[] obj = new TMDOBJ[nObj]; for (uint i = 0; i < nObj; ++i) { obj[i].vert_top = b.ReadUInt32(); obj[i].n_vert = b.ReadUInt32(); obj[i].normal_top = b.ReadUInt32(); obj[i].n_normal = b.ReadUInt32(); obj[i].primitive_top = b.ReadUInt32(); obj[i].n_primitive = b.ReadUInt32(); obj[i].scale = b.ReadInt32(); Console.WriteLine("TMDFile -> Object Index [" + i.ToString() + "] {"); Console.WriteLine(" Vertex Number: " + obj[i].n_vert.ToString()); Console.WriteLine(" Normal Number: " + obj[i].n_normal.ToString()); Console.WriteLine(" Primitive Number: " + obj[i].n_primitive.ToString()); Console.WriteLine("}"); } Console.WriteLine("TMDFile -> Done."); Console.WriteLine(); Console.WriteLine("TMDFile -> Reading Objects."); //Read Objects uint seek; for (uint i = 0; i < nObj; ++i) { ISimpleMesh tObj = new ISimpleMesh(); //Relative or direct seek? seek = (uint)((flags == 0) ? 0x0C : 0x00); //Read Vertices b.BaseStream.Seek(seek + obj[i].vert_top, SeekOrigin.Begin); for (uint j = 0; j < obj[i].n_vert; ++j) { float x = (float)b.ReadInt16() * 0.01f; float y = (float)b.ReadInt16() * 0.01f; float z = (float)b.ReadInt16() * 0.01f; b.ReadInt16(); tObj.VertexAdd(x, y, z); } //Read Normals b.BaseStream.Seek(seek + obj[i].normal_top, SeekOrigin.Begin); for (uint j = 0; j < obj[i].n_normal; ++j) { float nx = (float)b.ReadInt16() / 4096.0f; float ny = (float)b.ReadInt16() / 4096.0f; float nz = (float)b.ReadInt16() / 4096.0f; b.ReadInt16(); tObj.NormalAdd(nx, ny, nz); } //Read Primitives b.BaseStream.Seek(seek + obj[i].primitive_top, SeekOrigin.Begin); for (uint j = 0; j < obj[i].n_primitive; ++j) { //Read Primitive ID uint primID = b.ReadUInt32(); Primitive prim; float u0 = 0, v0 = 0, u1 = 0, v1 = 0, u2 = 0, v2 = 0, u3 = 0, v3 = 0; ushort nInd0, nInd1, nInd2, nInd3; ushort vInd0, vInd1, vInd2, vInd3; byte r0 = 255, g0 = 255, b0 = 255, r1 = 255, g1 = 255, b1 = 255, r2 = 255, g2 = 255, b2 = 255, r3 = 255, g3 = 255, b3 = 255; byte alpha = 255; switch (primID) { case 536871684: //3-POINT, FLAT, SOLID-COLOUR Console.WriteLine(" Reading Primitive: 3-POINT, FLAT, SOLID-COLOUR"); r0 = b.ReadByte(); g0 = b.ReadByte(); b0 = b.ReadByte(); b.ReadByte(); //Read indices nInd0 = b.ReadUInt16(); vInd0 = b.ReadUInt16(); vInd1 = b.ReadUInt16(); vInd2 = b.ReadUInt16(); prim = new Primitive(vInd0, vInd1, vInd2); prim.AddColour(r0, g0, b0); prim.AddColour(r0, g0, b0); prim.AddColour(r0, g0, b0); prim.AddNormal(nInd0); prim.AddNormal(nInd0); prim.AddNormal(nInd0); prim.AddTexcoord(0, 0); prim.AddTexcoord(0, 0); prim.AddTexcoord(0, 0); prim.SetAlpha(alpha); break; case 805307398: //3-POINT, SHADED, SOLID-COLOUR Console.WriteLine(" Reading Primitive: 3-POINT, SHADED, SOLID-COLOUR"); r0 = b.ReadByte(); g0 = b.ReadByte(); b0 = b.ReadByte(); b.ReadByte(); //Read indices nInd0 = b.ReadUInt16(); vInd0 = b.ReadUInt16(); nInd1 = b.ReadUInt16(); vInd1 = b.ReadUInt16(); nInd2 = b.ReadUInt16(); vInd2 = b.ReadUInt16(); prim = new Primitive(vInd0, vInd1, vInd2); prim.AddColour(r0, g0, b0); prim.AddColour(r0, g0, b0); prim.AddColour(r0, g0, b0); prim.AddNormal(nInd0); prim.AddNormal(nInd1); prim.AddNormal(nInd2); prim.AddTexcoord(0, 0); prim.AddTexcoord(0, 0); prim.AddTexcoord(0, 0); prim.SetAlpha(alpha); break; case 637535495: //3-POINT, FLAT, TEXTURE, SEMI-TRANSPARENT case 603981063: //3-POINT, FLAT, TEXTURE Console.WriteLine(" Reading Primitive: 3-POINT, FLAT, TEXTURE"); //Read Primitive Texture Data. u0 = (float)b.ReadByte() / 255.0f; v0 = (float)b.ReadByte() / 255.0f; b.ReadUInt16(); u1 = (float)b.ReadByte() / 255.0f; v1 = (float)b.ReadByte() / 255.0f; b.ReadUInt16(); u2 = (float)b.ReadByte() / 255.0f; v2 = (float)b.ReadByte() / 255.0f; b.ReadUInt16(); //Read Indices nInd0 = b.ReadUInt16(); vInd0 = b.ReadUInt16(); vInd1 = b.ReadUInt16(); vInd2 = b.ReadUInt16(); //Build primitive prim = new Primitive(vInd0, vInd1, vInd2); prim.AddColour(r0, g0, b0); prim.AddColour(r0, g0, b0); prim.AddColour(r0, g0, b0); prim.AddNormal(nInd0); prim.AddNormal(nInd0); prim.AddNormal(nInd0); prim.AddTexcoord(u0, v0); prim.AddTexcoord(u1, v1); prim.AddTexcoord(u2, v2); prim.SetAlpha(alpha); break; case 905971209: //3-POINT, SHADED, TEXTURE, SEMI-TRANSPARENT case 872416777: //3-POINT, SHADED, TEXTURE Console.WriteLine(" Reading Primitive: 3-POINT, SHADED, TEXTURE"); //Read Primitive Texture Data. u0 = (float)b.ReadByte() / 255.0f; v0 = (float)b.ReadByte() / 255.0f; b.ReadUInt16(); u1 = (float)b.ReadByte() / 255.0f; v1 = (float)b.ReadByte() / 255.0f; b.ReadUInt16(); u2 = (float)b.ReadByte() / 255.0f; v2 = (float)b.ReadByte() / 255.0f; b.ReadUInt16(); //Read Indices nInd0 = b.ReadUInt16(); vInd0 = b.ReadUInt16(); nInd1 = b.ReadUInt16(); vInd1 = b.ReadUInt16(); nInd2 = b.ReadUInt16(); vInd2 = b.ReadUInt16(); prim = new Primitive(vInd0, vInd1, vInd2); prim.AddColour(r0, g0, b0); prim.AddColour(r0, g0, b0); prim.AddColour(r0, g0, b0); prim.AddNormal(nInd0); prim.AddNormal(nInd1); prim.AddNormal(nInd2); prim.AddTexcoord(u0, v0); prim.AddTexcoord(u1, v1); prim.AddTexcoord(u2, v2); prim.SetAlpha(alpha); break; default: throw new Exception("Unknown Primitive ID: " + primID.ToString()); } tObj.PrimitiveAdd(prim); } //Add Mesh to Mesh array. pMesh.Add(tObj); } Console.WriteLine("TMDFile -> Done."); } catch (Exception e) { Console.WriteLine(e.Message); return(false); } Console.WriteLine(); Console.WriteLine("TMDFile -> Finished Import."); return(true); }