feat(renderer): added aabb selection outline
This commit is contained in:
parent
18b573db97
commit
b06098e4c7
4 changed files with 51 additions and 3 deletions
|
@ -9,10 +9,10 @@ uniform mat4 model;
|
|||
uniform mat4 view;
|
||||
uniform mat4 projection;
|
||||
uniform vec3 scale;
|
||||
uniform float thickness;
|
||||
|
||||
void main()
|
||||
{
|
||||
float thickness = 0.4;
|
||||
vec3 distFromEdge = sign(aPos) * 0.5 - aPos;
|
||||
vec3 tVec = (scale * sign(aPos) * 0.5 - distFromEdge * thickness) / scale;
|
||||
|
||||
|
|
|
@ -100,4 +100,21 @@ void get_closest_points_between_segments(const glm::vec3 &p_p0, const glm::vec3
|
|||
|
||||
r_ps = (1 - s) * p_p0 + s * p_p1;
|
||||
r_qt = (1 - t) * p_q0 + t * p_q1;
|
||||
}
|
||||
|
||||
void expandAABB(glm::vec3& min, glm::vec3& max, glm::vec3 point) {
|
||||
min = glm::vec3(glm::min(min.x, point.x), glm::min(min.y, point.y), glm::min(min.z, point.z));
|
||||
max = glm::vec3(glm::max(max.x, point.x), glm::max(max.y, point.y), glm::max(max.z, point.z));
|
||||
}
|
||||
|
||||
void computeAABBFromPoints(glm::vec3& min, glm::vec3& max, glm::vec3* points, int count) {
|
||||
if (count == 0) return;
|
||||
|
||||
min = points[0];
|
||||
max = points[0];
|
||||
|
||||
for (int i = 0; i < count; i++) {
|
||||
min = glm::vec3(glm::min(min.x, points[i].x), glm::min(min.y, points[i].y), glm::min(min.z, points[i].z));
|
||||
max = glm::vec3(glm::max(max.x, points[i].x), glm::max(max.y, points[i].y), glm::max(max.z, points[i].z));
|
||||
}
|
||||
}
|
|
@ -2,4 +2,7 @@
|
|||
#include <glm/glm.hpp>
|
||||
|
||||
// From godot/editor/plugins/gizmos/gizmo_3d_helper.h
|
||||
void get_closest_points_between_segments(const glm::vec3 &p_p0, const glm::vec3 &p_p1, const glm::vec3 &p_q0, const glm::vec3 &p_q1, glm::vec3 &r_ps, glm::vec3 &r_qt);
|
||||
void get_closest_points_between_segments(const glm::vec3 &p_p0, const glm::vec3 &p_p1, const glm::vec3 &p_q0, const glm::vec3 &p_q1, glm::vec3 &r_ps, glm::vec3 &r_qt);
|
||||
|
||||
void expandAABB(glm::vec3& min, glm::vec3& max, glm::vec3 point);
|
||||
void computeAABBFromPoints(glm::vec3& min, glm::vec3& max, glm::vec3* points, int count);
|
|
@ -17,6 +17,7 @@
|
|||
#include "datatypes/cframe.h"
|
||||
#include "datatypes/color3.h"
|
||||
#include "handles.h"
|
||||
#include "math_helper.h"
|
||||
#include "rendering/torus.h"
|
||||
#include "shader.h"
|
||||
#include "mesh.h"
|
||||
|
@ -437,16 +438,27 @@ void renderOutlines() {
|
|||
|
||||
// Pass in the camera position
|
||||
outlineShader->set("viewPos", camera.cameraPos);
|
||||
outlineShader->set("thickness", 0.4f);
|
||||
|
||||
// outlineShader->set("color", glm::vec3(1.f, 0.f, 0.f));
|
||||
|
||||
// Sort by nearest
|
||||
glm::vec3 min, max;
|
||||
bool first = true;
|
||||
|
||||
for (auto it = gWorkspace()->GetDescendantsStart(); it != gWorkspace()->GetDescendantsEnd(); it++) {
|
||||
InstanceRef inst = *it;
|
||||
if (inst->GetClass() != &Part::TYPE) continue;
|
||||
std::shared_ptr<Part> part = std::dynamic_pointer_cast<Part>(inst);
|
||||
if (!part->selected) continue;
|
||||
|
||||
if (first)
|
||||
min = part->position(), max = part->position();
|
||||
first = false;
|
||||
|
||||
Vector3 aabbSize = part->GetAABB();
|
||||
expandAABB(min, max, part->position() - aabbSize / 2.f);
|
||||
expandAABB(min, max, part->position() + aabbSize / 2.f);
|
||||
|
||||
glm::mat4 model = part->cframe;
|
||||
model = glm::scale(model, (glm::vec3)part->size + glm::vec3(0.2));
|
||||
outlineShader->set("model", model);
|
||||
|
@ -455,6 +467,22 @@ void renderOutlines() {
|
|||
OUTLINE_MESH->bind();
|
||||
glDrawArrays(GL_TRIANGLES, 0, OUTLINE_MESH->vertexCount);
|
||||
}
|
||||
|
||||
// Render AABB of selected parts
|
||||
if (first) return;
|
||||
|
||||
glm::vec3 outlineSize, outlinePos;
|
||||
outlineSize = (max - min);
|
||||
outlinePos = (max + min) / 2.f;
|
||||
|
||||
glm::mat4 model = glm::translate(glm::mat4(1.0f), outlinePos);
|
||||
model = glm::scale(model, outlineSize + glm::vec3(0.1));
|
||||
outlineShader->set("model", model);
|
||||
outlineShader->set("scale", outlineSize + glm::vec3(0.05));
|
||||
outlineShader->set("thickness", 0.2f);
|
||||
|
||||
OUTLINE_MESH->bind();
|
||||
glDrawArrays(GL_TRIANGLES, 0, OUTLINE_MESH->vertexCount);
|
||||
}
|
||||
|
||||
void renderRotationArcs() {
|
||||
|
|
Loading…
Add table
Reference in a new issue