mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 20:21:12 -06:00 
			
		
		
		
	1) Added new tech ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
2) Imgui dialog replaces texture for reset button and tooltip when layer editing is active
This commit is contained in:
		
							parent
							
								
									1e8aa54559
								
							
						
					
					
						commit
						6e4060569a
					
				
					 5 changed files with 132 additions and 12 deletions
				
			
		|  | @ -1522,9 +1522,12 @@ bool PrintObject::update_layer_height_profile(const ModelObject &model_object, c | |||
|         layer_height_profile.clear(); | ||||
| 
 | ||||
|     if (layer_height_profile.empty()) { | ||||
|             //layer_height_profile = layer_height_profile_adaptive(slicing_parameters, model_object.layer_config_ranges, model_object.volumes);
 | ||||
|             layer_height_profile = layer_height_profile_from_ranges(slicing_parameters, model_object.layer_config_ranges); | ||||
|        	updated = true; | ||||
| //#if ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
| //        layer_height_profile = layer_height_profile_adaptive(slicing_parameters, model_object.layer_config_ranges, model_object.volumes);
 | ||||
| //#else
 | ||||
|         layer_height_profile = layer_height_profile_from_ranges(slicing_parameters, model_object.layer_config_ranges); | ||||
| //#endif // ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
|         updated = true; | ||||
|     } | ||||
|     return updated; | ||||
| } | ||||
|  |  | |||
|  | @ -42,4 +42,7 @@ | |||
| #define ENABLE_THUMBNAIL_GENERATOR_DEBUG (0 && ENABLE_THUMBNAIL_GENERATOR) | ||||
| #define ENABLE_THUMBNAIL_GENERATOR_PNG_TO_GCODE (1 && ENABLE_THUMBNAIL_GENERATOR) | ||||
| 
 | ||||
| // Enable adaptive layer height profile
 | ||||
| #define ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE (1 && ENABLE_2_2_0_ALPHA1) | ||||
| 
 | ||||
| #endif // _technologies_h_
 | ||||
|  |  | |||
|  | @ -150,7 +150,9 @@ GLCanvas3D::LayersEditing::~LayersEditing() | |||
| } | ||||
| 
 | ||||
| const float GLCanvas3D::LayersEditing::THICKNESS_BAR_WIDTH = 70.0f; | ||||
| #if !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE | ||||
| const float GLCanvas3D::LayersEditing::THICKNESS_RESET_BUTTON_HEIGHT = 22.0f; | ||||
| #endif // !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
| 
 | ||||
| bool GLCanvas3D::LayersEditing::init(const std::string& vertex_shader_filename, const std::string& fragment_shader_filename) | ||||
| { | ||||
|  | @ -217,13 +219,70 @@ void GLCanvas3D::LayersEditing::render_overlay(const GLCanvas3D& canvas) const | |||
|     if (!m_enabled) | ||||
|         return; | ||||
| 
 | ||||
| #if ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE | ||||
|     static const ImVec4 orange(0.757f, 0.404f, 0.216f, 1.0f); | ||||
| 
 | ||||
|     const Size& cnv_size = canvas.get_canvas_size(); | ||||
|     float canvas_w = (float)cnv_size.get_width(); | ||||
|     float canvas_h = (float)cnv_size.get_height(); | ||||
| 
 | ||||
| 
 | ||||
|     ImGuiWrapper& imgui = *wxGetApp().imgui(); | ||||
|     imgui.set_next_window_pos(canvas_w - THICKNESS_BAR_WIDTH, canvas_h, ImGuiCond_Always, 1.0f, 1.0f); | ||||
|     imgui.set_next_window_bg_alpha(0.5f); | ||||
| 
 | ||||
|     ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); | ||||
| 
 | ||||
|     imgui.begin(_(L("Layer height profile")), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoCollapse); | ||||
| 
 | ||||
|     ImGui::PushStyleColor(ImGuiCol_Text, orange); | ||||
|     imgui.text(_(L("Left mouse button:"))); | ||||
|     ImGui::PopStyleColor(); | ||||
|     ImGui::SameLine(); | ||||
|     imgui.text(_(L("Add detail"))); | ||||
| 
 | ||||
