3DScene load_object method moved to c++
This commit is contained in:
parent
a8254e0053
commit
c6e44509e0
11 changed files with 142 additions and 55 deletions
|
@ -32,9 +32,7 @@ use Slic3r::Geometry qw(X Y);
|
|||
use Wx::GLCanvas qw(:all);
|
||||
use Slic3r::Geometry qw(PI);
|
||||
|
||||
# _dirty: boolean flag indicating, that the screen has to be redrawn on EVT_IDLE.
|
||||
# volumes: reference to vector of Slic3r::GUI::3DScene::Volume.
|
||||
# _camera_type: 'perspective' or 'ortho'
|
||||
#==============================================================================================================================
|
||||
__PACKAGE__->mk_accessors( qw(
|
||||
volumes
|
||||
|
@ -2169,37 +2167,28 @@ sub new {
|
|||
return $self;
|
||||
}
|
||||
|
||||
sub load_object {
|
||||
my ($self, $model, $print, $obj_idx, $instance_idxs) = @_;
|
||||
|
||||
#==============================================================================================================================
|
||||
my $useVBOs = Slic3r::GUI::_3DScene::use_VBOs();
|
||||
$self->SetCurrent($self->GetContext) if $useVBOs;
|
||||
|
||||
#sub load_object {
|
||||
# my ($self, $model, $print, $obj_idx, $instance_idxs) = @_;
|
||||
#
|
||||
# $self->SetCurrent($self->GetContext) if $useVBOs;
|
||||
#==============================================================================================================================
|
||||
|
||||
my $model_object;
|
||||
if ($model->isa('Slic3r::Model::Object')) {
|
||||
$model_object = $model;
|
||||
$model = $model_object->model;
|
||||
$obj_idx = 0;
|
||||
} else {
|
||||
$model_object = $model->get_object($obj_idx);
|
||||
}
|
||||
|
||||
$instance_idxs ||= [0..$#{$model_object->instances}];
|
||||
#==============================================================================================================================
|
||||
my $volume_indices = $self->volumes->load_object(
|
||||
$model_object, $obj_idx, $instance_idxs, $self->color_by, $self->select_by, $self->drag_by, $useVBOs && Slic3r::GUI::_3DScene::is_shader_enabled($self));
|
||||
#
|
||||
# my $model_object;
|
||||
# if ($model->isa('Slic3r::Model::Object')) {
|
||||
# $model_object = $model;
|
||||
# $model = $model_object->model;
|
||||
# $obj_idx = 0;
|
||||
# } else {
|
||||
# $model_object = $model->get_object($obj_idx);
|
||||
# }
|
||||
#
|
||||
# $instance_idxs ||= [0..$#{$model_object->instances}];
|
||||
# my $volume_indices = $self->volumes->load_object(
|
||||
# $model_object, $obj_idx, $instance_idxs, $self->color_by, $self->select_by, $self->drag_by,
|
||||
# $self->UseVBOs);
|
||||
#==============================================================================================================================
|
||||
return @{$volume_indices};
|
||||
}
|
||||
|
||||
#==============================================================================================================================
|
||||
# return @{$volume_indices};
|
||||
#}
|
||||
#
|
||||
## Create 3D thick extrusion lines for a skirt and brim.
|
||||
## Adds a new Slic3r::GUI::3DScene::Volume to $self->volumes.
|
||||
#sub load_print_toolpaths {
|
||||
|
|
|
@ -237,8 +237,13 @@ sub reload_scene {
|
|||
|
||||
$self->{objects_volumes_idxs} = [];
|
||||
foreach my $obj_idx (0..$#{$self->{model}->objects}) {
|
||||
my @volume_idxs = $self->load_object($self->{model}, $self->{print}, $obj_idx);
|
||||
push(@{$self->{objects_volumes_idxs}}, \@volume_idxs);
|
||||
#==============================================================================================================================
|
||||
my $volume_idxs = Slic3r::GUI::_3DScene::load_model($self, $self->{model}, $obj_idx, [0]);
|
||||
push(@{$self->{objects_volumes_idxs}}, \@{$volume_idxs});
|
||||
|
||||
# my @volume_idxs = $self->load_object($self->{model}, $self->{print}, $obj_idx);
|
||||
# push(@{$self->{objects_volumes_idxs}}, \@volume_idxs);
|
||||
#==============================================================================================================================
|
||||
}
|
||||
|
||||
$self->update_volumes_selection;
|
||||
|
|
|
@ -115,11 +115,12 @@ sub new {
|
|||
my $canvas;
|
||||
if ($Slic3r::GUI::have_OpenGL) {
|
||||
$canvas = $self->{canvas} = Slic3r::GUI::3DScene->new($self);
|
||||
$canvas->load_object($self->{model_object}, undef, undef, [0]);
|
||||
#==============================================================================================================================
|
||||
Slic3r::GUI::_3DScene::load_model_object($self->{canvas}, $self->{model_object}, 0, [0]);
|
||||
Slic3r::GUI::_3DScene::set_auto_bed_shape($canvas);
|
||||
Slic3r::GUI::_3DScene::set_axes_length($canvas, 2.0 * max(@{ Slic3r::GUI::_3DScene::get_volumes_bounding_box($canvas)->size }));
|
||||
|
||||
# $canvas->load_object($self->{model_object}, undef, undef, [0]);
|
||||
# $canvas->set_auto_bed_shape;
|
||||
#==============================================================================================================================
|
||||
$canvas->SetSize([500,500]);
|
||||
|
@ -261,14 +262,13 @@ sub _update {
|
|||
}
|
||||
|
||||
#==============================================================================================================================
|
||||
Slic3r::GUI::_3DScene::reset_volumes($self->{canvas});
|
||||
# $self->{canvas}->reset_objects;
|
||||
#==============================================================================================================================
|
||||
$self->{canvas}->load_object($_, undef, undef, [0]) for @objects;
|
||||
#==============================================================================================================================
|
||||
Slic3r::GUI::_3DScene::reset_volumes($self->{canvas});
|
||||
Slic3r::GUI::_3DScene::load_model_object($self->{canvas}, $_, 0, [0]) for @objects;
|
||||
Slic3r::GUI::_3DScene::set_cutting_plane($self->{canvas}, $self->{cut_options}{z}, [@expolygons]);
|
||||
Slic3r::GUI::_3DScene::update_volumes_colors_by_extruder($self->{canvas});
|
||||
Slic3r::GUI::_3DScene::render($self->{canvas});
|
||||
# $self->{canvas}->reset_objects;
|
||||
# $self->{canvas}->load_object($_, undef, undef, [0]) for @objects;
|
||||
# $self->{canvas}->SetCuttingPlane(
|
||||
# $self->{cut_options}{z},
|
||||
# [@expolygons],
|
||||
|
|
|
@ -165,18 +165,16 @@ sub new {
|
|||
# convert scene volume to model object volume
|
||||
$self->reload_tree(($volume_idx == -1) ? undef : $canvas->volumes->[$volume_idx]->volume_idx);
|
||||
});
|
||||
Slic3r::GUI::_3DScene::load_model_object($canvas, $self->{model_object}, 0, [0]);
|
||||
Slic3r::GUI::_3DScene::set_auto_bed_shape($canvas);
|
||||
Slic3r::GUI::_3DScene::set_axes_length($canvas, 2.0 * max(@{ Slic3r::GUI::_3DScene::get_volumes_bounding_box($canvas)->size }));
|
||||
|
||||
# $canvas->on_select(sub {
|
||||
# my ($volume_idx) = @_;
|
||||
# # convert scene volume to model object volume
|
||||
# $self->reload_tree(($volume_idx == -1) ? undef : $canvas->volumes->[$volume_idx]->volume_idx);
|
||||
# });
|
||||
#==============================================================================================================================
|
||||
|
||||
$canvas->load_object($self->{model_object}, undef, undef, [0]);
|
||||
#==============================================================================================================================
|
||||
Slic3r::GUI::_3DScene::set_auto_bed_shape($canvas);
|
||||
Slic3r::GUI::_3DScene::set_axes_length($canvas, 2.0 * max(@{ Slic3r::GUI::_3DScene::get_volumes_bounding_box($canvas)->size }));
|
||||
|
||||
# $canvas->load_object($self->{model_object}, undef, undef, [0]);
|
||||
# $canvas->set_auto_bed_shape;
|
||||
#==============================================================================================================================
|
||||
$canvas->SetSize([500,700]);
|
||||
|
@ -514,14 +512,13 @@ sub _parts_changed {
|
|||
$self->reload_tree;
|
||||
if ($self->{canvas}) {
|
||||
#==============================================================================================================================
|
||||
Slic3r::GUI::_3DScene::reset_volumes($self->{canvas});
|
||||
# $self->{canvas}->reset_objects;
|
||||
#==============================================================================================================================
|
||||
$self->{canvas}->load_object($self->{model_object});
|
||||
#==============================================================================================================================
|
||||
Slic3r::GUI::_3DScene::reset_volumes($self->{canvas});
|
||||
Slic3r::GUI::_3DScene::load_model_object($self->{canvas}, $self->{model_object}, 0, [0]);
|
||||
Slic3r::GUI::_3DScene::zoom_to_volumes($self->{canvas});
|
||||
Slic3r::GUI::_3DScene::update_volumes_colors_by_extruder($self->{canvas});
|
||||
Slic3r::GUI::_3DScene::render($self->{canvas});
|
||||
# $self->{canvas}->reset_objects;
|
||||
# $self->{canvas}->load_object($self->{model_object});
|
||||
# $self->{canvas}->zoom_to_volumes;
|
||||
# $self->{canvas}->update_volumes_colors_by_extruder($self->GetParent->GetParent->GetParent->{config});
|
||||
# $self->{canvas}->Render;
|
||||
|
@ -567,10 +564,11 @@ sub _update_canvas {
|
|||
|
||||
if ($self->{canvas}) {
|
||||
#==============================================================================================================================
|
||||
Slic3r::GUI::_3DScene::reset_volumes($self->{canvas});
|
||||
Slic3r::GUI::_3DScene::reset_volumes($self->{canvas});
|
||||
Slic3r::GUI::_3DScene::load_model_object($self->{canvas}, $self->{model_object}, 0, [0]);
|
||||
# $self->{canvas}->reset_objects;
|
||||
# $self->{canvas}->load_object($self->{model_object});
|
||||
#==============================================================================================================================
|
||||
$self->{canvas}->load_object($self->{model_object});
|
||||
|
||||
# restore selection, if any
|
||||
if (my $itemData = $self->get_selection) {
|
||||
|
@ -607,13 +605,12 @@ sub _update {
|
|||
my @objects = ();
|
||||
push @objects, $self->{model_object};
|
||||
#==============================================================================================================================
|
||||
Slic3r::GUI::_3DScene::reset_volumes($self->{canvas});
|
||||
# $self->{canvas}->reset_objects;
|
||||
#==============================================================================================================================
|
||||
$self->{canvas}->load_object($_, undef, [0]) for @objects;
|
||||
#==============================================================================================================================
|
||||
Slic3r::GUI::_3DScene::reset_volumes($self->{canvas});
|
||||
Slic3r::GUI::_3DScene::load_model_object($self->{canvas}, $_, 0, [0]) for @objects;
|
||||
Slic3r::GUI::_3DScene::update_volumes_colors_by_extruder($self->{canvas});
|
||||
Slic3r::GUI::_3DScene::render($self->{canvas});
|
||||
# $self->{canvas}->reset_objects;
|
||||
# $self->{canvas}->load_object($_, undef, [0]) for @objects;
|
||||
# $self->{canvas}->update_volumes_colors_by_extruder($self->GetParent->GetParent->GetParent->{config});
|
||||
# $self->{canvas}->Render;
|
||||
#==============================================================================================================================
|
||||
|
|
|
@ -2016,6 +2016,16 @@ static inline std::vector<float> parse_colors(const std::vector<std::string> &sc
|
|||
}
|
||||
|
||||
//##################################################################################################################
|
||||
std::vector<int> _3DScene::load_object(wxGLCanvas* canvas, const ModelObject* model_object, int obj_idx, std::vector<int> instance_idxs)
|
||||
{
|
||||
return s_canvas_mgr.load_object(canvas, model_object, obj_idx, instance_idxs);
|
||||
}
|
||||
|
||||
std::vector<int> _3DScene::load_object(wxGLCanvas* canvas, const Model* model, int obj_idx, std::vector<int> instance_idxs)
|
||||
{
|
||||
return s_canvas_mgr.load_object(canvas, model, obj_idx, instance_idxs);
|
||||
}
|
||||
|
||||
void _3DScene::load_print_toolpaths(wxGLCanvas* canvas)
|
||||
{
|
||||
s_canvas_mgr.load_print_toolpaths(canvas);
|
||||
|
|
|
@ -611,6 +611,9 @@ public:
|
|||
//##################################################################################################################
|
||||
|
||||
//##################################################################################################################
|
||||
static std::vector<int> load_object(wxGLCanvas* canvas, const ModelObject* model_object, int obj_idx, std::vector<int> instance_idxs);
|
||||
static std::vector<int> load_object(wxGLCanvas* canvas, const Model* model, int obj_idx, std::vector<int> instance_idxs);
|
||||
|
||||
static void load_print_toolpaths(wxGLCanvas* canvas);
|
||||
static void load_print_object_toolpaths(wxGLCanvas* canvas, const PrintObject* print_object, const std::vector<std::string>& str_tool_colors);
|
||||
static void load_wipe_tower_toolpaths(wxGLCanvas* canvas, const std::vector<std::string>& str_tool_colors);
|
||||
|
|
|
@ -959,6 +959,9 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, wxGLContext* context)
|
|||
, m_moving_enabled(false)
|
||||
, m_shader_enabled(false)
|
||||
, m_multisample_allowed(false)
|
||||
, m_color_by("volume")
|
||||
, m_select_by("object")
|
||||
, m_drag_by("instance")
|
||||
{
|
||||
if (m_canvas != nullptr)
|
||||
m_timer = new wxTimer(m_canvas);
|
||||
|
@ -1351,6 +1354,34 @@ void GLCanvas3D::set_toolpaths_range(double low, double high)
|
|||
m_volumes->set_range(low, high);
|
||||
}
|
||||
|
||||
std::vector<int> GLCanvas3D::load_object(const ModelObject& model_object, int obj_idx, std::vector<int> instance_idxs)
|
||||
{
|
||||
if (m_volumes == nullptr)
|
||||
return std::vector<int>();
|
||||
|
||||
if (instance_idxs.empty())
|
||||
{
|
||||
for (unsigned int i = 0; i < model_object.instances.size(); ++i)
|
||||
{
|
||||
instance_idxs.push_back(i);
|
||||
}
|
||||
}
|
||||
|
||||
return m_volumes->load_object(&model_object, obj_idx, instance_idxs, m_color_by, m_select_by, m_drag_by, m_use_VBOs && m_initialized);
|
||||
}
|
||||
|
||||
std::vector<int> GLCanvas3D::load_object(const Model& model, int obj_idx, std::vector<int> instance_idxs)
|
||||
{
|
||||
if ((0 <= obj_idx) && (obj_idx < (int)model.objects.size()))
|
||||
{
|
||||
const ModelObject* model_object = model.objects[obj_idx];
|
||||
if (model_object != nullptr)
|
||||
return load_object(*model_object, obj_idx, instance_idxs);
|
||||
}
|
||||
|
||||
return std::vector<int>();
|
||||
}
|
||||
|
||||
void GLCanvas3D::load_print_toolpaths()
|
||||
{
|
||||
if ((m_print == nullptr) || (m_volumes == nullptr))
|
||||
|
|
|
@ -25,6 +25,8 @@ class ExPolygon;
|
|||
class Print;
|
||||
class PrintObject;
|
||||
class GCodePreviewData;
|
||||
class ModelObject;
|
||||
class Model;
|
||||
|
||||
namespace GUI {
|
||||
|
||||
|
@ -342,6 +344,10 @@ private:
|
|||
bool m_shader_enabled;
|
||||
bool m_multisample_allowed;
|
||||
|
||||
std::string m_color_by;
|
||||
std::string m_select_by;
|
||||
std::string m_drag_by;
|
||||
|
||||
GCodePreviewVolumeIndex m_gcode_preview_volume_index;
|
||||
|
||||
PerlCallback m_on_viewport_changed_callback;
|
||||
|
@ -411,6 +417,9 @@ public:
|
|||
std::vector<double> get_current_print_zs(bool active_only) const;
|
||||
void set_toolpaths_range(double low, double high);
|
||||
|
||||
std::vector<int> load_object(const ModelObject& model_object, int obj_idx, std::vector<int> instance_idxs);
|
||||
std::vector<int> load_object(const Model& model, int obj_idx, std::vector<int> instance_idxs);
|
||||
|
||||
// Create 3D thick extrusion lines for a skirt and brim.
|
||||
// Adds a new Slic3r::GUI::3DScene::Volume to volumes.
|
||||
void load_print_toolpaths();
|
||||
|
|
|
@ -450,6 +450,24 @@ void GLCanvas3DManager::set_toolpaths_range(wxGLCanvas* canvas, double low, doub
|
|||
it->second->set_toolpaths_range(low, high);
|
||||
}
|
||||
|
||||
std::vector<int> GLCanvas3DManager::load_object(wxGLCanvas* canvas, const ModelObject* model_object, int obj_idx, std::vector<int> instance_idxs)
|
||||
{
|
||||
if (model_object == nullptr)
|
||||
return std::vector<int>();
|
||||
|
||||
CanvasesMap::const_iterator it = _get_canvas(canvas);
|
||||
return (it != m_canvases.end()) ? it->second->load_object(*model_object, obj_idx, instance_idxs) : std::vector<int>();
|
||||
}
|
||||
|
||||
std::vector<int> GLCanvas3DManager::load_object(wxGLCanvas* canvas, const Model* model, int obj_idx, std::vector<int> instance_idxs)
|
||||
{
|
||||
if (model == nullptr)
|
||||
return std::vector<int>();
|
||||
|
||||
CanvasesMap::const_iterator it = _get_canvas(canvas);
|
||||
return (it != m_canvases.end()) ? it->second->load_object(*model, obj_idx, instance_idxs) : std::vector<int>();
|
||||
}
|
||||
|
||||
void GLCanvas3DManager::load_print_toolpaths(wxGLCanvas* canvas)
|
||||
{
|
||||
CanvasesMap::iterator it = _get_canvas(canvas);
|
||||
|
|
|
@ -95,6 +95,9 @@ public:
|
|||
std::vector<double> get_current_print_zs(wxGLCanvas* canvas, bool active_only) const;
|
||||
void set_toolpaths_range(wxGLCanvas* canvas, double low, double high);
|
||||
|
||||
std::vector<int> load_object(wxGLCanvas* canvas, const ModelObject* model_object, int obj_idx, std::vector<int> instance_idxs);
|
||||
std::vector<int> load_object(wxGLCanvas* canvas, const Model* model, int obj_idx, std::vector<int> instance_idxs);
|
||||
|
||||
void load_print_toolpaths(wxGLCanvas* canvas);
|
||||
void load_print_object_toolpaths(wxGLCanvas* canvas, const PrintObject* print_object, const std::vector<std::string>& tool_colors);
|
||||
void load_wipe_tower_toolpaths(wxGLCanvas* canvas, const std::vector<std::string>& str_tool_colors);
|
||||
|
|
|
@ -510,6 +510,28 @@ reset_warning_texture()
|
|||
CODE:
|
||||
_3DScene::reset_warning_texture();
|
||||
|
||||
std::vector<int>
|
||||
load_model_object(canvas, model_object, obj_idx, instance_idxs)
|
||||
SV *canvas;
|
||||
ModelObject *model_object;
|
||||
int obj_idx;
|
||||
std::vector<int> instance_idxs;
|
||||
CODE:
|
||||
RETVAL = _3DScene::load_object((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), model_object, obj_idx, instance_idxs);
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
std::vector<int>
|
||||
load_model(canvas, model, obj_idx, instance_idxs)
|
||||
SV *canvas;
|
||||
Model *model;
|
||||
int obj_idx;
|
||||
std::vector<int> instance_idxs;
|
||||
CODE:
|
||||
RETVAL = _3DScene::load_object((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), model, obj_idx, instance_idxs);
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
void
|
||||
load_print_toolpaths(canvas)
|
||||
SV *canvas;
|
||||
|
|
Loading…
Reference in a new issue