OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::GluTessWrapper Class Reference
Collaboration diagram for Slic3r::GluTessWrapper:

Public Member Functions

 GluTessWrapper ()
 ~GluTessWrapper ()
std::vector< Vec3d > tesselate3d (const ExPolygon &expoly, double z_, bool flipped_)
std::vector< Vec3d > tesselate3d (const ExPolygons &expolygons, double z_, bool flipped_)

Private Member Functions

void tessBegin (GLenum which)
void tessEnd ()
void tessVertex (const GLvoid *data)
void tessCombine (const GLdouble newVertex[3], const GLdouble *neighborVertex[4], const GLfloat neighborWeight[4], GLdouble **outData)

Static Private Member Functions

static void tessBeginCB (GLenum which, void *polygonData)
static void tessEndCB (void *polygonData)
static void tessVertexCB (const GLvoid *data, void *polygonData)
static void tessCombineCB (const GLdouble newVertex[3], const GLdouble *neighborVertex[4], const GLfloat neighborWeight[4], GLdouble **outData, void *polygonData)
static void tessErrorCB (GLenum errorCode, void *polygonData)
static void tessError (GLenum errorCode)

Private Attributes

GLUtesselator * m_tesselator
GLenum m_primitive_type
GLdouble m_pt0 [3]
GLdouble m_pt1 [3]
int m_num_points
Pointf3s m_output_triangles
std::deque< Vec3d > m_intersection_points
double m_z
bool m_flipped

Detailed Description

Constructor & Destructor Documentation

◆ GluTessWrapper()

Slic3r::GluTessWrapper::GluTessWrapper ( )
inline
23 : m_tesselator(gluNewTess()) {
24 // register callback functions
25 gluTessCallback(m_tesselator, GLU_TESS_BEGIN_DATA, (_GLUfuncptr)tessBeginCB);
26 gluTessCallback(m_tesselator, GLU_TESS_END_DATA, (_GLUfuncptr)tessEndCB);
27 gluTessCallback(m_tesselator, GLU_TESS_ERROR_DATA, (_GLUfuncptr)tessErrorCB);
28 gluTessCallback(m_tesselator, GLU_TESS_VERTEX_DATA, (_GLUfuncptr)tessVertexCB);
29 gluTessCallback(m_tesselator, GLU_TESS_COMBINE_DATA, (_GLUfuncptr)tessCombineCB);
30 }
static void tessBeginCB(GLenum which, void *polygonData)
Definition Tesselate.cpp:115
static void tessCombineCB(const GLdouble newVertex[3], const GLdouble *neighborVertex[4], const GLfloat neighborWeight[4], GLdouble **outData, void *polygonData)
Definition Tesselate.cpp:118
static void tessVertexCB(const GLvoid *data, void *polygonData)
Definition Tesselate.cpp:117
GLUtesselator * m_tesselator
Definition Tesselate.cpp:185
static void tessErrorCB(GLenum errorCode, void *polygonData)
Definition Tesselate.cpp:120
static void tessEndCB(void *polygonData)
Definition Tesselate.cpp:116

References m_tesselator, tessBeginCB(), tessCombineCB(), tessEndCB(), tessErrorCB(), and tessVertexCB().

Referenced by tessBeginCB(), tessCombineCB(), tessEndCB(), tessErrorCB(), and tessVertexCB().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ~GluTessWrapper()

Slic3r::GluTessWrapper::~GluTessWrapper ( )
inline
31 {
32 gluDeleteTess(m_tesselator);
33 }

References m_tesselator.

Member Function Documentation

◆ tessBegin()

void Slic3r::GluTessWrapper::tessBegin ( GLenum which)
inlineprivate
123 {
124 assert(which == GL_TRIANGLES || which == GL_TRIANGLE_FAN || which == GL_TRIANGLE_STRIP);
125 m_primitive_type = which;
126 m_num_points = 0;
127 }
int m_num_points
Definition Tesselate.cpp:193
GLenum m_primitive_type
Definition Tesselate.cpp:188
#define GL_TRIANGLE_FAN
Definition gl.h:1889
#define GL_TRIANGLES
Definition gl.h:1887
#define GL_TRIANGLE_STRIP
Definition gl.h:1890

