Запись идентификатора в uniform-буфер
This commit is contained in:
		
							parent
							
								
									d7e81fa2cd
								
							
						
					
					
						commit
						c80d4fa5d1
					
				| @ -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; | ||||||
| 
 | 
 | ||||||
|         Model& operator[](int index); // Оператор[i] для простого доступа к частям модели
 |         Model& operator[](int index); // Оператор[i] для простого доступа к частям модели
 | ||||||
|  | |||||||
| @ -12,7 +12,9 @@ vertex_vbo(VERTEX), index_vbo(ELEMENT), normals_vbo(VERTEX), texCoords_vbo(VERTE | |||||||
| tangent_vbo(VERTEX), bitangent_vbo(VERTEX), | tangent_vbo(VERTEX), bitangent_vbo(VERTEX), | ||||||
| normalmapped(false), parallaxmapped(false), displacementmapped(false) | normalmapped(false), parallaxmapped(false), displacementmapped(false) | ||||||
| { | { | ||||||
| 
 |     // Приведение указателя к целому 8байт
 | ||||||
|  |     id.value = (GLuint64) this; | ||||||
|  |     id.etc = 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Конструктор копирования
 | // Конструктор копирования
 | ||||||
| @ -25,7 +27,9 @@ texture_diffuse(copy.texture_diffuse), texture_ambient(copy.texture_ambient), te | |||||||
| texture_heights(copy.texture_heights), texture_normals(copy.texture_normals), material(copy.material), | texture_heights(copy.texture_heights), texture_normals(copy.texture_normals), material(copy.material), | ||||||
| normalmapped(copy.normalmapped), parallaxmapped(copy.parallaxmapped), displacementmapped(copy.displacementmapped) | normalmapped(copy.normalmapped), parallaxmapped(copy.parallaxmapped), displacementmapped(copy.displacementmapped) | ||||||
| { | { | ||||||
| 
 |     // Приведение указателя к целому 8байт
 | ||||||
|  |     id.value = (GLuint64) this; | ||||||
|  |     id.etc = copy.id.etc; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Model::~Model() | Model::~Model() | ||||||
| @ -52,6 +56,9 @@ void Model::render() | |||||||
| // Вызов отрисовки
 | // Вызов отрисовки
 | ||||||
| void Model::render(ShaderProgram &shaderProgram, UBO &material_buffer, const glm::mat4 & group_transform)  | void Model::render(ShaderProgram &shaderProgram, UBO &material_buffer, const glm::mat4 & group_transform)  | ||||||
| { | { | ||||||
|  |     // Загрузка идентификатора объекта
 | ||||||
|  |     glUniform3uiv(shaderProgram.getUniformLoc("ID"), 1, (GLuint*) &id); | ||||||
|  | 
 | ||||||
|     // Расчитаем матрицу трансформации
 |     // Расчитаем матрицу трансформации
 | ||||||
|     glm::mat4 model = group_transform * this->getTransformMatrix(); |     glm::mat4 model = group_transform * this->getTransformMatrix(); | ||||||
|     GLuint model_uniform = shaderProgram.getUniformLoc("model"); |     GLuint model_uniform = shaderProgram.getUniformLoc("model"); | ||||||
| @ -546,3 +553,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; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user