topical media & game development
lib-of-vs-addons-ofx3DModelLoader-src-3DS-model3DS.h / h
/*
3DS model loader
� Keith O'Conor 2005
keith.oconor @ {cs.tcd.ie, gmail.com}
*/
ifndef MODEL3DS_H
define MODEL3DS_H
#pragma warning(disable: 4786) //ignore truncated STL debug identifiers warnings
include <ofMain.h>
include <texture3DS.h>
include <Vector3DS.h>
include <ofx3DBaseLoader.h>
include <iostream>
include <fstream>
include <vector>
include <list>
include <map>
include <string>
include <sstream>
include <cctype>
include <algorithm>
include <functional>
include <iostream>
include <assert.h>
define CHUNK_MAIN 0x4D4D
define CHUNK_3D_EDITOR 0x3D3D
define CHUNK_OBJECT_BLOCK 0x4000
define CHUNK_MESH 0x4100
define CHUNK_VERTICES 0x4110
define CHUNK_FACES 0x4120
define CHUNK_FACE_MATERIAL 0x4130
define CHUNK_SMOOTHING_GROUP 0x4150
define CHUNK_TEXCOORDS 0x4140
define CHUNK_MATERIAL_BLOCK 0xAFFF
define CHUNK_MATERIAL_NAME 0xA000
define CHUNK_AMBIENT_COLOR 0xA010
define CHUNK_DIFFUSE_COLOR 0xA020
define CHUNK_SPECULAR_COLOR 0xA030
define CHUNK_SPECULAR_EXPONENT 0xA040
define CHUNK_SHININESS 0xA041
define CHUNK_TRANSPARENCY 0xA050
define CHUNK_MATERIAL_TWO_SIDED 0xA081
define CHUNK_TEXTURE_MAP 0xA200
define CHUNK_BUMP_MAP 0xA230
define CHUNK_REFLECTION_MAP 0xA220
define CHUNK_MAP_FILENAME 0xA300
define CHUNK_RGB_FLOAT 0x0010
define CHUNK_RGB_BYTE 0x0011
define CHUNK_RGB_BYTE_GAMMA 0x0012
define CHUNK_RGB_FLOAT_GAMMA 0x0013
define CHUNK_PERCENT_INT 0x0030
define CHUNK_PERCENT_FLOAT 0x0031
define DRAW_IMMEDIATE_MODE 0x01
define DRAW_VERTEX_ARRAY 0x02
define DRAW_VBO 0x03
define DEBUG_OUTPUT false
class model3DS;
class mesh3DS;
class material3DS;
typedef unsigned short ushort;
////////////////////////////////////////////////
// 3DS Material
// Describes a material to be used by a mesh3DS
///////////////////////////////////////////////
class material3DS{
private:
std::string m_name;
float m_diffuseColor[3];
float m_ambientColor[3];
float m_specularColor[3];
float m_specularExponent;
float m_shininess;
float m_opacity;
GLuint m_textureMapId;
GLuint m_bumpMapId;
bool m_hasTextureMap;
bool m_hasBumpMap;
bool m_twoSided;
public:
material3DS():m_hasTextureMap(false),m_hasBumpMap(false),m_twoSided(false){}
void loadTexture(std::string filename, int mapType);
std::string getName()const{return m_name;}
const float* getDiffuseColor()const{return m_diffuseColor;}
const float* getAmbientColor()const{return m_ambientColor;}
const float* getSpecularColor()const{return m_specularColor;}
float getSpecularExponent()const{return m_specularExponent;}
float getShininess()const{return m_shininess;}
float getOpacity()const{return m_opacity;}
GLuint getTextureMapId()const{return m_textureMapId;}
GLuint getBumpMapId()const{return m_bumpMapId;}
bool hasTextureMap()const{return m_hasTextureMap;}
bool hasBumpMap()const{return m_hasBumpMap;}
bool isTwoSided()const{return m_twoSided;}
void setName(const std::string newName){m_name = newName;}
void setDiffuseColor(const float* newColor){memcpy(m_diffuseColor,newColor,sizeof(float)*3);}
void setAmbientColor(const float* newColor){memcpy(m_ambientColor,newColor,sizeof(float)*3);}
void setSpecularColor(const float* newColor){memcpy(m_specularColor,newColor,sizeof(float)*3);}
void setShininess(const float newShininess){m_shininess = newShininess;}
void setSpecularExponent(const float newExponent){m_specularExponent = newExponent;}
void setOpacity(const float newOpacity){m_opacity = newOpacity;}
void setTwoSided(const bool isTwoSided){m_twoSided = isTwoSided;}
};
////////////////////////////////////////////////
// 3DS Mesh
// Contains all vertex, face, texcoord & normal data
/////////////////////////////////////////////////
class mesh3DS{
private:
std::string m_name;
std::string m_materialName;
model3DS *m_parentModel;
std::vector<float> m_vertices;
std::vector<float> m_normals;
std::vector<ushort> m_faces;
std::vector<unsigned int> m_faceSmoothing;
std::vector<float> m_texcoords;
std::map<std::string, std::vector<ushort> > m_materialFaces;
//VBO IDs
GLuint m_verticesArrayId;
GLuint m_normalsArrayId;
GLuint m_texcoordsArrayId;
unsigned int m_drawMode;
public:
mesh3DS(model3DS *parentModel):m_parentModel(parentModel){}
void buildMesh();
void calculateNormals();
void sortFacesByMaterial();
void draw();
void addVertex(const float vertex){m_vertices.push_back(vertex);}
void addFaceIndex(const ushort faceIndex){m_faces.push_back(faceIndex);}
void addMaterialFace(const std::string &name, const ushort faceIndex){m_materialFaces[name].push_back(faceIndex);}
void addFaceSmoothing(const unsigned int smoothing){m_faceSmoothing.push_back(smoothing);}
void addTexcoord(const float texcoord){m_texcoords.push_back(texcoord);}
std::string getMaterial()const{return m_materialName;}
std::string getName()const{return m_name;}
int getNumFaces()const{return (int)m_faces.size();}
void setMaterial(const std::string &newMat){m_materialName = newMat;}
void setName(const std::string newName){m_name = newName;}
void setDrawMode(const unsigned int newDrawMode){m_drawMode = newDrawMode;}
};
///////////////////////////////////////////////////////////
// 3DS Model
// Contains all the meshes & materials that make up a 3DS model
////////////////////////////////////////////////////////////
typedef struct{
float minX,maxX;
float minY,maxY;
float minZ,maxZ;
} boundingBox3DS;
class model3DS : public ofx3DBaseLoader{
private:
std::string m_filename;
std::string m_filepath;
std::vector<mesh3DS> m_meshes;
std::map<std::string, material3DS> m_materials;
unsigned int m_drawMode;
boundingBox3DS m_boundingBox;
float m_scale;
float m_centerX, m_centerY, m_centerZ;
// temporaries used while reading chunks
mesh3DS *m_currentMesh;
material3DS *m_currentMaterial;
std::vector<material3DS> *m_currentMaterialFaces;
float m_currentColor[3];
ushort m_tempUshort;
float m_tempFloat;
std::string m_tempString;
void readChunk(std::ifstream *modelFile, const int objectStart, const int objectLength);
// Private copy and assignment constructors
// to prevent object being copied
model3DS(const model3DS &model);
model3DS &operator=(const model3DS &model);
public:
model3DS();
void loadModel(const char* filename, float scale = 1);
void loadModel(string filename, float scale);
void draw();
std::string getFilename(){return m_filename;}
const material3DS& getMaterial(const std::string &matName){return m_materials[matName];}
};
endif //MODEL3DS_H
(C) Æliens
04/09/2009
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.