mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 20:21:12 -06:00 
			
		
		
		
	3DScene layer editing overlay textures rendering moved to c++
This commit is contained in:
		
							parent
							
								
									751b41b94b
								
							
						
					
					
						commit
						f31c55ceed
					
				
					 8 changed files with 403 additions and 71 deletions
				
			
		|  | @ -1484,6 +1484,11 @@ sub Render { | |||
|     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | ||||
|     Slic3r::GUI::_3DScene::render_background($self); | ||||
|     Slic3r::GUI::_3DScene::render_bed($self); | ||||
|     Slic3r::GUI::_3DScene::render_axes($self); | ||||
|     Slic3r::GUI::_3DScene::render_objects($self, $self->UseVBOs); | ||||
|     Slic3r::GUI::_3DScene::render_cutting_plane($self); | ||||
|     Slic3r::GUI::_3DScene::render_warning_texture($self); | ||||
|     Slic3r::GUI::_3DScene::render_legend_texture($self); | ||||
|      | ||||
| #    if ($self->enable_picking && !$self->_mouse_dragging) { | ||||
| #        if (my $pos = $self->_mouse_pos) { | ||||
|  | @ -1577,17 +1582,9 @@ sub Render { | |||
| #         | ||||
| #        glDisable(GL_BLEND); | ||||
| #    } | ||||
| #============================================================================================================================== | ||||
|      | ||||
|     my $volumes_bb = $self->volumes_bounding_box; | ||||
|      | ||||
| #============================================================================================================================== | ||||
|     Slic3r::GUI::_3DScene::render_axes($self); | ||||
|     Slic3r::GUI::_3DScene::render_objects($self, $self->UseVBOs); | ||||
|     Slic3r::GUI::_3DScene::render_cutting_plane($self); | ||||
|     Slic3r::GUI::_3DScene::render_warning_texture($self); | ||||
|     Slic3r::GUI::_3DScene::render_legend_texture($self); | ||||
|      | ||||
| #     | ||||
| #    my $volumes_bb = $self->volumes_bounding_box; | ||||
| #     | ||||
| #    { | ||||
| #       # draw axes | ||||
| #        # disable depth testing so that axes are not covered by ground | ||||
|  | @ -1771,21 +1768,21 @@ sub _load_image_set_texture { | |||
|     return $params; | ||||
| } | ||||
| 
 | ||||
| sub _variable_layer_thickness_load_overlay_image { | ||||
|     my ($self) = @_; | ||||
|     $self->{layer_preview_annotation} = $self->_load_image_set_texture('variable_layer_height_tooltip.png') | ||||
|         if (! $self->{layer_preview_annotation}->{loaded}); | ||||
|     return $self->{layer_preview_annotation}->{valid}; | ||||
| } | ||||
| 
 | ||||
| sub _variable_layer_thickness_load_reset_image { | ||||
|     my ($self) = @_; | ||||
|     $self->{layer_preview_reset_image} = $self->_load_image_set_texture('variable_layer_height_reset.png') | ||||
|         if (! $self->{layer_preview_reset_image}->{loaded}); | ||||
|     return $self->{layer_preview_reset_image}->{valid}; | ||||
| } | ||||
| 
 | ||||
| #============================================================================================================================== | ||||
| #sub _variable_layer_thickness_load_overlay_image { | ||||
| #    my ($self) = @_; | ||||
| #    $self->{layer_preview_annotation} = $self->_load_image_set_texture('variable_layer_height_tooltip.png') | ||||
| #        if (! $self->{layer_preview_annotation}->{loaded}); | ||||
| #    return $self->{layer_preview_annotation}->{valid}; | ||||
| #} | ||||
| # | ||||
| #sub _variable_layer_thickness_load_reset_image { | ||||
| #    my ($self) = @_; | ||||
| #    $self->{layer_preview_reset_image} = $self->_load_image_set_texture('variable_layer_height_reset.png') | ||||
| #        if (! $self->{layer_preview_reset_image}->{loaded}); | ||||
| #    return $self->{layer_preview_reset_image}->{valid}; | ||||
| #} | ||||
| # | ||||
| ## Paint the tooltip. | ||||
| #sub _render_image { | ||||
| #    my ($self, $image, $l, $r, $b, $t) = @_; | ||||
|  | @ -1876,27 +1873,21 @@ sub draw_active_object_annotations { | |||
|     glBindTexture(GL_TEXTURE_2D, 0); | ||||
|     $self->{layer_height_edit_shader}->disable; | ||||
| 
 | ||||
|     # Paint the tooltip. | ||||
|     if ($self->_variable_layer_thickness_load_overlay_image) { | ||||
| #============================================================================================================================== | ||||
|         my $zoom = Slic3r::GUI::_3DScene::get_camera_zoom($self); | ||||
|         my $gap = 10/$zoom; | ||||
|         my ($l, $r, $b, $t) = ($bar_left - $self->{layer_preview_annotation}->{width}/$zoom - $gap, $bar_left - $gap, $reset_bottom + $self->{layer_preview_annotation}->{height}/$zoom + $gap, $reset_bottom + $gap); | ||||
|         Slic3r::GUI::_3DScene::render_texture($self, $self->{layer_preview_annotation}->{texture_id}, $l, $r, $t, $b); | ||||
|      | ||||
|     Slic3r::GUI::_3DScene::render_layer_editing_textures($self); | ||||
| 
 | ||||
| #    # Paint the tooltip. | ||||
| #    if ($self->_variable_layer_thickness_load_overlay_image)  | ||||
| #        my $gap = 10/$self->_zoom; | ||||
| #        my ($l, $r, $b, $t) = ($bar_left - $self->{layer_preview_annotation}->{width}/$self->_zoom - $gap, $bar_left - $gap, $reset_bottom + $self->{layer_preview_annotation}->{height}/$self->_zoom + $gap, $reset_bottom + $gap); | ||||
| #        $self->_render_image($self->{layer_preview_annotation}, $l, $r, $t, $b); | ||||
| #============================================================================================================================== | ||||
|     } | ||||
| 
 | ||||
|     # Paint the reset button. | ||||
|     if ($self->_variable_layer_thickness_load_reset_image) { | ||||
| #============================================================================================================================== | ||||
|         Slic3r::GUI::_3DScene::render_texture($self, $self->{layer_preview_reset_image}->{texture_id}, $reset_left, $reset_right, $reset_bottom, $reset_top); | ||||
| #    } | ||||
| # | ||||
| #    # Paint the reset button. | ||||
| #    if ($self->_variable_layer_thickness_load_reset_image) { | ||||
| #        $self->_render_image($self->{layer_preview_reset_image}, $reset_left, $reset_right, $reset_bottom, $reset_top); | ||||
| #    } | ||||
| #============================================================================================================================== | ||||
|     } | ||||
| 
 | ||||
|     # Paint the graph. | ||||
|     #FIXME show some kind of legend. | ||||
|  |  | |||
|  | @ -2065,6 +2065,11 @@ void _3DScene::render_legend_texture(wxGLCanvas* canvas) | |||
|     s_canvas_mgr.render_legend_texture(canvas); | ||||
| } | ||||
| 
 | ||||
| void _3DScene::render_layer_editing_textures(wxGLCanvas* canvas) | ||||
| { | ||||
|     s_canvas_mgr.render_layer_editing_textures(canvas); | ||||
| } | ||||
| 
 | ||||
| void _3DScene::render_texture(wxGLCanvas* canvas, unsigned int tex_id, float left, float right, float bottom, float top) | ||||
| { | ||||
|     s_canvas_mgr.render_texture(canvas, tex_id, left, right, bottom, top); | ||||
|  |  | |||
|  | @ -631,6 +631,7 @@ public: | |||
|     static void render_cutting_plane(wxGLCanvas* canvas); | ||||
|     static void render_warning_texture(wxGLCanvas* canvas); | ||||
|     static void render_legend_texture(wxGLCanvas* canvas); | ||||
|     static void render_layer_editing_textures(wxGLCanvas* canvas); | ||||
| 
 | ||||
|     static void render_texture(wxGLCanvas* canvas, unsigned int tex_id, float left, float right, float bottom, float top); | ||||
| 
 | ||||
|  |  | |||
|  | @ -6,7 +6,9 @@ | |||
| #include "../../libslic3r/PrintConfig.hpp" | ||||
| 
 | ||||
| #include <GL/glew.h> | ||||
| 
 | ||||
| #include <wx/glcanvas.h> | ||||
| #include <wx/image.h> | ||||
| 
 | ||||
| #include <iostream> | ||||
| 
 | ||||
|  | @ -23,6 +25,9 @@ static const float VIEW_BOTTOM[2] = { 0.0f, 180.0f }; | |||
| static const float VIEW_FRONT[2] = { 0.0f, 90.0f }; | ||||
| static const float VIEW_REAR[2] = { 180.0f, 90.0f }; | ||||
| 
 | ||||
| static const float VARIABLE_LAYER_THICKNESS_BAR_WIDTH = 70.0f; | ||||
| static const float VARIABLE_LAYER_THICKNESS_RESET_BUTTON_HEIGHT = 22.0f; | ||||
| 
 | ||||
| namespace Slic3r { | ||||
| namespace GUI { | ||||
| 
 | ||||
|  | @ -85,6 +90,94 @@ unsigned int GeometryBuffer::get_data_size() const | |||
|     return (unsigned int)m_data.size(); | ||||
| } | ||||
| 
 | ||||
| Size::Size() | ||||
|     : m_width(0) | ||||
|     , m_height(0) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| Size::Size(int width, int height) | ||||
|     : m_width(width) | ||||
|     , m_height(height) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| int Size::get_width() const | ||||
| { | ||||
|     return m_width; | ||||
| } | ||||
| 
 | ||||
| void Size::set_width(int width) | ||||
| { | ||||
|     m_width = width; | ||||
| } | ||||
| 
 | ||||
| int Size::get_height() const | ||||
| { | ||||
|     return m_height; | ||||
| } | ||||
| 
 | ||||
| void Size::set_height(int height) | ||||
| { | ||||
|     m_height = height; | ||||
| } | ||||
| 
 | ||||
| Rect::Rect() | ||||
|     : m_left(0.0f) | ||||
|     , m_top(0.0f) | ||||
|     , m_right(0.0f) | ||||
|     , m_bottom(0.0f) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| Rect::Rect(float left, float top, float right, float bottom) | ||||
|     : m_left(left) | ||||
|     , m_top(top) | ||||
|     , m_right(right) | ||||
|     , m_bottom(bottom) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| float Rect::get_left() const | ||||
| { | ||||
|     return m_left; | ||||
| } | ||||
| 
 | ||||
| void Rect::set_left(float left) | ||||
| { | ||||
|     m_left = left; | ||||
| } | ||||
| 
 | ||||
| float Rect::get_top() const | ||||
| { | ||||
|     return m_top; | ||||
| } | ||||
| 
 | ||||
| void Rect::set_top(float top) | ||||
| { | ||||
|     m_top = top; | ||||
| } | ||||
| 
 | ||||
| float Rect::get_right() const | ||||
| { | ||||
|     return m_right; | ||||
| } | ||||
| 
 | ||||
| void Rect::set_right(float right) | ||||
| { | ||||
|     m_right = right; | ||||
| } | ||||
| 
 | ||||
| float Rect::get_bottom() const | ||||
| { | ||||
|     return m_bottom; | ||||
| } | ||||
| 
 | ||||
| void Rect::set_bottom(float bottom) | ||||
| { | ||||
|     m_bottom = bottom; | ||||
| } | ||||
| 
 | ||||
| GLCanvas3D::Camera::Camera() | ||||
|     : m_type(CT_Ortho) | ||||
|     , m_zoom(1.0f) | ||||
|  | @ -406,16 +499,178 @@ void GLCanvas3D::CuttingPlane::_render_contour() const | |||
|     ::glDisableClientState(GL_VERTEX_ARRAY); | ||||
| } | ||||
| 
 | ||||
| GLCanvas3D::LayersEditing::GLTextureData::GLTextureData() | ||||
|     : id(0) | ||||
|     , width(0) | ||||
|     , height(0) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| GLCanvas3D::LayersEditing::GLTextureData::GLTextureData(unsigned int id, int width, int height) | ||||
|     : id(id) | ||||
|     , width(width) | ||||
|     , height(height) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| GLCanvas3D::LayersEditing::LayersEditing() | ||||
|     : m_enabled(false) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| GLCanvas3D::LayersEditing::~LayersEditing() | ||||
| { | ||||
|     if (m_tooltip_texture.id != 0) | ||||
|     { | ||||
|         ::glDeleteTextures(1, &m_tooltip_texture.id); | ||||
|         m_tooltip_texture = GLTextureData(); | ||||
|     } | ||||
|      | ||||
|     if (m_reset_texture.id != 0) | ||||
|     { | ||||
|         ::glDeleteTextures(1, &m_reset_texture.id); | ||||
|         m_reset_texture = GLTextureData(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| bool GLCanvas3D::LayersEditing::is_enabled() const | ||||
| { | ||||
|     return m_enabled; | ||||
| } | ||||
| 
 | ||||
| void GLCanvas3D::LayersEditing::render(const GLCanvas3D& canvas) const | ||||
| { | ||||
|     const Rect& bar_rect = _get_bar_rect_viewport(canvas); | ||||
|     const Rect& reset_rect = _get_reset_rect_viewport(canvas); | ||||
|     _render_tooltip_texture(canvas, bar_rect, reset_rect); | ||||
|     _render_reset_texture(canvas, reset_rect); | ||||
| } | ||||
| 
 | ||||
| GLCanvas3D::LayersEditing::GLTextureData GLCanvas3D::LayersEditing::_load_texture_from_file(const std::string& filename) const | ||||
| { | ||||
|     const std::string& path = resources_dir() + "/icons/"; | ||||
| 
 | ||||
|     // Load a PNG with an alpha channel.
 | ||||
|     wxImage image; | ||||
|     if (!image.LoadFile(path + filename, wxBITMAP_TYPE_PNG)) | ||||
|         return GLTextureData(); | ||||
| 
 | ||||
|     int width = image.GetWidth(); | ||||
|     int height = image.GetHeight(); | ||||
|     int n_pixels = width * height; | ||||
| 
 | ||||
|     if (n_pixels <= 0) | ||||
|         return GLTextureData(); | ||||
| 
 | ||||
|     // Get RGB & alpha raw data from wxImage, pack them into an array.
 | ||||
|     unsigned char* img_rgb = image.GetData(); | ||||
|     if (img_rgb == nullptr) | ||||
|         return GLTextureData(); | ||||
| 
 | ||||
|     unsigned char* img_alpha = image.GetAlpha(); | ||||
| 
 | ||||
|     std::vector<unsigned char> data(n_pixels * 4, 0); | ||||
|     for (int i = 0; i < n_pixels; ++i) | ||||
|     { | ||||
|         int data_id = i * 4; | ||||
|         int img_id = i * 3; | ||||
|         data[data_id + 0] = img_rgb[img_id + 0]; | ||||
|         data[data_id + 1] = img_rgb[img_id + 1]; | ||||
|         data[data_id + 2] = img_rgb[img_id + 2]; | ||||
|         data[data_id + 3] = (img_alpha != nullptr) ? img_alpha[i] : 255; | ||||
|     } | ||||
| 
 | ||||
|     // sends data to gpu
 | ||||
|     GLuint tex_id; | ||||
|     ::glGenTextures(1, &tex_id); | ||||
|     ::glBindTexture(GL_TEXTURE_2D, tex_id); | ||||
|     ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | ||||
|     ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | ||||
|     ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1); | ||||
|     ::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, (GLsizei)width, (GLsizei)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data()); | ||||
|     ::glBindTexture(GL_TEXTURE_2D, 0); | ||||
| 
 | ||||
|     return GLTextureData((unsigned int)tex_id, width, height); | ||||
| } | ||||
| 
 | ||||
| void GLCanvas3D::LayersEditing::_render_tooltip_texture(const GLCanvas3D& canvas, const Rect& bar_rect, const Rect& reset_rect) const | ||||
| { | ||||
|     if (m_tooltip_texture.id == 0) | ||||
|     { | ||||
|         m_tooltip_texture = _load_texture_from_file("variable_layer_height_tooltip.png"); | ||||
|         if (m_tooltip_texture.id == 0) | ||||
|             return; | ||||
|     } | ||||
| 
 | ||||
|     float zoom = canvas.get_camera_zoom(); | ||||
|     float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; | ||||
|     float gap = 10.0f * inv_zoom; | ||||
| 
 | ||||
|     float bar_left = bar_rect.get_left(); | ||||
|     float reset_bottom = reset_rect.get_bottom(); | ||||
| 
 | ||||
|     float l = bar_left - (float)m_tooltip_texture.width * inv_zoom - gap; | ||||
|     float r = bar_left - gap; | ||||
|     float t = reset_bottom + (float)m_tooltip_texture.height * inv_zoom + gap; | ||||
|     float b = reset_bottom + gap; | ||||
| 
 | ||||
|     canvas.render_texture(m_tooltip_texture.id, l, r, b, t); | ||||
| } | ||||
| 
 | ||||
| void GLCanvas3D::LayersEditing::_render_reset_texture(const GLCanvas3D& canvas, const Rect& reset_rect) const | ||||
| { | ||||
|     if (m_reset_texture.id == 0) | ||||
|     { | ||||
|         m_reset_texture = _load_texture_from_file("variable_layer_height_reset.png"); | ||||
|         if (m_reset_texture.id == 0) | ||||
|             return; | ||||
|     } | ||||
| 
 | ||||
|     canvas.render_texture(m_reset_texture.id, reset_rect.get_left(), reset_rect.get_right(), reset_rect.get_bottom(), reset_rect.get_top()); | ||||
| } | ||||
| 
 | ||||
| Rect GLCanvas3D::LayersEditing::_get_bar_rect_screen(const GLCanvas3D& canvas) const | ||||
| { | ||||
|     const Size& cnv_size = canvas.get_canvas_size(); | ||||
|     float w = (float)cnv_size.get_width(); | ||||
|     float h = (float)cnv_size.get_height(); | ||||
| 
 | ||||
|     return Rect(w - VARIABLE_LAYER_THICKNESS_BAR_WIDTH, 0.0f, w, h - VARIABLE_LAYER_THICKNESS_RESET_BUTTON_HEIGHT); | ||||
| } | ||||
| 
 | ||||
| Rect GLCanvas3D::LayersEditing::_get_reset_rect_screen(const GLCanvas3D& canvas) const | ||||
| { | ||||
|     const Size& cnv_size = canvas.get_canvas_size(); | ||||
|     float w = (float)cnv_size.get_width(); | ||||
|     float h = (float)cnv_size.get_height(); | ||||
| 
 | ||||
|     return Rect(w - VARIABLE_LAYER_THICKNESS_BAR_WIDTH, h - VARIABLE_LAYER_THICKNESS_RESET_BUTTON_HEIGHT, w, h); | ||||
| } | ||||
| 
 | ||||
| Rect GLCanvas3D::LayersEditing::_get_bar_rect_viewport(const GLCanvas3D& canvas) const | ||||
| { | ||||
|     const Size& cnv_size = canvas.get_canvas_size(); | ||||
|     float half_w = 0.5f * (float)cnv_size.get_width(); | ||||
|     float half_h = 0.5f * (float)cnv_size.get_height(); | ||||
| 
 | ||||
|     float zoom = canvas.get_camera_zoom(); | ||||
|     float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; | ||||
| 
 | ||||
|     return Rect((half_w - VARIABLE_LAYER_THICKNESS_BAR_WIDTH) * inv_zoom, half_h * inv_zoom, half_w * inv_zoom, (-half_h + VARIABLE_LAYER_THICKNESS_RESET_BUTTON_HEIGHT) * inv_zoom); | ||||
| } | ||||
| 
 | ||||
| Rect GLCanvas3D::LayersEditing::_get_reset_rect_viewport(const GLCanvas3D& canvas) const | ||||
| { | ||||
|     const Size& cnv_size = canvas.get_canvas_size(); | ||||
|     float half_w = 0.5f * (float)cnv_size.get_width(); | ||||
|     float half_h = 0.5f * (float)cnv_size.get_height(); | ||||
| 
 | ||||
|     float zoom = canvas.get_camera_zoom(); | ||||
|     float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; | ||||
| 
 | ||||
|     return Rect((half_w - VARIABLE_LAYER_THICKNESS_BAR_WIDTH) * inv_zoom, (-half_h + VARIABLE_LAYER_THICKNESS_RESET_BUTTON_HEIGHT) * inv_zoom, half_w * inv_zoom, -half_h * inv_zoom); | ||||
| } | ||||
| 
 | ||||
| GLCanvas3D::Shader::Shader() | ||||
|     : m_enabled(false) | ||||
|     , m_shader(nullptr) | ||||
|  | @ -524,7 +779,6 @@ GLCanvas3D::~GLCanvas3D() | |||
| bool GLCanvas3D::init(bool useVBOs) | ||||
| { | ||||
|     ::glClearColor(0.0f, 0.0f, 0.0f, 1.0f); | ||||
| //    ::glColor3f(1.0f, 0.0f, 0.0f);
 | ||||
|     ::glEnable(GL_DEPTH_TEST); | ||||
|     ::glClearDepth(1.0f); | ||||
|     ::glDepthFunc(GL_LEQUAL); | ||||
|  | @ -540,7 +794,6 @@ bool GLCanvas3D::init(bool useVBOs) | |||
|     GLfloat ambient[4] = { 0.3f, 0.3f, 0.3f, 1.0f }; | ||||
|     ::glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient); | ||||
| 
 | ||||
| //    ::glEnable(GL_LIGHTING);
 | ||||
|     ::glEnable(GL_LIGHT0); | ||||
|     ::glEnable(GL_LIGHT1); | ||||
| 
 | ||||
|  | @ -968,8 +1221,6 @@ void GLCanvas3D::picking_pass() | |||
| { | ||||
|     if (is_picking_enabled() && !is_mouse_dragging() && (m_volumes != nullptr)) | ||||
|     { | ||||
|         const Pointf& pos = get_mouse_position(); | ||||
| //        if (pos) {
 | ||||
|         // Render the object for picking.
 | ||||
|         // FIXME This cannot possibly work in a multi - sampled context as the color gets mangled by the anti - aliasing.
 | ||||
|         // Better to use software ray - casting on a bounding - box hierarchy.
 | ||||
|  | @ -991,12 +1242,11 @@ void GLCanvas3D::picking_pass() | |||
|         if (is_multisample_allowed()) | ||||
|             ::glEnable(GL_MULTISAMPLE); | ||||
| 
 | ||||
| //        ::glFlush();
 | ||||
| 
 | ||||
|         const std::pair<int, int>& cnv_size = _get_canvas_size(); | ||||
|         const Size& cnv_size = get_canvas_size(); | ||||
| 
 | ||||
|         const Pointf& pos = get_mouse_position(); | ||||
|         GLubyte color[4]; | ||||
|         ::glReadPixels(pos.x, cnv_size.second - pos.y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)color); | ||||
|         ::glReadPixels(pos.x, cnv_size.get_height() - pos.y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)color); | ||||
|         int volume_id = color[0] + color[1] * 256 + color[2] * 256 * 256; | ||||
| 
 | ||||
|         set_hover_volume_id(-1); | ||||
|  | @ -1021,7 +1271,6 @@ void GLCanvas3D::picking_pass() | |||
|             } | ||||
|         } | ||||
|     } | ||||
| //        }
 | ||||
| } | ||||
| 
 | ||||
