mirror of
https://github.com/brunoherbelin/vimix.git
synced 2025-12-12 18:59:59 +01:00
Improved implementation for rotation icon in GeometryView (and
This commit is contained in:
59
Mesh.cpp
59
Mesh.cpp
@@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
#include <glm/gtc/matrix_transform.hpp>
|
#include <glm/gtc/matrix_transform.hpp>
|
||||||
|
|
||||||
|
#include "Primitives.h"
|
||||||
#include "Resource.h"
|
#include "Resource.h"
|
||||||
#include "ImageShader.h"
|
#include "ImageShader.h"
|
||||||
#include "Visitor.h"
|
#include "Visitor.h"
|
||||||
@@ -463,10 +464,15 @@ Handles::Handles(Type type) : Node(), type_(type)
|
|||||||
{
|
{
|
||||||
color = glm::vec4( 1.f, 1.f, 1.f, 1.f);
|
color = glm::vec4( 1.f, 1.f, 1.f, 1.f);
|
||||||
|
|
||||||
if ( type_ == ROTATE )
|
if ( type_ == ROTATE ) {
|
||||||
handle_ = new Mesh("mesh/border_handles_rotation.ply");
|
handle_ = new Mesh("mesh/border_handles_rotation.ply");
|
||||||
else
|
// handle_->scale_ = glm::vec3( 0.01f, 0.01f, 1.f);
|
||||||
handle_ = new Mesh("mesh/border_handles_overlay.ply");
|
}
|
||||||
|
else {
|
||||||
|
handle_ = new LineSquare(color, 3);
|
||||||
|
handle_->scale_ = glm::vec3( 0.05f, 0.05f, 1.f);
|
||||||
|
}
|
||||||
|
// handle_ = new Mesh("mesh/border_handles_overlay.ply");
|
||||||
}
|
}
|
||||||
|
|
||||||
Handles::~Handles()
|
Handles::~Handles()
|
||||||
@@ -474,6 +480,12 @@ Handles::~Handles()
|
|||||||
if(handle_) delete handle_;
|
if(handle_) delete handle_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Handles::update( float dt )
|
||||||
|
{
|
||||||
|
Node::update(dt);
|
||||||
|
handle_->update(dt);
|
||||||
|
}
|
||||||
|
|
||||||
void Handles::draw(glm::mat4 modelview, glm::mat4 projection)
|
void Handles::draw(glm::mat4 modelview, glm::mat4 projection)
|
||||||
{
|
{
|
||||||
if ( !initialized() ) {
|
if ( !initialized() ) {
|
||||||
@@ -487,68 +499,45 @@ void Handles::draw(glm::mat4 modelview, glm::mat4 projection)
|
|||||||
|
|
||||||
// set color
|
// set color
|
||||||
handle_->shader()->color = color;
|
handle_->shader()->color = color;
|
||||||
|
// handle_->scale_ = glm::vec3( 0.01f, 0.01f, 1.f);
|
||||||
|
|
||||||
float ar = 1.f;//scale_.x / scale_.y;
|
|
||||||
glm::mat4 ctm;
|
glm::mat4 ctm;
|
||||||
|
|
||||||
|
|
||||||
glm::vec4 center = modelview * glm::vec4(0.f, 0.f, 0.f, 1.f);
|
|
||||||
glm::vec4 h = modelview * glm::vec4(1.f, 0.f, 0.f, 1.f);
|
|
||||||
// glm::vec3 scale = glm::normalize( diagonal - center );
|
|
||||||
glm::mat4 S = glm::scale(glm::identity<glm::mat4>(), glm::vec3( 1.f / h.x, 1.f / h.y, 1.f) );
|
|
||||||
|
|
||||||
// glm::vec4 t(1.f, 0.f, 0.f, 1.f);
|
|
||||||
// t = modelview * t;
|
|
||||||
// glm::mat4 S = glm::scale(glm::identity<glm::mat4>(), glm::vec3(1.f, 1.f, 1.f) );
|
|
||||||
|
|
||||||
if ( type_ == RESIZE ) {
|
if ( type_ == RESIZE ) {
|
||||||
// 4 corners
|
// 4 corners
|
||||||
ctm = modelview * glm::translate(glm::identity<glm::mat4>(), glm::vec3(1.f, -1.f, 0.f) ) ;
|
ctm = modelview * glm::translate(glm::identity<glm::mat4>(), glm::vec3(1.f, -1.f, 0.f) ) ;
|
||||||
// ctm *= S;
|
|
||||||
|
|
||||||
// glm::vec4 P = glm::inverse(modelview) * glm::vec4(1.f, 1.f, 0.f, 1.f );
|
|
||||||
|
|
||||||
|
|
||||||
// ctm = glm::translate(glm::identity<glm::mat4>(), glm::vec3(t) );
|
|
||||||
|
|
||||||
handle_->draw( ctm, projection );
|
handle_->draw( ctm, projection );
|
||||||
|
|
||||||
ctm = modelview * glm::translate(glm::identity<glm::mat4>(), glm::vec3(ar, +1.f, 0.f));
|
ctm = modelview * glm::translate(glm::identity<glm::mat4>(), glm::vec3(1.f, +1.f, 0.f));
|
||||||
|
|
||||||
handle_->draw( ctm, projection );
|
handle_->draw( ctm, projection );
|
||||||
|
|
||||||
ctm = modelview * glm::translate(glm::identity<glm::mat4>(), glm::vec3(-ar, -1.f, 0.f));
|
ctm = modelview * glm::translate(glm::identity<glm::mat4>(), glm::vec3(-1.f, -1.f, 0.f));
|
||||||
|
|
||||||
handle_->draw( ctm, projection );
|
handle_->draw( ctm, projection );
|
||||||
|
|
||||||
ctm = modelview * glm::translate(glm::identity<glm::mat4>(), glm::vec3(-ar, +1.f, 0.f));
|
ctm = modelview * glm::translate(glm::identity<glm::mat4>(), glm::vec3(-1.f, +1.f, 0.f));
|
||||||
|
|
||||||
handle_->draw( ctm, projection );
|
handle_->draw( ctm, projection );
|
||||||
}
|
}
|
||||||
else if ( type_ == RESIZE_H ){
|
else if ( type_ == RESIZE_H ){
|
||||||
// left and right
|
// left and right
|
||||||
ctm = modelview * glm::translate(glm::identity<glm::mat4>(), glm::vec3(ar, 0.f, 0.f) );
|
ctm = modelview * glm::translate(glm::identity<glm::mat4>(), glm::vec3(1.f, 0.f, 0.f) );
|
||||||
|
|
||||||
handle_->draw( ctm, projection );
|
handle_->draw( ctm, projection );
|
||||||
|
|
||||||
ctm = modelview * glm::translate(glm::identity<glm::mat4>(), glm::vec3(-ar, 0.f, 0.f));
|
ctm = modelview * glm::translate(glm::identity<glm::mat4>(), glm::vec3(-1.f, 0.f, 0.f));
|
||||||
|
|
||||||
handle_->draw( ctm, projection );
|
handle_->draw( ctm, projection );
|
||||||
}
|
}
|
||||||
else if ( type_ == RESIZE_V ){
|
else if ( type_ == RESIZE_V ){
|
||||||
// top and bottom
|
// top and bottom
|
||||||
ctm = modelview * glm::translate(glm::identity<glm::mat4>(), glm::vec3(0.f, +1.f, 0.f) );
|
ctm = modelview * glm::translate(glm::identity<glm::mat4>(), glm::vec3(0.f, +1.f, 0.f) );
|
||||||
|
|
||||||
handle_->draw( ctm, projection );
|
handle_->draw( ctm, projection );
|
||||||
|
|
||||||
ctm = modelview * glm::translate(glm::identity<glm::mat4>(), glm::vec3(0.f, -1.f, 0.f));
|
ctm = modelview * glm::translate(glm::identity<glm::mat4>(), glm::vec3(0.f, -1.f, 0.f));
|
||||||
|
|
||||||
handle_->draw( ctm, projection );
|
handle_->draw( ctm, projection );
|
||||||
}
|
}
|
||||||
else if ( type_ == ROTATE ){
|
else if ( type_ == ROTATE ){
|
||||||
// only once in upper top right corner
|
// only once in upper top right corner
|
||||||
ctm = modelview * glm::translate(glm::identity<glm::mat4>(), glm::vec3(ar + 0.06f, +1.06f, 0.f));
|
// ctm = modelview * glm::translate(glm::identity<glm::mat4>(), glm::vec3(1.08f, +1.08f, 0.f));
|
||||||
|
glm::vec4 pos = modelview * glm::vec4(1.08f, 1.08f, 0.f, 1.f);
|
||||||
|
ctm = GlmToolkit::transform(glm::vec3(pos), glm::vec3(0.f), glm::vec3(1.f));
|
||||||
handle_->draw( ctm, projection );
|
handle_->draw( ctm, projection );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ void PickingVisitor::visit(Handles &n)
|
|||||||
glm::vec4 P = glm::inverse(modelview_) * glm::vec4( point_, 0.f, 1.f );
|
glm::vec4 P = glm::inverse(modelview_) * glm::vec4( point_, 0.f, 1.f );
|
||||||
|
|
||||||
// get the bounding box of a handle
|
// get the bounding box of a handle
|
||||||
GlmToolkit::AxisAlignedBoundingBox bb = n.handle()->bbox();
|
GlmToolkit::AxisAlignedBoundingBox bb = n.handle()->bbox().scaled(n.handle()->scale_);
|
||||||
|
|
||||||
// test picking depending on type of handle
|
// test picking depending on type of handle
|
||||||
bool picked = false;
|
bool picked = false;
|
||||||
@@ -100,7 +100,12 @@ void PickingVisitor::visit(Handles &n)
|
|||||||
}
|
}
|
||||||
else if ( n.type() == Handles::ROTATE ){
|
else if ( n.type() == Handles::ROTATE ){
|
||||||
// Picking Rotation icon
|
// Picking Rotation icon
|
||||||
picked = bb.translated(glm::vec3(1.06f, +1.06f, 0.f)).contains( glm::vec3(P) );
|
glm::vec4 pos = modelview_ * glm::vec4(1.08f, 1.08f, 0.f, 1.f);
|
||||||
|
glm::mat4 ctm = GlmToolkit::transform(glm::vec3(pos), glm::vec3(0.f), glm::vec3(1.f));
|
||||||
|
glm::vec4 P = glm::inverse(ctm) * glm::vec4( point_, 0.f, 1.f );
|
||||||
|
|
||||||
|
bb = n.handle()->bbox();
|
||||||
|
picked = bb.contains( glm::vec3(P) );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( picked )
|
if ( picked )
|
||||||
|
|||||||
Reference in New Issue
Block a user