References GL_TRIANGLE_FAN, GL_TRIANGLE_STRIP, GL_TRIANGLES, m_num_points, and m_primitive_type.

Referenced by tessBeginCB().

Here is the caller graph for this function:

◆ tessBeginCB()

void Slic3r::GluTessWrapper::tessBeginCB ( GLenum which,
void * polygonData )
inlinestaticprivate
115{ reinterpret_cast<GluTessWrapper*>(polygonData)->tessBegin(which); }
void tessBegin(GLenum which)
Definition Tesselate.cpp:122
GluTessWrapper()
Definition Tesselate.cpp:23

References GluTessWrapper(), and tessBegin().

Referenced by GluTessWrapper().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ tessCombine()

void Slic3r::GluTessWrapper::tessCombine ( const GLdouble newVertex[3],
const GLdouble * neighborVertex[4],
const GLfloat neighborWeight[4],
GLdouble ** outData )
inlineprivate
172 {
173 m_intersection_points.emplace_back(newVertex[0], newVertex[1], m_z);
174 *outData = m_intersection_points.back().data();
175 }
double m_z
Definition Tesselate.cpp:199
std::deque< Vec3d > m_intersection_points
Definition Tesselate.cpp:197

References m_intersection_points, and m_z.

Referenced by tessCombineCB().

Here is the caller graph for this function:

◆ tessCombineCB()

void Slic3r::GluTessWrapper::tessCombineCB ( const GLdouble newVertex[3],
const GLdouble * neighborVertex[4],
const GLfloat neighborWeight[4],
GLdouble ** outData,
void * polygonData )
inlinestaticprivate
119 { reinterpret_cast<GluTessWrapper*>(polygonData)->tessCombine(newVertex, neighborVertex, neighborWeight, outData); }
void tessCombine(const GLdouble newVertex[3], const GLdouble *neighborVertex[4], const GLfloat neighborWeight[4], GLdouble **outData)
Definition Tesselate.cpp:171

References GluTessWrapper(), and tessCombine().

Referenced by GluTessWrapper().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ tesselate3d() [1/2]

std::vector< Vec3d > Slic3r::GluTessWrapper::tesselate3d ( const ExPolygon & expoly,
double z_,
bool flipped_ )
inline
36 {
37 m_z = z_;
38 m_flipped = flipped_;
39 m_output_triangles.clear();
40 std::vector<GLdouble> coords;
41 {
42 size_t num_coords = expoly.contour.points.size();
43 for (const Polygon &poly : expoly.holes)
44 num_coords += poly.points.size();
45 coords.reserve(num_coords * 3);
46 }
47 gluTessBeginPolygon(m_tesselator, (void*)this);
48 gluTessBeginContour(m_tesselator);
49 for (const Point &pt : expoly.contour.points) {
50 coords.emplace_back(unscale<double>(pt[0]));
51 coords.emplace_back(unscale<double>(pt[1]));
52 coords.emplace_back(0.);
53 gluTessVertex(m_tesselator, &coords[coords.size() - 3], &coords[coords.size() - 3]);
54 }
55 gluTessEndContour(m_tesselator);
56 for (const Polygon &poly : expoly.holes) {
57 gluTessBeginContour(m_tesselator);
58 for (const Point &pt : poly.points) {
59 coords.emplace_back(unscale<double>(pt[0]));
60 coords.emplace_back(unscale<double>(pt[1]));
61 coords.emplace_back(0.);
62 gluTessVertex(m_tesselator, &coords[coords.size() - 3], &coords[coords.size() - 3]);
63 }
64 gluTessEndContour(m_tesselator);
65 }
66 gluTessEndPolygon(m_tesselator);
68 return std::move(m_output_triangles);
69 }
bool m_flipped
Definition Tesselate.cpp:201
Pointf3s m_output_triangles
Definition Tesselate.cpp:195
void poly(std::vector< std::pair< Vec2d, Vec2d > > &out, std::initializer_list< Vec2d > p)
Definition DesignSketchTool.cpp:7751
T unscale(Q v)
Definition libslic3r.h:138

