#include #include #include "pattern.h" #include "application.h" #include "hcoord.h" #include "texturesdl.h" #include #include #include Assimp::Importer* importer; class FiskPattern : public Pattern { private: const aiScene* scene; Texture** textures; int patt_id2; HMatrix m1_mat; bool m2_visible; HVector m2_vec; public: FiskPattern() : Pattern("patterns/m1.patt") { patt_id2 = arLoadPatt("patterns/m2.patt"); scene = importer->ReadFile("models/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("models/tewi.x.data/Tewi_face_01.bmp"); Texture* tex_hair = new TextureSDL("models/tewi.x.data/TEWI_Hair_01.bmp"); Texture* tex_body = new TextureSDL("models/tewi.x.data/TEWI_Body_01.bmp"); Texture* tex_hair2 = new TextureSDL("models/tewi.x.data/TEWI_Hair_02.bmp"); Texture* tex_body2 = new TextureSDL("models/tewi.x.data/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] = tex_face; patt_width = 50.0; } protected: virtual void update(ARMarkerInfo* marker_info, int marker_num) { bool m1_visible = m2_visible = false; for(int j = 0; j < marker_num; j++) { if(patt_id == marker_info[j].id) { arGetTransMat(&marker_info[j], patt_center, patt_width, m1_mat.m); m1_visible = true; //else if( marker_info[k].cf < marker_info[j].cf ) k = j; } } if(!m1_visible) { return; } HMatrix m2_mat; for(int j = 0; j < marker_num; j++) { if(patt_id2 == marker_info[j].id) { arGetTransMat(&marker_info[j], patt_center, patt_width, m2_mat.m); m2_visible = true; m2_vec = m1_mat.invtr() * m2_mat.getTranslation(); } } draw(); } virtual void draw() { glMatrixMode(GL_MODELVIEW); m1_mat.glLoad(); glPushMatrix(); 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(); } } glPopMatrix(); if(m2_visible) { glLineWidth(5); glDisable(GL_TEXTURE_2D); glBegin(GL_LINES); glColor3f(1, 1, 1); glVertex3f(0, 0, 0); glVertex3f(m2_vec.x, m2_vec.y, m2_vec.z); glColor3f(1, 0, 0); glVertex3f(0, 0, 0); glVertex3f(m2_vec.x, 0, 0); glColor3f(0, 1, 0); glVertex3f(0, 0, 0); glVertex3f(0, m2_vec.y, 0); glColor3f(0, 0, 1); glVertex3f(0, 0, 0); glVertex3f(0, 0, m2_vec.z); glEnd(); glEnable(GL_TEXTURE_2D); } } }; /* 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; }