Инструмент трансформации
This commit is contained in:
parent
a34df4c64e
commit
332b30fdcb
2
.vscode/tasks.json
vendored
2
.vscode/tasks.json
vendored
@ -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",
|
||||
|
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 "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));
|
||||
}
|
||||
|
||||
// Отключение атрибутов
|
||||
|
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