diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index 0de933c37..3e0ecf5eb 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -194,18 +194,6 @@ sub new { $self->decrease; }; - my $on_action_ccw45 = sub { - $self->rotate(45, Z, 'relative'); - }; - - my $on_action_cw45 = sub { - $self->rotate(-45, Z, 'relative'); - }; - - my $on_action_scale = sub { - $self->changescale(undef); - }; - my $on_action_split = sub { $self->split_object; }; @@ -248,9 +236,6 @@ sub new { Slic3r::GUI::_3DScene::register_action_arrange_callback($self->{canvas3D}, $on_action_arrange); Slic3r::GUI::_3DScene::register_action_more_callback($self->{canvas3D}, $on_action_more); Slic3r::GUI::_3DScene::register_action_fewer_callback($self->{canvas3D}, $on_action_fewer); - Slic3r::GUI::_3DScene::register_action_ccw45_callback($self->{canvas3D}, $on_action_ccw45); - Slic3r::GUI::_3DScene::register_action_cw45_callback($self->{canvas3D}, $on_action_cw45); - Slic3r::GUI::_3DScene::register_action_scale_callback($self->{canvas3D}, $on_action_scale); Slic3r::GUI::_3DScene::register_action_split_callback($self->{canvas3D}, $on_action_split); Slic3r::GUI::_3DScene::register_action_cut_callback($self->{canvas3D}, $on_action_cut); Slic3r::GUI::_3DScene::register_action_settings_callback($self->{canvas3D}, $on_action_settings); @@ -388,23 +373,10 @@ sub new { # export_gcode cog_go.png my %icons = qw( - add brick_add.png - remove brick_delete.png - reset cross.png - arrange bricks.png print arrow_up.png send_gcode arrow_up.png reslice reslice.png export_stl brick_go.png - - increase add.png - decrease delete.png - rotate45cw arrow_rotate_clockwise.png - rotate45ccw arrow_rotate_anticlockwise.png - changescale arrow_out.png - split shape_ungroup.png - cut package.png - settings cog.png ); for (grep $self->{"btn_$_"}, keys %icons) { $self->{"btn_$_"}->SetBitmap(Wx::Bitmap->new(Slic3r::var($icons{$_}), wxBITMAP_TYPE_PNG)); @@ -2331,8 +2303,8 @@ sub selection_changed { # $self->{"btn_decrease"}->Disable; # } # } - - for my $toolbar_item (qw(delete more fewer ccw45 cw45 scale split cut settings)) { + + for my $toolbar_item (qw(delete more fewer split cut settings)) { Slic3r::GUI::_3DScene::enable_toolbar_item($self->{canvas3D}, $toolbar_item, $have_sel); } diff --git a/resources/icons/toolbar.png b/resources/icons/toolbar.png index e45f4989f..ce954143d 100644 Binary files a/resources/icons/toolbar.png and b/resources/icons/toolbar.png differ diff --git a/xs/src/slic3r/GUI/3DScene.cpp b/xs/src/slic3r/GUI/3DScene.cpp index 1b9106d75..c9607ccf9 100644 --- a/xs/src/slic3r/GUI/3DScene.cpp +++ b/xs/src/slic3r/GUI/3DScene.cpp @@ -2051,21 +2051,6 @@ void _3DScene::register_action_fewer_callback(wxGLCanvas* canvas, void* callback s_canvas_mgr.register_action_fewer_callback(canvas, callback); } -void _3DScene::register_action_ccw45_callback(wxGLCanvas* canvas, void* callback) -{ - s_canvas_mgr.register_action_ccw45_callback(canvas, callback); -} - -void _3DScene::register_action_cw45_callback(wxGLCanvas* canvas, void* callback) -{ - s_canvas_mgr.register_action_cw45_callback(canvas, callback); -} - -void _3DScene::register_action_scale_callback(wxGLCanvas* canvas, void* callback) -{ - s_canvas_mgr.register_action_scale_callback(canvas, callback); -} - void _3DScene::register_action_split_callback(wxGLCanvas* canvas, void* callback) { s_canvas_mgr.register_action_split_callback(canvas, callback); diff --git a/xs/src/slic3r/GUI/3DScene.hpp b/xs/src/slic3r/GUI/3DScene.hpp index 9aa023fae..b4aa6ce95 100644 --- a/xs/src/slic3r/GUI/3DScene.hpp +++ b/xs/src/slic3r/GUI/3DScene.hpp @@ -551,9 +551,6 @@ public: static void register_action_arrange_callback(wxGLCanvas* canvas, void* callback); static void register_action_more_callback(wxGLCanvas* canvas, void* callback); static void register_action_fewer_callback(wxGLCanvas* canvas, void* callback); - static void register_action_ccw45_callback(wxGLCanvas* canvas, void* callback); - static void register_action_cw45_callback(wxGLCanvas* canvas, void* callback); - static void register_action_scale_callback(wxGLCanvas* canvas, void* callback); static void register_action_split_callback(wxGLCanvas* canvas, void* callback); static void register_action_cut_callback(wxGLCanvas* canvas, void* callback); static void register_action_settings_callback(wxGLCanvas* canvas, void* callback); diff --git a/xs/src/slic3r/GUI/GLCanvas3D.cpp b/xs/src/slic3r/GUI/GLCanvas3D.cpp index dc867b767..14c3bffa7 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.cpp @@ -1131,12 +1131,12 @@ GLCanvas3D::Gizmos::~Gizmos() _reset(); } -bool GLCanvas3D::Gizmos::init() +bool GLCanvas3D::Gizmos::init(GLCanvas3D& parent) { #if ENABLE_GIZMOS_3D - GLGizmoBase* gizmo = new GLGizmoScale3D; + GLGizmoBase* gizmo = new GLGizmoScale3D(parent); #else - GLGizmoBase* gizmo = new GLGizmoScale; + GLGizmoBase* gizmo = new GLGizmoScale(parent); #endif // ENABLE_GIZMOS_3D if (gizmo == nullptr) return false; @@ -1147,9 +1147,9 @@ bool GLCanvas3D::Gizmos::init() m_gizmos.insert(GizmosMap::value_type(Scale, gizmo)); #if ENABLE_GIZMOS_3D - gizmo = new GLGizmoRotate3D; + gizmo = new GLGizmoRotate3D(parent); #else - gizmo = new GLGizmoRotate(GLGizmoRotate::Z); + gizmo = new GLGizmoRotate(parent, GLGizmoRotate::Z); #endif // ENABLE_GIZMOS_3D if (gizmo == nullptr) { @@ -1938,7 +1938,7 @@ bool GLCanvas3D::init(bool useVBOs, bool use_legacy_opengl) if (!m_volumes.empty()) m_volumes.finalize_geometry(m_use_VBOs); - if (m_gizmos.is_enabled() && !m_gizmos.init()) + if (m_gizmos.is_enabled() && !m_gizmos.init(*this)) return false; if (!_init_toolbar()) @@ -2720,24 +2720,6 @@ void GLCanvas3D::register_action_fewer_callback(void* callback) m_action_fewer_callback.register_callback(callback); } -void GLCanvas3D::register_action_ccw45_callback(void* callback) -{ - if (callback != nullptr) - m_action_ccw45_callback.register_callback(callback); -} - -void GLCanvas3D::register_action_cw45_callback(void* callback) -{ - if (callback != nullptr) - m_action_cw45_callback.register_callback(callback); -} - -void GLCanvas3D::register_action_scale_callback(void* callback) -{ - if (callback != nullptr) - m_action_scale_callback.register_callback(callback); -} - void GLCanvas3D::register_action_split_callback(void* callback) { if (callback != nullptr) @@ -3129,6 +3111,8 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } else if (evt.Dragging() && m_gizmos.is_dragging()) { + m_canvas->CaptureMouse(); + m_mouse.dragging = true; m_gizmos.update(mouse_ray(pos)); @@ -3307,6 +3291,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_mouse.dragging = false; m_toolbar_action_running = false; m_dirty = true; + + if (m_canvas->HasCapture()) + m_canvas->ReleaseMouse(); } else if (evt.Moving()) { @@ -3462,33 +3449,9 @@ bool GLCanvas3D::_init_toolbar() if (!m_toolbar.add_separator()) return false; - item.name = "ccw45"; - item.tooltip = GUI::L_str("Rotate CCW 45 degrees"); - item.sprite_id = 6; - item.is_toggable = false; - item.action_callback = &m_action_ccw45_callback; - if (!m_toolbar.add_item(item)) - return false; - - item.name = "cw45"; - item.tooltip = GUI::L_str("Rotate CW 45 degrees"); - item.sprite_id = 7; - item.is_toggable = false; - item.action_callback = &m_action_cw45_callback; - if (!m_toolbar.add_item(item)) - return false; - - item.name = "scale"; - item.tooltip = GUI::L_str("Scale..."); - item.sprite_id = 8; - item.is_toggable = false; - item.action_callback = &m_action_scale_callback; - if (!m_toolbar.add_item(item)) - return false; - item.name = "split"; item.tooltip = GUI::L_str("Split"); - item.sprite_id = 9; + item.sprite_id = 6; item.is_toggable = false; item.action_callback = &m_action_split_callback; if (!m_toolbar.add_item(item)) @@ -3496,7 +3459,7 @@ bool GLCanvas3D::_init_toolbar() item.name = "cut"; item.tooltip = GUI::L_str("Cut..."); - item.sprite_id = 10; + item.sprite_id = 7; item.is_toggable = false; item.action_callback = &m_action_cut_callback; if (!m_toolbar.add_item(item)) @@ -3507,7 +3470,7 @@ bool GLCanvas3D::_init_toolbar() item.name = "settings"; item.tooltip = GUI::L_str("Settings..."); - item.sprite_id = 11; + item.sprite_id = 8; item.is_toggable = false; item.action_callback = &m_action_settings_callback; if (!m_toolbar.add_item(item)) @@ -3515,7 +3478,7 @@ bool GLCanvas3D::_init_toolbar() item.name = "layersediting"; item.tooltip = GUI::L_str("Layers editing"); - item.sprite_id = 12; + item.sprite_id = 9; item.is_toggable = true; item.action_callback = &m_action_layersediting_callback; if (!m_toolbar.add_item(item)) @@ -3756,9 +3719,6 @@ void GLCanvas3D::_deregister_callbacks() m_action_arrange_callback.deregister_callback(); m_action_more_callback.deregister_callback(); m_action_fewer_callback.deregister_callback(); - m_action_ccw45_callback.deregister_callback(); - m_action_cw45_callback.deregister_callback(); - m_action_scale_callback.deregister_callback(); m_action_split_callback.deregister_callback(); m_action_cut_callback.deregister_callback(); m_action_settings_callback.deregister_callback(); diff --git a/xs/src/slic3r/GUI/GLCanvas3D.hpp b/xs/src/slic3r/GUI/GLCanvas3D.hpp index 0cd2870eb..2334fe092 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.hpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.hpp @@ -352,7 +352,7 @@ public: Gizmos(); ~Gizmos(); - bool init(); + bool init(GLCanvas3D& parent); bool is_enabled() const; void set_enabled(bool enable); @@ -505,9 +505,6 @@ private: PerlCallback m_action_arrange_callback; PerlCallback m_action_more_callback; PerlCallback m_action_fewer_callback; - PerlCallback m_action_ccw45_callback; - PerlCallback m_action_cw45_callback; - PerlCallback m_action_scale_callback; PerlCallback m_action_split_callback; PerlCallback m_action_cut_callback; PerlCallback m_action_settings_callback; @@ -625,9 +622,6 @@ public: void register_action_arrange_callback(void* callback); void register_action_more_callback(void* callback); void register_action_fewer_callback(void* callback); - void register_action_ccw45_callback(void* callback); - void register_action_cw45_callback(void* callback); - void register_action_scale_callback(void* callback); void register_action_split_callback(void* callback); void register_action_cut_callback(void* callback); void register_action_settings_callback(void* callback); diff --git a/xs/src/slic3r/GUI/GLCanvas3DManager.cpp b/xs/src/slic3r/GUI/GLCanvas3DManager.cpp index 0fe24ed43..57a49d7ab 100644 --- a/xs/src/slic3r/GUI/GLCanvas3DManager.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3DManager.cpp @@ -737,27 +737,6 @@ void GLCanvas3DManager::register_action_fewer_callback(wxGLCanvas* canvas, void* it->second->register_action_fewer_callback(callback); } -void GLCanvas3DManager::register_action_ccw45_callback(wxGLCanvas* canvas, void* callback) -{ - CanvasesMap::iterator it = _get_canvas(canvas); - if (it != m_canvases.end()) - it->second->register_action_ccw45_callback(callback); -} - -void GLCanvas3DManager::register_action_cw45_callback(wxGLCanvas* canvas, void* callback) -{ - CanvasesMap::iterator it = _get_canvas(canvas); - if (it != m_canvases.end()) - it->second->register_action_cw45_callback(callback); -} - -void GLCanvas3DManager::register_action_scale_callback(wxGLCanvas* canvas, void* callback) -{ - CanvasesMap::iterator it = _get_canvas(canvas); - if (it != m_canvases.end()) - it->second->register_action_scale_callback(callback); -} - void GLCanvas3DManager::register_action_split_callback(wxGLCanvas* canvas, void* callback) { CanvasesMap::iterator it = _get_canvas(canvas); diff --git a/xs/src/slic3r/GUI/GLCanvas3DManager.hpp b/xs/src/slic3r/GUI/GLCanvas3DManager.hpp index 58ee1c9d9..f7705a56c 100644 --- a/xs/src/slic3r/GUI/GLCanvas3DManager.hpp +++ b/xs/src/slic3r/GUI/GLCanvas3DManager.hpp @@ -167,9 +167,6 @@ public: void register_action_arrange_callback(wxGLCanvas* canvas, void* callback); void register_action_more_callback(wxGLCanvas* canvas, void* callback); void register_action_fewer_callback(wxGLCanvas* canvas, void* callback); - void register_action_ccw45_callback(wxGLCanvas* canvas, void* callback); - void register_action_cw45_callback(wxGLCanvas* canvas, void* callback); - void register_action_scale_callback(wxGLCanvas* canvas, void* callback); void register_action_split_callback(wxGLCanvas* canvas, void* callback); void register_action_cut_callback(wxGLCanvas* canvas, void* callback); void register_action_settings_callback(wxGLCanvas* canvas, void* callback); diff --git a/xs/src/slic3r/GUI/GLGizmo.cpp b/xs/src/slic3r/GUI/GLGizmo.cpp index ee98857e9..39ba440c3 100644 --- a/xs/src/slic3r/GUI/GLGizmo.cpp +++ b/xs/src/slic3r/GUI/GLGizmo.cpp @@ -1,6 +1,7 @@ #include "GLGizmo.hpp" #include "../../libslic3r/Utils.hpp" +#include "../../slic3r/GUI/GLCanvas3D.hpp" #include @@ -157,8 +158,9 @@ void GLGizmoBase::Grabber::render_face(float half_size) const } #endif // ENABLE_GIZMOS_3D -GLGizmoBase::GLGizmoBase() - : m_group_id(-1) +GLGizmoBase::GLGizmoBase(GLCanvas3D& parent) + : m_parent(parent) + , m_group_id(-1) , m_state(Off) , m_hover_id(-1) , m_is_container(false) @@ -195,6 +197,8 @@ void GLGizmoBase::start_dragging() void GLGizmoBase::stop_dragging() { + set_tooltip(""); + for (int i = 0; i < (int)m_grabbers.size(); ++i) { m_grabbers[i].dragging = false; @@ -234,6 +238,18 @@ void GLGizmoBase::render_grabbers_for_picking() const } } +void GLGizmoBase::set_tooltip(const std::string& tooltip) const +{ + m_parent.set_tooltip(tooltip); +} + +std::string GLGizmoBase::format(float value, unsigned int decimals) const +{ + char buf[1024]; + ::sprintf(buf, "%.*f", decimals, value); + return buf; +} + const float GLGizmoRotate::Offset = 5.0f; const unsigned int GLGizmoRotate::CircleResolution = 64; const unsigned int GLGizmoRotate::AngleResolution = 64; @@ -245,8 +261,8 @@ const float GLGizmoRotate::ScaleShortTooth = 1.0f; const unsigned int GLGizmoRotate::SnapRegionsCount = 8; const float GLGizmoRotate::GrabberOffset = 5.0f; -GLGizmoRotate::GLGizmoRotate(GLGizmoRotate::Axis axis) - : GLGizmoBase() +GLGizmoRotate::GLGizmoRotate(GLCanvas3D& parent, GLGizmoRotate::Axis axis) + : GLGizmoBase(parent) , m_axis(axis) , m_angle(0.0f) , m_center(0.0, 0.0, 0.0) @@ -327,6 +343,9 @@ void GLGizmoRotate::on_update(const Linef3& mouse_ray) void GLGizmoRotate::on_render(const BoundingBoxf3& box) const { + if (m_grabbers[0].dragging) + set_tooltip(format(m_angle * 180.0f / (float)PI, 4)); + #if ENABLE_GIZMOS_3D ::glEnable(GL_DEPTH_TEST); #else @@ -577,11 +596,11 @@ Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray) cons return Linef3(Vec3d(local_ray(0, 0), local_ray(1, 0), local_ray(2, 0)), Vec3d(local_ray(0, 1), local_ray(1, 1), local_ray(2, 1))).intersect_plane(0.0); } -GLGizmoRotate3D::GLGizmoRotate3D() - : GLGizmoBase() - , m_x(GLGizmoRotate::X) - , m_y(GLGizmoRotate::Y) - , m_z(GLGizmoRotate::Z) +GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent) + : GLGizmoBase(parent) + , m_x(parent, GLGizmoRotate::X) + , m_y(parent, GLGizmoRotate::Y) + , m_z(parent, GLGizmoRotate::Z) { m_is_container = true; @@ -682,8 +701,8 @@ void GLGizmoRotate3D::on_render(const BoundingBoxf3& box) const const float GLGizmoScale::Offset = 5.0f; -GLGizmoScale::GLGizmoScale() - : GLGizmoBase() +GLGizmoScale::GLGizmoScale(GLCanvas3D& parent) + : GLGizmoBase(parent) , m_scale(1.0f) , m_starting_scale(1.0f) { @@ -733,6 +752,9 @@ void GLGizmoScale::on_update(const Linef3& mouse_ray) void GLGizmoScale::on_render(const BoundingBoxf3& box) const { + if (m_grabbers[0].dragging || m_grabbers[1].dragging || m_grabbers[2].dragging || m_grabbers[3].dragging) + set_tooltip(format(100.0f * m_scale, 4) + "%"); + ::glDisable(GL_DEPTH_TEST); double min_x = box.min(0) - (double)Offset; @@ -779,8 +801,8 @@ void GLGizmoScale::on_render_for_picking(const BoundingBoxf3& box) const const float GLGizmoScale3D::Offset = 5.0f; -GLGizmoScale3D::GLGizmoScale3D() - : GLGizmoBase() +GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent) + : GLGizmoBase(parent) , m_scale_x(1.0f) , m_scale_y(1.0f) , m_scale_z(1.0f) @@ -847,6 +869,20 @@ void GLGizmoScale3D::on_update(const Linef3& mouse_ray) void GLGizmoScale3D::on_render(const BoundingBoxf3& box) const { + if (m_grabbers[0].dragging || m_grabbers[1].dragging) + set_tooltip("X: " + format(100.0f * m_scale_x, 4) + "%"); + else if (m_grabbers[2].dragging || m_grabbers[3].dragging) + set_tooltip("Y: " + format(100.0f * m_scale_y, 4) + "%"); + else if (m_grabbers[4].dragging || m_grabbers[5].dragging) + set_tooltip("Z: " + format(100.0f * m_scale_z, 4) + "%"); + else if (m_grabbers[6].dragging || m_grabbers[7].dragging || m_grabbers[8].dragging || m_grabbers[9].dragging) + { + std::string tooltip = "X: " + format(100.0f * m_scale_x, 4) + "%\n"; + tooltip += "Y: " + format(100.0f * m_scale_y, 4) + "%\n"; + tooltip += "Z: " + format(100.0f * m_scale_z, 4) + "%"; + set_tooltip(tooltip); + } + ::glEnable(GL_DEPTH_TEST); Vec3d offset_vec = (double)Offset * Vec3d::Ones(); @@ -1013,7 +1049,7 @@ void GLGizmoScale3D::do_scale_y(const Linef3& mouse_ray) double ratio = calc_ratio(2, mouse_ray, m_starting_center); if (ratio > 0.0) - m_scale_x = m_starting_scale_y * (float)ratio; + m_scale_x = m_starting_scale_y * (float)ratio; // << this is temporary // m_scale_y = m_starting_scale_y * (float)ratio; } @@ -1022,7 +1058,7 @@ void GLGizmoScale3D::do_scale_z(const Linef3& mouse_ray) double ratio = calc_ratio(1, mouse_ray, m_starting_center); if (ratio > 0.0) - m_scale_x = m_starting_scale_z * (float)ratio; + m_scale_x = m_starting_scale_z * (float)ratio; // << this is temporary // m_scale_z = m_starting_scale_z * (float)ratio; } diff --git a/xs/src/slic3r/GUI/GLGizmo.hpp b/xs/src/slic3r/GUI/GLGizmo.hpp index 0bef4bf63..50bb333e5 100644 --- a/xs/src/slic3r/GUI/GLGizmo.hpp +++ b/xs/src/slic3r/GUI/GLGizmo.hpp @@ -16,6 +16,8 @@ class Linef3; namespace GUI { +class GLCanvas3D; + class GLGizmoBase { protected: @@ -61,6 +63,8 @@ public: }; protected: + GLCanvas3D& m_parent; + int m_group_id; EState m_state; // textures are assumed to be square and all with the same size in pixels, no internal check is done @@ -73,7 +77,7 @@ protected: bool m_is_container; public: - GLGizmoBase(); + explicit GLGizmoBase(GLCanvas3D& parent); virtual ~GLGizmoBase() {} bool init() { return on_init(); } @@ -114,6 +118,9 @@ protected: float picking_color_component(unsigned int id) const; void render_grabbers() const; void render_grabbers_for_picking() const; + + void set_tooltip(const std::string& tooltip) const; + std::string format(float value, unsigned int decimals) const; }; class GLGizmoRotate : public GLGizmoBase @@ -146,7 +153,7 @@ private: mutable bool m_keep_initial_values; public: - explicit GLGizmoRotate(Axis axis); + GLGizmoRotate(GLCanvas3D& parent, Axis axis); float get_angle() const { return m_angle; } void set_angle(float angle); @@ -179,7 +186,7 @@ class GLGizmoRotate3D : public GLGizmoBase GLGizmoRotate m_z; public: - GLGizmoRotate3D(); + explicit GLGizmoRotate3D(GLCanvas3D& parent); float get_angle_x() const { return m_x.get_angle(); } void set_angle_x(float angle) { m_x.set_angle(angle); } @@ -237,7 +244,7 @@ class GLGizmoScale : public GLGizmoBase Vec2d m_starting_drag_position; public: - GLGizmoScale(); + explicit GLGizmoScale(GLCanvas3D& parent); float get_scale() const { return m_scale; } void set_scale(float scale) { m_starting_scale = scale; } @@ -268,7 +275,7 @@ class GLGizmoScale3D : public GLGizmoBase Vec3d m_starting_center; public: - GLGizmoScale3D(); + explicit GLGizmoScale3D(GLCanvas3D& parent); float get_scale_x() const { return m_scale_x; } void set_scale_x(float scale) { m_starting_scale_x = scale; } diff --git a/xs/xsp/GUI_3DScene.xsp b/xs/xsp/GUI_3DScene.xsp index 5f1b55cf3..c15fdc196 100644 --- a/xs/xsp/GUI_3DScene.xsp +++ b/xs/xsp/GUI_3DScene.xsp @@ -692,27 +692,6 @@ register_action_fewer_callback(canvas, callback) CODE: _3DScene::register_action_fewer_callback((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), (void*)callback); -void -register_action_ccw45_callback(canvas, callback) - SV *canvas; - SV *callback; - CODE: - _3DScene::register_action_ccw45_callback((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), (void*)callback); - -void -register_action_cw45_callback(canvas, callback) - SV *canvas; - SV *callback; - CODE: - _3DScene::register_action_cw45_callback((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), (void*)callback); - -void -register_action_scale_callback(canvas, callback) - SV *canvas; - SV *callback; - CODE: - _3DScene::register_action_scale_callback((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), (void*)callback); - void register_action_split_callback(canvas, callback) SV *canvas;