Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
draw_beach_ball.cpp File Reference
#include "draw_beach_ball.h"
#include "gl.h"
#include <vector>
#include <cmath>
#include <iostream>
+ Include dependency graph for draw_beach_ball.cpp:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define SAFE_INLINE   inline
 

Typedefs

typedef unsigned int color32
 

Enumerations

enum  EArrowParts { ARROW_CONE , ARROW_CONE_CAP , ARROW_CYL , ARROW_CYL_CAP }
 

Functions

template<typename T >
SAFE_INLINE const T & TClamp (const T &X, const T &Limit1, const T &Limit2)
 
static SAFE_INLINE color32 Color32FromARGBi (int A, int R, int G, int B)
 
static SAFE_INLINE color32 Color32FromARGBf (float A, float R, float G, float B)
 
static SAFE_INLINE void Color32ToARGBi (color32 Color, int *A, int *R, int *G, int *B)
 
static SAFE_INLINE void Color32ToARGBf (color32 Color, float *A, float *R, float *G, float *B)
 
static color32 ColorBlend (color32 Color1, color32 Color2, float S)
 
static void CreateSphere ()
 
static void CreateArrow ()
 

Variables

static std::vector< float > s_SphTri
 
static std::vector< color32s_SphCol
 
static std::vector< float > s_ArrowTri [4]
 
static std::vector< float > s_ArrowNorm [4]
 

Macro Definition Documentation

◆ SAFE_INLINE

#define SAFE_INLINE   inline

Typedef Documentation

◆ color32

typedef unsigned int color32

Enumeration Type Documentation

◆ EArrowParts

Enumerator
ARROW_CONE 
ARROW_CONE_CAP 
ARROW_CYL 
ARROW_CYL_CAP 
@ ARROW_CONE_CAP
Definition draw_beach_ball.cpp:29
@ ARROW_CYL
Definition draw_beach_ball.cpp:29
@ ARROW_CYL_CAP
Definition draw_beach_ball.cpp:29
@ ARROW_CONE
Definition draw_beach_ball.cpp:29

Function Documentation

◆ Color32FromARGBf()

static SAFE_INLINE color32 Color32FromARGBf ( float  A,
float  R,
float  G,
float  B 
)
static
46{
47 return (((color32)TClamp(A*256.0f, 0.0f, 255.0f))<<24) | (((color32)TClamp(R*256.0f, 0.0f, 255.0f))<<16) | (((color32)TClamp(G*256.0f, 0.0f, 255.0f))<<8) | ((color32)TClamp(B*256.0f, 0.0f, 255.0f));
48}
unsigned int color32
Definition draw_beach_ball.cpp:39
SAFE_INLINE const T & TClamp(const T &X, const T &Limit1, const T &Limit2)
Definition draw_beach_ball.cpp:31

References TClamp().

Referenced by ColorBlend().

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

◆ Color32FromARGBi()

static SAFE_INLINE color32 Color32FromARGBi ( int  A,
int  R,
int  G,
int  B 
)
static
41{
42 return (((color32)TClamp(A, 0, 255))<<24) | (((color32)TClamp(R, 0, 255))<<16) | (((color32)TClamp(G, 0, 255))<<8) | ((color32)TClamp(B, 0, 255));
43}

References TClamp().

+ Here is the call graph for this function:

◆ Color32ToARGBf()

static SAFE_INLINE void Color32ToARGBf ( color32  Color,
float *  A,
float *  R,
float *  G,
float *  B 
)
static
59{
60 if(A) *A = (1.0f/255.0f)*float((Color>>24)&0xff);
61 if(R) *R = (1.0f/255.0f)*float((Color>>16)&0xff);
62 if(G) *G = (1.0f/255.0f)*float((Color>>8)&0xff);
63 if(B) *B = (1.0f/255.0f)*float(Color&0xff);
64}

Referenced by ColorBlend().

+ Here is the caller graph for this function:

◆ Color32ToARGBi()

static SAFE_INLINE void Color32ToARGBi ( color32  Color,
int *  A,
int *  R,
int *  G,
int *  B 
)
static
51{
52 if(A) *A = (Color>>24)&0xff;
53 if(R) *R = (Color>>16)&0xff;
54 if(G) *G = (Color>>8)&0xff;
55 if(B) *B = Color&0xff;
56}

