mirror of
https://git.mirrors.martin98.com/https://github.com/bambulab/BambuStudio.git
synced 2025-09-28 18:23:14 +08:00
FIX:No need to calculate lod state in pick state
jira: STUDIO-11912 Change-Id: I32ee7d5a6bf6efc62cba4e3d9ef20024be814df7
This commit is contained in:
parent
3f8a4001e0
commit
d6eeceb20c
@ -460,10 +460,23 @@ Vec2f calc_pt_in_screen(const Vec3d &pt, const Matrix4d &view_proj_mat, int win
|
|||||||
LOD_LEVEL calc_volume_box_in_screen_bigger_than_threshold(const BoundingBoxf3 &v_box_in_world, const Matrix4d &view_proj_mat,
|
LOD_LEVEL calc_volume_box_in_screen_bigger_than_threshold(const BoundingBoxf3 &v_box_in_world, const Matrix4d &view_proj_mat,
|
||||||
int window_width, int window_height)
|
int window_width, int window_height)
|
||||||
{
|
{
|
||||||
auto s_min = calc_pt_in_screen(v_box_in_world.min, view_proj_mat, window_width, window_height);
|
auto & _min = v_box_in_world.min;
|
||||||
auto s_max = calc_pt_in_screen(v_box_in_world.max, view_proj_mat, window_width, window_height);
|
auto & _max = v_box_in_world.max;
|
||||||
auto size_x = abs(s_max.x() - s_min.x());
|
std::array<Vec3d,8> src_vertices;
|
||||||
auto size_y = abs(s_max.y() - s_min.y());
|
src_vertices[0] = _min;
|
||||||
|
src_vertices[1] = Vec3d(_max.x(), _min.y(), _min.z());
|
||||||
|
src_vertices[2] = Vec3d(_max.x(), _max.y(), _min.z());
|
||||||
|
src_vertices[3] = Vec3d(_min.x(), _max.y(), _min.z());
|
||||||
|
src_vertices[4] = Vec3d(_min.x(), _min.y(), _max.z());
|
||||||
|
src_vertices[5] = Vec3d(_max.x(), _min.y(), _max.z());
|
||||||
|
src_vertices[6] = _max;
|
||||||
|
src_vertices[7] = Vec3d(_min.x(), _max.y(), _max.z());
|
||||||
|
BoundingBoxf box2d;
|
||||||
|
for (int i = 0; i < src_vertices.size(); i++) {
|
||||||
|
box2d.merge(calc_pt_in_screen(src_vertices[i], view_proj_mat, window_width, window_height).cast<double>());
|
||||||
|
}
|
||||||
|
auto size_x = box2d.size().x();
|
||||||
|
auto size_y = box2d.size().y();
|
||||||
if (size_x >= LOD_SCREEN_MAX.x() || size_y >= LOD_SCREEN_MAX.y()) {
|
if (size_x >= LOD_SCREEN_MAX.x() || size_y >= LOD_SCREEN_MAX.y()) {
|
||||||
return LOD_LEVEL::HIGH;
|
return LOD_LEVEL::HIGH;
|
||||||
}
|
}
|
||||||
@ -951,8 +964,10 @@ void GLVolume::render(const GUI::Camera &camera, const std::vector<std::array<fl
|
|||||||
if (abs(zoom - LAST_CAMERA_ZOOM_VALUE) > ZOOM_THRESHOLD || m_lod_update_index >= LOD_UPDATE_FREQUENCY){
|
if (abs(zoom - LAST_CAMERA_ZOOM_VALUE) > ZOOM_THRESHOLD || m_lod_update_index >= LOD_UPDATE_FREQUENCY){
|
||||||
m_lod_update_index = 0;
|
m_lod_update_index = 0;
|
||||||
LAST_CAMERA_ZOOM_VALUE = zoom;
|
LAST_CAMERA_ZOOM_VALUE = zoom;
|
||||||
|
if (!picking) {
|
||||||
m_cur_lod_level = calc_volume_box_in_screen_bigger_than_threshold(transformed_bounding_box(), vier_proj_mat, viewport[2], viewport[3]);
|
m_cur_lod_level = calc_volume_box_in_screen_bigger_than_threshold(transformed_bounding_box(), vier_proj_mat, viewport[2], viewport[3]);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (m_cur_lod_level == LOD_LEVEL::SMALL && indexed_vertex_array_small) {
|
if (m_cur_lod_level == LOD_LEVEL::SMALL && indexed_vertex_array_small) {
|
||||||
render_which(indexed_vertex_array_small, shader);
|
render_which(indexed_vertex_array_small, shader);
|
||||||
} else if (m_cur_lod_level == LOD_LEVEL::MIDDLE && indexed_vertex_array_middle) {
|
} else if (m_cur_lod_level == LOD_LEVEL::MIDDLE && indexed_vertex_array_middle) {
|
||||||
@ -1078,8 +1093,10 @@ void GLVolume::render(const GUI::Camera &camera, const std::vector<std::array<fl
|
|||||||
if (abs(zoom - LAST_CAMERA_ZOOM_VALUE) > ZOOM_THRESHOLD || m_lod_update_index >= LOD_UPDATE_FREQUENCY) {
|
if (abs(zoom - LAST_CAMERA_ZOOM_VALUE) > ZOOM_THRESHOLD || m_lod_update_index >= LOD_UPDATE_FREQUENCY) {
|
||||||
m_lod_update_index = 0;
|
m_lod_update_index = 0;
|
||||||
LAST_CAMERA_ZOOM_VALUE = zoom;
|
LAST_CAMERA_ZOOM_VALUE = zoom;
|
||||||
|
if (!picking) {
|
||||||
m_cur_lod_level = calc_volume_box_in_screen_bigger_than_threshold(transformed_bounding_box(), vier_proj_mat, viewport[2], viewport[3]);
|
m_cur_lod_level = calc_volume_box_in_screen_bigger_than_threshold(transformed_bounding_box(), vier_proj_mat, viewport[2], viewport[3]);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (m_cur_lod_level == LOD_LEVEL::SMALL && indexed_vertex_array_small && indexed_vertex_array_small->vertices_and_normals_interleaved_VBO_id > 0) {
|
if (m_cur_lod_level == LOD_LEVEL::SMALL && indexed_vertex_array_small && indexed_vertex_array_small->vertices_and_normals_interleaved_VBO_id > 0) {
|
||||||
this->indexed_vertex_array_small->render(shader, this->tverts_range_lod, this->qverts_range_lod);
|
this->indexed_vertex_array_small->render(shader, this->tverts_range_lod, this->qverts_range_lod);
|
||||||
} else if (m_cur_lod_level == LOD_LEVEL::MIDDLE && indexed_vertex_array_middle && indexed_vertex_array_middle->vertices_and_normals_interleaved_VBO_id > 0) {
|
} else if (m_cur_lod_level == LOD_LEVEL::MIDDLE && indexed_vertex_array_middle && indexed_vertex_array_middle->vertices_and_normals_interleaved_VBO_id > 0) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user