|     ImGui::PushStyleColor(ImGuiCol_Text, orange); | ||||
|     imgui.text(_(L("Right mouse button:"))); | ||||
|     ImGui::PopStyleColor(); | ||||
|     ImGui::SameLine(); | ||||
|     imgui.text(_(L("Remove detail"))); | ||||
| 
 | ||||
|     ImGui::PushStyleColor(ImGuiCol_Text, orange); | ||||
|     imgui.text(_(L("Shift + Left mouse button:"))); | ||||
|     ImGui::PopStyleColor(); | ||||
|     ImGui::SameLine(); | ||||
|     imgui.text(_(L("Reset to base"))); | ||||
| 
 | ||||
|     ImGui::PushStyleColor(ImGuiCol_Text, orange); | ||||
|     imgui.text(_(L("Shift + Right mouse button:"))); | ||||
|     ImGui::PopStyleColor(); | ||||
|     ImGui::SameLine(); | ||||
|     imgui.text(_(L("Smoothing"))); | ||||
| 
 | ||||
|     ImGui::PushStyleColor(ImGuiCol_Text, orange); | ||||
|     imgui.text(_(L("Mouse wheel:"))); | ||||
|     ImGui::PopStyleColor(); | ||||
|     ImGui::SameLine(); | ||||
|     imgui.text(_(L("Increase/decrease edit area"))); | ||||
|      | ||||
|     ImGui::Separator(); | ||||
|     if (imgui.button(_(L("Reset")))) | ||||
|         wxPostEvent((wxEvtHandler*)canvas.get_wxglcanvas(), SimpleEvent(EVT_GLCANVAS_RESET_LAYER_HEIGHT_PROFILE)); | ||||
| 
 | ||||
|     imgui.end(); | ||||
| 
 | ||||
|     ImGui::PopStyleVar(); | ||||
| 
 | ||||
|     const Rect& bar_rect = get_bar_rect_viewport(canvas); | ||||
| #else | ||||
|     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(reset_rect); | ||||
|     _render_active_object_annotations(canvas, bar_rect); | ||||
|     _render_profile(bar_rect); | ||||
| #endif // ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
|     render_active_object_annotations(canvas, bar_rect); | ||||
|     render_profile(bar_rect); | ||||
| } | ||||
| 
 | ||||
| float GLCanvas3D::LayersEditing::get_cursor_z_relative(const GLCanvas3D& canvas) | ||||
|  | @ -248,11 +307,13 @@ bool GLCanvas3D::LayersEditing::bar_rect_contains(const GLCanvas3D& canvas, floa | |||
|     return (rect.get_left() <= x) && (x <= rect.get_right()) && (rect.get_top() <= y) && (y <= rect.get_bottom()); | ||||
| } | ||||
| 
 | ||||
| #if !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE | ||||
| bool GLCanvas3D::LayersEditing::reset_rect_contains(const GLCanvas3D& canvas, float x, float y) | ||||
| { | ||||
|     const Rect& rect = get_reset_rect_screen(canvas); | ||||
|     return (rect.get_left() <= x) && (x <= rect.get_right()) && (rect.get_top() <= y) && (y <= rect.get_bottom()); | ||||
| } | ||||
| #endif // !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
| 
 | ||||
| Rect GLCanvas3D::LayersEditing::get_bar_rect_screen(const GLCanvas3D& canvas) | ||||
| { | ||||
|  | @ -260,9 +321,14 @@ Rect GLCanvas3D::LayersEditing::get_bar_rect_screen(const GLCanvas3D& canvas) | |||
|     float w = (float)cnv_size.get_width(); | ||||
|     float h = (float)cnv_size.get_height(); | ||||
| 
 | ||||
| #if ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE | ||||
|     return Rect(w - thickness_bar_width(canvas), 0.0f, w, h); | ||||
| #else | ||||
|     return Rect(w - thickness_bar_width(canvas), 0.0f, w, h - reset_button_height(canvas)); | ||||
| #endif // ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
| } | ||||
| 
 | ||||