◆ ColorBlend()

static color32 ColorBlend ( color32  Color1,
color32  Color2,
float  S 
)
static
67{
68 float a1, r1, g1, b1, a2, r2, g2, b2;
69 Color32ToARGBf(Color1, &a1, &r1, &g1, &b1);
70 Color32ToARGBf(Color2, &a2, &r2, &g2, &b2);
71 float t = 1.0f-S;
72 return Color32FromARGBf(t*a1+S*a2, t*r1+S*r2, t*g1+S*g2, t*b1+S*b2);
73}
static SAFE_INLINE color32 Color32FromARGBf(float A, float R, float G, float B)
Definition draw_beach_ball.cpp:45
static SAFE_INLINE void Color32ToARGBf(color32 Color, float *A, float *R, float *G, float *B)
Definition draw_beach_ball.cpp:58

References Color32FromARGBf(), and Color32ToARGBf().

Referenced by CreateSphere().

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

◆ CreateArrow()

static void CreateArrow ( )
static
151{
152 const int SUBDIV = 15;
153 const float CYL_RADIUS = 0.08f;
154 const float CONE_RADIUS = 0.16f;
155 const float CONE_LENGTH = 0.25f;
156 const float ARROW_BGN = -1.1f;
157 const float ARROW_END = 1.15f;
158 int i;
159 for(i=0; i<4; ++i)
160 {
161 s_ArrowTri[i].clear();
162 s_ArrowNorm[i].clear();
163 }
164
165 float x0, x1, y0, y1, z0, z1, a0, a1, nx, nn;
166 for(i=0; i<SUBDIV; ++i)
167 {
168static const float FLOAT_PI = 3.14159265358979323846f;
169 a0 = 2.0f*FLOAT_PI*(float(i))/SUBDIV;
170 a1 = 2.0f*FLOAT_PI*(float(i+1))/SUBDIV;
171 x0 = ARROW_BGN;
172 x1 = ARROW_END-CONE_LENGTH;
173 y0 = cosf(a0);
174 z0 = sinf(a0);
175 y1 = cosf(a1);
176 z1 = sinf(a1);
177 s_ArrowTri[ARROW_CYL].push_back(x1); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*y0); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*z0);
178 s_ArrowTri[ARROW_CYL].push_back(x0); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*y0); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*z0);
179 s_ArrowTri[ARROW_CYL].push_back(x0); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*y1); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*z1);
180 s_ArrowTri[ARROW_CYL].push_back(x1); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*y0); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*z0);
181 s_ArrowTri[ARROW_CYL].push_back(x0); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*y1); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*z1);
182 s_ArrowTri[ARROW_CYL].push_back(x1); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*y1); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*z1);
183 s_ArrowNorm[ARROW_CYL].push_back(0); s_ArrowNorm[ARROW_CYL].push_back(y0); s_ArrowNorm[ARROW_CYL].push_back(z0);
184 s_ArrowNorm[ARROW_CYL].push_back(0); s_ArrowNorm[ARROW_CYL].push_back(y0); s_ArrowNorm[ARROW_CYL].push_back(z0);
185 s_ArrowNorm[ARROW_CYL].push_back(0); s_ArrowNorm[ARROW_CYL].push_back(y1); s_ArrowNorm[ARROW_CYL].push_back(z1);
186 s_ArrowNorm[ARROW_CYL].push_back(0); s_ArrowNorm[ARROW_CYL].push_back(y0); s_ArrowNorm[ARROW_CYL].push_back(z0);
187 s_ArrowNorm[ARROW_CYL].push_back(0); s_ArrowNorm[ARROW_CYL].push_back(y1); s_ArrowNorm[ARROW_CYL].push_back(z1);
188 s_ArrowNorm[ARROW_CYL].push_back(0); s_ArrowNorm[ARROW_CYL].push_back(y1); s_ArrowNorm[ARROW_CYL].push_back(z1);
189 s_ArrowTri[ARROW_CYL_CAP].push_back(x0); s_ArrowTri[ARROW_CYL_CAP].push_back(0); s_ArrowTri[ARROW_CYL_CAP].push_back(0);
190 s_ArrowTri[ARROW_CYL_CAP].push_back(x0); s_ArrowTri[ARROW_CYL_CAP].push_back(CYL_RADIUS*y1); s_ArrowTri[ARROW_CYL_CAP].push_back(CYL_RADIUS*z1);
191 s_ArrowTri[ARROW_CYL_CAP].push_back(x0); s_ArrowTri[ARROW_CYL_CAP].push_back(CYL_RADIUS*y0); s_ArrowTri[ARROW_CYL_CAP].push_back(CYL_RADIUS*z0);
192 s_ArrowNorm[ARROW_CYL_CAP].push_back(-1); s_ArrowNorm[ARROW_CYL_CAP].push_back(0); s_ArrowNorm[ARROW_CYL_CAP].push_back(0);
193 s_ArrowNorm[ARROW_CYL_CAP].push_back(-1); s_ArrowNorm[ARROW_CYL_CAP].push_back(0); s_ArrowNorm[ARROW_CYL_CAP].push_back(0);
194 s_ArrowNorm[ARROW_CYL_CAP].push_back(-1); s_ArrowNorm[ARROW_CYL_CAP].push_back(0); s_ArrowNorm[ARROW_CYL_CAP].push_back(0);
195 x0 = ARROW_END-CONE_LENGTH;
196 x1 = ARROW_END;
197 nx = CONE_RADIUS/(x1-x0);
198 nn = 1.0f/sqrtf(nx*nx+1);
199 s_ArrowTri[ARROW_CONE].push_back(x1); s_ArrowTri[ARROW_CONE].push_back(0); s_ArrowTri[ARROW_CONE].push_back(0);
200 s_ArrowTri[ARROW_CONE].push_back(x0); s_ArrowTri[ARROW_CONE].push_back(CONE_RADIUS*y0); s_ArrowTri[ARROW_CONE].push_back(CONE_RADIUS*z0);
201 s_ArrowTri[ARROW_CONE].push_back(x0); s_ArrowTri[ARROW_CONE].push_back(CONE_RADIUS*y1); s_ArrowTri[ARROW_CONE].push_back(CONE_RADIUS*z1);
202 s_ArrowTri[ARROW_CONE].push_back(x1); s_ArrowTri[ARROW_CONE].push_back(0); s_ArrowTri[ARROW_CONE].push_back(0);
203 s_ArrowTri[ARROW_CONE].push_back(x0); s_ArrowTri[ARROW_CONE].push_back(CONE_RADIUS*y1); s_ArrowTri[ARROW_CONE].push_back(CONE_RADIUS*z1);
204 s_ArrowTri[ARROW_CONE].push_back(x1); s_ArrowTri[ARROW_CONE].push_back(0); s_ArrowTri[ARROW_CONE].push_back(0);
205 s_ArrowNorm[ARROW_CONE].push_back(nn*nx); s_ArrowNorm[ARROW_CONE].push_back(nn*y0); s_ArrowNorm[ARROW_CONE].push_back(nn*z0);
206 s_ArrowNorm[ARROW_CONE].push_back(nn*nx); s_ArrowNorm[ARROW_CONE].push_back(nn*y0); s_ArrowNorm[ARROW_CONE].push_back(nn*z0);
207 s_ArrowNorm[ARROW_CONE].push_back(nn*nx); s_ArrowNorm[ARROW_CONE].push_back(nn*y1); s_ArrowNorm[ARROW_CONE].push_back(nn*z1);
208 s_ArrowNorm[ARROW_CONE].push_back(nn*nx); s_ArrowNorm[ARROW_CONE].push_back(nn*y0); s_ArrowNorm[ARROW_CONE].push_back(nn*z0);
209 s_ArrowNorm[ARROW_CONE].push_back(nn*nx); s_ArrowNorm[ARROW_CONE].push_back(nn*y1); s_ArrowNorm[ARROW_CONE].push_back(nn*z1);
210 s_ArrowNorm[ARROW_CONE].push_back(nn*nx); s_ArrowNorm[ARROW_CONE].push_back(nn*y1); s_ArrowNorm[ARROW_CONE].push_back(nn*z1);
211 s_ArrowTri[ARROW_CONE_CAP].push_back(x0); s_ArrowTri[ARROW_CONE_CAP].push_back(0); s_ArrowTri[ARROW_CONE_CAP].push_back(0);
214 s_ArrowNorm[ARROW_CONE_CAP].push_back(-1); s_ArrowNorm[ARROW_CONE_CAP].push_back(0); s_ArrowNorm[ARROW_CONE_CAP].push_back(0);
215 s_ArrowNorm[ARROW_CONE_CAP].push_back(-1); s_ArrowNorm[ARROW_CONE_CAP].push_back(0); s_ArrowNorm[ARROW_CONE_CAP].push_back(0);
216 s_ArrowNorm[ARROW_CONE_CAP].push_back(-1); s_ArrowNorm[ARROW_CONE_CAP].push_back(0); s_ArrowNorm[ARROW_CONE_CAP].push_back(0);
217 }
218
219 //for(i=0; i<4; ++i)
220 //{
221 // s_ArrowTriProj[i].clear();
222 // s_ArrowTriProj[i].resize(2*(s_ArrowTri[i].size()/3), 0);
223 // s_ArrowColLight[i].clear();
224 // s_ArrowColLight[i].resize(s_ArrowTri[i].size()/3, 0);
225 //}
226}
static const double CONE_RADIUS
Definition GLGizmoSlaSupports.cpp:20
static std::vector< float > s_ArrowNorm[4]
Definition draw_beach_ball.cpp:149
static std::vector< float > s_ArrowTri[4]
Definition draw_beach_ball.cpp:148

