mirror of
https://github.com/brunoherbelin/vimix.git
synced 2025-12-11 18:34:58 +01:00
Added ALT modifier to selection rotation
This commit is contained in:
@@ -62,15 +62,14 @@ GeometryView::GeometryView() : View(GEOMETRY)
|
|||||||
overlay_position_cross_->visible_ = false;
|
overlay_position_cross_->visible_ = false;
|
||||||
// 'clock' : tic marks every 10 degrees for ROTATION
|
// 'clock' : tic marks every 10 degrees for ROTATION
|
||||||
// with dark background
|
// with dark background
|
||||||
Group *g = new Group;
|
overlay_rotation_clock_ = new Group;
|
||||||
Symbol *s = new Symbol(Symbol::CLOCK);
|
overlay_rotation_clock_tic_ = new Symbol(Symbol::CLOCK);
|
||||||
g->attach(s);
|
overlay_rotation_clock_->attach(overlay_rotation_clock_tic_);
|
||||||
s = new Symbol(Symbol::CIRCLE_POINT);
|
Symbol *s = new Symbol(Symbol::CIRCLE_POINT);
|
||||||
s->color = glm::vec4(0.f, 0.f, 0.f, 0.1f);
|
s->color = glm::vec4(0.f, 0.f, 0.f, 0.1f);
|
||||||
s->scale_ = glm::vec3(28.f, 28.f, 1.f);
|
s->scale_ = glm::vec3(28.f, 28.f, 1.f);
|
||||||
s->translation_.z = -0.1;
|
s->translation_.z = -0.1;
|
||||||
g->attach(s);
|
overlay_rotation_clock_->attach(s);
|
||||||
overlay_rotation_clock_ = g;
|
|
||||||
overlay_rotation_clock_->scale_ = glm::vec3(0.25f, 0.25f, 1.f);
|
overlay_rotation_clock_->scale_ = glm::vec3(0.25f, 0.25f, 1.f);
|
||||||
scene.fg()->attach(overlay_rotation_clock_);
|
scene.fg()->attach(overlay_rotation_clock_);
|
||||||
overlay_rotation_clock_->visible_ = false;
|
overlay_rotation_clock_->visible_ = false;
|
||||||
@@ -90,7 +89,7 @@ GeometryView::GeometryView() : View(GEOMETRY)
|
|||||||
overlay_rotation_->visible_ = false;
|
overlay_rotation_->visible_ = false;
|
||||||
// 'grid' : tic marks every 0.1 step for SCALING
|
// 'grid' : tic marks every 0.1 step for SCALING
|
||||||
// with dark background
|
// with dark background
|
||||||
g = new Group;
|
Group *g = new Group;
|
||||||
s = new Symbol(Symbol::GRID);
|
s = new Symbol(Symbol::GRID);
|
||||||
g->attach(s);
|
g->attach(s);
|
||||||
s = new Symbol(Symbol::SQUARE_POINT);
|
s = new Symbol(Symbol::SQUARE_POINT);
|
||||||
@@ -603,15 +602,26 @@ View::Cursor GeometryView::grab (Source *s, glm::vec2 from, glm::vec2 to, std::p
|
|||||||
|
|
||||||
// compute rotation angle
|
// compute rotation angle
|
||||||
float angle = glm::orientedAngle( glm::normalize(glm::vec2(selection_from)), glm::normalize(glm::vec2(selection_to)));
|
float angle = glm::orientedAngle( glm::normalize(glm::vec2(selection_from)), glm::normalize(glm::vec2(selection_to)));
|
||||||
glm::mat4 R = glm::rotate(glm::identity<glm::mat4>(), angle, glm::vec3(0.f, 0.f, 1.f) );
|
|
||||||
|
|
||||||
// apply to selection overlay
|
// apply to selection overlay
|
||||||
glm::vec4 vec = S * glm::vec4( overlay_selection_stored_status_->scale_, 0.f );
|
glm::vec4 vec = S * glm::vec4( overlay_selection_stored_status_->scale_, 0.f );
|
||||||
overlay_selection_->scale_ = glm::vec3(vec);
|
overlay_selection_->scale_ = glm::vec3(vec);
|
||||||
overlay_selection_->rotation_.z = overlay_selection_stored_status_->rotation_.z + angle;
|
overlay_selection_->rotation_.z = overlay_selection_stored_status_->rotation_.z + angle;
|
||||||
|
|
||||||
|
// POST-CORRECTION ; discretized rotation with ALT
|
||||||
|
if (UserInterface::manager().altModifier()) {
|
||||||
|
int degrees = int( glm::degrees(overlay_selection_->rotation_.z) );
|
||||||
|
degrees = (degrees / 10) * 10;
|
||||||
|
overlay_selection_->rotation_.z = glm::radians( float(degrees) );
|
||||||
|
angle = overlay_selection_->rotation_.z - overlay_selection_stored_status_->rotation_.z;
|
||||||
|
overlay_rotation_clock_->visible_ = true;
|
||||||
|
overlay_rotation_clock_->copyTransform(overlay_rotation_);
|
||||||
|
overlay_rotation_clock_tic_->color = overlay_selection_icon_->color;
|
||||||
|
}
|
||||||
|
|
||||||
// apply to selection sources
|
// apply to selection sources
|
||||||
// NB: complete transform matrix (right to left) : move to center, rotate, scale and move back
|
// NB: complete transform matrix (right to left) : move to center, rotate, scale and move back
|
||||||
|
glm::mat4 R = glm::rotate(glm::identity<glm::mat4>(), angle, glm::vec3(0.f, 0.f, 1.f) );
|
||||||
glm::mat4 M = T * S * R * glm::inverse(T);
|
glm::mat4 M = T * S * R * glm::inverse(T);
|
||||||
applySelectionTransform(M);
|
applySelectionTransform(M);
|
||||||
|
|
||||||
@@ -1003,6 +1013,7 @@ void GeometryView::terminate()
|
|||||||
|
|
||||||
overlay_rotation_->color = glm::vec4(1.f, 1.f, 1.f, 0.8f);
|
overlay_rotation_->color = glm::vec4(1.f, 1.f, 1.f, 0.8f);
|
||||||
overlay_rotation_fix_->color = glm::vec4(1.f, 1.f, 1.f, 0.8f);
|
overlay_rotation_fix_->color = glm::vec4(1.f, 1.f, 1.f, 0.8f);
|
||||||
|
overlay_rotation_clock_tic_->color = glm::vec4(1.f, 1.f, 1.f, 0.8f);
|
||||||
overlay_scaling_->color = glm::vec4(1.f, 1.f, 1.f, 0.8f);
|
overlay_scaling_->color = glm::vec4(1.f, 1.f, 1.f, 0.8f);
|
||||||
overlay_scaling_cross_->color = glm::vec4(1.f, 1.f, 1.f, 0.8f);
|
overlay_scaling_cross_->color = glm::vec4(1.f, 1.f, 1.f, 0.8f);
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ private:
|
|||||||
Node *overlay_position_cross_;
|
Node *overlay_position_cross_;
|
||||||
Symbol *overlay_rotation_;
|
Symbol *overlay_rotation_;
|
||||||
Symbol *overlay_rotation_fix_;
|
Symbol *overlay_rotation_fix_;
|
||||||
Node *overlay_rotation_clock_;
|
Group *overlay_rotation_clock_;
|
||||||
|
Symbol *overlay_rotation_clock_tic_;
|
||||||
Node *overlay_rotation_clock_hand_;
|
Node *overlay_rotation_clock_hand_;
|
||||||
Symbol *overlay_scaling_;
|
Symbol *overlay_scaling_;
|
||||||
Symbol *overlay_scaling_cross_;
|
Symbol *overlay_scaling_cross_;
|
||||||
|
|||||||
Reference in New Issue
Block a user