| #if !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE | ||||
| Rect GLCanvas3D::LayersEditing::get_reset_rect_screen(const GLCanvas3D& canvas) | ||||
| { | ||||
|     const Size& cnv_size = canvas.get_canvas_size(); | ||||
|  | @ -271,6 +337,7 @@ Rect GLCanvas3D::LayersEditing::get_reset_rect_screen(const GLCanvas3D& canvas) | |||
| 
 | ||||
|     return Rect(w - thickness_bar_width(canvas), h - reset_button_height(canvas), w, h); | ||||
| } | ||||
| #endif // !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
| 
 | ||||
| Rect GLCanvas3D::LayersEditing::get_bar_rect_viewport(const GLCanvas3D& canvas) | ||||
| { | ||||
|  | @ -281,9 +348,14 @@ Rect GLCanvas3D::LayersEditing::get_bar_rect_viewport(const GLCanvas3D& canvas) | |||
|     float zoom = (float)canvas.get_camera().get_zoom(); | ||||
|     float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; | ||||
| 
 | ||||
| #if ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE | ||||
|     return Rect((half_w - thickness_bar_width(canvas)) * inv_zoom, half_h * inv_zoom, half_w * inv_zoom, -half_h * inv_zoom); | ||||
| #else | ||||
|     return Rect((half_w - thickness_bar_width(canvas)) * inv_zoom, half_h * inv_zoom, half_w * inv_zoom, (-half_h + reset_button_height(canvas)) * inv_zoom); | ||||
| #endif // ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
| } | ||||
| 
 | ||||
| #if !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE | ||||
| Rect GLCanvas3D::LayersEditing::get_reset_rect_viewport(const GLCanvas3D& canvas) | ||||
| { | ||||
|     const Size& cnv_size = canvas.get_canvas_size(); | ||||
|  | @ -295,13 +367,14 @@ Rect GLCanvas3D::LayersEditing::get_reset_rect_viewport(const GLCanvas3D& canvas | |||
| 
 | ||||
|     return Rect((half_w - thickness_bar_width(canvas)) * inv_zoom, (-half_h + reset_button_height(canvas)) * inv_zoom, half_w * inv_zoom, -half_h * inv_zoom); | ||||
| } | ||||
| #endif // !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
| 
 | ||||
| 
 | ||||
| bool GLCanvas3D::LayersEditing::_is_initialized() const | ||||
| bool GLCanvas3D::LayersEditing::is_initialized() const | ||||
| { | ||||
|     return m_shader.is_initialized(); | ||||
| } | ||||
| 
 | ||||
| #if !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE | ||||
| void GLCanvas3D::LayersEditing::_render_tooltip_texture(const GLCanvas3D& canvas, const Rect& bar_rect, const Rect& reset_rect) const | ||||
| { | ||||
|     // TODO: do this with ImGui
 | ||||
|  | @ -347,8 +420,9 @@ void GLCanvas3D::LayersEditing::_render_reset_texture(const Rect& reset_rect) co | |||
| 
 | ||||
|     GLTexture::render_texture(m_reset_texture.get_id(), reset_rect.get_left(), reset_rect.get_right(), reset_rect.get_bottom(), reset_rect.get_top()); | ||||
| } | ||||
| #endif // !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
| 
 | ||||
| void GLCanvas3D::LayersEditing::_render_active_object_annotations(const GLCanvas3D& canvas, const Rect& bar_rect) const | ||||
| void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3D& canvas, const Rect& bar_rect) const | ||||
| { | ||||
|     m_shader.start_using(); | ||||
| 
 | ||||
|  | @ -379,7 +453,7 @@ void GLCanvas3D::LayersEditing::_render_active_object_annotations(const GLCanvas | |||
|     m_shader.stop_using(); | ||||
| } | ||||
| 
 | ||||
| void GLCanvas3D::LayersEditing::_render_profile(const Rect& bar_rect) const | ||||
| void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) const | ||||
| { | ||||
|     //FIXME show some kind of legend.
 | ||||
| 
 | ||||
|  | @ -557,6 +631,7 @@ float GLCanvas3D::LayersEditing::thickness_bar_width(const GLCanvas3D &canvas) | |||
|          * THICKNESS_BAR_WIDTH; | ||||
| } | ||||
| 
 | ||||
