Welcome to mirror list, hosted at ThFree Co, Russian Federation.

3DBed.hpp « GUI « slic3r « src - github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 07b9f175852c1d6eb0db89f42f230c0be553c24d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#ifndef slic3r_3DBed_hpp_
#define slic3r_3DBed_hpp_

#include "GLTexture.hpp"
#include "3DScene.hpp"
#include "GLModel.hpp"

#include <tuple>
#include <array>

namespace Slic3r {
namespace GUI {

class GLCanvas3D;

class GeometryBuffer
{
    struct Vertex
    {
        Vec3f position{ Vec3f::Zero() };
        Vec2f tex_coords{ Vec2f::Zero() };
    };

    std::vector<Vertex> m_vertices;

public:
    bool set_from_triangles(const std::vector<Vec2f> &triangles, float z);
    bool set_from_lines(const Lines& lines, float z);

    const float* get_vertices_data() const;
    unsigned int get_vertices_data_size() const { return (unsigned int)m_vertices.size() * get_vertex_data_size(); }
    unsigned int get_vertex_data_size() const { return (unsigned int)(5 * sizeof(float)); }
    size_t get_position_offset() const { return 0; }
    size_t get_tex_coords_offset() const { return (size_t)(3 * sizeof(float)); }
    unsigned int get_vertices_count() const { return (unsigned int)m_vertices.size(); }
};

class Bed3D
{
    class Axes
    {
    public:
        static const float DefaultStemRadius;
        static const float DefaultStemLength;
        static const float DefaultTipRadius;
        static const float DefaultTipLength;

    private:
        Vec3d m_origin{ Vec3d::Zero() };
        float m_stem_length{ DefaultStemLength };
        GLModel m_arrow;

    public:
        const Vec3d& get_origin() const { return m_origin; }
        void set_origin(const Vec3d& origin) { m_origin = origin; }
        void set_stem_length(float length) {
            m_stem_length = length;
            m_arrow.reset();
        }
        float get_total_length() const { return m_stem_length + DefaultTipLength; }
        void render() const;
    };

public:
#if ENABLE_OUT_OF_BED_DETECTION_IMPROVEMENTS
    enum class EType : unsigned char
    {
        System,
        Custom
    };

    enum class EShapeType : unsigned char
    {
        Rectangle,
        Circle,
        Custom,
        Invalid
    };
#else
    enum EType : unsigned char
    {
        System,
        Custom,
        Num_Types
    };
#endif // ENABLE_OUT_OF_BED_DETECTION_IMPROVEMENTS

private:
#if ENABLE_OUT_OF_BED_DETECTION_IMPROVEMENTS
    EType m_type{ EType::Custom };
    EShapeType m_shape_type{ EShapeType::Invalid };
#else
    EType m_type{ Custom };
#endif // ENABLE_OUT_OF_BED_DETECTION_IMPROVEMENTS
    Pointfs m_shape;
    std::string m_texture_filename;
    std::string m_model_filename;
    BoundingBoxf3 m_bounding_box;
    BoundingBoxf3 m_extended_bounding_box;
    Polygon m_polygon;
    GeometryBuffer m_triangles;
    GeometryBuffer m_gridlines;
    GLTexture m_texture;
    // temporary texture shown until the main texture has still no levels compressed
    GLTexture m_temp_texture;
    GLModel m_model;
    Vec3d m_model_offset{ Vec3d::Zero() };
    unsigned int m_vbo_id{ 0 };
    Axes m_axes;

    float m_scale_factor{ 1.0f };

public:
    Bed3D() = default;
    ~Bed3D() { reset(); }

    EType get_type() const { return m_type; }
#if ENABLE_OUT_OF_BED_DETECTION_IMPROVEMENTS
    EShapeType get_shape_type() const { return m_shape_type; }
    bool is_custom() const { return m_type == EType::Custom; }
#else
    bool is_custom() const { return m_type == Custom; }
#endif // ENABLE_OUT_OF_BED_DETECTION_IMPROVEMENTS

    const Pointfs& get_shape() const { return m_shape; }
    // Return true if the bed shape changed, so the calee will update the UI.
    bool set_shape(const Pointfs& shape, const std::string& custom_texture, const std::string& custom_model, bool force_as_custom = false);

    const BoundingBoxf3& get_bounding_box(bool extended) const { return extended ? m_extended_bounding_box : m_bounding_box; }

    bool contains(const Point& point) const;
    Point point_projection(const Point& point) const;

    void render(GLCanvas3D& canvas, bool bottom, float scale_factor,
        bool show_axes, bool show_texture);

    void render_for_picking(GLCanvas3D& canvas, bool bottom, float scale_factor);

#if ENABLE_OUT_OF_BED_DETECTION_IMPROVEMENTS
    static bool is_rectangle(const Pointfs& shape, Vec2d* min = nullptr, Vec2d* max = nullptr);
    static bool is_circle(const Pointfs& shape, Vec2d* center = nullptr, double* radius = nullptr);
    static bool is_convex(const Pointfs& shape);
    static EShapeType detect_shape_type(const Pointfs& shape);
#endif // ENABLE_OUT_OF_BED_DETECTION_IMPROVEMENTS

private:
    void calc_bounding_boxes() const;
    void calc_triangles(const ExPolygon& poly);
    void calc_gridlines(const ExPolygon& poly, const BoundingBox& bed_bbox);
    std::tuple<EType, std::string, std::string> detect_type(const Pointfs& shape) const;
    void render_internal(GLCanvas3D& canvas, bool bottom, float scale_factor,
        bool show_axes, bool show_texture, bool picking);
    void render_axes() const;
    void render_system(GLCanvas3D& canvas, bool bottom, bool show_texture) const;
    void render_texture(bool bottom, GLCanvas3D& canvas) const;
    void render_model() const;
    void render_custom(GLCanvas3D& canvas, bool bottom, bool show_texture, bool picking) const;
    void render_default(bool bottom, bool picking) const;
    void reset();
};

} // GUI
} // Slic3r

#endif // slic3r_3DBed_hpp_