cooles update, funtzt mehr, materialien noch nich ganz
This commit is contained in:
		
							parent
							
								
									4db04f28c7
								
							
						
					
					
						commit
						a853e102eb
					
				| 
						 | 
				
			
			@ -22,25 +22,25 @@ bool Load3ds::parse(Model *m) {
 | 
			
		|||
	
 | 
			
		||||
	unsigned short ident;
 | 
			
		||||
	unsigned int len;
 | 
			
		||||
	
 | 
			
		||||
	bool modelloaded = false;
 | 
			
		||||
	bool materialloaded = false;
 | 
			
		||||
	
 | 
			
		||||
	Material mat;
 | 
			
		||||
	ModelObject modobj;
 | 
			
		||||
	m->clear();
 | 
			
		||||
	std::cout << "size: " << sizeof(int) << std::endl;
 | 
			
		||||
	while(!mfile.eof()) {
 | 
			
		||||
		ident = len = 0;
 | 
			
		||||
		mfile.read((char *)&ident, 2);
 | 
			
		||||
		mfile.read((char *)&len, 4);
 | 
			
		||||
// 		mfile.read((char *)&m, 1);
 | 
			
		||||
// 		mfile.read((char *)&n, 1);
 | 
			
		||||
 | 
			
		||||
		std::cout << "Chunk: 0x" << std::hex << ident << " (" << std::dec << len << ")" << std::endl;
 | 
			
		||||
		switch(ident) {
 | 
			
		||||
			case 0x4d4d:
 | 
			
		||||
				// Main Chunk
 | 
			
		||||
				std::cout << "yeah!" << std::endl;
 | 
			
		||||
			break;
 | 
			
		||||
			case 0x3d3d:
 | 
			
		||||
				// 3D Editor Chunk
 | 
			
		||||
				std::cout << "editorchunk" << std::endl;
 | 
			
		||||
			break;
 | 
			
		||||
			case 0x4000:
 | 
			
		||||
			{
 | 
			
		||||
| 
						 | 
				
			
			@ -50,7 +50,7 @@ bool Load3ds::parse(Model *m) {
 | 
			
		|||
					modobj.clear();
 | 
			
		||||
				}
 | 
			
		||||
				modelloaded = true;
 | 
			
		||||
				std::cout << "namechunk" << std::endl;
 | 
			
		||||
// 				std::cout << "namechunk" << std::endl;
 | 
			
		||||
				std::string name;
 | 
			
		||||
				char c;
 | 
			
		||||
				do {
 | 
			
		||||
| 
						 | 
				
			
			@ -67,6 +67,7 @@ bool Load3ds::parse(Model *m) {
 | 
			
		|||
				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; i<panz; i++) {
 | 
			
		||||
					mfile.read((char*)&p.x, sizeof(float));
 | 
			
		||||
| 
						 | 
				
			
			@ -84,6 +85,7 @@ bool Load3ds::parse(Model *m) {
 | 
			
		|||
				unsigned short panz, tp;
 | 
			
		||||
				Punkt3D p;
 | 
			
		||||
				mfile.read((char*)&panz, 2);
 | 
			
		||||
// 				std::cout << "\t\t\tPolygonanz: " << panz << std::endl;
 | 
			
		||||
				for(unsigned int i=0; i<panz; i++) {
 | 
			
		||||
					mfile.read((char*)&tp, 2);
 | 
			
		||||
					p.x = tp;
 | 
			
		||||
| 
						 | 
				
			
			@ -91,16 +93,40 @@ bool Load3ds::parse(Model *m) {
 | 
			
		|||
					p.y = tp;
 | 
			
		||||
					mfile.read((char*)&tp, 2);
 | 
			
		||||
					p.z = tp;
 | 
			
		||||
					p.print("Polygon");
 | 
			
		||||
					mfile.read((char*)&tp, 2);
 | 
			
		||||
					tp; // flags
 | 
			
		||||
// 					p.print("Polygon");
 | 
			
		||||
					modobj.polygon.push_back(p);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
			// Komischer Chunk, ein haufen Zahlen sind sich selber zugewiesen
 | 
			
		||||
 | 
			
		||||
			case 0x4130:
 | 
			
		||||
			{
 | 
			
		||||
				std::string name;
 | 
			
		||||
				char c;
 | 
			
		||||
				do {
 | 
			
		||||
					mfile.read(&c, 1);
 | 
			
		||||
					name += c;
 | 
			
		||||
				} while(c!=0);
 | 
			
		||||
				modobj.mat = m->findMaterial(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<panz; i++) {
 | 
			
		||||
// 					mfile.read((char*)&tp, 2);
 | 
			
		||||
// 					std::cout << 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; i<panz; i++) {
 | 
			
		||||
					mfile.read((char*)&p.x, sizeof(float));
 | 
			
		||||
					mfile.read((char*)&p.y, sizeof(float));
 | 
			
		||||
| 
						 | 
				
			
			@ -108,25 +134,94 @@ bool Load3ds::parse(Model *m) {
 | 
			
		|||
				}
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
			case 0xafff:
 | 
			
		||||
				// Materialchunk
 | 
			
		||||
			break;
 | 
			
		||||
			case 0xa000:
 | 
			
		||||
			{
 | 
			
		||||
				if(materialloaded) {
 | 
			
		||||
					m->addMaterial(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;
 | 
			
		||||
// 				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);
 | 
			
		||||
		modobj.clear();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,6 +6,7 @@
 | 
			
		|||
#include <string>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include "model.h"
 | 
			
		||||
#include "../glcolor.h"
 | 
			
		||||
 | 
			
		||||
class Chunk {
 | 
			
		||||
	private:
 | 
			
		||||
| 
						 | 
				
			
			@ -24,6 +25,8 @@ class Load3ds {
 | 
			
		|||
		
 | 
			
		||||
		bool parsed;
 | 
			
		||||
		bool error;
 | 
			
		||||
		
 | 
			
		||||
		GLColor readColorChunk(std::ifstream *file);
 | 
			
		||||
	public:
 | 
			
		||||
		Load3ds(std::string _fname, bool parse=true);
 | 
			
		||||
		
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,35 +13,70 @@ void ModelObject::clear() {
 | 
			
		|||
 | 
			
		||||
void ModelObject::calcNormales() {
 | 
			
		||||
	normal.clear();
 | 
			
		||||
	Punkt3D a, b;
 | 
			
		||||
	Punkt3D a, b, c;
 | 
			
		||||
	for(unsigned int i=0; i<polygon.size(); i++) {
 | 
			
		||||
		a = vertex.at((unsigned short)polygon[i].x) - vertex.at((unsigned short)polygon[i].z);
 | 
			
		||||
		b = vertex.at((unsigned short)polygon[i].y) - vertex.at((unsigned short)polygon[i].z);
 | 
			
		||||
		normal.push_back(a.kreuzprodukt(b));
 | 
			
		||||
		c = a.kreuzprodukt(b);
 | 
			
		||||
		c.normalize();
 | 
			
		||||
		normal.push_back(c);
 | 
			
		||||
// 		c.print("Normale");
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ModelObject::render() {
 | 
			
		||||
	std::cout << "render " << name << std::endl;
 | 
			
		||||
// 	std::cout << "render " << name << " mit " << polygon.size()<< std::endl;
 | 
			
		||||
// 	std::cout << "Vertex: " << vertex.size() << std::endl;
 | 
			
		||||
	glBegin(GL_TRIANGLES);
 | 
			
		||||
		for(unsigned int i=0; i<polygon.size(); i++) {
 | 
			
		||||
	// 		glNormal3f(normal.at(    (unsigned short)polygon[i].x));
 | 
			
		||||
	// 		glTexCoord2f(mapcoord.at((unsigned short)polygon[i].x));
 | 
			
		||||
// 			std::cout << "whee nr " <<i << std::endl;
 | 
			
		||||
// 			polygon[i].print();
 | 
			
		||||
// 			std::cout << "Stat: " << polygon.size() << " " << vertex.size() << " " << mapcoord.size() << " " << normal.size() << std::endl;
 | 
			
		||||
// 			glNormal3f(normal.at(    (unsigned short)polygon[i].x));
 | 
			
		||||
// 			glColor3f(mat.diffuse.r, mat.diffuse.g, mat.diffuse.b);
 | 
			
		||||
			glColorGLC(mat.ambient);
 | 
			
		||||
// 			std::cout << mat.ambient.r << ", " << mat.ambient.g << ", " << mat.ambient.b << std::endl;
 | 
			
		||||
 | 
			
		||||
			glNormal3f(normal.at(i));
 | 
			
		||||
				
 | 
			
		||||
			glTexCoord2f(mapcoord.at((unsigned short)polygon[i].x));
 | 
			
		||||
			glVertex3f(vertex.at(    (unsigned short)polygon[i].x));
 | 
			
		||||
			
 | 
			
		||||
	// 		glNormal3f(normal.at(    (unsigned short)polygon[i].y));
 | 
			
		||||
	// 		glTexCoord2f(mapcoord.at((unsigned short)polygon[i].y));
 | 
			
		||||
 | 
			
		||||
			glTexCoord2f(mapcoord.at((unsigned short)polygon[i].y));
 | 
			
		||||
			glVertex3f(vertex.at(    (unsigned short)polygon[i].y));
 | 
			
		||||
	
 | 
			
		||||
	// 		glNormal3f(normal.at(    (unsigned short)polygon[i].z));
 | 
			
		||||
	// 		glTexCoord2f(mapcoord.at((unsigned short)polygon[i].z));
 | 
			
		||||
 | 
			
		||||
			glTexCoord2f(mapcoord.at((unsigned short)polygon[i].z));
 | 
			
		||||
			glVertex3f(vertex.at(    (unsigned short)polygon[i].z));
 | 
			
		||||
			vertex.at(    (unsigned short)polygon[i].x).print();
 | 
			
		||||
// 			vertex.at(    (unsigned short)polygon[i].x).print();
 | 
			
		||||
		}
 | 
			
		||||
	glEnd();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string ModelObject::getName() {
 | 
			
		||||
	return name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Material::Material() {
 | 
			
		||||
	clear();
 | 
			
		||||
}
 | 
			
		||||
		
 | 
			
		||||
void Material::clear() {
 | 
			
		||||
	name = "";
 | 
			
		||||
		
 | 
			
		||||
	ambient.set(0.0f, 0.0f, 0.0f);
 | 
			
		||||
	diffuse.set(0.0f, 0.0f, 0.0f);
 | 
			
		||||
	specular.set(0.0f, 0.0f, 0.0f);
 | 
			
		||||
	percent = 0.0f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string Material::getName() {
 | 
			
		||||
	return name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Model::Model() {
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -55,7 +90,21 @@ void Model::addObject(ModelObject c) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
void Model::render() {
 | 
			
		||||
	std::cout << "Render Model " << objects.size() << std::endl;
 | 
			
		||||
// 	std::cout << "Render Model " << objects.size() << std::endl;
 | 
			
		||||
	for(unsigned int i=0; i<objects.size(); i++) 
 | 
			
		||||
		objects[i].render();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Model::addMaterial(Material m) {
 | 
			
		||||
	materials.push_back(m);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Material Model::findMaterial(std::string name) {
 | 
			
		||||
	for(unsigned int i=0; i<materials.size(); i++) {
 | 
			
		||||
		if(name==materials[i].getName()) {
 | 
			
		||||
			std::cout<<"found!"<<std::endl;
 | 
			
		||||
			return materials[i];
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return Material();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,8 +6,28 @@
 | 
			
		|||
#include "../punkt2d.h"
 | 
			
		||||
#include "../punkt3d.h"
 | 
			
		||||
#include "../gltexture.h"
 | 
			
		||||
#include "../glcolor.h"
 | 
			
		||||
// #include "load3ds.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Material {
 | 
			
		||||
	friend class Load3ds;
 | 
			
		||||
	friend class ModelObject;
 | 
			
		||||
	private:
 | 
			
		||||
		std::string name;
 | 
			
		||||
		
 | 
			
		||||
		GLColor ambient;
 | 
			
		||||
		GLColor diffuse;
 | 
			
		||||
		GLColor specular;
 | 
			
		||||
		float percent;
 | 
			
		||||
	public:
 | 
			
		||||
		Material();
 | 
			
		||||
		
 | 
			
		||||
		void clear();
 | 
			
		||||
		std::string getName();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ModelObject {
 | 
			
		||||
	friend class Load3ds;
 | 
			
		||||
	private:
 | 
			
		||||
| 
						 | 
				
			
			@ -17,9 +37,12 @@ class ModelObject {
 | 
			
		|||
		std::vector<Punkt3D> polygon;
 | 
			
		||||
		void calcNormales();
 | 
			
		||||
		std::string name;
 | 
			
		||||
		
 | 
			
		||||
		Material mat;
 | 
			
		||||
	public:
 | 
			
		||||
		ModelObject();
 | 
			
		||||
		
 | 
			
		||||
		std::string getName();
 | 
			
		||||
		void render();
 | 
			
		||||
		void clear();
 | 
			
		||||
	
 | 
			
		||||
| 
						 | 
				
			
			@ -28,13 +51,16 @@ class ModelObject {
 | 
			
		|||
class Model {
 | 
			
		||||
	private:
 | 
			
		||||
		std::vector<ModelObject> objects;
 | 
			
		||||
		
 | 
			
		||||
		std::vector<Material> materials;
 | 
			
		||||
		
 | 
			
		||||
	public:
 | 
			
		||||
		Model();
 | 
			
		||||
		void addObject(ModelObject c);
 | 
			
		||||
		void addMaterial(Material m);
 | 
			
		||||
		void clear();
 | 
			
		||||
		void render();
 | 
			
		||||
		
 | 
			
		||||
		Material findMaterial(std::string name);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue