#include "load3ds.h" #include "../punkt3d.h" Load3ds::Load3ds(std::string _fname, bool _parse) { filename = _fname; parsed = false; error = false; // if(_parse) // parse(); } bool Load3ds::parse(Model *m) { if(parsed) unload(); std::ifstream mfile(filename.c_str(), std::ios::binary); if(!mfile) { return false; } unsigned short ident; unsigned int len; bool modelloaded = false; bool materialloaded = false; Material mat; ModelObject modobj; m->clear(); while(!mfile.eof()) { ident = len = 0; mfile.read((char *)&ident, 2); mfile.read((char *)&len, 4); std::cout << "Chunk: 0x" << std::hex << ident << " (" << std::dec << len << ")" << std::endl; switch(ident) { case 0x4d4d: // Main Chunk break; case 0x3d3d: // 3D Editor Chunk break; case 0x4000: { if(modelloaded) { modobj.calcNormales(); m->addObject(modobj); modobj.clear(); } modelloaded = true; // std::cout << "namechunk" << std::endl; std::string name; char c; do { mfile.read(&c, 1); name += c; } while(c!=0); std::cout << "Name: " << name << std::endl; modobj.name = name; } break; case 0x4100: break; case 0x4110:{ unsigned short panz; Punkt3D p; mfile.read((char*)&panz, 2); // std::cout << "\t\t\tVertexanz: " << panz << std::endl; glBegin(GL_LINE_LOOP); for(unsigned int i=0; ifindMaterial(name); std::cout << "Mat Name: " << name << std::endl; unsigned short panz, tp; mfile.read((char*)&panz, 2); mfile.ignore(panz*2); // for(unsigned int i=0; i " << tp << std::endl; // } } break; case 0x4140: { unsigned short panz; Punkt2D p; mfile.read((char*)&panz, 2); // std::cout << "\t\t\tUV-Anz: " << panz << std::endl; for(unsigned int i=0; iaddMaterial(mat); mat.clear(); } materialloaded = true; std::string name; char c; do { mfile.read(&c, 1); name += c; } while(c!=0); mat.name = name; std::cout << "Mat Name: " << name << std::endl; } break; case 0xa010: { GLColor col; col = readColorChunk(&mfile); mat.ambient = col; std::cout << col.r << ", " << col.g << ", " << col.b << std::endl; } break; case 0xa020: { GLColor col; col = readColorChunk(&mfile); mat.diffuse = col; std::cout << col.r << ", " << col.g << ", " << col.b << std::endl; } break; case 0xa030: { GLColor col; col = readColorChunk(&mfile); mat.specular = col; std::cout << col.r << ", " << col.g << ", " << col.b << std::endl; } break; default: //Switch Chunk // std::cout << "einfach ignorieren..." << std::endl; mfile.ignore(len-6); // std::cout << "moep" << std::endl; break; } } if(materialloaded) m->addMaterial(mat); if(modelloaded) { modobj.calcNormales(); // modobj.mat = m->findMaterial(modobj.getName()); m->addObject(modobj); } std::cout << "Ende Load" << std::endl; mfile.close(); return true; } GLColor Load3ds::readColorChunk(std::ifstream *file) { GLColor col; unsigned short id, tp; unsigned int clen; file->read((char*)&id, 2); // Color, warscheinlich nur bytes, wenn nich implementiere funktion file->read((char*)&clen, 4); // len, gleiches wie oben switch(id) { case 0x11: file->read((char*)&tp, 1); col.r = tp/255.0f; file->read((char*)&tp, 1); col.g = tp/255.0f; file->read((char*)&tp, 1); col.b = tp/255.0f; break; default: file->ignore(clen-6); break; } return col; } void Load3ds::unload() { parsed = false; error = false; }