fix gizmo

jira: STUDIO-11812 / STUDIO-11844

Change-Id: I7afa825863dc56d16473bb6e4989763fcf561244
This commit is contained in:
jun.zhang 2025-05-19 11:53:20 +08:00 committed by lane.wei
parent 46b842290d
commit e0401306c1
9 changed files with 27 additions and 80 deletions

View File

@ -549,7 +549,6 @@ std::pair<double, double> Camera::calc_tight_frustrum_zs_around(const BoundingBo
{
std::pair<double, double> ret;
auto& [near_z, far_z] = ret;
m_scene_box_radius = box.radius();
// box in eye space
const BoundingBoxf3 eye_box = box.transformed(m_view_matrix);
near_z = -eye_box.max(2);
@ -567,17 +566,12 @@ std::pair<double, double> Camera::calc_tight_frustrum_zs_around(const BoundingBo
far_z = mid_z + half_size;
}
if (near_z < FrustrumMinNearZ) {
if (near_z < FrustrumMinNearZ)
{
const double delta = FrustrumMinNearZ - near_z;
set_distance(m_distance + delta);
m_last_scene_box_radius = m_scene_box_radius;
near_z += delta;
far_z += delta;
} else {
if (abs(m_last_scene_box_radius - m_scene_box_radius) > 1) {
m_last_scene_box_radius = m_scene_box_radius;
set_distance(DefaultDistance);
}
}
return ret;

View File

@ -70,8 +70,6 @@ private:
std::pair<double, double> m_frustrum_zs;
BoundingBoxf3 m_scene_box;
float m_scene_box_radius{0};
float m_last_scene_box_radius{0};
Frustum m_frustum;
Vec3f m_last_eye, m_last_center, m_last_up;
float m_last_near, m_last_far, m_last_aspect, m_last_fov,m_last_zoom;

View File

@ -385,23 +385,9 @@ BoundingBoxf3 GLGizmoAdvancedCut::get_bounding_box() const
t_aabb.reset();
// rotate aabb
if (m_is_dragging) {
auto t_rotate_aabb = GLGizmoRotate3D::get_bounding_box();
if (t_rotate_aabb.defined) {
t_aabb.merge(t_rotate_aabb);
t_aabb.defined = true;
}
}
else {
const auto t_x_aabb = m_gizmos[X].get_bounding_box();
t_aabb.merge(t_x_aabb);
const auto t_y_aabb = m_gizmos[Y].get_bounding_box();
t_aabb.merge(t_y_aabb);
const auto t_z_aabb = m_gizmos[Z].get_bounding_box();
t_aabb.merge(t_z_aabb);
auto t_rotate_aabb = GLGizmoRotate3D::get_bounding_box();
if (t_rotate_aabb.defined) {
t_aabb.merge(t_rotate_aabb);
t_aabb.defined = true;
}
// end rotate aabb

View File

@ -226,7 +226,7 @@ bool GLGizmoBase::render_combo(const std::string &label, const std::vector<std::
return is_changed;
}
void GLGizmoBase::render_cross_mark(const Transform3d& matrix, const Vec3f &target, bool is_single)
void GLGizmoBase::render_cross_mark(const Transform3d& matrix, const Vec3f &target)
{
if (!m_cross_mark.is_initialized()) {
GLModel::Geometry geo;
@ -258,18 +258,18 @@ void GLGizmoBase::render_cross_mark(const Transform3d& matrix, const Vec3f &targ
p_ogl_manager->set_line_width(2.0f);
Transform3d model_matrix{ Transform3d::Identity() };
model_matrix = get_corss_mask_model_matrix(ECrossMaskType::X, target, is_single);
model_matrix = get_corss_mask_model_matrix(ECrossMaskType::X, target);
p_flat_shader->set_uniform("view_model_matrix", view_model_matrix * model_matrix);
p_flat_shader->set_uniform("projection_matrix", proj_matrix);
m_cross_mark.set_color({ 1.0f, 0.0f, 0.0f, 1.0f });
m_cross_mark.render_geometry();
model_matrix = get_corss_mask_model_matrix(ECrossMaskType::Y, target, is_single);
model_matrix = get_corss_mask_model_matrix(ECrossMaskType::Y, target);
p_flat_shader->set_uniform("view_model_matrix", view_model_matrix * model_matrix);
m_cross_mark.set_color({ 0.0f, 1.0f, 0.0f, 1.0f });
m_cross_mark.render_geometry();
model_matrix = get_corss_mask_model_matrix(ECrossMaskType::Z, target, is_single);
model_matrix = get_corss_mask_model_matrix(ECrossMaskType::Z, target);
p_flat_shader->set_uniform("view_model_matrix", view_model_matrix * model_matrix);
m_cross_mark.set_color({ 0.0f, 0.0f, 1.0f, 1.0f });
m_cross_mark.render_geometry();
@ -601,7 +601,7 @@ void GLGizmoBase::do_stop_dragging(bool perform_mouse_cleanup)
m_parent.refresh_camera_scene_box();
}
BoundingBoxf3 GLGizmoBase::get_cross_mask_aabb(const Transform3d& matrix, const Vec3f& target, bool is_single) const
BoundingBoxf3 GLGizmoBase::get_cross_mask_aabb(const Transform3d& matrix, const Vec3f& target) const
{
BoundingBoxf3 t_aabb;
t_aabb.reset();
@ -610,7 +610,7 @@ BoundingBoxf3 GLGizmoBase::get_cross_mask_aabb(const Transform3d& matrix, const
const auto& t_cross_aabb = m_cross_mark.get_bounding_box();
Transform3d model_matrix{ Transform3d::Identity() };
// x axis aabb
model_matrix = get_corss_mask_model_matrix(ECrossMaskType::X, target, is_single);
model_matrix = get_corss_mask_model_matrix(ECrossMaskType::X, target);
auto t_x_axis_aabb = t_cross_aabb.transformed(matrix * model_matrix);
t_x_axis_aabb.defined = true;
t_aabb.merge(t_x_axis_aabb);
@ -618,7 +618,7 @@ BoundingBoxf3 GLGizmoBase::get_cross_mask_aabb(const Transform3d& matrix, const
// end x axis aabb
// y axis aabb
model_matrix = get_corss_mask_model_matrix(ECrossMaskType::Y, target, is_single);
model_matrix = get_corss_mask_model_matrix(ECrossMaskType::Y, target);
auto t_y_axis_aabb = t_cross_aabb.transformed(matrix * model_matrix);
t_y_axis_aabb.defined = true;
t_aabb.merge(t_y_axis_aabb);
@ -626,7 +626,7 @@ BoundingBoxf3 GLGizmoBase::get_cross_mask_aabb(const Transform3d& matrix, const
// end y axis aabb
// z axis aabb
model_matrix = get_corss_mask_model_matrix(ECrossMaskType::Z, target, is_single);
model_matrix = get_corss_mask_model_matrix(ECrossMaskType::Z, target);
auto t_z_axis_aabb = t_cross_aabb.transformed(matrix * model_matrix);
t_z_axis_aabb.defined = true;
t_aabb.merge(t_z_axis_aabb);
@ -651,11 +651,11 @@ void GLGizmoBase::modify_radius(float& radius) const
}
}
Transform3d GLGizmoBase::get_corss_mask_model_matrix(ECrossMaskType type, const Vec3f& target, bool is_single) const
Transform3d GLGizmoBase::get_corss_mask_model_matrix(ECrossMaskType type, const Vec3f& target) const
{
double half_length = 4.0;
const auto center_x = is_single ? target + Vec3f(half_length * 0.5f, 0.0f, 0.0f) : target;
const float scale = is_single ? half_length : 2.0f * half_length;
const auto center_x = target;
const float scale = 2.0f * half_length;
Transform3d model_matrix{ Transform3d::Identity() };
if (ECrossMaskType::X == type) {
model_matrix.data()[3 * 4 + 0] = center_x.x();
@ -666,14 +666,14 @@ Transform3d GLGizmoBase::get_corss_mask_model_matrix(ECrossMaskType type, const
model_matrix.data()[2 * 4 + 2] = 1.0f;
}
else if (ECrossMaskType::Y == type) {
const auto center_y = is_single ? target + Vec3f(0.0f, half_length * 0.5f, 0.0f) : target;
const auto center_y = target;
model_matrix = Geometry::translation_transform(center_y.cast<double>())
* Geometry::rotation_transform({ 0.0f, 0.0f, 0.5 * PI })
* Geometry::scale_transform({ scale, 1.0f, 1.0f });
}
else if (ECrossMaskType::Z == type) {
const auto center_z = is_single ? target + Vec3f(0.0f, 0.0f, half_length * 0.5f) : target;
const auto center_z = target;
model_matrix = Geometry::translation_transform(center_z.cast<double>())
* Geometry::rotation_transform({ 0.0f, -0.5 * PI, 0.0f })
* Geometry::scale_transform({ scale, 1.0f, 1.0f });

View File

@ -175,7 +175,7 @@ protected:
DoubleShowType show_type = DoubleShowType::Normal);
bool render_combo(const std::string &label, const std::vector<std::string> &lines,
size_t &selection_idx, float label_width, float item_width);
void render_cross_mark(const Transform3d& matrix, const Vec3f& target,bool is_single =false);
void render_cross_mark(const Transform3d& matrix, const Vec3f& target);
static float get_grabber_size();
public:
@ -301,7 +301,7 @@ protected:
if (value <= _min) { value = _min; }
}
BoundingBoxf3 get_cross_mask_aabb(const Transform3d& matrix, const Vec3f& target, bool is_single = false) const;
BoundingBoxf3 get_cross_mask_aabb(const Transform3d& matrix, const Vec3f& target) const;
void modify_radius(float& radius) const;
@ -312,7 +312,7 @@ private:
Y,
Z
};
Transform3d get_corss_mask_model_matrix(ECrossMaskType type, const Vec3f& target, bool is_single = false) const;
Transform3d get_corss_mask_model_matrix(ECrossMaskType type, const Vec3f& target) const;
private:
// Flag for dirty visible state of Gizmo

View File

@ -105,7 +105,7 @@ BoundingBoxf3 GLGizmoMove3D::get_bounding_box() const
cur_tran = selection.get_first_volume()->get_instance_transformation();
}
auto t_cross_mask_aabb = get_cross_mask_aabb(cur_tran.get_matrix(), Vec3f::Zero(), true);
auto t_cross_mask_aabb = get_cross_mask_aabb(cur_tran.get_matrix(), Vec3f::Zero());
t_cross_mask_aabb.defined = true;
t_aabb.merge(t_cross_mask_aabb);
t_aabb.defined = true;
@ -300,7 +300,7 @@ void GLGizmoMove3D::on_render()
else {
cur_tran = selection.get_first_volume()->get_instance_transformation();
}
render_cross_mark(cur_tran.get_matrix(), Vec3f::Zero(), true);
render_cross_mark(cur_tran.get_matrix(), Vec3f::Zero());
}
}

View File

@ -459,6 +459,7 @@ Transform3d GLGizmoRotate::calculate_circle_model_matrix() const
{
auto radius = m_radius;
modify_radius(radius);
radius *= 1.3;
Transform3d redius_scale_matrix;
Geometry::scale_transform(redius_scale_matrix, { radius, radius, radius });
const Selection& selection = m_parent.get_selection();
@ -574,35 +575,6 @@ BoundingBoxf3 GLGizmoRotate::get_bounding_box() const
t_aabb.defined = true;
}
// end m_circle aabb
// m_grabber_connection aabb
if (m_grabber_connection.model.is_initialized()) {
BoundingBoxf3 t_grabber_connection_aabb = m_grabber_connection.model.get_bounding_box();
t_grabber_connection_aabb = t_grabber_connection_aabb.transformed(t_circle_model_matrix);
t_grabber_connection_aabb.defined = true;
t_aabb.merge(t_grabber_connection_aabb);
t_aabb.defined = true;
}
// m_grabbers aabb
if (m_grabbers.front().get_cube().is_initialized()) {
auto t_grabbers_aabb = m_grabbers.front().get_cube().get_bounding_box();
t_grabbers_aabb = t_grabbers_aabb.transformed(m_grabbers.front().m_matrix);
t_grabbers_aabb.defined = true;
t_aabb.merge(t_grabbers_aabb);
t_aabb.defined = true;
}
// end m_grabbers aabb
// m_cone aabb
if (m_cone.is_initialized()) {
auto t_cone_aabb = m_cone.get_bounding_box();
t_cone_aabb = t_cone_aabb.transformed(m_grabbers.front().m_matrix);
t_cone_aabb.defined = true;
t_aabb.merge(t_cone_aabb);
t_aabb.defined = true;
}
return t_aabb;
}
@ -628,21 +600,18 @@ BoundingBoxf3 GLGizmoRotate3D::get_bounding_box() const
BoundingBoxf3 t_aabb;
t_aabb.reset();
if (m_hover_id == -1 || m_hover_id == 0)
{
const auto t_x_aabb = m_gizmos[X].get_bounding_box();
t_aabb.merge(t_x_aabb);
t_aabb.defined = true;
}
if (m_hover_id == -1 || m_hover_id == 1)
{
const auto t_y_aabb = m_gizmos[Y].get_bounding_box();
t_aabb.merge(t_y_aabb);
t_aabb.defined = true;
}
if (m_hover_id == -1 || m_hover_id == 2)
{
const auto t_z_aabb = m_gizmos[Z].get_bounding_box();
t_aabb.merge(t_z_aabb);

View File

@ -613,7 +613,7 @@ void GLGizmoSVG::on_render()
render_glmodel(m_move_grabber.get_cube(), render_color, view_matrix * cube_mat, projection_matrix);
}
#ifdef DEBUG_SVG
render_cross_mark(tran.get_matrix(), Vec3f::Zero(), true);
render_cross_mark(tran.get_matrix(), Vec3f::Zero());
#endif
if (is_rotate_by_grabbers || (!is_surface_dragging && !is_parent_dragging)) {
if (m_hover_id == c_move_cube_id && m_dragging) {

View File

@ -657,10 +657,10 @@ void GLGizmoText::on_render()
Geometry::Transformation tran(m_text_volume_tran);
if (tran.get_offset().norm() > 1) {
auto text_volume_tran_world = mi->get_transformation().get_matrix() * m_text_volume_tran;
render_cross_mark(text_volume_tran_world, Vec3f::Zero(), true);
render_cross_mark(text_volume_tran_world, Vec3f::Zero());
}
render_cross_mark(m_text_tran_in_world, Vec3f::Zero(), true);
render_cross_mark(m_text_tran_in_world, Vec3f::Zero());
glsafe(::glLineWidth(2.0f));
::glBegin(GL_LINES);