#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; int patt_id2; bool m2_visible; double m2_vec[3]; public: FiskPattern() : Pattern("patterns/m1.patt") { patt_id2 = arLoadPatt("patterns/m2.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; patt_trans_kake[3][0] = patt_trans_kake[3][1] = patt_trans_kake[3][2] = 0; patt_trans_kake[3][3] = 1.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, patt_trans_kake); m1_visible = true; //else if( marker_info[k].cf < marker_info[j].cf ) k = j; } } if(!m1_visible) { return; } //patt_trans_kake[0][0] = patt_trans_kake[1][1] = patt_trans_kake[2][2] = 1; //patt_trans_kake[0][1] = patt_trans_kake[0][2] = 0; //patt_trans_kake[1][0] = patt_trans_kake[1][2] = 0; //patt_trans_kake[2][0] = patt_trans_kake[2][1] = 0; double m2_matrix[3][4]; for(int j = 0; j < marker_num; j++) { if(patt_id2 == marker_info[j].id) { arGetTransMat(&marker_info[j], patt_center, patt_width, m2_matrix); m2_visible = true; double x = m2_matrix[0][3]; double y = m2_matrix[1][3]; double z = m2_matrix[2][3]; arUtilMatInv(patt_trans_kake, m2_matrix); m2_vec[0] = m2_matrix[0][0] * x + m2_matrix[0][1] * y + m2_matrix[0][2] * z + m2_matrix[0][3]; m2_vec[2] = -(m2_matrix[1][0] * x + m2_matrix[1][1] * y + m2_matrix[1][2] * z + m2_matrix[1][3]); m2_vec[1] = m2_matrix[2][0] * x + m2_matrix[2][1] * y + m2_matrix[2][2] * z + m2_matrix[2][3]; } } draw(); } virtual void draw() { double gl_para[16]; //arglCameraView(patt_trans_kake, gl_para, 1.0); glMatrixMode(GL_MODELVIEW); //glLoadMatrixd(gl_para); glLoadTransposeMatrixd((double*)patt_trans_kake); //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(); } } if(m2_visible) { glLineWidth(5); glDisable(GL_TEXTURE_2D); glBegin(GL_LINES); glColor3f(1, 1, 1); glVertex3f(0, 0, 0); glVertex3f(m2_vec[0], m2_vec[1], m2_vec[2]); glColor3f(1, 0, 0); glVertex3f(0, 0, 0); glVertex3f(m2_vec[0], 0, 0); glColor3f(0, 1, 0); glVertex3f(0, 0, 0); glVertex3f(0, m2_vec[1], 0); glColor3f(0, 0, 1); glVertex3f(0, 0, 0); glVertex3f(0, 0, m2_vec[2]); 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; }