diff --git a/include/Model.h b/include/Model.h index e66dee7..eda704e 100644 --- a/include/Model.h +++ b/include/Model.h @@ -74,8 +74,10 @@ class Model : public Movable void load_tangent(glm::vec3* tangent, GLuint count); // Загрузка касательных векторов в буфер void load_bitangent(glm::vec3* bitangent, GLuint count); // Загрузка бикасательных векторов в буфер void set_texture(Texture& texture); // Привязка текстуры к модели - void set_index_range(size_t first_byteOffset, size_t count); // Ограничение диапазона из буфера индексов - + void set_index_range(size_t first_byteOffset, size_t count, size_t type = GL_UNSIGNED_INT); // Ограничение диапазона из буфера индексов + void setBO(int attribute, BO & bo); // Замена вершинного буфера по номеру его привязки + void setIndicesBO(BO & data); // + bool normalmapped; // Использование карт нормалей bool parallaxmapped; // Использование параллакса bool displacementmapped; // Использование карт высот для сдвига вершин @@ -89,7 +91,7 @@ class Model : public Movable BO normals_vbo, texCoords_vbo; // буферы с нормалями и текстурными координатами BO tangent_vbo, bitangent_vbo; // буферы с касательными и бикасательными векторами size_t verteces_count; // Количество вершин - size_t first_index_byteOffset, indices_count; // Сдвиг в байтах для первого и количество индексов + size_t first_index_byteOffset, indices_count, indices_datatype; // Сдвиг в байтах для первого, количество индексов и тип данных индексов Texture texture_albedo; // Текстура альбедо (цвет поверхности) Texture texture_roughness; // Текстура шероховатостей Texture texture_metallic; // Текстура металличности diff --git a/src/Model.cpp b/src/Model.cpp index e9f8895..4d1366c 100644 --- a/src/Model.cpp +++ b/src/Model.cpp @@ -7,7 +7,7 @@ Movable::Movable() : position(0), rotation(0), scale(1) {} Movable::Movable(const Movable& copy) : position(copy.position), rotation(copy.rotation), scale(copy.scale) {} // Конструктор без параметров -Model::Model() : verteces_count(0), first_index_byteOffset(0), indices_count(0), +Model::Model() : verteces_count(0), first_index_byteOffset(0), indices_count(0), indices_datatype(GL_UNSIGNED_INT), vertex_vbo(VERTEX), index_vbo(ELEMENT), normals_vbo(VERTEX), texCoords_vbo(VERTEX), tangent_vbo(VERTEX), bitangent_vbo(VERTEX), normalmapped(false), parallaxmapped(false), displacementmapped(false) @@ -20,7 +20,7 @@ normalmapped(false), parallaxmapped(false), displacementmapped(false) // Конструктор копирования Model::Model(const Model& copy) : Movable(copy), vao(copy.vao), -verteces_count(copy.verteces_count), first_index_byteOffset(copy.first_index_byteOffset), indices_count(copy.indices_count), +verteces_count(copy.verteces_count), first_index_byteOffset(copy.first_index_byteOffset), indices_count(copy.indices_count), indices_datatype(copy.indices_datatype), vertex_vbo(copy.vertex_vbo), index_vbo(copy.index_vbo), normals_vbo(copy.normals_vbo), texCoords_vbo(copy.texCoords_vbo), tangent_vbo(copy.tangent_vbo), bitangent_vbo(copy.bitangent_vbo), texture_albedo(copy.texture_albedo), texture_roughness(copy.texture_roughness), texture_metallic(copy.texture_metallic), texture_specular(copy.texture_specular), texture_emitted(copy.texture_emitted), @@ -46,7 +46,7 @@ void Model::render() if (indices_count) { index_vbo.use(); - glDrawElements(GL_TRIANGLES, indices_count, GL_UNSIGNED_INT, (void*)(first_index_byteOffset)); + glDrawElements(GL_TRIANGLES, indices_count, indices_datatype, (void*)(first_index_byteOffset)); } // Если есть вершины - рисуем на основании массива вершин else if (verteces_count) @@ -236,10 +236,11 @@ void Model::set_texture(Texture& texture) } // Ограничение диапазона из буфера индексов -void Model::set_index_range(size_t first_byteOffset, size_t count) +void Model::set_index_range(size_t first_byteOffset, size_t count, size_t type) { first_index_byteOffset = first_byteOffset; indices_count = count; + indices_datatype = type; } // Функция для конфигурации атрибута вершинного буфера @@ -500,6 +501,37 @@ GrouptedModel loadOBJtoGroupted(const char* filename, const char* mtl_directory, return result; } +// Замена вершинного буфера по номеру его привязки +void Model::setBO(int attribute, BO & bo) +{ + switch(attribute) + { + case 0: + vertex_vbo = bo; + break; + case 1: + texCoords_vbo = bo; + break; + case 2: + normals_vbo = bo; + break; + case 3: + tangent_vbo = bo; + break; + case 4: + bitangent_vbo = bo; + break; + default: + throw std::runtime_error("Unknown attribute buffer"); + }; +} + +// Замена индексного буфера +void Model::setIndicesBO(BO & data) +{ + index_vbo = data; +} + // Вызов отрисовки групповой модели void GrouptedModel::render(ShaderProgram &shaderProgram, UBO &material_buffer) {