| #if !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE | ||||
| float GLCanvas3D::LayersEditing::reset_button_height(const GLCanvas3D &canvas) | ||||
| { | ||||
|     return | ||||
|  | @ -567,6 +642,7 @@ float GLCanvas3D::LayersEditing::reset_button_height(const GLCanvas3D &canvas) | |||
| #endif | ||||
|          * THICKNESS_RESET_BUTTON_HEIGHT; | ||||
| } | ||||
| #endif // !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
| 
 | ||||
| 
 | ||||
| const Point GLCanvas3D::Mouse::Drag::Invalid_2D_Point(INT_MAX, INT_MAX); | ||||
|  | @ -1118,6 +1194,9 @@ wxDEFINE_EVENT(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, wxKeyEvent); | |||
| wxDEFINE_EVENT(EVT_GLCANVAS_EDIT_COLOR_CHANGE, wxKeyEvent); | ||||
| wxDEFINE_EVENT(EVT_GLCANVAS_UNDO, SimpleEvent); | ||||
| wxDEFINE_EVENT(EVT_GLCANVAS_REDO, SimpleEvent); | ||||
| #if ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE | ||||
| wxDEFINE_EVENT(EVT_GLCANVAS_RESET_LAYER_HEIGHT_PROFILE, SimpleEvent); | ||||
| #endif // ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
| 
 | ||||
| #if ENABLE_THUMBNAIL_GENERATOR | ||||
| const double GLCanvas3D::DefaultCameraZoomToBoxMarginFactor = 1.25; | ||||
|  | @ -1420,6 +1499,15 @@ bool GLCanvas3D::is_layers_editing_allowed() const | |||
|     return m_layers_editing.is_allowed(); | ||||
| } | ||||
| 
 | ||||
| #if ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE | ||||
| void GLCanvas3D::reset_layer_height_profile() | ||||
| { | ||||
|     m_layers_editing.reset_layer_height_profile(*this); | ||||
|     m_layers_editing.state = LayersEditing::Completed; | ||||
|     m_dirty = true; | ||||
| } | ||||
| #endif // ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
| 
 | ||||