| void GLCanvas3D::render_background() const | ||||
|  | @ -1181,11 +1430,11 @@ void GLCanvas3D::render_warning_texture() const | |||
|             ::glPushMatrix(); | ||||
|             ::glLoadIdentity(); | ||||
| 
 | ||||
|             const std::pair<int, int>& cnv_size = _get_canvas_size(); | ||||
|             const Size& cnv_size = get_canvas_size(); | ||||
|             float zoom = get_camera_zoom(); | ||||
|             float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; | ||||
|             float l = (-0.5f * (float)w) * inv_zoom; | ||||
|             float t = (-0.5f * (float)cnv_size.second + (float)h) * inv_zoom; | ||||
|             float t = (-0.5f * (float)cnv_size.get_height() + (float)h) * inv_zoom; | ||||
|             float r = l + (float)w * inv_zoom; | ||||
|             float b = t - (float)h * inv_zoom; | ||||
| 
 | ||||
|  | @ -1214,11 +1463,11 @@ void GLCanvas3D::render_legend_texture() const | |||
|             ::glPushMatrix(); | ||||
|             ::glLoadIdentity(); | ||||
|              | ||||
|             const std::pair<int, int>& cnv_size = _get_canvas_size(); | ||||
|             const Size& cnv_size = get_canvas_size(); | ||||
|             float zoom = get_camera_zoom(); | ||||
|             float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; | ||||
|             float l = (-0.5f * (float)cnv_size.first) * inv_zoom; | ||||
|             float t = (0.5f * (float)cnv_size.second) * inv_zoom; | ||||
|             float l = (-0.5f * (float)cnv_size.get_width()) * inv_zoom; | ||||
|             float t = (0.5f * (float)cnv_size.get_height()) * inv_zoom; | ||||
|             float r = l + (float)w * inv_zoom; | ||||
|             float b = t - (float)h * inv_zoom; | ||||
|             render_texture(tex_id, l, r, b, t); | ||||
|  | @ -1229,6 +1478,11 @@ void GLCanvas3D::render_legend_texture() const | |||
|     } | ||||
| } | ||||
| 
 | ||||