References ARROW_CONE, ARROW_CONE_CAP, ARROW_CYL, ARROW_CYL_CAP, CONE_RADIUS, s_ArrowNorm, and s_ArrowTri.

Referenced by igl::opengl2::draw_beach_ball().

+ Here is the caller graph for this function:

◆ CreateSphere()

static void CreateSphere ( )
static
78{
79 const int SUBDIV = 7;
80 s_SphTri.clear();
81 s_SphCol.clear();
82
83 const float A[8*3] = { 1,0,0, 0,0,-1, -1,0,0, 0,0,1, 0,0,1, 1,0,0, 0,0,-1, -1,0,0 };
84 const float B[8*3] = { 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,-1,0, 0,-1,0, 0,-1,0, 0,-1,0 };
85 const float C[8*3] = { 0,0,1, 1,0,0, 0,0,-1, -1,0,0, 1,0,0, 0,0,-1, -1,0,0, 0,0,1 };
86 //const color32 COL_A[8] = { 0xffff8080, 0xff000080, 0xff800000, 0xff8080ff, 0xff8080ff, 0xffff8080, 0xff000080, 0xff800000 };
87 //const color32 COL_B[8] = { 0xff80ff80, 0xff80ff80, 0xff80ff80, 0xff80ff80, 0xff008000, 0xff008000, 0xff008000, 0xff008000 };
88 //const color32 COL_C[8] = { 0xff8080ff, 0xffff8080, 0xff000080, 0xff800000, 0xffff8080, 0xff000080, 0xff800000, 0xff8080ff };
89 const color32 COL_A[8] = { 0xffffffff, 0xffffff40, 0xff40ff40, 0xff40ffff, 0xffff40ff, 0xffff4040, 0xff404040, 0xff4040ff };
90 const color32 COL_B[8] = { 0xffffffff, 0xffffff40, 0xff40ff40, 0xff40ffff, 0xffff40ff, 0xffff4040, 0xff404040, 0xff4040ff };
91 const color32 COL_C[8] = { 0xffffffff, 0xffffff40, 0xff40ff40, 0xff40ffff, 0xffff40ff, 0xffff4040, 0xff404040, 0xff4040ff };
92
93 int i, j, k, l;
94 float xa, ya, za, xb, yb, zb, xc, yc, zc, x, y, z, norm, u[3], v[3];
96 for( i=0; i<8; ++i )
97 {
98 xa = A[3*i+0]; ya = A[3*i+1]; za = A[3*i+2];
99 xb = B[3*i+0]; yb = B[3*i+1]; zb = B[3*i+2];
100 xc = C[3*i+0]; yc = C[3*i+1]; zc = C[3*i+2];
101 for( j=0; j<=SUBDIV; ++j )
102 for( k=0; k<=2*(SUBDIV-j); ++k )
103 {
104 if( k%2==0 )
105 {
106 u[0] = ((float)j)/(SUBDIV+1);
107 v[0] = ((float)(k/2))/(SUBDIV+1);
108 u[1] = ((float)(j+1))/(SUBDIV+1);
109 v[1] = ((float)(k/2))/(SUBDIV+1);
110 u[2] = ((float)j)/(SUBDIV+1);
111 v[2] = ((float)(k/2+1))/(SUBDIV+1);
112 }
113 else
114 {
115 u[0] = ((float)j)/(SUBDIV+1);
116 v[0] = ((float)(k/2+1))/(SUBDIV+1);
117 u[1] = ((float)(j+1))/(SUBDIV+1);
118 v[1] = ((float)(k/2))/(SUBDIV+1);
119 u[2] = ((float)(j+1))/(SUBDIV+1);
120 v[2] = ((float)(k/2+1))/(SUBDIV+1);
121 }
122
123 for( l=0; l<3; ++l )
124 {
125 x = (1.0f-u[l]-v[l])*xa + u[l]*xb + v[l]*xc;
126 y = (1.0f-u[l]-v[l])*ya + u[l]*yb + v[l]*yc;
127 z = (1.0f-u[l]-v[l])*za + u[l]*zb + v[l]*zc;
128 norm = sqrtf(x*x+y*y+z*z);
129 x /= norm; y /= norm; z /= norm;
130 s_SphTri.push_back(x); s_SphTri.push_back(y); s_SphTri.push_back(z);
131static const float FLOAT_EPS = 1.0e-7f;
132 if( u[l]+v[l]>FLOAT_EPS )
133 col = ColorBlend(COL_A[i], ColorBlend(COL_B[i], COL_C[i], v[l]/(u[l]+v[l])), u[l]+v[l]);
134 else
135 col = COL_A[i];
136 //if( (j==0 && k==0) || (j==0 && k==2*SUBDIV) || (j==SUBDIV && k==0) )
137 // col = 0xffff0000;
138 s_SphCol.push_back(col);
139 }
140 }
141 }
142 //s_SphTriProj.clear();
143 //s_SphTriProj.resize(2*s_SphCol.size(), 0);
144 //s_SphColLight.clear();
145 //s_SphColLight.resize(s_SphCol.size(), 0);
146}
EIGEN_DEVICE_FUNC ColXpr col(Index i)
This is the const version of col().
Definition BlockMethods.h:838
static color32 ColorBlend(color32 Color1, color32 Color2, float S)
Definition draw_beach_ball.cpp:66
static std::vector< color32 > s_SphCol
Definition draw_beach_ball.cpp:76
static std::vector< float > s_SphTri
Definition draw_beach_ball.cpp:75
const Scalar & y
Definition MathFunctions.h:552
const float FLOAT_EPS
Definition EPS.h:16
TCoord< P > x(const P &p)
Definition geometry_traits.hpp:297

References col(), ColorBlend(), s_SphCol, and s_SphTri.

Referenced by igl::opengl2::draw_beach_ball().

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

◆ TClamp()

template<typename T >
SAFE_INLINE const T & TClamp ( const T &  X,
const T &  Limit1,
const T &  Limit2 
)
32{
33 if( Limit1<Limit2 )
34 return (X<=Limit1) ? Limit1 : ( (X>=Limit2) ? Limit2 : X );
35 else
36 return (X<=Limit2) ? Limit2 : ( (X>=Limit1) ? Limit1 : X );
37}
@ X
Definition libslic3r.h:98

Referenced by Color32FromARGBf(), and Color32FromARGBi().

+ Here is the caller graph for this function:

Variable Documentation

◆ s_ArrowNorm

std::vector<float> s_ArrowNorm[4]
static

◆ s_ArrowTri

std::vector<float> s_ArrowTri[4]
static

◆ s_SphCol

std::vector<color32> s_SphCol
static

◆ s_SphTri

std::vector<float> s_SphTri
static