Имена текстур assimp C++

135
09 августа 2019, 22:00

Разбираюсь с структурой assimp Разработал класс на основе примера для рисования модели ни никак не могу понять как получить адрес файла с текстурой.

Вот класс

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();
    }
READ ALSO
C++ const char to char

C++ const char to char

имею структуру

120
imgui OpenGL 3.3 C++ glfw Графичиский интерфейс

imgui OpenGL 3.3 C++ glfw Графичиский интерфейс

Пытаюсь создать приложение с графическим интерфейсом копирую код из стандартного примера визуалки 2017 в визуалку 2010 выдает кучу ошибок линковки...

101
Смена значения XML из кода фрагмента

Смена значения XML из кода фрагмента

В colorxml я имею вот эту строку

111