Инструмент трансформации
This commit is contained in:
		
							parent
							
								
									bb5f424387
								
							
						
					
					
						commit
						27b73b228a
					
				
							
								
								
									
										2
									
								
								.vscode/tasks.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.vscode/tasks.json
									
									
									
									
										vendored
									
									
								
							@ -7,6 +7,7 @@
 | 
				
			|||||||
            "args": [
 | 
					            "args": [
 | 
				
			||||||
                "-fdiagnostics-color=always",
 | 
					                "-fdiagnostics-color=always",
 | 
				
			||||||
                "${workspaceRoot}/src/*.cpp",
 | 
					                "${workspaceRoot}/src/*.cpp",
 | 
				
			||||||
 | 
					                "${workspaceRoot}/src/tools/*.cpp",
 | 
				
			||||||
                "${workspaceRoot}/../dependencies/glad/src/glad.c",
 | 
					                "${workspaceRoot}/../dependencies/glad/src/glad.c",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                "-I${workspaceRoot}/include",
 | 
					                "-I${workspaceRoot}/include",
 | 
				
			||||||
@ -44,6 +45,7 @@
 | 
				
			|||||||
            "args": [
 | 
					            "args": [
 | 
				
			||||||
                "-fdiagnostics-color=always",
 | 
					                "-fdiagnostics-color=always",
 | 
				
			||||||
                "${workspaceRoot}/src/*.cpp",
 | 
					                "${workspaceRoot}/src/*.cpp",
 | 
				
			||||||
 | 
					                "${workspaceRoot}/src/tools/*.cpp",
 | 
				
			||||||
                "${workspaceRoot}/../dependencies/glad/src/glad.c",
 | 
					                "${workspaceRoot}/../dependencies/glad/src/glad.c",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                "-I${workspaceRoot}/include",
 | 
					                "-I${workspaceRoot}/include",
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										27
									
								
								include/tools/TRS.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								include/tools/TRS.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					#ifndef TRS_H
 | 
				
			||||||
 | 
					#define TRS_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define T_SENSITIVITY 0.001
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "Model.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Интерфейс инструмента
 | 
				
			||||||
 | 
					class TRS
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public:
 | 
				
			||||||
 | 
					        void render(GLuint64 selectedID, ShaderProgram &shaderProgram, UBO &material_buffer); // Рендер инструмента нужного типа для выбранного объекта
 | 
				
			||||||
 | 
					        virtual void process(GLuint64 selectedID, GLuint etc, const glm::vec4& dpos) = 0; // Взаимодействие с инструментом
 | 
				
			||||||
 | 
					    protected:
 | 
				
			||||||
 | 
					        void init_etc(); // Инициализирует дополнительную информацию модели
 | 
				
			||||||
 | 
					        GrouptedModel tool; // Модель
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Инструмент трансформации
 | 
				
			||||||
 | 
					class Transform : public TRS
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public: 
 | 
				
			||||||
 | 
					        Transform();
 | 
				
			||||||
 | 
					        virtual void process(GLuint64 selectedID, GLuint etc, const glm::vec4& dpos); // Взаимодействие с инструментом
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // TRS_H
 | 
				
			||||||
							
								
								
									
										38
									
								
								shaders/tools.frag
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								shaders/tools.frag
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					#version 420 core 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					layout(std140, binding = 1) uniform Material
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    vec3 ka;
 | 
				
			||||||
 | 
					    vec3 kd;
 | 
				
			||||||
 | 
					    vec3 ks;
 | 
				
			||||||
 | 
					    float p;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					layout (location = 1) out vec3 gNormal;
 | 
				
			||||||
 | 
					layout (location = 3) out vec4 gAmbientSpecular;
 | 
				
			||||||
 | 
					layout (location = 4) out uvec3 gID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					in vec3 vertex; // Позиция вершины в пространстве
 | 
				
			||||||
 | 
					in vec3 N; // Нормаль трансформированная
 | 
				
			||||||
 | 
					in vec2 texCoord; // Текстурные координаты
 | 
				
			||||||
 | 
					in vec3 T; // Касательный вектор
 | 
				
			||||||
 | 
					in vec3 B; // Бикасательный вектор
 | 
				
			||||||
 | 
					in vec3 view; // Вектор от поверхности к камере
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uniform bool normalmapped;
 | 
				
			||||||
 | 
					uniform bool parallaxmapped;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uniform float parallax_heightScale = 0.1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uniform uvec3 ID = uvec3(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void main()
 | 
				
			||||||
 | 
					{    
 | 
				
			||||||
 | 
					    gNormal = vec3(0);
 | 
				
			||||||
 | 
					    // Сохранение фоновой составляющей
 | 
				
			||||||
 | 
					    gAmbientSpecular.rgb = ka;
 | 
				
			||||||
 | 
					    // Сохранение идентификатора объекта
 | 
				
			||||||
 | 
					    gID = ID;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    gl_FragDepth = 0.01 * gl_FragCoord.z;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										22
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								src/main.cpp
									
									
									
									
									
								
							@ -11,6 +11,7 @@
 | 
				
			|||||||
#include "Texture.h"
 | 
					#include "Texture.h"
 | 
				
			||||||
#include "Shader.h"
 | 
					#include "Shader.h"
 | 
				
			||||||
#include "Lights.h"
 | 
					#include "Lights.h"
 | 
				
			||||||
 | 
					#include "tools/TRS.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define WINDOW_WIDTH 800
 | 
					#define WINDOW_WIDTH 800
 | 
				
			||||||
#define WINDOW_HEIGHT 600
 | 
					#define WINDOW_HEIGHT 600
 | 
				
			||||||
@ -120,6 +121,7 @@ int main(void)
 | 
				
			|||||||
    scene.position.z = 1;
 | 
					    scene.position.z = 1;
 | 
				
			||||||
    scene.parts[0].material.kd = {0.5,0.5,0.5};
 | 
					    scene.parts[0].material.kd = {0.5,0.5,0.5};
 | 
				
			||||||
    scene.parts[0].material.ka = {0.05,0.05,0.05};
 | 
					    scene.parts[0].material.ka = {0.05,0.05,0.05};
 | 
				
			||||||
 | 
					    scene.set_group_id((GLuint64) &scene);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    // Установка цвета очистки буфера цвета
 | 
					    // Установка цвета очистки буфера цвета
 | 
				
			||||||
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 | 
					    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 | 
				
			||||||
@ -392,6 +394,16 @@ int main(void)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    ID selected; // Выбранная модель
 | 
					    ID selected; // Выбранная модель
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Шейдер для инструментов
 | 
				
			||||||
 | 
					    ShaderProgram toolsShader;
 | 
				
			||||||
 | 
					    // Загрузим шейдеры
 | 
				
			||||||
 | 
					    toolsShader.load(GL_VERTEX_SHADER, "shaders/gshader.vert");
 | 
				
			||||||
 | 
					    toolsShader.load(GL_FRAGMENT_SHADER, "shaders/tools.frag");
 | 
				
			||||||
 | 
					    toolsShader.link();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Инструменты
 | 
				
			||||||
 | 
					    Transform transform;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Пока не произойдет событие запроса закрытия окна
 | 
					    // Пока не произойдет событие запроса закрытия окна
 | 
				
			||||||
    while(!glfwWindowShouldClose(window))
 | 
					    while(!glfwWindowShouldClose(window))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@ -415,6 +427,11 @@ int main(void)
 | 
				
			|||||||
        scene.render(gShader, material_data);
 | 
					        scene.render(gShader, material_data);
 | 
				
			||||||
        rectangle.render(gShader, material_data);
 | 
					        rectangle.render(gShader, material_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Используем шейдер для инструментов
 | 
				
			||||||
 | 
					        toolsShader.use();
 | 
				
			||||||
 | 
					        // Рендерим инструменты для выбранного объекта
 | 
				
			||||||
 | 
					        transform.render(selected.value, toolsShader, material_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Выбор объекта
 | 
					        // Выбор объекта
 | 
				
			||||||
        if (mouse.left == 0100000)
 | 
					        if (mouse.left == 0100000)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@ -546,6 +563,11 @@ int main(void)
 | 
				
			|||||||
        &&  mouse.x != mouse.prev_x 
 | 
					        &&  mouse.x != mouse.prev_x 
 | 
				
			||||||
        &&  mouse.y != mouse.prev_y)
 | 
					        &&  mouse.y != mouse.prev_y)
 | 
				
			||||||
            camera.rotate(glm::vec2(mouse.x - mouse.prev_x, mouse.prev_y - mouse.y));
 | 
					            camera.rotate(glm::vec2(mouse.x - mouse.prev_x, mouse.prev_y - mouse.y));
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					        // Взаимодействие с инструментом при зажатой левой кнопке
 | 
				
			||||||
 | 
					        if (mouse.left > 0100000)
 | 
				
			||||||
 | 
					            if (selected.etc)
 | 
				
			||||||
 | 
					                transform.process(selected.value, selected.etc, glm::transpose(camera.getVP()) * glm::vec4(mouse.x - mouse.prev_x, mouse.prev_y - mouse.y, 0, 1));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Отключение атрибутов
 | 
					    // Отключение атрибутов
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										63
									
								
								src/tools/TRS.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								src/tools/TRS.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,63 @@
 | 
				
			|||||||
 | 
					#include "tools/TRS.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Инициализирует дополнительную информацию модели
 | 
				
			||||||
 | 
					void TRS::init_etc()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    for (int i = 0; i < tool.parts.size(); i++)
 | 
				
			||||||
 | 
					        tool.parts[i].id.etc = i+1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Рендер инструмента нужного типа для выбранного объекта
 | 
				
			||||||
 | 
					void TRS::render(GLuint64 selectedID, ShaderProgram &shaderProgram, UBO &material_buffer)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    // Если есть выбранная модель - рендерим инструмент для неё
 | 
				
			||||||
 | 
					    if (selectedID)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // Указатель на объект
 | 
				
			||||||
 | 
					        I_Movable* selectedObject = (I_Movable*) selectedID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Смещение инструмента в центр модели
 | 
				
			||||||
 | 
					        tool.position = selectedObject->getPos();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Замена идентификатора инструмента идентификатором выбранного объекта
 | 
				
			||||||
 | 
					        tool.set_group_id(selectedID); // без замены доп. информации
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Рендер инструмента
 | 
				
			||||||
 | 
					        tool.render(shaderProgram, material_buffer);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Transform::Transform() 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    tool = loadOBJtoGroupted("../resources/models/tools/transform.obj", "../resources/models/tools/", "../resources/textures/");
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // Масштабирование
 | 
				
			||||||
 | 
					    tool.scale = glm::vec3(0.3);
 | 
				
			||||||
 | 
					    tool.rotation.y = 180;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // Инициализация дополнительной информации
 | 
				
			||||||
 | 
					    init_etc();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Взаимодействие с инструментом
 | 
				
			||||||
 | 
					void Transform::process(GLuint64 selectedID, GLuint etc, const glm::vec4& dpos)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    // Если есть выбранная модель - рендерим инструмент для неё
 | 
				
			||||||
 | 
					    if (selectedID)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // Указатель на объект
 | 
				
			||||||
 | 
					        Movable* selectedObject = (Movable*) selectedID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        glm::vec3 dVec(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (etc & 01)
 | 
				
			||||||
 | 
					            dVec.x = dpos.x * T_SENSITIVITY;
 | 
				
			||||||
 | 
					        if (etc & 02)
 | 
				
			||||||
 | 
					            dVec.z = dpos.z * T_SENSITIVITY;
 | 
				
			||||||
 | 
					        if (etc & 04)
 | 
				
			||||||
 | 
					            dVec.y = dpos.y * T_SENSITIVITY;      
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if (etc > 0)
 | 
				
			||||||
 | 
					            selectedObject->dPosition(dVec);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user