mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-07-16 15:32:09 +00:00
Includes (but is not limited to) the following commits: SPE-2218 - libvgcode - Fixed color of wipe moves for speed range view SPE-2218 - libvgcode - Fixed detection of fan speed range SPE-2218 - libvgcode - Fixed detection of temperature range SPE-2218 - libvgcode - Fixed colors for Actual volumetric flow rate view SPE-2214 - Fixed detection of toolpaths bounding box in GCodeViewer SPE-2206 - Modified LibBGCode.cmake to get latest version of libbgcode which fixed parsing of gcode lines G4 libvgcode - Fixed potential out of bound access in ViewerImpl::update_view_full_range() Tech ENABLE_GL_CORE_PROFILE set as default Tech ENABLE_OPENGL_ES replaced by build option SLIC3R_OPENGL_ES libvgcode - Precompiler definition of ENABLE_OPENGL_ES moved into CMakeLists.txt Added missing include libvgcode - Textures setup modified to work when building using emscripten libvgcode - small optimization libvgcode - fixed OpenGLWrapper::unload_opengl() libvgcode - CMakeLists.txt modified to work with emscripten libvgcode - Replace 'glVertexAttribIPointer()' with 'glVertexAttribPointer()' in SegmentTemplate::init() for OpenGL ES libvgcode - Replace 'xor' with '^' Bitset.hpp libvgcode - Newer glad library for OpenGL 4.6 and OpenGL ES 3.0 libvgcode - Alternate fix in method ViewerImpl::update_heights_widths() for OpenGL ES libvgcode - Fixes in glAssertRecentCallImpl() libvgcode - Fixes in method ViewerImpl::update_heights_widths() for OpenGL ES Fixed ES shaders so they work with OpenGL ES 3.0 libvgcode - Use multiple plain textures in place of texture buffers for OpenGL ES libvgcode - Use plain textures in place of texture buffers for OpenGL ES (partial implementation using one texture per buffer) libvgcode - refactoring of class OpenGLWrapper libvgcode - small refactoring in shaders libvgcode - replacement of glMapBuffer() call for OpenGL ES Fixed warning libvgcode - Changes into CMakeLists.txt Fixed debug export of gcode data to be configuration indipendent Disabled tech ENABLE_NEW_GCODE_VIEWER_DEBUG Removed obsolete tech ENABLE_GCODE_VIEWER_DATA_CHECKING Code cleanup and techs removal - completed Code cleanup and techs removal - step 1 SPE-1872: Implemented G2/G3 lines discretization for gcfMarlinFirmware firmware flavour SPE-1872: Corrections into GCodeProcessor::process_G2_G3() to match firmware code SPE-1872: Actual speed profile - Further enhancements of imgui debug window SPE-1872: Actual speed profile - Rework in its calculation + enhanced imgui debug window SPE-1872: New imgui widget to show actual speed profile SPE-1872: Fixed actual speed for seam moves and at extrusion/travel/wipe start SPE-1872: Fixed rendering of wipe moves when actual speed view is selected SPE-1872: Actual speed profile extended to travel and wipe moves SPE-1872: Fixes in function recalculate_trapezoids() and method GCodeProcessor::TimeMachine::calculate_time() to smooth actual speed profile SPE-1872: Added debug graphic to show move actual speed profile SPE-1872: libvgcode library: replace volumetric flow rate data with mm3_per_mm to reduce memory usage SPE-1872: Added visualization of actual volumetric flow rate SPE-1872: Fixes in calculating actual speed SPE-1872: Added visualization of actual speed in gcode preview SPE-2124: Added command line option 'opengl-aa' to allow the user to turn on the automatic selection of max number of supported samples for OpenGL antialising #12117: Reduced moire patterns by using the highest number of samples available for multisampling New gcode visualization integration - Partially enabled imgui debug window New gcode visualization integration - Fixed center of gravity calculation and rendering New gcode visualization library - Interface for estimated times New gcode visualization library - Tool marker rendering New gcode visualization library - Axes aligned bounding boxes calculation Removed obsolete debug code New gcode visualization library - Added statistic of used memory New gcode visualization library - Separation of tool colors and color changes colors to simplify client code Added missing include New gcode visualization library - Added print color changes detection New gcode visualization library - Modified OpenGL ES context detection New gcode visualization library - Another makefile cleanup New gcode visualization library - Makefiles cleanup New gcode visualization library - Added suppression of error 'This function or variable may be unsafe' in VS2022 New gcode visualization library - Compatibility with OpenGL ES New gcode visualization library - Interface cleanup and documentation New gcode visualization library - Extended interface to give access to estimated times New gcode visualization integration - Toggling of top layer only view state New gcode visualization integration - Removed imperial units from tool position data Small refactoring New gcode visualization library - Custom values for travel and wipe moves radius New gcode visualization library - Allow customization of range colors New gcode visualization library - Partial update of interface comments/documentation New gcode visualization integration - Follow-up of 35ee55e29bb231fd01a2eb71ae293832a37ca65d - Better fix for toolpaths visible range when toggling options' visibility New gcode visualization integration - Fixed toolpaths reset New gcode visualization library - Fixed method set_option_color() New gcode visualization library - Fixed method ViewerImpl::set_extrusion_role_color() New gcode visualization library - Added methods to release gpu resources on demand. New gcode visualization library - Travel and wipe moves as options New gcode visualization integration - Fixed toolpaths visible range when toggling options' visibility New gcode visualization integration - Fixed management of gcode preview view type New gcode visualization - Fixed wrong include New gcode visualization - Added missing headers New gcode visualization - Refactoring + added missing headers New gcode visualization - New code set as standalone library + embed glad library to load OpenGL functions New gcode visualization - Fixed errors and warnings when building the new code as a standalone library New gcode visualization integration - Fixed layers ordering in pre-gcode preview New gcode visualization integration - Fixed objects' tool colors in pre-gcode preview Code cleanup New gcode visualization integration - Tool position properties data window New gcode visualization integration - Fixed in export toolpaths to obj New gcode visualization - Inlining in source code Refactoring New gcode visualization integration - Export toolpaths to obj Some refactoring and warning fix New gcode visualization integration - Customizable travel moves colors New gcode visualization integration - Customizable options colors New gcode visualization integration - Customizable extrusion roles colors New gcode visualization integration - Fixed pre-gcode preview layers times New gcode visualization integration - Modify pre-gcode preview to use the new toolpaths renderer, objects WIP New gcode visualization - Modify pre-gcode preview to use the new toolpaths renderer, WIP (brim/skirt/wipe tower) New gcode visualization integration - Do not reset visible range when toggling options/roles visibility New gcode visualization - Fixed color of first vertex of top layer (when top layer only option is enabled) New gcode visualization - Customizable travels and wipes segment radius New gcode visualization integration - Removed tech ENABLE_GCODE_VIEWER_STATISTICS New gcode visualization integration - Added check of OpenGL version New gcode visualization integration - Removed GCodeProcessorResult::spiral_vase_layers Another bunch of warnings fixes Fixed warnings New gcode visualization integration - Removal of old visualization Fixed includes New gcode visualization integration - File structure of new code separated in api + src New gcode visualization integration - View ranges management moved to new visualizer New gcode visualization integration - Fixed top layer only visualization for MMU printers New gcode visualization integration - Removed dependency on imgui from new visualizer Some refactoring New gcode visualization integration - Removed dependency on Slic3r::GCodeProcessorResult from new visualizer New gcode visualization integration - Moves' data conversion moved to client side New gcode visualization: layers times refactoring A bunch of fixes for the new gcode visualization New gcode visualization: render in gray color layers containing pause print or custom gcode options when in Color Print view New gcode visualization integration - Tool colors New gcode visualization integration - Layers times New gcode visualization integration - Travels and Extrusion roles times Fixed detection of start/end of contiguous extrusion paths New gcode visualization integration - Extrusion roles New gcode visualization integration - Colors New gcode visualization integration - Tool position Center of gravity and tool marker may both be rendered with fixed screen size and a scaling factor Fixed rendering of options in new gcode visualization Tool marker NOT rendered by the new visualization code Center of gravity marker NOT rendered by the new visualization code Fixed toolpaths_cog shaders Tool position window for new gcode visualization Top layer only coloring for neww gcode visualization Refactoring in preview's new visualization Hidden imgui debug dialog for new visualization in preview Synchronization of moves between old and new visualization Fixed missing gcode window in new visualization Rendering of debug imgui dialog moved from class libvgcode::Viewer to class libvgcode::Toolpaths + warnings fixing Some functionality moved from class libvgcode::Viewer to class libvgcode::Toolpaths Some refactoring and cleanup Refatoring of PathVertex and Toolpaths::load() SPE-1982: Tech ENABLE_NEW_GCODE_VIEWER - 1st installment of new toolpaths rendering code (WIP)
264 lines
12 KiB
C++
264 lines
12 KiB
C++
#ifndef slic3r_GLModel_hpp_
|
|
#define slic3r_GLModel_hpp_
|
|
|
|
#include "libslic3r/Point.hpp"
|
|
#include "libslic3r/BoundingBox.hpp"
|
|
#include "libslic3r/Color.hpp"
|
|
#include <vector>
|
|
#include <string>
|
|
|
|
struct indexed_triangle_set;
|
|
|
|
namespace Slic3r {
|
|
|
|
class TriangleMesh;
|
|
class Polygon;
|
|
using Polygons = std::vector<Polygon, PointsAllocator<Polygon>>;
|
|
class BuildVolume;
|
|
|
|
namespace GUI {
|
|
|
|
class GLModel
|
|
{
|
|
public:
|
|
struct Geometry
|
|
{
|
|
enum class EPrimitiveType : unsigned char
|
|
{
|
|
Points,
|
|
Triangles,
|
|
TriangleStrip,
|
|
TriangleFan,
|
|
Lines,
|
|
LineStrip,
|
|
LineLoop
|
|
};
|
|
|
|
enum class EVertexLayout : unsigned char
|
|
{
|
|
P2, // position 2 floats
|
|
P2T2, // position 2 floats + texture coords 2 floats
|
|
P3, // position 3 floats
|
|
P3T2, // position 3 floats + texture coords 2 floats
|
|
P3N3, // position 3 floats + normal 3 floats
|
|
P3N3T2, // position 3 floats + normal 3 floats + texture coords 2 floats
|
|
P4, // position 4 floats
|
|
};
|
|
|
|
enum class EIndexType : unsigned char
|
|
{
|
|
UINT, // unsigned int
|
|
USHORT, // unsigned short
|
|
UBYTE // unsigned byte
|
|
};
|
|
|
|
struct Format
|
|
{
|
|
EPrimitiveType type{ EPrimitiveType::Triangles };
|
|
EVertexLayout vertex_layout{ EVertexLayout::P3N3 };
|
|
};
|
|
|
|
Format format;
|
|
std::vector<float> vertices;
|
|
std::vector<unsigned int> indices;
|
|
EIndexType index_type{ EIndexType::UINT };
|
|
ColorRGBA color{ ColorRGBA::BLACK() };
|
|
|
|
void reserve_vertices(size_t vertices_count) { vertices.reserve(vertices_count * vertex_stride_floats(format)); }
|
|
void reserve_indices(size_t indices_count) { indices.reserve(indices_count); }
|
|
|
|
void add_vertex(const Vec2f& position); // EVertexLayout::P2
|
|
void add_vertex(const Vec2f& position, const Vec2f& tex_coord); // EVertexLayout::P2T2
|
|
void add_vertex(const Vec3f& position); // EVertexLayout::P3
|
|
void add_vertex(const Vec3f& position, const Vec2f& tex_coord); // EVertexLayout::P3T2
|
|
void add_vertex(const Vec3f& position, const Vec3f& normal); // EVertexLayout::P3N3
|
|
void add_vertex(const Vec3f& position, const Vec3f& normal, const Vec2f& tex_coord); // EVertexLayout::P3N3T2
|
|
void add_vertex(const Vec4f& position); // EVertexLayout::P4
|
|
|
|
void set_vertex(size_t id, const Vec3f& position, const Vec3f& normal); // EVertexLayout::P3N3
|
|
|
|
void set_index(size_t id, unsigned int index);
|
|
|
|
void add_index(unsigned int id);
|
|
void add_line(unsigned int id1, unsigned int id2);
|
|
void add_triangle(unsigned int id1, unsigned int id2, unsigned int id3);
|
|
|
|
Vec2f extract_position_2(size_t id) const;
|
|
Vec3f extract_position_3(size_t id) const;
|
|
Vec3f extract_normal_3(size_t id) const;
|
|
Vec2f extract_tex_coord_2(size_t id) const;
|
|
|
|
unsigned int extract_index(size_t id) const;
|
|
|
|
void remove_vertex(size_t id);
|
|
|
|
bool is_empty() const { return vertices_count() == 0 || indices_count() == 0; }
|
|
|
|
size_t vertices_count() const { return vertices.size() / vertex_stride_floats(format); }
|
|
size_t indices_count() const { return indices.size(); }
|
|
|
|
size_t vertices_size_floats() const { return vertices.size(); }
|
|
size_t vertices_size_bytes() const { return vertices_size_floats() * sizeof(float); }
|
|
size_t indices_size_bytes() const { return indices.size() * index_stride_bytes(*this); }
|
|
|
|
indexed_triangle_set get_as_indexed_triangle_set() const;
|
|
|
|
static size_t vertex_stride_floats(const Format& format);
|
|
static size_t vertex_stride_bytes(const Format& format) { return vertex_stride_floats(format) * sizeof(float); }
|
|
|
|
static size_t position_stride_floats(const Format& format);
|
|
static size_t position_stride_bytes(const Format& format) { return position_stride_floats(format) * sizeof(float); }
|
|
static size_t position_offset_floats(const Format& format);
|
|
static size_t position_offset_bytes(const Format& format) { return position_offset_floats(format) * sizeof(float); }
|
|
|
|
static size_t normal_stride_floats(const Format& format);
|
|
static size_t normal_stride_bytes(const Format& format) { return normal_stride_floats(format) * sizeof(float); }
|
|
static size_t normal_offset_floats(const Format& format);
|
|
static size_t normal_offset_bytes(const Format& format) { return normal_offset_floats(format) * sizeof(float); }
|
|
|
|
static size_t tex_coord_stride_floats(const Format& format);
|
|
static size_t tex_coord_stride_bytes(const Format& format) { return tex_coord_stride_floats(format) * sizeof(float); }
|
|
static size_t tex_coord_offset_floats(const Format& format);
|
|
static size_t tex_coord_offset_bytes(const Format& format) { return tex_coord_offset_floats(format) * sizeof(float); }
|
|
|
|
static size_t index_stride_bytes(const Geometry& data);
|
|
|
|
static bool has_position(const Format& format);
|
|
static bool has_normal(const Format& format);
|
|
static bool has_tex_coord(const Format& format);
|
|
};
|
|
|
|
struct RenderData
|
|
{
|
|
Geometry geometry;
|
|
unsigned int vao_id{ 0 };
|
|
unsigned int vbo_id{ 0 };
|
|
unsigned int ibo_id{ 0 };
|
|
size_t vertices_count{ 0 };
|
|
size_t indices_count{ 0 };
|
|
};
|
|
private:
|
|
RenderData m_render_data;
|
|
|
|
// By default the vertex and index buffers data are sent to gpu at the first call to render() method.
|
|
// If you need to initialize a model from outside the main thread, so that a call to render() may happen
|
|
// before the initialization is complete, use the methods:
|
|
// disable_render()
|
|
// ... do your initialization ...
|
|
// enable_render()
|
|
// to keep the data on cpu side until needed.
|
|
bool m_render_disabled{ false };
|
|
BoundingBoxf3 m_bounding_box;
|
|
std::string m_filename;
|
|
|
|
public:
|
|
GLModel() = default;
|
|
virtual ~GLModel() { reset(); }
|
|
|
|
size_t vertices_count() const { return m_render_data.vertices_count > 0 ?
|
|
m_render_data.vertices_count : m_render_data.geometry.vertices_count(); }
|
|
size_t indices_count() const { return m_render_data.indices_count > 0 ?
|
|
m_render_data.indices_count : m_render_data.geometry.indices_count(); }
|
|
|
|
size_t vertices_size_floats() const { return vertices_count() * Geometry::vertex_stride_floats(m_render_data.geometry.format); }
|
|
size_t vertices_size_bytes() const { return vertices_size_floats() * sizeof(float); }
|
|
|
|
size_t indices_size_bytes() const { return indices_count() * Geometry::index_stride_bytes(m_render_data.geometry); }
|
|
|
|
const Geometry& get_geometry() const { return m_render_data.geometry; }
|
|
|
|
void init_from(Geometry&& data);
|
|
void init_from(const TriangleMesh& mesh);
|
|
void init_from(const indexed_triangle_set& its);
|
|
void init_from(const Polygons& polygons, float z);
|
|
bool init_from_file(const std::string& filename);
|
|
|
|
void set_color(const ColorRGBA& color) { m_render_data.geometry.color = color; }
|
|
const ColorRGBA& get_color() const { return m_render_data.geometry.color; }
|
|
|
|
void reset();
|
|
void render();
|
|
void render(const std::pair<size_t, size_t>& range);
|
|
void render_instanced(unsigned int instances_vbo, unsigned int instances_count);
|
|
|
|
bool is_initialized() const { return vertices_count() > 0 && indices_count() > 0; }
|
|
bool is_empty() const { return m_render_data.geometry.is_empty(); }
|
|
|
|
const BoundingBoxf3& get_bounding_box() const { return m_bounding_box; }
|
|
const std::string& get_filename() const { return m_filename; }
|
|
|
|
bool is_render_disabled() const { return m_render_disabled; }
|
|
void enable_render() { m_render_disabled = false; }
|
|
void disable_render() { m_render_disabled = true; }
|
|
|
|
size_t cpu_memory_used() const {
|
|
size_t ret = 0;
|
|
if (!m_render_data.geometry.vertices.empty())
|
|
ret += vertices_size_bytes();
|
|
if (!m_render_data.geometry.indices.empty())
|
|
ret += indices_size_bytes();
|
|
return ret;
|
|
}
|
|
size_t gpu_memory_used() const {
|
|
size_t ret = 0;
|
|
if (m_render_data.geometry.vertices.empty())
|
|
ret += vertices_size_bytes();
|
|
if (m_render_data.geometry.indices.empty())
|
|
ret += indices_size_bytes();
|
|
return ret;
|
|
}
|
|
|
|
private:
|
|
bool send_to_gpu();
|
|
};
|
|
bool contains(const BuildVolume& volume, const GLModel& model, bool ignore_bottom = true);
|
|
|
|
// create an arrow with cylindrical stem and conical tip, with the given dimensions and resolution
|
|
// the origin of the arrow is in the center of the stem cap
|
|
// the arrow has its axis of symmetry along the Z axis and is pointing upward
|
|
// used to render bed axes and sequential marker
|
|
GLModel::Geometry stilized_arrow(unsigned int resolution, float tip_radius, float tip_height, float stem_radius, float stem_height);
|
|
|
|
// create an arrow whose stem is a quarter of circle, with the given dimensions and resolution
|
|
// the origin of the arrow is in the center of the circle
|
|
// the arrow is contained in the 1st quadrant of the XY plane and is pointing counterclockwise
|
|
// used to render sidebar hints for rotations
|
|
GLModel::Geometry circular_arrow(unsigned int resolution, float radius, float tip_height, float tip_width, float stem_width, float thickness);
|
|
|
|
// create an arrow with the given dimensions
|
|
// the origin of the arrow is in the center of the stem cap
|
|
// the arrow is contained in XY plane and has its main axis along the Y axis
|
|
// used to render sidebar hints for position and scale
|
|
GLModel::Geometry straight_arrow(float tip_width, float tip_height, float stem_width, float stem_height, float thickness);
|
|
|
|
// create a diamond with the given resolution
|
|
// the origin of the diamond is in its center
|
|
// the diamond is contained into a box with size [1, 1, 1]
|
|
GLModel::Geometry diamond(unsigned int resolution);
|
|
|
|
// create a sphere with smooth normals
|
|
// the origin of the sphere is in its center
|
|
GLModel::Geometry smooth_sphere(unsigned int resolution, float radius);
|
|
// create a cylinder with smooth normals
|
|
// the axis of the cylinder is the Z axis
|
|
// the origin of the cylinder is the center of its bottom cap face
|
|
GLModel::Geometry smooth_cylinder(unsigned int resolution, float radius, float height);
|
|
// create a torus with smooth normals
|
|
// the axis of the torus is the Z axis
|
|
// the origin of the torus is in its center
|
|
GLModel::Geometry smooth_torus(unsigned int primary_resolution, unsigned int secondary_resolution, float radius, float thickness);
|
|
|
|
GLModel::Geometry init_plane_data(const indexed_triangle_set &its, const std::vector<int> &triangle_indices,float normal_offset = 0.0f);
|
|
GLModel::Geometry init_torus_data(unsigned int primary_resolution,
|
|
unsigned int secondary_resolution,
|
|
const Vec3f & center,
|
|
float radius,
|
|
float thickness,
|
|
const Vec3f & model_axis,
|
|
const Transform3f &world_trafo);
|
|
} // namespace GUI
|
|
} // namespace Slic3r
|
|
|
|
#endif // slic3r_GLModel_hpp_
|
|
|