void RenderTerrainNode::loadData() { if (!isLeaf()) { for (int i = 0; i < 4; ++i) { m_children[i]->loadData(); } } else { createRenderData(); setMaterialInstance(m_terrain->getMaterialInstance()); } }
void MD5Model::loadMesh(const char *filename) { // sanity check if (!filename) throw Exception("MD5Model::loadMesh(): filename is NULL"); // attempt to open file for reading std::ifstream fin(filename, std::ifstream::in); // was open successful? if (!fin.is_open()) { std::string msg = std::string("MD5Model::loadMesh(): unable to open ") + std::string(filename) + std::string(" for reading"); throw Exception(msg); } // read in file version std::string str; getNextToken(fin, &str); // token must read "MD5Version" if (str != "MD5Version") throw Exception("MD5Model::loadMesh(): expected 'MD5Version'"); // get version # int ver = readInt(fin); // must be version 10 if (ver != 10) throw Exception("MD5Model::loadMesh(): MD5Version must be 10"); // clear any data before reading file clear(); // read in all of the MD5Model elements readElements(fin); // close input file (should be done destructor anyway...) fin.close(); // calculate vertex positions and normals from information in joints // 模型pose姿势中,多个骨骼节点初始位置+连续weight位置变换(骨骼节点开始的位置 + weightPos经过joint四元数旋转的位置)* 权重 的结果作为顶点的位置。 buildVerts(); // 直接叉乘,规范化,将单位面法向量作为每个顶点的法向量 buildNormals(); createRenderData(); }