From 332b30fdcba37974cfa06c4ed790bd0f50498d08 Mon Sep 17 00:00:00 2001 From: "R.E. Kovalev" Date: Tue, 4 Apr 2023 16:46:50 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=20=D1=82=D1=80=D0=B0=D0=BD=D1=81=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/tasks.json | 2 ++ include/tools/TRS.h | 27 +++++++++++++++++++ shaders/tools.frag | 38 +++++++++++++++++++++++++++ src/main.cpp | 22 ++++++++++++++++ src/tools/TRS.cpp | 63 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 152 insertions(+) create mode 100644 include/tools/TRS.h create mode 100644 shaders/tools.frag create mode 100644 src/tools/TRS.cpp diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 6afc88d..2ffab7d 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -7,6 +7,7 @@ "args": [ "-fdiagnostics-color=always", "${workspaceRoot}/src/*.cpp", + "${workspaceRoot}/src/tools/*.cpp", "${workspaceRoot}/../dependencies/glad/src/glad.c", "-I${workspaceRoot}/include", @@ -44,6 +45,7 @@ "args": [ "-fdiagnostics-color=always", "${workspaceRoot}/src/*.cpp", + "${workspaceRoot}/src/tools/*.cpp", "${workspaceRoot}/../dependencies/glad/src/glad.c", "-I${workspaceRoot}/include", diff --git a/include/tools/TRS.h b/include/tools/TRS.h new file mode 100644 index 0000000..2979c47 --- /dev/null +++ b/include/tools/TRS.h @@ -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 \ No newline at end of file diff --git a/shaders/tools.frag b/shaders/tools.frag new file mode 100644 index 0000000..f5b3a81 --- /dev/null +++ b/shaders/tools.frag @@ -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; +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 9312ca0..0070cc6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -11,6 +11,7 @@ #include "Texture.h" #include "Shader.h" #include "Lights.h" +#include "tools/TRS.h" #define WINDOW_WIDTH 800 #define WINDOW_HEIGHT 600 @@ -120,6 +121,7 @@ int main(void) scene.position.z = 1; scene.parts[0].material.kd = {0.5,0.5,0.5}; 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); @@ -392,6 +394,16 @@ int main(void) 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)) { @@ -415,6 +427,11 @@ int main(void) scene.render(gShader, material_data); rectangle.render(gShader, material_data); + // Используем шейдер для инструментов + toolsShader.use(); + // Рендерим инструменты для выбранного объекта + transform.render(selected.value, toolsShader, material_data); + // Выбор объекта if (mouse.left == 0100000) { @@ -546,6 +563,11 @@ int main(void) && mouse.x != mouse.prev_x && mouse.y != mouse.prev_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)); } // Отключение атрибутов diff --git a/src/tools/TRS.cpp b/src/tools/TRS.cpp new file mode 100644 index 0000000..3a63ffd --- /dev/null +++ b/src/tools/TRS.cpp @@ -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); + } +} \ No newline at end of file