//======================================== // Class abstracting the geometric mesh. // Nicolau Sunyer & Sergi Funtané (10/13/2005). // Universitat de Girona. //======================================== #include #include #include "CMesh.h" #include "Main.h" #include "MyFrame.h" //Constructor. CMesh :: CMesh() { } //Destructor. CMesh::~CMesh() { } void CMesh::ShowMesh(char *filename) { FILE *file = NULL; file = fopen(filename, "w"); for (int i = 0; i < m_pObject._geo[0]._numTriSets; i++) for (int j = 0; j < m_pObject._geo[0]._triSet[i]._numTris; j++) { fprintf(file, "\nx = %d, y = %d, z = %d", m_pObject._geo[0]._triSet[i]._index[3 * j], m_pObject._geo[0]._triSet[i]._index[3 * j + 1], m_pObject._geo[0]._triSet[i]._index[3 * j + 2]); } fclose(file); } void CMesh::NormalizeIt(wxProgressDialog &dialog) { float WBMax[3], WBMin[3]; int i, j; bool cont = true; WBMax[0] = m_pObject._geo[0]._triSet[0]._ver[0]; WBMax[1] = m_pObject._geo[0]._triSet[0]._ver[1]; WBMax[2] = m_pObject._geo[0]._triSet[0]._ver[2]; WBMin[0] = m_pObject._geo[0]._triSet[0]._ver[0]; WBMin[1] = m_pObject._geo[0]._triSet[0]._ver[1]; WBMin[2] = m_pObject._geo[0]._triSet[0]._ver[2]; for (i = 0; i < m_pObject._geo[0]._numTriSets && cont; i++) for (j = 0; j < m_pObject._geo[0]._triSet[i]._numVer && cont; j++) { cont = dialog.Update((m_pObject._geo[0]._numTriSets / 100) * m_pObject._geo[0]._numTriSets); if (WBMax[0] < m_pObject._geo[0]._triSet[i]._ver[3 * j]) WBMax[0] = m_pObject._geo[0]._triSet[i]._ver[3 * j]; if (WBMax[1] < m_pObject._geo[0]._triSet[i]._ver[3 * j + 1]) WBMax[1] = m_pObject._geo[0]._triSet[i]._ver[3 * j + 1]; if (WBMax[2] < m_pObject._geo[0]._triSet[i]._ver[3 * j + 2]) WBMax[2] = m_pObject._geo[0]._triSet[i]._ver[3 * j + 2]; if (WBMin[0] > m_pObject._geo[0]._triSet[i]._ver[3 * j]) WBMin[0] = m_pObject._geo[0]._triSet[i]._ver[3 * j]; if (WBMin[1] > m_pObject._geo[0]._triSet[i]._ver[3 * j + 1]) WBMin[1] = m_pObject._geo[0]._triSet[i]._ver[3 * j + 1]; if (WBMin[2] > m_pObject._geo[0]._triSet[i]._ver[3 * j + 2]) WBMin[2] = m_pObject._geo[0]._triSet[i]._ver[3 * j + 2]; } float sizeX = WBMax[0] - WBMin[0]; float sizeY = WBMax[1] - WBMin[1]; float sizeZ = WBMax[2] - WBMin[2]; float dispX = 0.5*(WBMax[0] + WBMin[0]); float dispY = 0.5*(WBMax[1] + WBMin[1]); float dispZ = 0.5*(WBMax[2] + WBMin[2]); float norm; if (sizeX>=sizeY) { if (sizeX>=sizeZ) norm = 0.5*sizeX; else norm = 0.5*sizeZ; } else { if (sizeY>=sizeZ) norm = 0.5*sizeY; else norm = 0.5*sizeZ; } for (i = 0; i < m_pObject._geo[0]._numTriSets; i++) for (j = 0; j < m_pObject._geo[0]._triSet[i]._numVer; j++) { m_pObject._geo[0]._triSet[i]._ver[3 * j] = (m_pObject._geo[0]._triSet[i]._ver[3 * j] - dispX) / norm; m_pObject._geo[0]._triSet[i]._ver[3 * j + 1] = (m_pObject._geo[0]._triSet[i]._ver[3 * j + 1] - dispY) / norm; m_pObject._geo[0]._triSet[i]._ver[3 * j + 2] = (m_pObject._geo[0]._triSet[i]._ver[3 * j + 2] - dispZ) / norm; } } float CMesh::getValue(const char *string, int &i) { int j = 0; float value; char substring[100]; while ((string[i] != ' ') && (string[i] != '\0')) { substring[j] = string[i]; i++; j++; } substring[j] = '\0'; value = atof(substring); return (value); } void CMesh::XMLToSNStr(char *name) { int i = 0, j = 0, k; const char *string; bool cont = true, color = false; // Read root element and decide from there what type String response; TiXmlDocument* doc = new TiXmlDocument(name); // Some double-parsing here but never mind if (!doc->LoadFile()) { exit (1); } TiXmlElement *root = 0; root = doc->RootElement(); if (!root) { doc->Clear(); delete doc; exit(-1); } TiXmlElement *element = root->FirstChildElement("submeshes"); if (!element) { doc->Clear(); delete doc; exit(-1); } element = element->FirstChildElement("submesh"); if (!element) { doc->Clear(); delete doc; exit(-1); } m_pObject._numGeos = 1; m_pObject._geo = new snGeo[1]; m_pObject._geo[0]._numTriSets = 0; TiXmlElement *cnt; for (cnt = element; cnt; cnt = cnt->NextSiblingElement()) m_pObject._geo[0]._numTriSets += 1; //progress bar wxProgressDialog dialog(wxT("Parsing XML file"), wxT("Progress..."), m_pObject._geo[0]._numTriSets, //range 0, //parent wxPD_APP_MODAL|wxPD_AUTO_HIDE| wxPD_ELAPSED_TIME|wxPD_ESTIMATED_TIME|wxPD_REMAINING_TIME|wxPD_CAN_ABORT); m_pObject._geo[0]._triSet = new snTriSet[m_pObject._geo[0]._numTriSets]; for (element = element; element && cont; element = element->NextSiblingElement()) { cont = dialog.Update((m_pObject._geo[0]._numTriSets / 100) * i); cnt = element->FirstChildElement("faces"); if (!cnt) { doc->Clear(); delete doc; exit(-1); } const char *auxString = cnt->Attribute("count"); m_pObject._geo[0]._triSet[i]._numTris = atoi(auxString); m_pObject._geo[0]._triSet[i]._index = new int[m_pObject._geo[0]._triSet[i]._numTris * 3]; TiXmlElement *tri, *aux; j = 0; for(tri = cnt; tri; tri = cnt->NextSiblingElement("faces")) { for (aux = tri->FirstChildElement(); aux; aux = aux->NextSiblingElement()) { m_pObject._geo[0]._triSet[i]._index[3 * j] = atoi(aux->Attribute("v1")); m_pObject._geo[0]._triSet[i]._index[3 * j + 1] = atoi(aux->Attribute("v2")); m_pObject._geo[0]._triSet[i]._index[3 * j + 2] = atoi(aux->Attribute("v3")); j++; } } tri = cnt->NextSiblingElement("geometry"); int NVer = atoi(tri->Attribute("vertexcount")); tri = tri->FirstChildElement("vertexbuffer"); const char *cad = tri->Attribute("colours_diffuse"); if (cad != NULL) color = true; //->if (!strcmp(cad, "true")) color = true; else color = false; m_pObject._geo[0]._triSet[i]._numVer = NVer; m_pObject._geo[0]._triSet[i]._ver = new float[NVer * 3]; m_pObject._geo[0]._triSet[i]._nor = new float[NVer * 3]; m_pObject._geo[0]._triSet[i]._tex = new float[NVer * 2]; m_pObject._geo[0]._triSet[i]._refl = new float[NVer * 3]; TiXmlElement *aux1; aux = tri->FirstChildElement(); for (j = 0; j < NVer; j++) { aux1 = aux->FirstChildElement("position"); m_pObject._geo[0]._triSet[i]._ver[3 * j] = atof(aux1->Attribute("x")); m_pObject._geo[0]._triSet[i]._ver[3 * j + 1] = atof(aux1->Attribute("y")); m_pObject._geo[0]._triSet[i]._ver[3 * j + 2] = atof(aux1->Attribute("z")); aux1 = aux1->NextSiblingElement("normal"); m_pObject._geo[0]._triSet[i]._nor[3 * j] = atof(aux1->Attribute("x")); m_pObject._geo[0]._triSet[i]._nor[3 * j + 1] = atof(aux1->Attribute("y")); m_pObject._geo[0]._triSet[i]._nor[3 * j + 2] = atof(aux1->Attribute("z")); aux1 = aux1->NextSiblingElement("texcoord"); m_pObject._geo[0]._triSet[i]._tex[2 * j] = atof(aux1->Attribute("u")); m_pObject._geo[0]._triSet[i]._tex[2 * j + 1] = atof(aux1->Attribute("v")); /*->aux1 = aux->FirstChildElement("colour_diffuse"); response = aux1->Attribute("value"); /*->m_pObject._geo[0]._triSet[i]._ver[3 * j] = atof(aux1->Attribute("x")); m_pObject._geo[0]._triSet[i]._ver[3 * j + 1] = atof(aux1->Attribute("y")); m_pObject._geo[0]._triSet[i]._ver[3 * j + 2] = atof(aux1->Attribute("z"));*/ if (color) { aux1 = aux->FirstChildElement("colour_diffuse"); response = aux1->Attribute("value"); string = response.c_str(); k = 0; m_pObject._geo[0]._triSet[i]._refl[3 * j] = getValue(string, k); k++; m_pObject._geo[0]._triSet[i]._refl[3 * j + 1] = getValue(string, k); k++; m_pObject._geo[0]._triSet[i]._refl[3 * j + 2] = getValue(string, k); k++; getValue(string, k); } else { m_pObject._geo[0]._triSet[i]._refl[3 * j] = 0.5; m_pObject._geo[0]._triSet[i]._refl[3 * j + 1] = 0.5; m_pObject._geo[0]._triSet[i]._refl[3 * j + 2] = 0.5; } aux = aux->NextSiblingElement(); } i++; } NormalizeIt(dialog); doc->Clear(); delete doc; } void CMesh::LoadMesh(char *argv) { /*->logMgr = new LogManager(); logMgr->createLog(opts.logFile, false, !opts.quietMode); rgm = new ResourceGroupManager(); mth = new Math(); meshMgr = new MeshManager(); matMgr = new MaterialManager(); matMgr->initialise(); skelMgr = new SkeletonManager(); meshSerializer = new MeshSerializer(); xmlMeshSerializer = new XMLMeshSerializer(); skeletonSerializer = new SkeletonSerializer(); xmlSkeletonSerializer = new XMLSkeletonSerializer(); bufferManager = new DefaultHardwareBufferManager(); // needed because we don't have a rendersystem /*->meshToXML(opts); opts.source = opts.dest; opts.sourceExt = opts.destExt;*/ XMLToSNStr(argv); /*->delete xmlSkeletonSerializer; delete skeletonSerializer; delete xmlMeshSerializer; delete meshSerializer; delete skelMgr; delete matMgr; delete meshMgr; delete bufferManager; delete mth; delete rgm; delete logMgr;*/ } void CMesh::FreeMem() { for(int i = 0; i