Understanding the structure of assimp I developed a class based on an example for drawing a model and I can’t figure out how to get the address of a texture file.
Here is the class
class ModelPoint { const struct aiScene* scene; public: struct mesh //Одна деталь модэли { string name; GLuint flag; vector<float>vertex; GLuint VAO,VBO; int PointCount; }; vector<mesh>masMesh; mesh tempMesh; ModelPoint() { } void recursive_render (const struct aiScene *sc, const struct aiNode* nd) { int i; unsigned int n = 0, t; // draw all meshes assigned to this node for (; n < nd->mNumMeshes; ++n) { const struct aiMesh* mesh = scene->mMeshes[nd->mMeshes[n]]; //Матеріал для текстури //unsigned int IndexMaterial = mesh->mMaterialIndex; //sc->mMaterials[IndexMaterial]-> //cout<<sc->mMaterials[IndexMaterial]->GetTextureCount (aiTextureType_DIFFUSE)<<endl; // apply_material(sc->mMaterials[mesh->mMaterialIndex]); if(mesh->mNormals == NULL) { // glDisable(GL_LIGHTING); } else { // glEnable(GL_LIGHTING); } if(mesh->mColors[0] != NULL) { // glEnable(GL_COLOR_MATERIAL); } else { // glDisable(GL_COLOR_MATERIAL); } //Тут ?? for (t = 0; t < mesh->mNumFaces; ++t) { const struct aiFace* face = &mesh->mFaces[t]; GLenum face_mode; //Узнаем каким типом примитивов рисовать switch(face->mNumIndices) { case 1: face_mode = GL_POINTS; break; case 2: face_mode = GL_LINES; break; case 3: face_mode = GL_TRIANGLES; break; default: face_mode = GL_POLYGON; break; } tempMesh.flag = face_mode; //Тут по идеи одна дкталь модэли mesh for(i = 0; i < face->mNumIndices; i++) { //Времинные переменные float nx = 0,ny = 0,nz = 0,ux = 0,uy = 0; //Получаим индэксы int index = face->mIndices[i]; //Если есть нормали используем if(mesh->mNormals != NULL) {nx = mesh->mNormals[index].x; nx = mesh->mNormals[index].y; nx = mesh->mNormals[index].z;} //Если есть текстурные координаты используем if(mesh->mVertices != NULL){ux = mesh->mVertices[index].x; uy = mesh->mVertices[index].y;} //Додаємо точку з 8 цифер vertex8f(mesh->mVertices[index].x,mesh->mVertices[index].y,mesh->mVertices[index].z,nx,ny,nz,ux,uy); } //Тут вказую що кінець однієї детаілі і очищую дані if(tempMesh.vertex.size() > 2) AddMesh(); } } // draw all children for (n = 0; n < nd->mNumChildren; ++n) { recursive_render(sc, nd->mChildren[n]); } } void load(const char* url) { scene = aiImportFile(url,aiProcessPreset_TargetRealtime_Quality); // cout<<"naem"<<scene->mRootNode[0].mName.data<<endl; } void compilate() { if(scene) { recursive_render(scene,scene->mRootNode); for(int i = 0;i<masMesh.size();i++) { // first, configure the cube's VAO (and VBO) glGenVertexArrays(1, &masMesh[i].VAO); glGenBuffers(1, &masMesh[i].VBO); glBindBuffer(GL_ARRAY_BUFFER, masMesh[i].VBO); int s = sizeof(float)*masMesh[i].vertex.size(); glBufferData(GL_ARRAY_BUFFER, s, &masMesh[i].vertex[0], GL_STATIC_DRAW); // glBufferData(GL_ARRAY_BUFFER, sizeof(float) * VertexNormalTexture.size(), &VertexNormalTexture[0], GL_STATIC_DRAW); glBindVertexArray(masMesh[i].VAO); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float))); glEnableVertexAttribArray(1); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float))); glEnableVertexAttribArray(2); masMesh[i].PointCount = masMesh[i].vertex.size() / 8; } } } void vertex1f(float x) { tempMesh.vertex.push_back(x); } void vertex2f(float x,float y) { tempMesh.vertex.push_back(x); tempMesh.vertex.push_back(y); } void vertex3f(float x,float y,float z) { tempMesh.vertex.push_back(x); tempMesh.vertex.push_back(y); tempMesh.vertex.push_back(z); } void setName(char *a) { tempMesh.name = a; } void vertex5f(float x,float y,float z,float nx,float ny) { tempMesh.vertex.push_back(x); tempMesh.vertex.push_back(y); tempMesh.vertex.push_back(z); tempMesh.vertex.push_back(nx); tempMesh.vertex.push_back(ny); } void vertex6f(float x,float y,float z,float nx,float ny,float nz) { tempMesh.vertex.push_back(x); tempMesh.vertex.push_back(y); tempMesh.vertex.push_back(z); tempMesh.vertex.push_back(nx); tempMesh.vertex.push_back(ny); tempMesh.vertex.push_back(nz); } void vertex7f(float x,float y,float z,float nx,float ny,float nz,float ux) { tempMesh.vertex.push_back(x); tempMesh.vertex.push_back(y); tempMesh.vertex.push_back(z); tempMesh.vertex.push_back(nx); tempMesh.vertex.push_back(ny); tempMesh.vertex.push_back(nz); tempMesh.vertex.push_back(ux); } void vertex8f(float x,float y,float z,float nx,float ny,float nz,float ux,float uy) { tempMesh.vertex.push_back(x); tempMesh.vertex.push_back(y); tempMesh.vertex.push_back(z); tempMesh.vertex.push_back(nx); tempMesh.vertex.push_back(ny); tempMesh.vertex.push_back(nz); tempMesh.vertex.push_back(ux); tempMesh.vertex.push_back(uy); } void AddMesh() { masMesh.push_back(tempMesh); tempMesh.name = ""; tempMesh.vertex.clear(); //tempMesh.flag = GL_TRIANGLES; } void draw() { if(scene) for(int i = 0;i<masMesh.size();i++) { //glActiveTexture(GL_TEXTURE0); //glBindTexture(GL_TEXTURE_2D, diffuseMap); //glActiveTexture(GL_TEXTURE1); //glBindTexture(GL_TEXTURE_2D, specularMap); glBindVertexArray(masMesh[i].VAO); glDrawArrays(masMesh[i].flag, 0, masMesh[i].PointCount); //cout<<i<<" co "<<masMesh[i].PointCount<<endl; } } ~ModelPoint() { } }; main
ModelPoint Model; Model.load("data\\Model\\ED209.obj"); Model.compilate(); ... LightSH.Use(); { TransformU Transform; Transform.active("model",LightSH.shaderProgram); //S.draw(GL_LINES); Model.draw(); }