References Slic3r::ExPolygon::contour, Slic3r::ExPolygon::holes, m_flipped, m_intersection_points, m_output_triangles, m_tesselator, m_z, Slic3r::MultiPoint::points, and Slic3r::unscale().

Referenced by Slic3r::triangulate_expolygon_2d(), Slic3r::triangulate_expolygon_2f(), Slic3r::triangulate_expolygon_3d(), Slic3r::triangulate_expolygons_2d(), Slic3r::triangulate_expolygons_2f(), and Slic3r::triangulate_expolygons_3d().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ tesselate3d() [2/2]

std::vector< Vec3d > Slic3r::GluTessWrapper::tesselate3d ( const ExPolygons & expolygons,
double z_,
bool flipped_ )
inline
72 {
73 m_z = z_;
74 m_flipped = flipped_;
75 m_output_triangles.clear();
76 std::vector<GLdouble> coords;
77 {
78 size_t num_coords = 0;
79 for (const ExPolygon &expoly : expolygons) {
80 size_t num_coords_this = expoly.contour.points.size();
81 for (const Polygon &poly : expoly.holes)
82 num_coords_this += poly.points.size();
83 num_coords = std::max(num_coords, num_coords_this);
84 }
85 coords.assign(num_coords * 3, 0);
86 }
87 for (const ExPolygon &expoly : expolygons) {
88 gluTessBeginPolygon(m_tesselator, (void*)this);
89 gluTessBeginContour(m_tesselator);
90 size_t idx = 0;
91 for (const Point &pt : expoly.contour.points) {
92 coords[idx ++] = unscale<double>(pt[0]);
93 coords[idx ++] = unscale<double>(pt[1]);
94 coords[idx ++] = 0.;
95 gluTessVertex(m_tesselator, &coords[idx - 3], &coords[idx - 3]);
96 }
97 gluTessEndContour(m_tesselator);
98 for (const Polygon &poly : expoly.holes) {
99 gluTessBeginContour(m_tesselator);
100 for (const Point &pt : poly.points) {
101 coords[idx ++] = unscale<double>(pt[0]);
102 coords[idx ++] = unscale<double>(pt[1]);
103 coords[idx ++] = 0.;
104 gluTessVertex(m_tesselator, &coords[idx - 3], &coords[idx - 3]);
105 }
106 gluTessEndContour(m_tesselator);
107 }
108 gluTessEndPolygon(m_tesselator);
109 }
110 m_intersection_points.clear();
111 return std::move(m_output_triangles);
112 }

References m_flipped, m_intersection_points, m_output_triangles, m_tesselator, m_z, and Slic3r::unscale().

Here is the call graph for this function:

◆ tessEnd()

void Slic3r::GluTessWrapper::tessEnd ( )
inlineprivate
130 {
131 m_num_points = 0;
132 }

References m_num_points.

Referenced by tessEndCB().

Here is the caller graph for this function:

◆ tessEndCB()

void Slic3r::GluTessWrapper::tessEndCB ( void * polygonData)
inlinestaticprivate
116{ reinterpret_cast<GluTessWrapper*>(polygonData)->tessEnd(); }
void tessEnd()
Definition Tesselate.cpp:129

References GluTessWrapper(), and tessEnd().

Referenced by GluTessWrapper().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ tessError()

void Slic3r::GluTessWrapper::tessError ( GLenum errorCode)
inlinestaticprivate
178 {
179// const GLubyte *errorStr;
180// errorStr = gluErrorString(errorCode);
181// printf("Error: %s\n", (const char*)errorStr);
182 }

Referenced by tessErrorCB().

Here is the caller graph for this function:

◆ tessErrorCB()

