mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2026-01-24 22:17:32 -07:00
* NEW:add move and rotate gizmo in assemble view Cherry-picked from bambulab/BambuStudio@d9e47bd9a9 Co-authored-by: zhou.xu <zhou.xu@bambulab.com> * Deselect other parts if Alt is pressed when selecting Cherry-picked from bambulab/BambuStudio@f5eb2899e7 Co-authored-by: zhou.xu <zhou.xu@bambulab.com> * FIX:z offset is error after copy and paste several objects jira: STUDIO-6753 STUDIO-7135 Change-Id: I6d9c8eb0c957ff1e3194709704ceb6c3920baa4f (cherry picked from commit 847a7141a6f47e409566b19e73c0ebdeb08f39e2) (cherry picked from commit a5cc52beb7eef5848368e660ca4f14e95ad5f7d5) * FIX:arrow direction in scaling tool is incorrect Jira: STUDIO-5672 Change-Id: I82c0ab336805e34c8380f93e64d3b9dbbf283805 (cherry picked from commit f6f27b700f0305854fcdbcb1191af25a4b8bdbe4) * FIX:world cs is displayed incorrectly The value of world coordinate system for model_volume is displayed incorrectly Jira: STUDIO-6399 code is from PrusaSlicer thanks for PrusaSlicer and enricoturri1966 commit 325709c5ae9b937867b36103a41d12a102c99292 Author: enricoturri1966 <enricoturri@seznam.cz> Date: Thu Jan 26 15:49:00 2023 +0100 SPE-1419 - Fixed reset skew resetting mirror, reset scale resetting mirror, changed labels in Object Manipulator panel, scale of instances using the Object Manipulator panel always made as absolute Change-Id: I30fdd39effd73b8dc027e4263fa7e64937b84326 Cherry-picked from bambulab/BambuStudio@0b46b9848b Co-authored-by: enricoturri1966 <enricoturri@seznam.cz> * FIX:fix scale problem add tool tip for move,rotate,scale gizmo Jira: STUDIO-6425 STUDIO-6419 Change-Id: I0b89c9b70f83cde21c6a407bcecd78c925515cfa Cherry-picked from bambulab/BambuStudio@6dad59102b Co-authored-by: zhou.xu <zhou.xu@bambulab.com> * NEW:add Object coordinates in move gizmo jira: none Part of the code references PrusaSlicer,thanks for PrusaSlicer and enricoturri1966 commit c12eeee12f9e2c91a9dfe7905f1370143805f038 Author: enricoturri1966 <enricoturri@seznam.cz> Date: Mon Oct 2 14:26:36 2023 +0200 SPE-1926: Tech ENABLE_CGAL_BOUNDING_SPHERE - Use selection's bounding sphere center as pivot for rotations Change-Id: Iae7e4539c198af3ff1aa99e1c0ce015fbcf80256 (cherry picked from commit 2b73bc915ee27218c9803ba0a01b0d3e47adf1da) Cherry-picked from bambulab/BambuStudio@98cce3b656 Co-authored-by: enricoturri1966 <enricoturri@seznam.cz> Co-authored-by: zhou.xu <zhou.xu@bambulab.com> * FIX:fix imgui style at Object coordinate in move tool jira:STUDIO-7141 Change-Id: Ib2900012c28878c4e7ad97eb0cf319f693cb9f6f (cherry picked from commit b7b09c82897678c4f3615713bc5d1cc7a3b17b19) (cherry picked from commit c89732a04619a6d910b723c126515bae802f7167) * ENH:use local cs for non_model_part better jira: STUDIO-7234 Change-Id: I0f0e99429e5e0b7cc4932a661eceffcff4a495f6 (cherry picked from commit b4305a3bfc9e5ae05c1785a710238a70f2dfb44a) (cherry picked from commit b28ac4f812f0024ec619c5d1b3c96e4cef4debdb) * ENH:add a cross mark for object cs jira: STUDIO-6947 Change-Id: Iaaab4f072045756ac3ba12c3f65e1c7f04ba65b8 (cherry picked from commit a2a2f49b4d94f257d36c9d17b4ec952e5dc9f0eb) Cherry-picked from bambulab/BambuStudio@8400e162a7 Co-authored-by: zhou.xu <zhou.xu@bambulab.com> * NEW:add tip button for move,rotate,scale jira: STUDIO-7273 Change-Id: I44aeecd8aaa17ec49ac1d8ff2bee5c3729c52061 (cherry picked from commit 998f33b4ce588f59cef345e327a97f6f669f6089) (cherry picked from commit f5eb2899e7252ea3ff0f8a79ef8d55c6009ebb28) * FIX:scale and size sholud >0 in scale tool jira: STUDIO-7433 Change-Id: Ibd4d00d9ca4762d002049e97a6d0819649f464db (cherry picked from commit eaaf11031ee49009af14abbd05bb4a07c88aceda) (cherry picked from commit 0d393d64b804ba7ae05454bf158de470cc74a6a6) * Fix crossmark rendering * Use combox as coord selection Cherry-picked from bambulab/BambuStudio@56f628dac1 Co-authored-by: zhou.xu <zhou.xu@bambulab.com> * NEW:add "world coordinates" scale for scale gizmo upgrade Transformation class jira:none about 75% code is from PrusaSlicer,thanks for PrusaSlicer and enricoturri1966 commit b32e9366606dce7d4f8de8db84fd902113bdbe28 Author: enricoturri1966 <enricoturri@seznam.cz> Date: Tue Mar 7 14:32:18 2023 +0100 Rework of constrained scaling Change-Id: I1248ea586e6b8f2fb6cdf3aa901ed7f525c3f111 (cherry picked from commit e10381aad1412b0c47afa340b634faa3af9d1a1f) Cherry-picked from bambulab/BambuStudio@c0536c09b4 Co-authored-by: enricoturri1966 <enricoturri@seznam.cz> Co-authored-by: zhou.xu <zhou.xu@bambulab.com> * ENH:set "Rotate (relative)" jira:none code is from PrusaSlicer,thanks for PrusaSlicer and enricoturri1966 commit 243985173e70c189ad9a86eefaaea0757d9749cb Author: enricoturri1966 <enricoturri@seznam.cz> Date: Thu May 12 14:33:41 2022 +0200 Tech ENABLE_TRANSFORMATIONS_BY_MATRICES - Allow for relative rotations Change-Id: I851939093ffb6881542fb21b434e17cc31a6dab2 (cherry picked from commit e412fa3492fa2ef59b84a84be1ede80935fb8a8d) * FIX:limit scaling ratio by grabber in scale tool jira: none Change-Id: I20a4404d4e4025ae230ab46ba8d8d3e5ffed10e3 (cherry picked from commit 97f63f167e80e859fec49666c8986f5a01f61838) * FIX:selection should be not empty when update_ui_from_settings jira: none Change-Id: I74b76733eba03d148dfd70279ec2ba65f19cc39a (cherry picked from commit f402685aee747fe5c3740b2cb80fc2a60e129918) * ENH:add "volume selection" checkbox jira: none Change-Id: I68b5f54e37ea2ab9e2b65ac84abc834060f400df (cherry picked from commit eec7de441bd40408fe688587d2834b0c42c0d66f) * FIX:add can_sequential_clearance_show_in_gizmo api jira: STUDIO-7836 Change-Id: Ie0cded272596bafee4e491e379722dcc23035dc4 (cherry picked from commit 715d2b9b7840939663e99e0ecbfcefd8ecf2904f) * FIX:select all should ban in paint,cut and so on gizmo jira: STUDIO-7872 Change-Id: Ic6496dbdd892814e1fc41625ee34ffc46f171657 (cherry picked from commit 95e8ca728553081db4ecbb3d865c8b999a6ff2fa) * FIX:add wipe tower'position in move gizmo jira: STUDIO-7861 Change-Id: I8147717bc61ba06a7e1fba45532cdadc2ba1174e (cherry picked from commit 065dddb890d3ec81643b9767397bdad72ae69ebd) * ENH:fix text coordinate system calculation jira: STUDIO-6449 Change-Id: I36214c14c348e8f52b96501cd027205819b0dabc (cherry picked from commit 44287812a0cb212f1bf6fe70e32e1075f532886d) Cherry-picked from bambulab/BambuStudio@4091f3e042 Co-authored-by: zhou.xu <zhou.xu@bambulab.com> * FIX:delete old selection.translate api jira: STUDIO-8201 code is from PrusaSlicer,thanks for PrusaSlicer and enricoturri1966 commit 88ce6ccdef5f680709ea8b676688784a7af287dd Author: enricoturri1966 <enricoturri@seznam.cz> Date: Wed May 11 10:54:42 2022 +0200 Tech ENABLE_TRANSFORMATIONS_BY_MATRICES - Change-Id: Iafe963f0f7bf9028f32a4fb4a4cc8cc609662283 Change-Id: Ibbc36c004734f35564f0028dd1e537ac926a2f1f Cherry-picked from bambulab/BambuStudio@c6d9f2685e Co-authored-by: enricoturri1966 <enricoturri@seznam.cz> Co-authored-by: zhou.xu <zhou.xu@bambulab.com> * FIX:add protection for null pointer jira: none Change-Id: I9a9231bab893f5d2afa008f65165269ae176c962 (cherry picked from commit f27a713aaf77b1109fc57b8650efa6b23081f799) * FIX:when two dir is perpendicular to each other,scale error (plane_normal.dot(ray_dir)) jira:STUDIO-8274 Change-Id: Ib3145ab75e18c832d20065d204aa41b75f73b673 (cherry picked from commit fbdc9cd580f835d1a873d08ed64baed3b3db6f9a) * ENH:add "reset real zeros" button in rotate gizmo jira: STUDIO-8291 Change-Id: Ia10e4d8a2a3a073c22a1306aeab9ffa3e7b77c2b (cherry picked from commit 738e3f004daa9082709800e4e3d0d9bbe1b7ed7e) * FIX:add "absolute rotation" in rotate gizmo jira: STUDIO-8726 Change-Id: I23deb4ab11cf24ca4f0f0c5a35a74268c34f60f6 (cherry picked from commit d26b8f9fcadf8f7709a302991e43be711560e84e) (cherry picked from commit 496d69f9d1b91c6bd84804e57a276bccf79f0cbd) * Fix tooltip button size * Fix issue that reative rotation history not cleared after gizmo closed * Show selection box in assemble view * ENH:add an tip icon for assembly view jira: STUDIO-7155 Change-Id: Ie9e4fa578c8aa5bda9ff771d82f396f8b51026bb (cherry picked from commit 515f9473347fb912a9dc8c365f1c318506096083) --------- Co-authored-by: zhou.xu <zhou.xu@bambulab.com> Co-authored-by: enricoturri1966 <enricoturri@seznam.cz> Co-authored-by: SoftFever <softfeverever@gmail.com>
555 lines
25 KiB
C++
555 lines
25 KiB
C++
#ifndef slic3r_3DScene_hpp_
|
|
#define slic3r_3DScene_hpp_
|
|
|
|
#include "libslic3r/libslic3r.h"
|
|
#include "libslic3r/Point.hpp"
|
|
#include "libslic3r/Line.hpp"
|
|
#include "libslic3r/TriangleMesh.hpp"
|
|
#include "libslic3r/Utils.hpp"
|
|
#include "libslic3r/Geometry.hpp"
|
|
#include "libslic3r/Color.hpp"
|
|
// BBS
|
|
#include "libslic3r/ObjectID.hpp"
|
|
|
|
#include "GLModel.hpp"
|
|
#include "GLShader.hpp"
|
|
#include "MeshUtils.hpp"
|
|
|
|
#include <functional>
|
|
#include <optional>
|
|
|
|
#ifndef NDEBUG
|
|
#define HAS_GLSAFE
|
|
#endif // NDEBUG
|
|
|
|
#ifdef HAS_GLSAFE
|
|
extern void glAssertRecentCallImpl(const char *file_name, unsigned int line, const char *function_name);
|
|
inline void glAssertRecentCall() { glAssertRecentCallImpl(__FILE__, __LINE__, __FUNCTION__); }
|
|
#define glsafe(cmd) do { cmd; glAssertRecentCallImpl(__FILE__, __LINE__, __FUNCTION__); } while (false)
|
|
#define glcheck() do { glAssertRecentCallImpl(__FILE__, __LINE__, __FUNCTION__); } while (false)
|
|
#else // HAS_GLSAFE
|
|
inline void glAssertRecentCall() { }
|
|
#define glsafe(cmd) cmd
|
|
#define glcheck()
|
|
#endif // HAS_GLSAFE
|
|
extern std::vector<Slic3r::ColorRGBA> get_extruders_colors();
|
|
extern float FullyTransparentMaterialThreshold;
|
|
extern float FullTransparentModdifiedToFixAlpha;
|
|
extern Slic3r::ColorRGBA adjust_color_for_rendering(const Slic3r::ColorRGBA &colors);
|
|
|
|
|
|
namespace Slic3r {
|
|
namespace GUI {
|
|
class Size;
|
|
}
|
|
|
|
class SLAPrintObject;
|
|
enum SLAPrintObjectStep : unsigned int;
|
|
class BuildVolume;
|
|
class DynamicPrintConfig;
|
|
class ExtrusionPath;
|
|
class ExtrusionMultiPath;
|
|
class ExtrusionLoop;
|
|
class ExtrusionEntity;
|
|
class ExtrusionEntityCollection;
|
|
class ModelObject;
|
|
class ModelVolume;
|
|
class GLShaderProgram;
|
|
enum ModelInstanceEPrintVolumeState : unsigned char;
|
|
|
|
using ModelObjectPtrs = std::vector<ModelObject*>;
|
|
|
|
// Return appropriate color based on the ModelVolume.
|
|
extern ColorRGBA color_from_model_volume(const ModelVolume& model_volume);
|
|
|
|
class GLVolume {
|
|
public:
|
|
std::string name;
|
|
|
|
static ColorRGBA DISABLED_COLOR;
|
|
static ColorRGBA SLA_SUPPORT_COLOR;
|
|
static ColorRGBA SLA_PAD_COLOR;
|
|
static ColorRGBA NEUTRAL_COLOR;
|
|
static ColorRGBA UNPRINTABLE_COLOR;
|
|
static std::array<ColorRGBA, 5> MODEL_COLOR;
|
|
static ColorRGBA MODEL_MIDIFIER_COL;
|
|
static ColorRGBA MODEL_NEGTIVE_COL;
|
|
static ColorRGBA SUPPORT_ENFORCER_COL;
|
|
static ColorRGBA SUPPORT_BLOCKER_COL;
|
|
static ColorRGBA MODEL_HIDDEN_COL;
|
|
|
|
static void update_render_colors();
|
|
static void load_render_colors();
|
|
|
|
static float explosion_ratio;
|
|
static float last_explosion_ratio;
|
|
|
|
enum EHoverState : unsigned char
|
|
{
|
|
HS_None,
|
|
HS_Hover,
|
|
HS_Select,
|
|
HS_Deselect
|
|
};
|
|
|
|
GLVolume(float r = 1.f, float g = 1.f, float b = 1.f, float a = 1.f);
|
|
GLVolume(const ColorRGBA& color) : GLVolume(color.r(), color.g(), color.b(), color.a()) {}
|
|
virtual ~GLVolume() = default;
|
|
|
|
// BBS
|
|
protected:
|
|
Geometry::Transformation m_instance_transformation;
|
|
Geometry::Transformation m_volume_transformation;
|
|
// BBS
|
|
Vec3d m_offset_to_assembly{ 0.0, 0.0, 0.0 };
|
|
|
|
// Shift in z required by sla supports+pad
|
|
double m_sla_shift_z;
|
|
// Bounding box of this volume, in unscaled coordinates.
|
|
std::optional<BoundingBoxf3> m_transformed_bounding_box;
|
|
// Convex hull of the volume, if any.
|
|
std::shared_ptr<const TriangleMesh> m_convex_hull;
|
|
// Bounding box of this volume, in unscaled coordinates.
|
|
std::optional<BoundingBoxf3> m_transformed_convex_hull_bounding_box;
|
|
// Bounding box of the non sinking part of this volume, in unscaled coordinates.
|
|
std::optional<BoundingBoxf3> m_transformed_non_sinking_bounding_box;
|
|
|
|
class SinkingContours
|
|
{
|
|
static const float HalfWidth;
|
|
GLVolume& m_parent;
|
|
GUI::GLModel m_model;
|
|
BoundingBoxf3 m_old_box;
|
|
Vec3d m_shift{ Vec3d::Zero() };
|
|
|
|
public:
|
|
SinkingContours(GLVolume& volume) : m_parent(volume) {}
|
|
void render();
|
|
|
|
private:
|
|
void update();
|
|
};
|
|
|
|
SinkingContours m_sinking_contours;
|
|
|
|
public:
|
|
// Color of the triangles / quads held by this volume.
|
|
ColorRGBA color;
|
|
// Color used to render this volume.
|
|
ColorRGBA render_color;
|
|
|
|
struct CompositeID {
|
|
CompositeID(int object_id, int volume_id, int instance_id) : object_id(object_id), volume_id(volume_id), instance_id(instance_id) {}
|
|
CompositeID() : object_id(-1), volume_id(-1), instance_id(-1) {}
|
|
// Object ID, which is equal to the index of the respective ModelObject in Model.objects array.
|
|
int object_id;
|
|
// Volume ID, which is equal to the index of the respective ModelVolume in ModelObject.volumes array.
|
|
// If negative, it is an index of a geometry produced by the PrintObject for the respective ModelObject,
|
|
// and which has no associated ModelVolume in ModelObject.volumes. For example, SLA supports.
|
|
// Volume with a negative volume_id cannot be picked independently, it will pick the associated instance.
|
|
int volume_id;
|
|
// Instance ID, which is equal to the index of the respective ModelInstance in ModelObject.instances array.
|
|
int instance_id;
|
|
bool operator==(const CompositeID &rhs) const { return object_id == rhs.object_id && volume_id == rhs.volume_id && instance_id == rhs.instance_id; }
|
|
bool operator!=(const CompositeID &rhs) const { return ! (*this == rhs); }
|
|
bool operator< (const CompositeID &rhs) const
|
|
{ return object_id < rhs.object_id || (object_id == rhs.object_id && (volume_id < rhs.volume_id || (volume_id == rhs.volume_id && instance_id < rhs.instance_id))); }
|
|
};
|
|
CompositeID composite_id;
|
|
// Fingerprint of the source geometry. For ModelVolumes, it is the ModelVolume::ID and ModelInstanceID,
|
|
// for generated volumes it is the timestamp generated by PrintState::invalidate() or PrintState::set_done(),
|
|
// and the associated ModelInstanceID.
|
|
// Valid geometry_id should always be positive.
|
|
std::pair<size_t, size_t> geometry_id;
|
|
// An ID containing the extruder ID (used to select color).
|
|
int extruder_id;
|
|
|
|
size_t model_object_ID{0};
|
|
|
|
// Various boolean flags.
|
|
struct {
|
|
// Is this object selected?
|
|
bool selected : 1;
|
|
// Is this object disabled from selection?
|
|
bool disabled : 1;
|
|
// Is this object printable?
|
|
bool printable : 1;
|
|
// Is this object visible(in assemble view)?
|
|
bool visible : 1;
|
|
// Whether or not this volume is active for rendering
|
|
bool is_active : 1;
|
|
// Whether or not to use this volume when applying zoom_to_volumes()
|
|
bool zoom_to_volumes : 1;
|
|
// Wheter or not this volume is enabled for outside print volume detection in shader.
|
|
bool shader_outside_printer_detection_enabled : 1;
|
|
// Wheter or not this volume is outside print volume.
|
|
bool is_outside : 1;
|
|
bool partly_inside : 1;
|
|
// Wheter or not this volume has been generated from a modifier
|
|
bool is_modifier : 1;
|
|
// Wheter or not this volume has been generated from the wipe tower
|
|
bool is_wipe_tower : 1;
|
|
// Wheter or not this volume has been generated from an extrusion path
|
|
bool is_extrusion_path : 1;
|
|
// Wheter or not to always render this volume using its own alpha
|
|
bool force_transparent : 1;
|
|
// Whether or not always use the volume's own color (not using SELECTED/HOVER/DISABLED/OUTSIDE)
|
|
bool force_native_color : 1;
|
|
// Whether or not render this volume in neutral
|
|
bool force_neutral_color : 1;
|
|
// Whether or not to force rendering of sinking contours
|
|
bool force_sinking_contours : 1;
|
|
// Is render for picking
|
|
bool picking : 1;
|
|
};
|
|
|
|
// Is mouse or rectangle selection over this object to select/deselect it ?
|
|
EHoverState hover;
|
|
|
|
GUI::GLModel model;
|
|
// raycaster used for picking
|
|
std::unique_ptr<GUI::MeshRaycaster> mesh_raycaster;
|
|
// BBS
|
|
mutable std::vector<GUI::GLModel> mmuseg_models;
|
|
mutable ObjectBase::Timestamp mmuseg_ts;
|
|
|
|
// Ranges of triangle and quad indices to be rendered.
|
|
std::pair<size_t, size_t> tverts_range;
|
|
|
|
// If the qverts or tverts contain thick extrusions, then offsets keeps pointers of the starts
|
|
// of the extrusions per layer.
|
|
std::vector<coordf_t> print_zs;
|
|
// Offset into qverts & tverts, or offsets into indices stored into an OpenGL name_index_buffer.
|
|
std::vector<size_t> offsets;
|
|
|
|
// Bounding box of this volume, in unscaled coordinates.
|
|
BoundingBoxf3 bounding_box() const {
|
|
return this->model.get_bounding_box();
|
|
}
|
|
|
|
void set_color(const ColorRGBA& rgba) { color = rgba; }
|
|
void set_render_color(const ColorRGBA& rgba) { render_color = rgba; }
|
|
// Sets render color in dependence of current state
|
|
void set_render_color();
|
|
// set color according to model volume
|
|
void set_color_from_model_volume(const ModelVolume& model_volume);
|
|
|
|
const Geometry::Transformation& get_instance_transformation() const { return m_instance_transformation; }
|
|
void set_instance_transformation(const Geometry::Transformation& transformation) { m_instance_transformation = transformation; set_bounding_boxes_as_dirty(); }
|
|
void set_instance_transformation(const Transform3d& transform) { m_instance_transformation.set_matrix(transform); set_bounding_boxes_as_dirty(); }
|
|
|
|
Vec3d get_instance_offset() const { return m_instance_transformation.get_offset(); }
|
|
double get_instance_offset(Axis axis) const { return m_instance_transformation.get_offset(axis); }
|
|
|
|
void set_instance_offset(const Vec3d& offset) { m_instance_transformation.set_offset(offset); set_bounding_boxes_as_dirty(); }
|
|
void set_instance_offset(Axis axis, double offset) { m_instance_transformation.set_offset(axis, offset); set_bounding_boxes_as_dirty(); }
|
|
|
|
Vec3d get_instance_rotation() const { return m_instance_transformation.get_rotation(); }
|
|
double get_instance_rotation(Axis axis) const { return m_instance_transformation.get_rotation(axis); }
|
|
|
|
void set_instance_rotation(const Vec3d& rotation) { m_instance_transformation.set_rotation(rotation); set_bounding_boxes_as_dirty(); }
|
|
void set_instance_rotation(Axis axis, double rotation) { m_instance_transformation.set_rotation(axis, rotation); set_bounding_boxes_as_dirty(); }
|
|
|
|
Vec3d get_instance_scaling_factor() const { return m_instance_transformation.get_scaling_factor(); }
|
|
double get_instance_scaling_factor(Axis axis) const { return m_instance_transformation.get_scaling_factor(axis); }
|
|
|
|
void set_instance_scaling_factor(const Vec3d& scaling_factor) { m_instance_transformation.set_scaling_factor(scaling_factor); set_bounding_boxes_as_dirty(); }
|
|
void set_instance_scaling_factor(Axis axis, double scaling_factor) { m_instance_transformation.set_scaling_factor(axis, scaling_factor); set_bounding_boxes_as_dirty(); }
|
|
|
|
Vec3d get_instance_mirror() const { return m_instance_transformation.get_mirror(); }
|
|
double get_instance_mirror(Axis axis) const { return m_instance_transformation.get_mirror(axis); }
|
|
|
|
void set_instance_mirror(const Vec3d& mirror) { m_instance_transformation.set_mirror(mirror); set_bounding_boxes_as_dirty(); }
|
|
void set_instance_mirror(Axis axis, double mirror) { m_instance_transformation.set_mirror(axis, mirror); set_bounding_boxes_as_dirty(); }
|
|
|
|
const Geometry::Transformation& get_volume_transformation() const { return m_volume_transformation; }
|
|
void set_volume_transformation(const Geometry::Transformation& transformation) { m_volume_transformation = transformation; set_bounding_boxes_as_dirty(); }
|
|
void set_volume_transformation(const Transform3d& transform) { m_volume_transformation.set_matrix(transform); set_bounding_boxes_as_dirty(); }
|
|
|
|
Vec3d get_volume_offset() const { return m_volume_transformation.get_offset(); }
|
|
double get_volume_offset(Axis axis) const { return m_volume_transformation.get_offset(axis); }
|
|
|
|
void set_volume_offset(const Vec3d& offset) { m_volume_transformation.set_offset(offset); set_bounding_boxes_as_dirty(); }
|
|
void set_volume_offset(Axis axis, double offset) { m_volume_transformation.set_offset(axis, offset); set_bounding_boxes_as_dirty(); }
|
|
|
|
Vec3d get_volume_rotation() const { return m_volume_transformation.get_rotation(); }
|
|
double get_volume_rotation(Axis axis) const { return m_volume_transformation.get_rotation(axis); }
|
|
|
|
void set_volume_rotation(const Vec3d& rotation) { m_volume_transformation.set_rotation(rotation); set_bounding_boxes_as_dirty(); }
|
|
void set_volume_rotation(Axis axis, double rotation) { m_volume_transformation.set_rotation(axis, rotation); set_bounding_boxes_as_dirty(); }
|
|
|
|
Vec3d get_volume_scaling_factor() const { return m_volume_transformation.get_scaling_factor(); }
|
|
double get_volume_scaling_factor(Axis axis) const { return m_volume_transformation.get_scaling_factor(axis); }
|
|
|
|
void set_volume_scaling_factor(const Vec3d& scaling_factor) { m_volume_transformation.set_scaling_factor(scaling_factor); set_bounding_boxes_as_dirty(); }
|
|
void set_volume_scaling_factor(Axis axis, double scaling_factor) { m_volume_transformation.set_scaling_factor(axis, scaling_factor); set_bounding_boxes_as_dirty(); }
|
|
|
|
Vec3d get_volume_mirror() const { return m_volume_transformation.get_mirror(); }
|
|
double get_volume_mirror(Axis axis) const { return m_volume_transformation.get_mirror(axis); }
|
|
|
|
void set_volume_mirror(const Vec3d& mirror) { m_volume_transformation.set_mirror(mirror); set_bounding_boxes_as_dirty(); }
|
|
void set_volume_mirror(Axis axis, double mirror) { m_volume_transformation.set_mirror(axis, mirror); set_bounding_boxes_as_dirty(); }
|
|
|
|
double get_sla_shift_z() const { return m_sla_shift_z; }
|
|
void set_sla_shift_z(double z) { m_sla_shift_z = z; }
|
|
|
|
void set_convex_hull(std::shared_ptr<const TriangleMesh> convex_hull) { m_convex_hull = std::move(convex_hull); }
|
|
void set_convex_hull(const TriangleMesh &convex_hull) { m_convex_hull = std::make_shared<const TriangleMesh>(convex_hull); }
|
|
void set_convex_hull(TriangleMesh &&convex_hull) { m_convex_hull = std::make_shared<const TriangleMesh>(std::move(convex_hull)); }
|
|
|
|
void set_offset_to_assembly(const Vec3d& offset) { m_offset_to_assembly = offset; set_bounding_boxes_as_dirty(); }
|
|
Vec3d get_offset_to_assembly() { return m_offset_to_assembly; }
|
|
|
|
int object_idx() const { return this->composite_id.object_id; }
|
|
int volume_idx() const { return this->composite_id.volume_id; }
|
|
int instance_idx() const { return this->composite_id.instance_id; }
|
|
|
|
Transform3d world_matrix() const;
|
|
bool is_left_handed() const;
|
|
|
|
const BoundingBoxf3& transformed_bounding_box() const;
|
|
// non-caching variant
|
|
BoundingBoxf3 transformed_convex_hull_bounding_box(const Transform3d &trafo) const;
|
|
// caching variant
|
|
const BoundingBoxf3& transformed_convex_hull_bounding_box() const;
|
|
// non-caching variant
|
|
BoundingBoxf3 transformed_non_sinking_bounding_box(const Transform3d& trafo) const;
|
|
// caching variant
|
|
const BoundingBoxf3& transformed_non_sinking_bounding_box() const;
|
|
// convex hull
|
|
const TriangleMesh* convex_hull() const { return m_convex_hull.get(); }
|
|
|
|
bool empty() const { return this->model.is_empty(); }
|
|
|
|
void set_range(double low, double high);
|
|
|
|
virtual void render();
|
|
|
|
//BBS: add outline related logic and add virtual specifier
|
|
virtual void render_with_outline(const GUI::Size& cnv_size);
|
|
|
|
//BBS: add simple render function for thumbnail
|
|
void simple_render(GLShaderProgram* shader, ModelObjectPtrs& model_objects, std::vector<ColorRGBA>& extruder_colors, bool ban_light =false);
|
|
|
|
void set_bounding_boxes_as_dirty() {
|
|
m_transformed_bounding_box.reset();
|
|
m_transformed_convex_hull_bounding_box.reset();
|
|
m_transformed_non_sinking_bounding_box.reset();
|
|
}
|
|
|
|
bool is_sla_support() const;
|
|
bool is_sla_pad() const;
|
|
|
|
bool is_sinking() const;
|
|
bool is_below_printbed() const;
|
|
void render_sinking_contours();
|
|
|
|
// Return an estimate of the memory consumed by this class.
|
|
size_t cpu_memory_used() const {
|
|
return sizeof(*this) + this->model.cpu_memory_used() + this->print_zs.capacity() * sizeof(coordf_t) +
|
|
this->offsets.capacity() * sizeof(size_t);
|
|
}
|
|
// Return an estimate of the memory held by GPU vertex buffers.
|
|
size_t gpu_memory_used() const { return this->model.gpu_memory_used(); }
|
|
size_t total_memory_used() const { return this->cpu_memory_used() + this->gpu_memory_used(); }
|
|
};
|
|
|
|
// BBS
|
|
class GLWipeTowerVolume : public GLVolume {
|
|
public:
|
|
GLWipeTowerVolume(const std::vector<ColorRGBA>& colors);
|
|
void render() override;
|
|
void render_with_outline(const GUI::Size& cnv_size) override { render(); }
|
|
|
|
std::vector<GUI::GLModel> model_per_colors;
|
|
bool IsTransparent();
|
|
|
|
private:
|
|
std::vector<ColorRGBA> m_colors;
|
|
};
|
|
|
|
typedef std::vector<GLVolume*> GLVolumePtrs;
|
|
typedef std::pair<GLVolume*, std::pair<unsigned int, double>> GLVolumeWithIdAndZ;
|
|
typedef std::vector<GLVolumeWithIdAndZ> GLVolumeWithIdAndZList;
|
|
|
|
class GLVolumeCollection
|
|
{
|
|
public:
|
|
enum class ERenderType : unsigned char
|
|
{
|
|
Opaque,
|
|
Transparent,
|
|
All
|
|
};
|
|
|
|
struct PrintVolume
|
|
{
|
|
// see: Bed3D::EShapeType
|
|
int type{ 0 };
|
|
// data contains:
|
|
// Rectangle:
|
|
// [0] = min.x, [1] = min.y, [2] = max.x, [3] = max.y
|
|
// Circle:
|
|
// [0] = center.x, [1] = center.y, [3] = radius
|
|
std::array<float, 4> data;
|
|
// [0] = min z, [1] = max z
|
|
std::array<float, 2> zs;
|
|
};
|
|
|
|
private:
|
|
PrintVolume m_print_volume;
|
|
PrintVolume m_render_volume;
|
|
|
|
// z range for clipping in shaders
|
|
std::array<float, 2> m_z_range;
|
|
|
|
// plane coeffs for clipping in shaders
|
|
std::array<double, 4> m_clipping_plane;
|
|
|
|
// plane coeffs for render volumes with different colors in shaders
|
|
// used by cut gizmo
|
|
std::array<double, 4> m_color_clip_plane;
|
|
bool m_use_color_clip_plane{ false };
|
|
std::array<ColorRGBA, 2> m_color_clip_plane_colors{ ColorRGBA::RED(), ColorRGBA::BLUE() };
|
|
|
|
struct Slope
|
|
{
|
|
// toggle for slope rendering
|
|
bool active{ false };//local active
|
|
bool isGlobalActive{false};
|
|
float normal_z;
|
|
};
|
|
|
|
Slope m_slope;
|
|
bool m_show_sinking_contours = false;
|
|
|
|
public:
|
|
GLVolumePtrs volumes;
|
|
|
|
GLVolumeCollection() {
|
|
set_default_slope_normal_z();
|
|
|
|
//BBS init render volume
|
|
m_render_volume.type = -1;
|
|
}
|
|
~GLVolumeCollection() { clear(); }
|
|
|
|
std::vector<int> load_object(
|
|
const ModelObject *model_object,
|
|
int obj_idx,
|
|
const std::vector<int> &instance_idxs,
|
|
const std::string &color_by,
|
|
bool opengl_initialized,
|
|
bool need_raycaster = true);
|
|
|
|
int load_object_volume(
|
|
const ModelObject *model_object,
|
|
int obj_idx,
|
|
int volume_idx,
|
|
int instance_idx,
|
|
const std::string &color_by,
|
|
bool opengl_initialized,
|
|
bool in_assemble_view = false,
|
|
bool use_loaded_id = false,
|
|
bool need_raycaster = true);
|
|
// Load SLA auxiliary GLVolumes (for support trees or pad).
|
|
void load_object_auxiliary(
|
|
const SLAPrintObject *print_object,
|
|
int obj_idx,
|
|
// pairs of <instance_idx, print_instance_idx>
|
|
const std::vector<std::pair<size_t, size_t>>& instances,
|
|
SLAPrintObjectStep milestone,
|
|
// Timestamp of the last change of the milestone
|
|
size_t timestamp);
|
|
|
|
int load_wipe_tower_preview(
|
|
int obj_idx, float pos_x, float pos_y, float width, float depth, float height, float rotation_angle, bool size_unknown, float brim_width);
|
|
|
|
GLVolume* new_toolpath_volume(const ColorRGBA& rgba);
|
|
GLVolume* new_nontoolpath_volume(const ColorRGBA& rgba);
|
|
|
|
int get_selection_support_threshold_angle(bool&) const;
|
|
// Render the volumes by OpenGL.
|
|
//BBS: add outline drawing logic
|
|
void render(ERenderType type,
|
|
bool disable_cullface,
|
|
const Transform3d & view_matrix,
|
|
const Transform3d& projection_matrix,
|
|
const GUI::Size& cnv_size,
|
|
std::function<bool(const GLVolume &)> filter_func = std::function<bool(const GLVolume &)>(),
|
|
bool partly_inside_enable =true
|
|
) const;
|
|
|
|
// Clear the geometry
|
|
void clear() { for (auto *v : volumes) delete v; volumes.clear(); }
|
|
|
|
bool empty() const { return volumes.empty(); }
|
|
void set_range(double low, double high) { for (GLVolume *vol : this->volumes) vol->set_range(low, high); }
|
|
|
|
void set_print_volume(const PrintVolume& print_volume) { m_print_volume = print_volume; }
|
|
|
|
void set_z_range(float min_z, float max_z) { m_z_range[0] = min_z; m_z_range[1] = max_z; }
|
|
void set_clipping_plane(const std::array<double, 4>& coeffs) { m_clipping_plane = coeffs; }
|
|
|
|
const std::array<float, 2>& get_z_range() const { return m_z_range; }
|
|
const std::array<double, 4>& get_clipping_plane() const { return m_clipping_plane; }
|
|
|
|
void set_use_color_clip_plane(bool use) { m_use_color_clip_plane = use; }
|
|
void set_color_clip_plane(const Vec3d& cp_normal, double offset) {
|
|
for (int i = 0; i < 3; ++i)
|
|
m_color_clip_plane[i] = -cp_normal[i];
|
|
m_color_clip_plane[3] = offset;
|
|
}
|
|
void set_color_clip_plane_colors(const std::array<ColorRGBA, 2>& colors) { m_color_clip_plane_colors = colors; }
|
|
|
|
bool is_slope_GlobalActive() const { return m_slope.isGlobalActive; }
|
|
bool is_slope_active() const { return m_slope.active; }
|
|
void set_slope_active(bool active) { m_slope.active = active; }
|
|
void set_slope_GlobalActive(bool active) { m_slope.isGlobalActive = active; }
|
|
|
|
float get_slope_normal_z() const { return m_slope.normal_z; }
|
|
void set_slope_normal_z(float normal_z) { m_slope.normal_z = normal_z; }
|
|
void set_default_slope_normal_z() { m_slope.normal_z = -::cos(Geometry::deg2rad(90.0f - 45.0f)); }
|
|
void set_show_sinking_contours(bool show) { m_show_sinking_contours = show; }
|
|
|
|
// returns true if all the volumes are completely contained in the print volume
|
|
// returns the containment state in the given out_state, if non-null
|
|
bool check_outside_state(const Slic3r::BuildVolume& build_volume, ModelInstanceEPrintVolumeState* out_state) const;
|
|
void reset_outside_state();
|
|
|
|
void update_colors_by_extruder(const DynamicPrintConfig *config, bool is_update_alpha = true);
|
|
|
|
// Returns a vector containing the sorted list of all the print_zs of the volumes contained in this collection
|
|
std::vector<double> get_current_print_zs(bool active_only) const;
|
|
|
|
// Return an estimate of the memory consumed by this class.
|
|
size_t cpu_memory_used() const;
|
|
// Return an estimate of the memory held by GPU vertex buffers.
|
|
size_t gpu_memory_used() const;
|
|
size_t total_memory_used() const { return this->cpu_memory_used() + this->gpu_memory_used(); }
|
|
// Return CPU, GPU and total memory log line.
|
|
std::string log_memory_info() const;
|
|
|
|
void set_transparency(float alpha);
|
|
|
|
private:
|
|
GLVolumeCollection(const GLVolumeCollection &other);
|
|
GLVolumeCollection& operator=(const GLVolumeCollection &);
|
|
};
|
|
|
|
GLVolumeWithIdAndZList volumes_to_render(const GLVolumePtrs& volumes, GLVolumeCollection::ERenderType type, const Transform3d& view_matrix, std::function<bool(const GLVolume&)> filter_func = nullptr);
|
|
|
|
struct _3DScene
|
|
{
|
|
static void thick_lines_to_verts(const Lines& lines, const std::vector<double>& widths, const std::vector<double>& heights, bool closed, double top_z, GUI::GLModel::Geometry& geometry);
|
|
static void thick_lines_to_verts(const Lines3& lines, const std::vector<double>& widths, const std::vector<double>& heights, bool closed, GUI::GLModel::Geometry& geometry);
|
|
static void extrusionentity_to_verts(const ExtrusionPath& extrusion_path, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry);
|
|
static void extrusionentity_to_verts(const ExtrusionLoop& extrusion_loop, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry);
|
|
static void extrusionentity_to_verts(const ExtrusionMultiPath& extrusion_multi_path, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry);
|
|
static void extrusionentity_to_verts(const ExtrusionEntityCollection& extrusion_entity_collection, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry);
|
|
static void extrusionentity_to_verts(const ExtrusionEntity* extrusion_entity, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry);
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|