Запись идентификатора в uniform-буфер

This commit is contained in:
parent 270e13315c
commit f7a3ebca2a
2 changed files with 30 additions and 0 deletions

View File

@ -23,6 +23,13 @@ struct Material
Material() : ka(0.2f), kd(0.2f), ks(0.2f), p(1) { }; Material() : ka(0.2f), kd(0.2f), ks(0.2f), p(1) { };
}; };
// Идентификатор модели
struct ID
{
GLuint64 value = 0; // Идентификатор
GLuint etc = 0; // Дополнительная информация
};
// Класс определяющий положение, вращение и размер объекта // Класс определяющий положение, вращение и размер объекта
class Movable class Movable
{ {
@ -58,6 +65,8 @@ class Model : public Movable
bool parallaxmapped; // Использование параллакса bool parallaxmapped; // Использование параллакса
bool displacementmapped; // Использование карт высот для сдвига вершин bool displacementmapped; // Использование карт высот для сдвига вершин
ID id; // ID модели
Material material; // Материал модели Material material; // Материал модели
private: private:
VAO *vao; VAO *vao;
@ -78,6 +87,7 @@ class GrouptedModel: public Movable
{ {
public: public:
void render(ShaderProgram &shaderProgram, UBO &material_buffer); // Вызов отрисовки void render(ShaderProgram &shaderProgram, UBO &material_buffer); // Вызов отрисовки
void set_group_id(GLuint64 id, GLuint etc = 0); // Изменение флага записи идентификатора для всех моделей
std::vector<Model> parts; std::vector<Model> parts;
}; };

View File

@ -24,6 +24,9 @@ normalmapped(false), parallaxmapped(false), displacementmapped(false)
vao = new VAO(); vao = new VAO();
// Запоминаем, что для нового VAO количество моделей, использующих его, = 1 // Запоминаем, что для нового VAO количество моделей, использующих его, = 1
vaos_count[vao->get_handler()] = 1; vaos_count[vao->get_handler()] = 1;
// Приведение указателя к целому 8байт
id.value = (GLuint64) this;
id.etc = 0;
} }
// Конструктор копирования // Конструктор копирования
@ -38,6 +41,9 @@ normalmapped(copy.normalmapped), parallaxmapped(copy.parallaxmapped), displaceme
{ {
// Если создается копия модели, то запоминаем поля и инкрементируем словарь с количеством // Если создается копия модели, то запоминаем поля и инкрементируем словарь с количеством
vaos_count[vao->get_handler()]++; vaos_count[vao->get_handler()]++;
// Приведение указателя к целому 8байт
id.value = (GLuint64) this;
id.etc = copy.id.etc;
} }
Model::~Model() Model::~Model()
@ -77,6 +83,9 @@ void Model::render()
// Вызов отрисовки // Вызов отрисовки
void Model::render(ShaderProgram &shaderProgram, UBO &material_buffer, const glm::mat4& global_tranform) void Model::render(ShaderProgram &shaderProgram, UBO &material_buffer, const glm::mat4& global_tranform)
{ {
// Загрузка идентификатора объекта
glUniform3uiv(shaderProgram.getUniformLoc("ID"), 1, (GLuint*) &id);
// Расчитаем матрицу трансформации // Расчитаем матрицу трансформации
glm::mat4 model = global_tranform * this->getTransformMatrix(); glm::mat4 model = global_tranform * this->getTransformMatrix();
GLuint model_uniform = shaderProgram.getUniformLoc("model"); GLuint model_uniform = shaderProgram.getUniformLoc("model");
@ -591,3 +600,14 @@ void genShpere(Model& model, float radius, int sectorsCount)
model.load_normals(&normals[0], normals.size()); model.load_normals(&normals[0], normals.size());
model.load_indices(&indices[0], indices.size()); model.load_indices(&indices[0], indices.size());
} }
// Изменение флага записи идентификатора для всех моделей
void GrouptedModel::set_group_id(GLuint64 id, GLuint etc)
{
for (auto& part : parts)
{
part.id.value = id;
if (etc)
part.id.etc = etc;
}
}