| void GLCanvas3D::render_layer_editing_textures() const | ||||
| { | ||||
|     m_layers_editing.render(*this); | ||||
| } | ||||
| 
 | ||||
| void GLCanvas3D::render_texture(unsigned int tex_id, float left, float right, float bottom, float top) const | ||||
| { | ||||
|     ::glColor4f(1.0f, 1.0f, 1.0f, 1.0f); | ||||
|  | @ -1278,8 +1532,8 @@ void GLCanvas3D::on_idle(wxIdleEvent& evt) | |||
| 
 | ||||
|     if (m_canvas != nullptr) | ||||
|     { | ||||
|         const std::pair<int, int>& cnv_size = _get_canvas_size(); | ||||
|         resize((unsigned int)cnv_size.first, (unsigned int)cnv_size.second); | ||||
|         const Size& cnv_size = get_canvas_size(); | ||||
|         resize((unsigned int)cnv_size.get_width(), (unsigned int)cnv_size.get_height()); | ||||
|         m_canvas->Refresh(); | ||||
|     } | ||||
| } | ||||
|  | @ -1319,6 +1573,17 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) | |||
|     } | ||||
| } | ||||
| 
 | ||||
| Size GLCanvas3D::get_canvas_size() const | ||||
| { | ||||
|     int w = 0; | ||||
|     int h = 0; | ||||
| 
 | ||||
|     if (m_canvas != nullptr) | ||||
|         m_canvas->GetSize(&w, &h); | ||||
| 
 | ||||
|     return Size(w, h); | ||||
| } | ||||
| 
 | ||||