void Slic3r::GluTessWrapper::tessErrorCB ( GLenum errorCode,
void * polygonData )
inlinestaticprivate
120{ reinterpret_cast<GluTessWrapper*>(polygonData)->tessError(errorCode); }
static void tessError(GLenum errorCode)
Definition Tesselate.cpp:177

References GluTessWrapper(), and tessError().

Referenced by GluTessWrapper().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ tessVertex()

void Slic3r::GluTessWrapper::tessVertex ( const GLvoid * data)
inlineprivate
135 {
136 if (data == nullptr)
137 return;
138 const GLdouble *ptr = (const GLdouble*)data;
139 ++ m_num_points;
140 if (m_num_points == 1) {
141 memcpy(m_pt0, ptr, sizeof(GLdouble) * 3);
142 } else if (m_num_points == 2) {
143 memcpy(m_pt1, ptr, sizeof(GLdouble) * 3);
144 } else {
145 bool flip = m_flipped;
147 flip = !flip;
148 m_num_points = 2;
149 }
150 m_output_triangles.emplace_back(m_pt0[0], m_pt0[1], m_z);
151 if (flip) {
152 m_output_triangles.emplace_back(ptr[0], ptr[1], m_z);
153 m_output_triangles.emplace_back(m_pt1[0], m_pt1[1], m_z);
154 } else {
155 m_output_triangles.emplace_back(m_pt1[0], m_pt1[1], m_z);
156 m_output_triangles.emplace_back(ptr[0], ptr[1], m_z);
157 }
159 memcpy(m_pt0, m_pt1, sizeof(GLdouble) * 3);
160 memcpy(m_pt1, ptr, sizeof(GLdouble) * 3);
161 } else if (m_primitive_type == GL_TRIANGLE_FAN) {
162 memcpy(m_pt1, ptr, sizeof(GLdouble) * 3);
163 } else {
165 assert(m_num_points == 3);
166 m_num_points = 0;
167 }
168 }
169 }
GLdouble m_pt0[3]
Definition Tesselate.cpp:190
GLdouble m_pt1[3]
Definition Tesselate.cpp:191
double GLdouble
Definition gl.h:2068

References GL_TRIANGLE_FAN, GL_TRIANGLE_STRIP, GL_TRIANGLES, m_flipped, m_num_points, m_output_triangles, m_primitive_type, m_pt0, m_pt1, and m_z.

Referenced by tessVertexCB().

Here is the caller graph for this function:

◆ tessVertexCB()

void Slic3r::GluTessWrapper::tessVertexCB ( const GLvoid * data,
void * polygonData )
inlinestaticprivate
117{ reinterpret_cast<GluTessWrapper*>(polygonData)->tessVertex(data); }
void tessVertex(const GLvoid *data)
Definition Tesselate.cpp:134

References GluTessWrapper(), and tessVertex().

Referenced by GluTessWrapper().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ m_flipped

bool Slic3r::GluTessWrapper::m_flipped
private

◆ m_intersection_points

std::deque<Vec3d> Slic3r::GluTessWrapper::m_intersection_points
private

◆ m_num_points

int Slic3r::GluTessWrapper::m_num_points
private

Referenced by tessBegin(), tessEnd(), and tessVertex().

◆ m_output_triangles

Pointf3s Slic3r::GluTessWrapper::m_output_triangles
private

◆ m_primitive_type

GLenum Slic3r::GluTessWrapper::m_primitive_type
private

Referenced by tessBegin(), and tessVertex().

◆ m_pt0

GLdouble Slic3r::GluTessWrapper::m_pt0[3]
private

Referenced by tessVertex().

◆ m_pt1

GLdouble Slic3r::GluTessWrapper::m_pt1[3]
private

Referenced by tessVertex().

◆ m_tesselator

GLUtesselator* Slic3r::GluTessWrapper::m_tesselator
private

◆ m_z

double Slic3r::GluTessWrapper::m_z
private

The documentation for this class was generated from the following file:
  • /home/runner/work/OrcaSlicer/OrcaSlicer/src/libslic3r/Tesselate.cpp