| bool GLCanvas3D::is_reload_delayed() const | ||||
| { | ||||
|     return m_reload_delayed; | ||||
|  | @ -2814,6 +2902,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) | |||
|             m_layers_editing.state = LayersEditing::Editing; | ||||
|             _perform_layer_editing_action(&evt); | ||||
|         } | ||||
| #if !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE | ||||
|         else if ((layer_editing_object_idx != -1) && m_layers_editing.reset_rect_contains(*this, pos(0), pos(1))) | ||||
|         { | ||||
|             if (evt.LeftDown()) | ||||
|  | @ -2826,6 +2915,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) | |||
|                 m_dirty = true; | ||||
|             } | ||||
|         } | ||||
| #endif // !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
|         else if (evt.LeftDown() && (evt.ShiftDown() || evt.AltDown()) && m_picking_enabled) | ||||
|         { | ||||
|             if (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports) | ||||
|  |  | |||
|  | @ -104,6 +104,9 @@ wxDECLARE_EVENT(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, wxKeyEvent); | |||
| wxDECLARE_EVENT(EVT_GLCANVAS_EDIT_COLOR_CHANGE, wxKeyEvent); | ||||
| wxDECLARE_EVENT(EVT_GLCANVAS_UNDO, SimpleEvent); | ||||
| wxDECLARE_EVENT(EVT_GLCANVAS_REDO, SimpleEvent); | ||||
| #if ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE | ||||
| wxDECLARE_EVENT(EVT_GLCANVAS_RESET_LAYER_HEIGHT_PROFILE, SimpleEvent); | ||||
| #endif // ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
| 
 | ||||
| class GLCanvas3D | ||||
| { | ||||
|  | @ -153,13 +156,17 @@ private: | |||
| 
 | ||||
|     private: | ||||
|         static const float THICKNESS_BAR_WIDTH; | ||||
| #if !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE | ||||
|         static const float THICKNESS_RESET_BUTTON_HEIGHT; | ||||
| #endif // !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
| 
 | ||||
|         bool                        m_enabled; | ||||
|         Shader                      m_shader; | ||||
|         unsigned int                m_z_texture_id; | ||||
| #if !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE | ||||
|         mutable GLTexture           m_tooltip_texture; | ||||
|         mutable GLTexture           m_reset_texture; | ||||
| #endif // !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
|         // Not owned by LayersEditing.
 | ||||
|         const DynamicPrintConfig   *m_config; | ||||
|         // ModelObject for the currently selected object (Model::objects[last_object_id]).
 | ||||
|  | @ -220,25 +227,35 @@ private: | |||
| 
 | ||||
|         static float get_cursor_z_relative(const GLCanvas3D& canvas); | ||||
|         static bool bar_rect_contains(const GLCanvas3D& canvas, float x, float y); | ||||
| #if !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE | ||||
|         static bool reset_rect_contains(const GLCanvas3D& canvas, float x, float y); | ||||
| #endif // !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
|         static Rect get_bar_rect_screen(const GLCanvas3D& canvas); | ||||
| #if !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE | ||||
|         static Rect get_reset_rect_screen(const GLCanvas3D& canvas); | ||||
| #endif // !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
|         static Rect get_bar_rect_viewport(const GLCanvas3D& canvas); | ||||
| #if !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE | ||||
|         static Rect get_reset_rect_viewport(const GLCanvas3D& canvas); | ||||
| #endif // !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
| 
 | ||||
|         float object_max_z() const { return m_object_max_z; } | ||||
| 
 | ||||
|     private: | ||||
|         bool _is_initialized() const; | ||||
|         bool is_initialized() const; | ||||
|         void generate_layer_height_texture(); | ||||
| #if !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE | ||||
|         void _render_tooltip_texture(const GLCanvas3D& canvas, const Rect& bar_rect, const Rect& reset_rect) const; | ||||
|         void _render_reset_texture(const Rect& reset_rect) const; | ||||
|         void _render_active_object_annotations(const GLCanvas3D& canvas, const Rect& bar_rect) const; | ||||
|         void _render_profile(const Rect& bar_rect) const; | ||||
| #endif // !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
|         void render_active_object_annotations(const GLCanvas3D& canvas, const Rect& bar_rect) const; | ||||
|         void render_profile(const Rect& bar_rect) const; | ||||
|         void update_slicing_parameters(); | ||||
| 
 | ||||
|         static float thickness_bar_width(const GLCanvas3D &canvas); | ||||
| #if !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE | ||||
|         static float reset_button_height(const GLCanvas3D &canvas); | ||||
| #endif // !ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
|     }; | ||||
| 
 | ||||
|     struct Mouse | ||||
|  | @ -500,6 +517,10 @@ public: | |||
|     bool is_layers_editing_enabled() const; | ||||
|     bool is_layers_editing_allowed() const; | ||||
| 
 | ||||
| #if ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE | ||||
|     void reset_layer_height_profile(); | ||||
| #endif // ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
| 
 | ||||
|     bool is_reload_delayed() const; | ||||
| 
 | ||||
|     void enable_layers_editing(bool enable); | ||||
|  |  | |||
|  | @ -2070,6 +2070,9 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) | |||
|     view3D_canvas->Bind(EVT_GLCANVAS_RESETGIZMOS, [this](SimpleEvent&) { reset_all_gizmos(); }); | ||||
|     view3D_canvas->Bind(EVT_GLCANVAS_UNDO, [this](SimpleEvent&) { this->undo(); }); | ||||
|     view3D_canvas->Bind(EVT_GLCANVAS_REDO, [this](SimpleEvent&) { this->redo(); }); | ||||
| #if ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE | ||||
|     view3D_canvas->Bind(EVT_GLCANVAS_RESET_LAYER_HEIGHT_PROFILE, [this](SimpleEvent&) { this->view3D->get_canvas3d()->reset_layer_height_profile(); }); | ||||
| #endif // ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE
 | ||||
| 
 | ||||
|     // 3DScene/Toolbar:
 | ||||
|     view3D_canvas->Bind(EVT_GLTOOLBAR_ADD, &priv::on_action_add, this); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Enrico Turri
						Enrico Turri