| void GLCanvas3D::_zoom_to_bounding_box(const BoundingBoxf3& bbox) | ||||
| { | ||||
|     // Calculate the zoom factor needed to adjust viewport to bounding box.
 | ||||
|  | @ -1333,24 +1598,14 @@ void GLCanvas3D::_zoom_to_bounding_box(const BoundingBoxf3& bbox) | |||
| 
 | ||||
|         if (is_shown_on_screen()) | ||||
|         { | ||||
|             const std::pair<int, int>& cnv_size = _get_canvas_size(); | ||||
|             resize((unsigned int)cnv_size.first, (unsigned int)cnv_size.second); | ||||
|             const Size& cnv_size = get_canvas_size(); | ||||
|             resize((unsigned int)cnv_size.get_width(), (unsigned int)cnv_size.get_height()); | ||||
|             if (m_canvas != nullptr) | ||||
|                 m_canvas->Refresh(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| std::pair<int, int> GLCanvas3D::_get_canvas_size() const | ||||
| { | ||||
|     std::pair<int, int> ret(0, 0); | ||||
| 
 | ||||
|     if (m_canvas != nullptr) | ||||
|         m_canvas->GetSize(&ret.first, &ret.second); | ||||
| 
 | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| float GLCanvas3D::_get_zoom_to_bounding_box_factor(const BoundingBoxf3& bbox) const | ||||
| { | ||||
|     float max_bb_size = bbox.max_size(); | ||||
|  | @ -1433,8 +1688,8 @@ float GLCanvas3D::_get_zoom_to_bounding_box_factor(const BoundingBoxf3& bbox) co | |||
|     max_x *= 2.0; | ||||
|     max_y *= 2.0; | ||||
| 
 | ||||
|     const std::pair<int, int>& cnv_size = _get_canvas_size(); | ||||
|     return (float)std::min((coordf_t)cnv_size.first / max_x, (coordf_t)cnv_size.second / max_y); | ||||
|     const Size& cnv_size = get_canvas_size(); | ||||
|     return (float)std::min((coordf_t)cnv_size.get_width() / max_x, (coordf_t)cnv_size.get_height() / max_y); | ||||
| } | ||||
| 
 | ||||
| void GLCanvas3D::_deregister_callbacks() | ||||
|  |  | |||
|  | @ -32,6 +32,46 @@ public: | |||
|     unsigned int get_data_size() const; | ||||
| }; | ||||
| 
 | ||||
| class Size | ||||
| { | ||||
|     int m_width; | ||||
|     int m_height; | ||||
| 
 | ||||
| public: | ||||
|     Size(); | ||||
|     Size(int width, int height); | ||||
| 
 | ||||
|     int get_width() const; | ||||
|     void set_width(int width); | ||||
| 
 | ||||
|     int get_height() const; | ||||
|     void set_height(int height); | ||||
| }; | ||||
| 
 | ||||
| class Rect | ||||
| { | ||||
|     float m_left; | ||||
|     float m_top; | ||||
|     float m_right; | ||||
|     float m_bottom; | ||||
| 
 | ||||
| public: | ||||
|     Rect(); | ||||
|     Rect(float left, float top, float right, float bottom); | ||||
| 
 | ||||
|     float get_left() const; | ||||
|     void set_left(float left); | ||||
| 
 | ||||
|     float get_top() const; | ||||
|     void set_top(float top); | ||||
| 
 | ||||
|     float get_right() const; | ||||
|     void set_right(float right); | ||||
| 
 | ||||
|     float get_bottom() const; | ||||
|     void set_bottom(float bottom); | ||||
| }; | ||||
| 
 | ||||
| class GLCanvas3D | ||||
| { | ||||
| public: | ||||
|  | @ -135,12 +175,36 @@ public: | |||
| 
 | ||||
|     class LayersEditing | ||||
|     { | ||||
|         struct GLTextureData | ||||
|         { | ||||
|             unsigned int id; | ||||
|             int width; | ||||
|             int height; | ||||
| 
 | ||||
|             GLTextureData(); | ||||
|             GLTextureData(unsigned int id, int width, int height); | ||||
|         }; | ||||
| 
 | ||||
|         bool m_enabled; | ||||
|         mutable GLTextureData m_tooltip_texture; | ||||
|         mutable GLTextureData m_reset_texture; | ||||
| 
 | ||||
|     public: | ||||
|         LayersEditing(); | ||||
|         ~LayersEditing(); | ||||
| 
 | ||||
|         bool is_enabled() const; | ||||
| 
 | ||||
|         void render(const GLCanvas3D& canvas) const; | ||||
| 
 | ||||
|     private: | ||||
|         GLTextureData _load_texture_from_file(const std::string& filename) const; | ||||
|         void _render_tooltip_texture(const GLCanvas3D& canvas, const Rect& bar_rect, const Rect& reset_rect) const; | ||||
|         void _render_reset_texture(const GLCanvas3D& canvas, const Rect& reset_rect) const; | ||||
|         Rect _get_bar_rect_screen(const GLCanvas3D& canvas) const; | ||||
|         Rect _get_reset_rect_screen(const GLCanvas3D& canvas) const; | ||||
|         Rect _get_bar_rect_viewport(const GLCanvas3D& canvas) const; | ||||
|         Rect _get_reset_rect_viewport(const GLCanvas3D& canvas) const; | ||||
|     }; | ||||
| 
 | ||||
|     class Shader | ||||
|  | @ -299,6 +363,7 @@ public: | |||
|     void render_cutting_plane() const; | ||||
|     void render_warning_texture() const; | ||||
|     void render_legend_texture() const; | ||||
|     void render_layer_editing_textures() const; | ||||
| 
 | ||||
|     void render_texture(unsigned int tex_id, float left, float right, float bottom, float top) const; | ||||
| 
 | ||||
|  | @ -309,9 +374,10 @@ public: | |||
|     void on_idle(wxIdleEvent& evt); | ||||
|     void on_char(wxKeyEvent& evt); | ||||
| 
 | ||||
|     Size get_canvas_size() const; | ||||
| 
 | ||||
| private: | ||||
|     void _zoom_to_bounding_box(const BoundingBoxf3& bbox); | ||||
|     std::pair<int, int> _get_canvas_size() const; | ||||
|     float _get_zoom_to_bounding_box_factor(const BoundingBoxf3& bbox) const; | ||||
| 
 | ||||
|     void _deregister_callbacks(); | ||||
|  |  | |||
|  | @ -560,6 +560,13 @@ void GLCanvas3DManager::render_legend_texture(wxGLCanvas* canvas) const | |||
|         it->second->render_legend_texture(); | ||||
| } | ||||
| 
 | ||||
| void GLCanvas3DManager::render_layer_editing_textures(wxGLCanvas* canvas) const | ||||
| { | ||||
|     CanvasesMap::const_iterator it = _get_canvas(canvas); | ||||
|     if (it != m_canvases.end()) | ||||
|         it->second->render_layer_editing_textures(); | ||||
| } | ||||
| 
 | ||||
| void GLCanvas3DManager::render_texture(wxGLCanvas* canvas, unsigned int tex_id, float left, float right, float bottom, float top) const | ||||
| { | ||||
|     CanvasesMap::const_iterator it = _get_canvas(canvas); | ||||
|  |  | |||
|  | @ -139,6 +139,7 @@ public: | |||
|     void render_cutting_plane(wxGLCanvas* canvas) const; | ||||
|     void render_warning_texture(wxGLCanvas* canvas) const; | ||||
|     void render_legend_texture(wxGLCanvas* canvas) const; | ||||
|     void render_layer_editing_textures(wxGLCanvas* canvas) const; | ||||
| 
 | ||||
|     void render_texture(wxGLCanvas* canvas, unsigned int tex_id, float left, float right, float bottom, float top) const; | ||||
| 
 | ||||
|  |  | |||
|  | @ -632,6 +632,12 @@ render_legend_texture(canvas) | |||
|     CODE: | ||||
|         _3DScene::render_legend_texture((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas")); | ||||
| 
 | ||||
| void | ||||
| render_layer_editing_textures(canvas) | ||||
|         SV *canvas; | ||||
|     CODE: | ||||
|         _3DScene::render_layer_editing_textures((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas")); | ||||
| 
 | ||||
| void | ||||
| render_texture(canvas, tex_id, left, right, bottom, top) | ||||
|         SV           *canvas; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Enrico Turri
						Enrico Turri