Разбираюсь с структурой 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();
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Пытаюсь создать приложение с графическим интерфейсом копирую код из стандартного примера визуалки 2017 в визуалку 2010 выдает кучу ошибок линковки...