#include #include #include "pattern.h" #include "application.h" #include "texturesdl.h" #include #include #include Assimp::Importer* importer; class FiskPattern : public Pattern { private: const aiScene* scene; Texture** textures; public: FiskPattern() : Pattern("patterns/m1.patt") { scene = importer->ReadFile("tewi.x", 0); if(scene) { std::cout << "Loaded model: " << scene->mNumMeshes << " meshes, " << scene->mNumMaterials << " materials." << std::endl; for(int i = 0; i < scene->mNumMaterials; i++) { aiMaterial* material = scene->mMaterials[i]; std::cout << "Material " << i << ": " << material->mNumProperties << " properties." << std::endl; for(int j = 0; j < material->mNumProperties; j++) { aiMaterialProperty* property = material->mProperties[j]; std::cout << " " << std::string(property->mKey.data, property->mKey.length) << ": " << std::string(property->mData, property->mDataLength) << std::endl; } } for(int i = 0; i < scene->mNumMeshes; i++) { aiMesh* mesh = scene->mMeshes[i]; std::cout << "Mesh " << i << ": mMaterialIndex = " << mesh->mMaterialIndex << "." << std::endl; } } else { std::cerr << "Failed to import model." << std::endl << importer->GetErrorString() << std::endl; } Texture* tex_face = new TextureSDL("Tewi_face_01.bmp"); Texture* tex_hair = new TextureSDL("TEWI_Hair_01.bmp"); Texture* tex_body = new TextureSDL("TEWI_Body_01.bmp"); Texture* tex_hair2 = new TextureSDL("TEWI_Hair_02.bmp"); Texture* tex_body2 = new TextureSDL("TEWI_Body_02.bmp"); textures = new Texture*[10]; textures[1] = tex_face; textures[2] = tex_hair; textures[3] = tex_body; textures[4] = tex_body; textures[5] = tex_body; textures[6] = tex_body; textures[7] = tex_body; textures[8] = tex_hair; textures[9] = new TextureSDL("gradient.png"); patt_width = 50.0; } protected: virtual void draw() { double gl_para[16]; arglCameraView(patt_trans_kake, gl_para, 1.0); glMatrixMode(GL_MODELVIEW); glLoadMatrixd(gl_para); //glTranslatef(0.0, -8.0, 0.0); glRotatef(90, 1, 0, 0); //glColor4f(1, 0, 0, 0.5); glPolygonMode(GL_FRONT, GL_FILL); for(int i = 0; i < 6; i++) { // scene->mNumMeshes aiMesh* mesh = scene->mMeshes[i]; glBindTexture(GL_TEXTURE_2D, textures[mesh->mMaterialIndex]->tex()); for(int j = 0; j < mesh->mNumFaces; j++) { aiFace* face = &mesh->mFaces[j]; glBegin(GL_POLYGON); for(int k = 0; k < face->mNumIndices; k++) { aiVector3D* texcoord = &mesh->mTextureCoords[0][face->mIndices[k]]; glTexCoord2f(texcoord->x, 2 - texcoord->y); aiVector3D* vertice = &mesh->mVertices[face->mIndices[k]]; glVertex3f(vertice->x, vertice->y, vertice->z); } glEnd(); } } } }; class MarisaPattern : public Pattern { private: const aiScene* scene; Texture** textures; public: MarisaPattern() : Pattern("patterns/m2.patt") { scene = importer->ReadFile("kirisame_marisa.x", 0); if(scene != NULL) { std::cout << "Loaded model: " << scene->mNumMeshes << " meshes, " << scene->mNumMaterials << " materials." << std::endl; for(int i = 0; i < scene->mNumMaterials; i++) { aiMaterial* material = scene->mMaterials[i]; std::cout << "Material " << i << ": " << material->mNumProperties << " properties." << std::endl; for(int j = 0; j < material->mNumProperties; j++) { aiMaterialProperty* property = material->mProperties[j]; std::cout << " " << std::string(property->mKey.data, property->mKey.length) << ": " << std::string(property->mData, property->mDataLength) << std::endl; } } for(int i = 0; i < scene->mNumMeshes; i++) { aiMesh* mesh = scene->mMeshes[i]; std::cout << "Mesh " << i << ": mMaterialIndex = " << mesh->mMaterialIndex << ", mNumBones = " << mesh->mNumBones << std::endl; } } else { std::cerr << "Failed to import model." << std::endl << importer->GetErrorString() << std::endl; } Texture* tex_head = new TextureSDL("Ma-head.tga"); Texture* tex_1 = new TextureSDL("Marisa-1.bmp"); Texture* tex_B = new TextureSDL("B.spa"); Texture* tex_2 = new TextureSDL("Marisa-2.tga"); Texture* tex_S = new TextureSDL("S.spa"); textures = new Texture*[8]; //textures[0] = tex_head; //textures[1] = tex_1; //textures[2] = tex_B; //textures[3] = tex_1; //textures[4] = tex_B; //textures[5] = tex_2; //textures[6] = tex_1; //textures[7] = tex_2; textures[0] = tex_head; // face textures[1] = tex_1; // body + hat textures[2] = tex_B; // buttons textures[3] = tex_2; // skirt, arms, hair, legs textures[4] = tex_S; // accessories patt_width = 10.0; } protected: virtual void draw() { double gl_para[16]; arglCameraView(patt_trans_kake, gl_para, 1.0); glMatrixMode(GL_MODELVIEW); glLoadMatrixd(gl_para); //glTranslatef(0.0, -8.0, 0.0); glRotatef(90, 1, 0, 0); glRotatef(180, 0, 1, 0); //glColor4f(1, 0, 0, 0.5); glPolygonMode(GL_FRONT, GL_FILL); for(int i = 0; i < scene->mNumMeshes; i++) { // scene->mNumMeshes aiMesh* mesh = scene->mMeshes[i]; glBindTexture(GL_TEXTURE_2D, textures[i]->tex()); for(int j = 0; j < mesh->mNumFaces; j++) { aiFace* face = &mesh->mFaces[j]; glBegin(GL_POLYGON); for(int k = 0; k < face->mNumIndices; k++) { aiVector3D* texcoord = &mesh->mTextureCoords[0][face->mIndices[k]]; glTexCoord2f(texcoord->x, 2 - texcoord->y); aiVector3D* vertice = &mesh->mVertices[face->mIndices[k]]; glVertex3f(vertice->x, vertice->y, vertice->z); } glEnd(); } } } }; int main(int argc, char **argv) { try { Application* app = new Application(); Assimp::Importer _importer; importer = &_importer; app->patt = new FiskPattern(); Assimp::Importer _importer2; importer = &_importer2; app->patt2 = new MarisaPattern(); app->run(); } catch(std::runtime_error e) { std::cerr << "Exception caught: " << e.what() << std::endl; } return 0; }