#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); // Инициализация дополнительной информации 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.y = dpos.y * T_SENSITIVITY; if (etc & 04) dVec.z = dpos.z * T_SENSITIVITY; if (etc > 0) selectedObject->dPosition(dVec); } } Rotate::Rotate() { tool = loadOBJtoGroupted("../resources/models/tools/rotate.obj", "../resources/models/tools/", "../resources/textures/"); // Масштабирование tool.scale = glm::vec3(0.3); // Инициализация дополнительной информации tool.parts[0].id.etc = 1; tool.parts[1].id.etc = 2; tool.parts[2].id.etc = 4; } // Взаимодействие с инструментом void Rotate::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 * R_SENSITIVITY; if (etc & 02) dVec.y = dpos.y * R_SENSITIVITY; if (etc & 04) dVec.z = dpos.z * R_SENSITIVITY; if (etc > 0) selectedObject->dRotation(dVec); } } Scale::Scale() { tool = loadOBJtoGroupted("../resources/models/tools/scale.obj", "../resources/models/tools/", "../resources/textures/"); // Масштабирование tool.scale = glm::vec3(0.3); // Инициализация дополнительной информации init_etc(); } // Взаимодействие с инструментом void Scale::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 * S_SENSITIVITY; if (etc & 02) dVec.y = dpos.y * S_SENSITIVITY; if (etc & 04) dVec.z = dpos.z * S_SENSITIVITY; if (etc > 0) selectedObject->dScale(dVec); } }