Запись идентификатора в 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) { }; | ||||
| }; | ||||
| 
 | ||||
| // Идентификатор модели
 | ||||
| struct ID | ||||
| { | ||||
|     GLuint64 value = 0; // Идентификатор
 | ||||
|     GLuint etc = 0; // Дополнительная информация
 | ||||
| }; | ||||
| 
 | ||||
| // Класс определяющий положение, вращение и размер объекта
 | ||||
| class Movable | ||||
| { | ||||
| @ -58,6 +65,8 @@ class Model : public Movable | ||||
|         bool parallaxmapped; // Использование параллакса
 | ||||
|         bool displacementmapped; // Использование карт высот для сдвига вершин
 | ||||
| 
 | ||||
|         ID id; // ID модели
 | ||||
| 
 | ||||
|         Material material; // Материал модели
 | ||||
|     private: | ||||
|         VAO vao; | ||||
| @ -78,6 +87,7 @@ class GrouptedModel: public Movable | ||||
| { | ||||
|     public: | ||||
|         void render(ShaderProgram &shaderProgram, UBO &material_buffer); // Вызов отрисовки
 | ||||
|         void set_group_id(GLuint64 id, GLuint etc = 0); // Изменение флага записи идентификатора для всех моделей
 | ||||
|         std::vector<Model> parts; | ||||
| 
 | ||||
|         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), | ||||
| 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), | ||||
| normalmapped(copy.normalmapped), parallaxmapped(copy.parallaxmapped), displacementmapped(copy.displacementmapped) | ||||
| { | ||||
| 
 | ||||
|     // Приведение указателя к целому 8байт
 | ||||
|     id.value = (GLuint64) this; | ||||
|     id.etc = copy.id.etc; | ||||
| } | ||||
| 
 | ||||
| Model::~Model() | ||||
| @ -52,6 +56,9 @@ void Model::render() | ||||
| // Вызов отрисовки
 | ||||
| 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(); | ||||
|     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_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