5 #ifndef GLVERTEX_GEOMETRY_H
6 #define GLVERTEX_GEOMETRY_H
26 addQuads(
this, color);
29 static void addQuads(
lglVBO *vbo,
bool color =
false,
double dx = 1,
double dy = 1,
double dz = 1,
bool facecolors =
true)
35 if (color && !facecolors) vbo->lglColor(col);
38 if (color && facecolors) vbo->lglColor(1,0,0);
39 vbo->lglNormal(-1,0,0);
40 vbo->lglTexCoord(0,0);
41 vbo->lglVertex(-0.5*dx,-0.5*dy,-0.5*dz);
42 vbo->lglTexCoord(0,1);
43 vbo->lglVertex(-0.5*dx,-0.5*dy,0.5*dz);
44 vbo->lglTexCoord(-1,1);
45 vbo->lglVertex(-0.5*dx,0.5*dy,0.5*dz);
46 vbo->lglTexCoord(-1,0);
47 vbo->lglVertex(-0.5*dx,0.5*dy,-0.5*dz);
50 if (color && facecolors) vbo->lglColor(0,1,1);
51 vbo->lglNormal(1,0,0);
52 vbo->lglTexCoord(1,0);
53 vbo->lglVertex(0.5*dx,-0.5*dy,0.5*dz);
54 vbo->lglTexCoord(1,1);
55 vbo->lglVertex(0.5*dx,-0.5*dy,-0.5*dz);
56 vbo->lglTexCoord(2,1);
57 vbo->lglVertex(0.5*dx,0.5*dy,-0.5*dz);
58 vbo->lglTexCoord(2,0);
59 vbo->lglVertex(0.5*dx,0.5*dy,0.5*dz);
62 if (color && facecolors) vbo->lglColor(0,1,0);
63 vbo->lglNormal(0,0,1);
64 vbo->lglTexCoord(0,0);
65 vbo->lglVertex(-0.5*dx,-0.5*dy,0.5*dz);
66 vbo->lglTexCoord(1,0);
67 vbo->lglVertex(0.5*dx,-0.5*dy,0.5*dz);
68 vbo->lglTexCoord(1,-1);
69 vbo->lglVertex(0.5*dx,0.5*dy,0.5*dz);
70 vbo->lglTexCoord(0,-1);
71 vbo->lglVertex(-0.5*dx,0.5*dy,0.5*dz);
74 if (color && facecolors) vbo->lglColor(1,0,1);
75 vbo->lglNormal(0,0,-1);
76 vbo->lglTexCoord(1,1);
77 vbo->lglVertex(0.5*dx,-0.5*dy,-0.5*dz);
78 vbo->lglTexCoord(0,1);
79 vbo->lglVertex(-0.5*dx,-0.5*dy,-0.5*dz);
80 vbo->lglTexCoord(0,2);
81 vbo->lglVertex(-0.5*dx,0.5*dy,-0.5*dz);
82 vbo->lglTexCoord(1,2);
83 vbo->lglVertex(0.5*dx,0.5*dy,-0.5*dz);
86 if (color && facecolors) vbo->lglColor(0,0,1);
87 vbo->lglNormal(0,-1,0);
88 vbo->lglTexCoord(0,1);
89 vbo->lglVertex(-0.5*dx,-0.5*dy,-0.5*dz);
90 vbo->lglTexCoord(1,1);
91 vbo->lglVertex(0.5*dx,-0.5*dy,-0.5*dz);
92 vbo->lglTexCoord(1,0);
93 vbo->lglVertex(0.5*dx,-0.5*dy,0.5*dz);
94 vbo->lglTexCoord(0,0);
95 vbo->lglVertex(-0.5*dx,-0.5*dy,0.5*dz);
98 if (color && facecolors) vbo->lglColor(1,1,0);
99 vbo->lglNormal(0,1,0);
100 vbo->lglTexCoord(3,0);
101 vbo->lglVertex(-0.5*dx,0.5*dy,0.5*dz);
102 vbo->lglTexCoord(2,0);
103 vbo->lglVertex(0.5*dx,0.5*dy,0.5*dz);
104 vbo->lglTexCoord(2,1);
105 vbo->lglVertex(0.5*dx,0.5*dy,-0.5*dz);
106 vbo->lglTexCoord(3,1);
107 vbo->lglVertex(-0.5*dx,0.5*dy,-0.5*dz);
112 static void addTo(
lglVBO *vbo,
bool color =
false,
double dx = 1,
double dy = 1,
double dz = 1,
bool facecolors =
true)
118 if (color && !facecolors) vbo->lglColor(col);
121 if (color && facecolors) vbo->lglColor(1,0,0);
122 vbo->lglNormal(-1,0,0);
123 vbo->lglTexCoord(0,0);
124 vbo->lglVertex(-0.5*dx,-0.5*dy,-0.5*dz);
125 vbo->lglTexCoord(0,1);
126 vbo->lglVertex(-0.5*dx,-0.5*dy,0.5*dz);
127 vbo->lglTexCoord(-1,0);
128 vbo->lglVertex(-0.5*dx,0.5*dy,-0.5*dz);
129 vbo->lglTexCoord(-1,1);
130 vbo->lglVertex(-0.5*dx,0.5*dy,0.5*dz);
137 if (color && facecolors) vbo->lglColor(0,1,1);
138 vbo->lglNormal(1,0,0);
139 vbo->lglTexCoord(1,0);
140 vbo->lglVertex(0.5*dx,-0.5*dy,0.5*dz);
141 vbo->lglTexCoord(1,1);
142 vbo->lglVertex(0.5*dx,-0.5*dy,-0.5*dz);
143 vbo->lglTexCoord(2,0);
144 vbo->lglVertex(0.5*dx,0.5*dy,0.5*dz);
145 vbo->lglTexCoord(2,1);
146 vbo->lglVertex(0.5*dx,0.5*dy,-0.5*dz);
153 if (color && facecolors) vbo->lglColor(0,1,0);
154 vbo->lglNormal(0,0,1);
155 vbo->lglTexCoord(0,0);
156 vbo->lglVertex(-0.5*dx,-0.5*dy,0.5*dz);
157 vbo->lglTexCoord(1,0);
158 vbo->lglVertex(0.5*dx,-0.5*dy,0.5*dz);
159 vbo->lglTexCoord(0,-1);
160 vbo->lglVertex(-0.5*dx,0.5*dy,0.5*dz);
161 vbo->lglTexCoord(1,-1);
162 vbo->lglVertex(0.5*dx,0.5*dy,0.5*dz);
169 if (color && facecolors) vbo->lglColor(1,0,1);
170 vbo->lglNormal(0,0,-1);
171 vbo->lglTexCoord(1,1);
172 vbo->lglVertex(0.5*dx,-0.5*dy,-0.5*dz);
173 vbo->lglTexCoord(0,1);
174 vbo->lglVertex(-0.5*dx,-0.5*dy,-0.5*dz);
175 vbo->lglTexCoord(1,2);
176 vbo->lglVertex(0.5*dx,0.5*dy,-0.5*dz);
177 vbo->lglTexCoord(0,2);
178 vbo->lglVertex(-0.5*dx,0.5*dy,-0.5*dz);
185 if (color && facecolors) vbo->lglColor(0,0,1);
186 vbo->lglNormal(0,-1,0);
187 vbo->lglTexCoord(0,1);
188 vbo->lglVertex(-0.5*dx,-0.5*dy,-0.5*dz);
189 vbo->lglTexCoord(1,1);
190 vbo->lglVertex(0.5*dx,-0.5*dy,-0.5*dz);
191 vbo->lglTexCoord(0,0);
192 vbo->lglVertex(-0.5*dx,-0.5*dy,0.5*dz);
193 vbo->lglTexCoord(1,0);
194 vbo->lglVertex(0.5*dx,-0.5*dy,0.5*dz);
201 if (color && facecolors) vbo->lglColor(1,1,0);
202 vbo->lglNormal(0,1,0);
203 vbo->lglTexCoord(3,0);
204 vbo->lglVertex(-0.5*dx,0.5*dy,0.5*dz);
205 vbo->lglTexCoord(2,0);
206 vbo->lglVertex(0.5*dx,0.5*dy,0.5*dz);
207 vbo->lglTexCoord(3,1);
208 vbo->lglVertex(-0.5*dx,0.5*dy,-0.5*dz);
209 vbo->lglTexCoord(2,1);
210 vbo->lglVertex(0.5*dx,0.5*dy,-0.5*dz);
226 lglBox(
double dx,
double dy,
double dz,
230 lglCube::addQuads(
this, color, dx, dy, dz);
237 lglCube::addQuads(
this, color, size.x, size.y, size.z);
240 static void addQuads(
lglVBO *vbo,
bool color =
false,
double dx = 1,
double dy = 1,
double dz = 1,
bool facecolors =
true)
242 lglCube::addQuads(vbo, color, dx, dy, dz, facecolors);
245 static void addTo(
lglVBO *vbo,
bool color =
false,
double dx = 1,
double dy = 1,
double dz = 1,
bool facecolors =
true)
247 lglCube::addTo(vbo, color, dx, dy, dz, facecolors);
262 lglTet(
bool color =
false)
265 addTriangles(
this, color);
268 static void addTriangles(
lglVBO *vbo,
bool color =
false,
bool facecolors =
true)
270 static const double c1 = sqrt(3.0)/6;
271 static const double c2 = sqrt(6.0)/6;
272 static const double c3 = sqrt(3.0)/3;
274 static const vec3 a(-0.5,-c2,c1);
275 static const vec3 b(0.5,-c2,c1);
276 static const vec3 c(0,-c2,-c3);
277 static const vec3 d(0,c2,0);
283 if (color && !facecolors) vbo->lglColor(col);
286 if (color && facecolors) vbo->lglColor(1,1,1);
288 vbo->lglTexCoord(0,0);
290 vbo->lglTexCoord(1,0);
292 vbo->lglTexCoord(0,1);
296 if (color && facecolors) vbo->lglColor(1,0,0);
298 vbo->lglTexCoord(0,1);
300 vbo->lglTexCoord(1,0);
302 vbo->lglTexCoord(1,1);
306 if (color && facecolors) vbo->lglColor(0,1,0);
308 vbo->lglTexCoord(1,0);
310 vbo->lglTexCoord(2,0);
312 vbo->lglTexCoord(1,1);
316 if (color && facecolors) vbo->lglColor(0,0,1);
318 vbo->lglTexCoord(2,0);
320 vbo->lglTexCoord(2,1);
322 vbo->lglTexCoord(1,1);
343 addTriangles(
this, color);
346 static void addTriangles(
lglVBO *vbo,
bool color =
false,
bool facecolors =
true)
348 static const vec3 a(-0.5,-0.5,0.5);
349 static const vec3 b(0.5,-0.5,0.5);
350 static const vec3 c(0.5,-0.5,-0.5);
351 static const vec3 d(-0.5,-0.5,-0.5);
352 static const vec3 e(0,0.5,0);
358 if (color && !facecolors) vbo->lglColor(col);
361 if (color && facecolors) vbo->lglColor(1,1,1);
363 vbo->lglTexCoord(1,1);
365 vbo->lglTexCoord(0,1);
367 vbo->lglTexCoord(0,0);
370 vbo->lglTexCoord(1,0);
372 vbo->lglTexCoord(1,1);
376 if (color && facecolors) vbo->lglColor(1,1,0);
378 vbo->lglTexCoord(1,0);
380 vbo->lglTexCoord(2,0);
382 vbo->lglTexCoord(1.5,0.5);
386 if (color && facecolors) vbo->lglColor(0,1,1);
388 vbo->lglTexCoord(2,0);
390 vbo->lglTexCoord(2,1);
392 vbo->lglTexCoord(1.5,0.5);
396 if (color && facecolors) vbo->lglColor(0,0,1);
398 vbo->lglTexCoord(2,1);
400 vbo->lglTexCoord(1,1);
402 vbo->lglTexCoord(1.5,0.5);
406 if (color && facecolors) vbo->lglColor(1,0,0);
408 vbo->lglTexCoord(1,1);
410 vbo->lglTexCoord(1,0);
412 vbo->lglTexCoord(1.5,0.5);
430 lglPyramidBase(
double size = 1,
double height = 1,
double base = 0.5,
bool color =
false)
433 std::string name =
"pyramid_base";
434 name += std::string(
"(");
435 name += glslmath::to_string(size) +
", ";
436 name += glslmath::to_string(height) +
", ";
437 name += glslmath::to_string(base);
438 name += std::string(
")");
441 addTriangles(
this, size, height, base, color);
444 static void addTriangles(
lglVBO *vbo,
double size = 1,
double height = 1,
double base = 0.5,
bool color =
false)
446 const vec3 a(-0.5*size,-0.5*base,0.5*size);
447 const vec3 b(0.5*size,-0.5*base,0.5*size);
448 const vec3 c(0.5*size,-0.5*base,-0.5*size);
449 const vec3 d(-0.5*size,-0.5*base,-0.5*size);
450 const vec3 e(0,-0.5*base+height,0);
452 double w = base/height;
453 const vec3 f = (1-w)*a + w*e;
454 const vec3 g = (1-w)*b + w*e;
455 const vec3 h = (1-w)*c + w*e;
456 const vec3 i = (1-w)*d + w*e;
462 if (color) vbo->lglColor(col);
465 vbo->lglNormal((d-c).cross(c-b).normalize());
466 vbo->lglTexCoord(0,-1);
468 vbo->lglTexCoord(1,-1);
470 vbo->lglTexCoord(1,0);
472 vbo->lglTexCoord(0,0);
476 vbo->lglNormal((a-b).cross(b-e).normalize());
477 vbo->lglTexCoord(0,0);
479 vbo->lglTexCoord(1,0);
481 vbo->lglTexCoord(1,1);
483 vbo->lglTexCoord(1,0);
487 vbo->lglNormal((b-c).cross(c-e).normalize());
488 vbo->lglTexCoord(1,0);
490 vbo->lglTexCoord(2,0);
492 vbo->lglTexCoord(2,1);
494 vbo->lglTexCoord(1,1);
498 vbo->lglNormal((c-d).cross(d-e).normalize());
499 vbo->lglTexCoord(2,0);
501 vbo->lglTexCoord(3,0);
503 vbo->lglTexCoord(3,1);
505 vbo->lglTexCoord(2,1);
509 vbo->lglNormal((d-a).cross(a-e).normalize());
510 vbo->lglTexCoord(-1,0);
512 vbo->lglTexCoord(0,0);
514 vbo->lglTexCoord(0,1);
516 vbo->lglTexCoord(-1,1);
522 vbo->lglNormal((f-g).cross(g-h).normalize());
523 vbo->lglTexCoord(0,1);
525 vbo->lglTexCoord(1,1);
527 vbo->lglTexCoord(1,2);
529 vbo->lglTexCoord(0,2);
553 lglPrism(
double slanting = 0,
bool color =
false)
556 addTriangles(
this, slanting, color);
559 static void addTriangles(
lglVBO *vbo,
double slanting = 0,
bool color =
false,
bool facecolors =
true)
561 static const vec3 a(-0.5,-0.5,0.5);
562 static const vec3 b(0.5,-0.5,0.5);
563 static const vec3 c(slanting,0.5,0.5);
564 static const vec3 d(-0.5,-0.5,-0.5);
565 static const vec3 e(0.5,-0.5,-0.5);
566 static const vec3 f(slanting,0.5,-0.5);
572 if (color && !facecolors) vbo->lglColor(col);
575 if (color && facecolors) vbo->lglColor(1,1,0);
577 vbo->lglTexCoord(0,0);
579 vbo->lglTexCoord(1,0);
581 vbo->lglTexCoord(0,1);
585 if (color && facecolors) vbo->lglColor(0,1,1);
587 vbo->lglTexCoord(0,1);
589 vbo->lglTexCoord(1,0);
591 vbo->lglTexCoord(1,1);
595 if (color && facecolors) vbo->lglColor(1,0,0);
597 vbo->lglTexCoord(2,1);
599 vbo->lglTexCoord(1,1);
601 vbo->lglTexCoord(1,0);
603 vbo->lglTexCoord(1,0);
605 vbo->lglTexCoord(2,0);
607 vbo->lglTexCoord(2,1);
611 if (color && facecolors) vbo->lglColor(0,1,0);
613 vbo->lglTexCoord(3,1);
615 vbo->lglTexCoord(2,1);
617 vbo->lglTexCoord(2,0);
619 vbo->lglTexCoord(2,0);
621 vbo->lglTexCoord(3,0);
623 vbo->lglTexCoord(3,1);
627 if (color && facecolors) vbo->lglColor(0,0,1);
629 vbo->lglTexCoord(4,1);
631 vbo->lglTexCoord(3,1);
633 vbo->lglTexCoord(3,0);
635 vbo->lglTexCoord(3,0);
637 vbo->lglTexCoord(4,0);
639 vbo->lglTexCoord(5,1);
657 lglSphere(
bool color =
false,
int tessel = 8)
660 addTo(
this, color, tessel);
663 static void addTo(
lglVBO *vbo,
bool color =
false,
int tessel = 8)
671 int alpha_steps = 4*tessel;
672 int beta_steps = tessel;
676 for (j=-beta_steps; j<beta_steps; j++)
680 if (color) vbo->lglColor(col);
682 for (i=0; i<=alpha_steps; i++)
684 u = (double)i/alpha_steps;
685 v = (double)j/beta_steps;
690 p =
vec3(sin(alpha)*cos(beta),
691 cos(alpha)*cos(beta),
695 vbo->lglTexCoord(1.0f-(
float)u,0.5f-(
float)v/2);
698 v = (double)(j+1)/beta_steps;
701 p =
vec3(sin(alpha)*cos(beta),
702 cos(alpha)*cos(beta),
706 vbo->lglTexCoord(1.0f-(
float)u,0.5f-(
float)v/2);
727 addTo(
this, color, tessel);
730 static void addTo(
lglVBO *vbo,
bool color =
false,
int tessel = 8)
738 int alpha_steps = 4*tessel;
739 int beta_steps = tessel;
743 for (j=0; j<beta_steps; j++)
747 if (color) vbo->lglColor(col);
749 for (i=0; i<=alpha_steps; i++)
751 u = (double)i/alpha_steps;
752 v = (double)j/beta_steps;
757 p =
vec3(sin(alpha)*cos(beta),
759 -cos(alpha)*cos(beta));
762 vbo->lglTexCoord(1.0f-(
float)u,1.0f-(
float)v);
765 v = (double)(j+1)/beta_steps;
768 p =
vec3(sin(alpha)*cos(beta),
770 -cos(alpha)*cos(beta));
773 vbo->lglTexCoord(1.0f-(
float)u,1.0f-(
float)v);
793 lglCylinder(
bool caps =
false,
bool color =
false,
int tessel = 8)
796 std::string name =
"cylinder";
797 name += std::string(
"(");
798 name += std::string(caps?
"caps":
"nocaps");
799 name += std::string(
")");
802 addTo(
this, caps, color, tessel);
805 static void addTo(
lglVBO *vbo,
bool caps =
false,
bool color =
false,
int tessel = 8)
812 int steps = 4*tessel;
818 if (color) vbo->lglColor(col);
820 for (i=0; i<=steps; i++)
825 double s = sin(alpha);
826 double c = cos(alpha);
828 vbo->lglNormal(
vec3(s,c,0));
829 vbo->lglTexCoord(1.0f-(
float)u,0);
830 vbo->lglVertex(
vec3(s,c,-1)/2);
831 vbo->lglTexCoord(1.0f-(
float)u,1);
832 vbo->lglVertex(
vec3(s,c,1)/2);
843 if (color) vbo->lglColor(col);
845 vbo->lglNormal(0,0,1);
847 for (i=0; i<=steps; i++)
852 double s = sin(alpha)/2;
853 double c = cos(alpha)/2;
855 vbo->lglTexCoord(1.5f+(
float)s,0.5f+(
float)c);
856 vbo->lglVertex(
vec3(s,c,0.5));
858 vbo->lglTexCoord(1.5f-(
float)s,0.5f+(
float)c);
859 vbo->lglVertex(
vec3(-s,c,0.5));
866 if (color) vbo->lglColor(col);
868 vbo->lglNormal(0,0,-1);
870 for (i=0; i<=steps; i++)
875 double s = sin(alpha)/2;
876 double c = cos(alpha)/2;
878 vbo->lglTexCoord(1.5f+(
float)s,0.5f+(
float)c);
879 vbo->lglVertex(
vec3(-s,c,-0.5));
881 vbo->lglTexCoord(1.5f-(
float)s,0.5f+(
float)c);
882 vbo->lglVertex(
vec3(s,c,-0.5));
899 lglHemiCylinder(
bool caps =
false,
double angle = 180,
bool color =
false,
int tessel = 8)
902 std::string name =
"hemi_cylinder";
903 name += std::string(
"(");
904 name += std::string(caps?
"caps":
"nocaps") +
", ";
905 name += glslmath::to_string(angle);
906 name += std::string(
")");
909 addTo(
this, caps, angle, color, tessel);
912 static void addTo(
lglVBO *vbo,
bool caps =
false,
double angle = 180,
bool color =
false,
int tessel = 8)
919 int steps = (int)ceil(angle/360*4*tessel);
925 if (color) vbo->lglColor(col);
927 for (i=0; i<=steps; i++)
930 alpha = (u*angle/360-(angle-180)/2)*2*PI;
932 double s = sin(alpha);
933 double c = cos(alpha);
935 vbo->lglNormal(
vec3(-c,s,0));
936 vbo->lglTexCoord(1.0f-(
float)u,0);
937 vbo->lglVertex(
vec3(-c,s,-1)/2);
938 vbo->lglTexCoord(1.0f-(
float)u,1);
939 vbo->lglVertex(
vec3(-c,s,1)/2);
948 if (color) vbo->lglColor(col);
950 vbo->lglNormal(0,0,1);
952 for (i=0; i<=steps; i++)
957 double s = sin(alpha)/2;
958 double c = cos(alpha)/2;
960 vbo->lglTexCoord(0.5f-(
float)c,1);
961 vbo->lglVertex(
vec3(-c,0,0.5));
963 vbo->lglTexCoord(0.5f-(
float)c,1.0f-(
float)s*2);
964 vbo->lglVertex(
vec3(-c,s,0.5));
971 if (color) vbo->lglColor(col);
973 vbo->lglNormal(0,0,-1);
975 for (i=0; i<=steps; i++)
980 double s = sin(alpha)/2;
981 double c = cos(alpha)/2;
983 vbo->lglTexCoord(1.5f+(
float)c,1.0f-(
float)s*2);
984 vbo->lglVertex(
vec3(-c,s,-0.5));
986 vbo->lglTexCoord(1.5f+(
float)c,1);
987 vbo->lglVertex(
vec3(-c,0,-0.5));
1006 lglDisc(
bool color =
false,
int tessel = 8)
1009 addTo(
this, color, tessel);
1012 static void addTo(
lglVBO *vbo,
bool color =
false,
int tessel = 8)
1019 int steps = 2*tessel;
1025 if (color) vbo->lglColor(col);
1027 vbo->lglNormal(0,0,1);
1029 for (i=0; i<=steps; i++)
1031 u = (double)i/steps;
1034 double s = sin(alpha)/2;
1035 double c = cos(alpha)/2;
1037 vbo->lglTexCoord(0.5f+(
float)s,0.5f+(
float)c);
1038 vbo->lglVertex(
vec3(s,c,0));
1040 vbo->lglTexCoord(0.5f-(
float)s,0.5f+(
float)c);
1041 vbo->lglVertex(
vec3(-s,c,0));
1057 lglHemiDisc(
double angle = 180,
bool color =
false,
int tessel = 8)
1060 std::string name =
"hemi_disc";
1061 name += std::string(
"(");
1062 name += glslmath::to_string(angle);
1063 name += std::string(
")");
1066 addTo(
this, angle, color, tessel);
1069 static void addTo(
lglVBO *vbo,
double angle = 180,
bool color =
false,
int tessel = 8)
1076 int steps = (int)ceil(angle/360*4*tessel);
1082 if (color) vbo->lglColor(col);
1084 vbo->lglNormal(0,0,1);
1086 for (i=0; i<=steps; i++)
1088 u = (double)i/steps;
1089 alpha = (u*angle/360-(angle-180)/2)*2*PI;
1091 double s = sin(alpha)/2;
1092 double c = cos(alpha)/2;
1094 if (angle > 180) vbo->lglTexCoord(0.5f,0.5f);
1095 else vbo->lglTexCoord(0.5f,1);
1096 vbo->lglVertex(
vec3(0,0,0));
1098 if (angle > 180) vbo->lglTexCoord(0.5f-(
float)c,0.5f-(
float)s);
1099 else vbo->lglTexCoord(0.5f-(
float)c,1.0f-(
float)s*2);
1100 vbo->lglVertex(
vec3(-c,s,0));
1118 lglCone(
bool color =
false,
int tessel = 8)
1121 addTo(
this, color, tessel);
1124 static void addTo(
lglVBO *vbo,
bool color =
false,
int tessel = 8)
1131 int steps = 4*tessel;
1137 if (color) vbo->lglColor(col);
1139 for (i=0; i<=steps; i++)
1141 u = (double)i/steps;
1144 double s = sin(alpha);
1145 double c = cos(alpha);
1147 vbo->lglNormal(
vec3(s,c,0.5));
1148 vbo->lglTexCoord(0.5f+(
float)s/2,0.5f+(
float)c/2);
1149 vbo->lglVertex(
vec3(s,c,-1)/2);
1151 vbo->lglNormal(
vec3(0,0,0));
1152 vbo->lglTexCoord(0.5f,0.5f);
1153 vbo->lglVertex(
vec3(0,0,0.5));
1171 lglConeBase(
double size = 1,
double height = 1,
double base = 0.5,
bool color =
false,
int tessel = 8)
1174 std::string name =
"cone_base";
1175 name += std::string(
"(");
1176 name += glslmath::to_string(size) +
", ";
1177 name += glslmath::to_string(height) +
", ";
1178 name += glslmath::to_string(base);
1179 name += std::string(
")");
1182 addTo(
this, size, height, base, color, tessel);
1185 static void addTo(
lglVBO *vbo,
1186 double size = 1,
double height = 1,
double base = 0.5,
1187 bool color =
false,
int tessel = 8)
1194 int steps = 4*tessel;
1196 double w = base/height;
1203 if (color) vbo->lglColor(col);
1205 for (i=0; i<=steps; i++)
1207 u = (double)i/steps;
1210 double s = sin(alpha)*size/2;
1211 double c = cos(alpha)*size/2;
1214 vbo->lglNormal(
vec3(s,size*size/height/4,c));
1215 vbo->lglTexCoord((
float)u,0.5f);
1216 vbo->lglVertex((1-w)*v+w*t);
1217 vbo->lglTexCoord((
float)u,1);
1225 if (color) vbo->lglColor(col);
1227 for (i=0; i<=steps; i++)
1229 u = (double)i/steps;
1232 double s = sin(alpha)*size/2;
1233 double c = cos(alpha)*size/2;
1236 vbo->lglNormal(
vec3(0,-1,0));
1237 vbo->lglTexCoord((
float)u,0);
1238 vbo->lglVertex(
vec3(0,-base/2,0));
1239 vbo->lglTexCoord((
float)u,0.5f);
1249 if (color) vbo->lglColor(col);
1251 for (i=0; i<=steps; i++)
1253 u = (double)i/steps;
1256 double s = sin(alpha)*size/2;
1257 double c = cos(alpha)*size/2;
1260 vbo->lglNormal(
vec3(0,1,0));
1261 vbo->lglTexCoord((
float)u,0);
1262 vbo->lglVertex(
vec3(0,base/2,0));
1263 vbo->lglTexCoord((
float)u,0.5f);
1264 vbo->lglVertex((1-w)*v+w*t);
1284 lglRing(
double outer = 1.0,
double inner = 0.0,
double displace = 0.0,
1285 bool color =
false,
int tessel = 8)
1288 std::string name =
"ring";
1289 name += std::string(
"(");
1290 name += glslmath::to_string(outer) +
", ";
1291 name += glslmath::to_string(inner) +
", ";
1292 name += glslmath::to_string(displace);
1293 name += std::string(
")");
1296 addTo(
this, outer, inner, displace, color, tessel);
1299 static void addTo(
lglVBO *vbo,
1300 double outer = 1.0,
double inner = 0.0,
double displace = 0.0,
1301 bool color =
false,
int tessel = 8)
1308 int steps = 4*tessel;
1314 if (color) vbo->lglColor(col);
1316 for (i=0; i<=steps; i++)
1318 u = (double)i/steps;
1321 double s = sin(alpha);
1322 double c = cos(alpha);
1324 double d = displace/(outer-inner);
1325 vbo->lglNormal(
vec3(d*s,d*c,1));
1327 vbo->lglTexCoord((
float)u,1);
1328 vbo->lglVertex(
vec3(outer*s,outer*c,0));
1330 vbo->lglTexCoord((
float)u,0);
1331 vbo->lglVertex(
vec3(inner*s,inner*c,displace));
1347 lglHemiRing(
double outer = 1.0,
double inner = 0.0,
double displace = 0.0,
1348 double angle = 180,
bool color =
false,
int tessel = 8)
1351 std::string name =
"hemi_ring";
1352 name += std::string(
"(");
1353 name += glslmath::to_string(outer) +
", ";
1354 name += glslmath::to_string(inner) +
", ";
1355 name += glslmath::to_string(displace) +
", ";
1356 name += glslmath::to_string(angle);
1357 name += std::string(
")");
1360 addTo(
this, outer, inner, displace, angle, color, tessel);
1363 static void addTo(
lglVBO *vbo,
1364 double outer = 1.0,
double inner = 0.0,
double displace = 0.0,
1365 double angle = 180,
bool color =
false,
int tessel = 8)
1372 int steps = (int)ceil(angle/360*4*tessel);
1378 if (color) vbo->lglColor(col);
1380 for (i=0; i<=steps; i++)
1382 u = (double)i/steps;
1383 alpha = (u*angle/360-(angle-180)/2)*2*PI;
1385 double s = sin(alpha);
1386 double c = cos(alpha);
1388 double d = displace/(outer-inner);
1389 vbo->lglNormal(
vec3(-d*c,d*s,1));
1391 vbo->lglTexCoord((
float)u,1);
1392 vbo->lglVertex(
vec3(-outer*c,outer*s,0));
1394 vbo->lglTexCoord((
float)u,0);
1395 vbo->lglVertex(
vec3(-inner*c,inner*s,displace));
1410 lglArc(
double outer = 1.0,
double inner = 0.0,
1411 double angle = 180,
bool color =
false,
int tessel = 8)
1414 std::string name =
"arc";
1415 name += std::string(
"(");
1416 name += glslmath::to_string(outer) +
", ";
1417 name += glslmath::to_string(inner) +
", ";
1418 name += glslmath::to_string(angle);
1419 name += std::string(
")");
1422 addTo(
this, outer, inner, angle, color, tessel);
1425 static void addTo(
lglVBO *vbo,
1426 double outer = 1.0,
double inner = 0.0,
1427 double angle = 180,
bool color =
false,
int tessel = 8)
1432 lglHemiCylinder::addTo(vbo,
false, angle, color, tessel);
1437 lglHemiCylinder::addTo(vbo,
false, angle, color, tessel);
1441 lglHemiRing::addTo(vbo, outer, inner, 0, angle, color, tessel);
1446 lglHemiRing::addTo(vbo, outer, inner, 0, angle, color, tessel);
1470 load(path, silent, texgen);
1477 load(path, silent, texgen);
1480 bool load(
const char *path,
bool silent =
false,
lgl_texgenmode_enum texgen = LGL_TEXGEN_NONE)
1482 bool ok =
lglLoadObj(
this, path, silent, texgen);
1487 bool load(std::string path,
bool silent =
false,
lgl_texgenmode_enum texgen = LGL_TEXGEN_NONE)
1489 return(load(path.c_str(), silent, texgen));
1523 :
lglObj(
"teapot.obj",
true, texgen)
1533 lglSheet(
const std::string &name =
"sheet")
1537 void create(
int tessel = 8,
double size = 1.0,
bool color =
false)
1540 addTo(
this, tessel, size, color);
1543 void addTo(
lglVBO *vbo,
int tessel = 8,
double size = 1.0,
bool color =
false)
1549 int steps = 4*tessel;
1555 if (color) vbo->lglColor(col);
1559 for (u=outer_first(steps, &align);
1560 u<outer_last(steps);
1561 u=outer_next(u, steps, &align))
1563 op = outer_point(u);
1567 n = outer_normal(u);
1569 vbo->lglNormal(
vec3(n,0));
1570 vbo->lglTexCoord(op);
1571 vbo->lglVertex(
vec3(op,-0.5*size));
1572 vbo->lglVertex(
vec3(op,0.5*size));
1576 n = outer_normal(u, -1);
1578 vbo->lglNormal(
vec3(n,0));
1579 vbo->lglTexCoord(op);
1580 vbo->lglVertex(
vec3(op,-0.5*size));
1581 vbo->lglVertex(
vec3(op,0.5*size));
1583 n = outer_normal(u, +1);
1585 vbo->lglNormal(
vec3(n,0));
1586 vbo->lglTexCoord(op);
1587 vbo->lglVertex(
vec3(op,-0.5*size));
1588 vbo->lglVertex(
vec3(op,0.5*size));
1596 if (color) vbo->lglColor(col);
1600 for (u=inner_first(steps, &align);
1601 u<inner_last(steps);
1602 u=inner_next(u, steps, &align))
1604 ip = inner_point(u);
1608 n = inner_normal(u);
1610 vbo->lglNormal(
vec3(n,0));
1611 vbo->lglTexCoord(ip);
1612 vbo->lglVertex(
vec3(ip,0.5*size));
1613 vbo->lglVertex(
vec3(ip,-0.5*size));
1617 n = inner_normal(u, -1);
1619 vbo->lglNormal(
vec3(n,0));
1620 vbo->lglTexCoord(ip);
1621 vbo->lglVertex(
vec3(ip,0.5*size));
1622 vbo->lglVertex(
vec3(ip,-0.5*size));
1624 n = inner_normal(u, +1);
1626 vbo->lglNormal(
vec3(n,0));
1627 vbo->lglTexCoord(ip);
1628 vbo->lglVertex(
vec3(ip,0.5*size));
1629 vbo->lglVertex(
vec3(ip,-0.5*size));
1637 if (color) vbo->lglColor(col);
1639 vbo->lglNormal(
vec3(0,0,-1));
1640 for (u=0; u<1+0.5/steps; u=next(u, steps))
1642 op = outer_point(u);
1643 ip = inner_point(u);
1645 vbo->lglTexCoord(ip);
1646 vbo->lglVertex(
vec3(ip,-0.5*size));
1647 vbo->lglTexCoord(op);
1648 vbo->lglVertex(
vec3(op,-0.5*size));
1655 if (color) vbo->lglColor(col);
1657 vbo->lglNormal(
vec3(0,0,1));
1658 for (u=0; u<1+0.5/steps; u=next(u, steps))
1660 op = outer_point(u);
1661 ip = inner_point(u);
1663 vbo->lglTexCoord(op);
1664 vbo->lglVertex(
vec3(op,0.5*size));
1665 vbo->lglTexCoord(ip);
1666 vbo->lglVertex(
vec3(ip,0.5*size));
1674 virtual vec2 outer_point(
double u) = 0;
1676 virtual vec2 inner_point(
double u)
1681 virtual vec2 outer_normal(
double u,
int mode = 0,
double d = 0.001)
1683 int k = outer_tessel();
1686 if (k > 0) maxd = 0.01/k;
1687 if (maxd < d) d = maxd;
1692 if (mode < 0) rd = 0;
1693 if (mode > 0) ld = 0;
1695 vec2 p1 = outer_point(u-ld);
1696 vec2 p2 = outer_point(u+rd);
1704 virtual vec2 inner_normal(
double u,
int mode = 0,
double d = 0.001)
1706 int k = inner_tessel();
1709 if (k > 0) maxd = 0.01/k;
1710 if (maxd < d) d = maxd;
1715 if (mode < 0) rd = 0;
1716 if (mode > 0) ld = 0;
1718 vec2 p1 = inner_point(u-ld);
1719 vec2 p2 = inner_point(u+rd);
1727 virtual double outer_first(
int steps,
bool *align = NULL)
1732 virtual double inner_first(
int steps,
bool *align = NULL)
1737 virtual double outer_last(
int steps)
1739 return(1+0.5/steps);
1742 virtual double inner_last(
int steps)
1744 return(1+0.5/steps);
1747 virtual double outer_next(
double u,
int steps,
bool *align = NULL)
1749 return(u+1.0/steps);
1752 virtual double inner_next(
double u,
int steps,
bool *align = NULL)
1754 return(u+1.0/steps);
1757 virtual double next(
double u,
int steps)
1759 double v = inner_next(u, steps);
1760 u = outer_next(u, steps);
1765 virtual int outer_tessel() {
return(1);}
1766 virtual int inner_tessel() {
return(1);}
1782 outer_(outer), inner_(inner)
1795 void addOuterPoint(
vec2 point,
bool align =
true)
1800 void addInnerPoint(
vec2 point,
bool align =
true)
1805 void outerStraighten()
1810 void innerStraighten()
1845 virtual vec2 outer_point(
double u)
1850 virtual vec2 inner_point(
double u)
1855 virtual double outer_first(
int steps,
bool *align = NULL)
1857 return(outer_.first(steps, align));
1860 virtual double inner_first(
int steps,
bool *align = NULL)
1862 return(inner_.first(steps, align));
1865 virtual double outer_last(
int steps)
1867 return(outer_.last(steps));
1870 virtual double inner_last(
int steps)
1872 return(inner_.last(steps));
1875 virtual double outer_next(
double u,
int steps,
bool *align = NULL)
1877 return(outer_.next(u, steps, align));
1880 virtual double inner_next(
double u,
int steps,
bool *align = NULL)
1882 return(inner_.next(u, steps, align));
1885 virtual int outer_tessel() {
return(outer_.size());}
1886 virtual int inner_tessel() {
return(inner_.size());}
1900 lglSheetDisc(
int tessel = 8,
double size = 1.0,
bool color =
false)
1903 std::string name =
"sheet_disc";
1904 name += std::string(
"(");
1905 name += glslmath::to_string(size);
1906 name += std::string(
")");
1909 addTo(
this, tessel, size, color);
1914 virtual vec2 outer_point(
double u)
1920 return(0.5*
vec2(c,-s));
1938 lglShim(
double outer = 1.0,
double inner = 0.0,
1939 int tessel = 8,
double size = 1.0,
bool color =
false)
1941 outer_(outer), inner_(inner)
1943 std::string name =
"shim";
1944 name += std::string(
"(");
1945 name += glslmath::to_string(outer) +
", ";
1946 name += glslmath::to_string(inner) +
", ";
1947 name += glslmath::to_string(size);
1948 name += std::string(
")");
1951 addTo(
this, tessel, size, color);
1956 double outer_, inner_;
1958 virtual vec2 outer_point(
double u)
1964 return(outer_*
vec2(c,-s));
1967 virtual vec2 inner_point(
double u)
1973 return(inner_*
vec2(c,-s));
1986 lglHemiShim(
double outer = 1.0,
double inner = 0.0,
1987 int tessel = 8,
double size = 1.0,
bool color =
false)
1989 outer_(outer), inner_(inner)
1991 std::string name =
"hemi_shim";
1992 name += std::string(
"(");
1993 name += glslmath::to_string(outer) +
", ";
1994 name += glslmath::to_string(inner) +
", ";
1995 name += glslmath::to_string(size);
1996 name += std::string(
")");
1999 addTo(
this, tessel, size, color);
2004 double outer_, inner_;
2006 virtual vec2 outer_point(
double u)
2012 return(outer_*
vec2(s,-c));
2015 virtual vec2 inner_point(
double u)
2021 return(inner_*
vec2(s,-c));
2041 lglSpiral(
double outer = 1.0,
double inner = 0.1,
2042 double thickness = 0.01,
double windings = 10.0,
2043 int tessel = 8,
double size = 1.0,
bool color =
false)
2045 outer_(outer), inner_(inner),
2046 thickness_(thickness), windings_(windings)
2048 std::string name =
"spiral";
2049 name += std::string(
"(");
2050 name += glslmath::to_string(outer) +
", ";
2051 name += glslmath::to_string(inner) +
", ";
2052 name += glslmath::to_string(size);
2053 name += std::string(
")");
2056 addTo(
this, (
int)ceil(tessel*windings+0.5), size, color);
2061 double outer_, inner_;
2062 double thickness_, windings_;
2064 virtual vec2 outer_point(
double u)
2066 static const double p = 5.0;
2068 double a = u*2*PI*windings_;
2074 u = u/(1-pow(0.5, p));
2076 double d = (1-u)*(inner_+thickness_)+u*outer_;
2078 return(d*
vec2(c,-s));
2081 virtual vec2 inner_point(
double u)
2083 static const double p = 5.0;
2085 double a = u*2*PI*windings_;
2091 u = u/(1-pow(0.5, p));
2093 double d = (1-u)*(inner_+thickness_)+u*outer_-thickness_;
2095 return(d*
vec2(c,-s));
2116 lglGear(
double outer = 1.0,
double inner = 0.0,
2117 double modul = 1.0/16,
double angle = 0.0,
2121 inner_radius_(inner)
2123 std::string name =
"gear";
2124 name += std::string(
"(");
2125 name += glslmath::to_string(outer) +
", ";
2126 name += glslmath::to_string(inner) +
", ";
2127 name += glslmath::to_string(modul) +
", ";
2128 name += glslmath::to_string(angle) +
", ";
2129 name += glslmath::to_string(hk) +
", ";
2130 name += glslmath::to_string(hf);
2131 name += std::string(
")");
2134 const int steps = 128;
2136 int z = (int)floor(2*outer/modul+0.5);
2140 double df = outer-hk*modul;
2141 double dk = outer+hk*modul;
2142 double dg = outer-hk*modul;
2144 double a = acos(dg/d)*180/PI;
2145 if (angle > a) dg = d*cos(angle*PI/180);
2155 double u = -0.25*modul*PI/d;
2157 for (
int i=0; i<z; i++)
2165 double l = sqrt(d*d-dg*dg);
2166 vec2 p2 = construct(
vec2(0,0), p1, dg, l);
2169 vec2 p3 = evolve(
vec2(0,0), -l, p2, d);
2171 for (
int k=0; k<steps; k++)
2176 p3 = evolve(
vec2(0,0), 2*l/steps, p2, d);
2177 if (p3.
norm() > df*df)
2186 addOuterPoint(p3*(df-hf*modul)/df,
false);
2188 addOuterPoint(p3,
false);
2189 for (; j<steps; j++)
2193 p3 = evolve(
vec2(0,0), 2*l/steps, p2, d);
2194 if (p3.
norm() > dk*dk)
2208 u += 0.5*modul*PI/d;
2213 double l = sqrt(d*d-dg*dg);
2214 vec2 p2 = construct(p1,
vec2(0,0), l, dg);
2217 vec2 p3 = evolve(
vec2(0,0), s, p2, d);
2219 addOuterPoint(p3,
false);
2222 p3 = evolve(
vec2(0,0), 2*l/steps, p2, d);
2228 addOuterPoint(p3*(df-hf*modul)/df,
false);
2231 u += 0.5*modul*PI/d;
2238 double contactRadius()
2243 double contactAngle()
2255 return((
int)floor(2*r_/m_+0.5));
2267 double inner_radius_;
2269 vec2 evolve(
vec2 center,
double delta,
vec2 &point,
double &dist)
2271 double radius = (point-center).
length();
2272 double angle = delta/radius*180/PI;
2275 point = R * (point - center) + center;
2278 vec2 d = point - center;
2281 return(point + n*dist);
2290 double m = sqrt(d1*d1-h*h);
2292 vec2 p = p1 + m/l*d;
2298 virtual vec2 inner_point(
double u)
2300 return(inner_radius_*outer_point(u).
normalize());
2303 virtual double inner_first(
int steps,
bool *align = NULL)
2305 return(outer_first(steps, align));
2308 virtual double inner_last(
int steps)
2310 return(outer_last(steps));
2313 virtual double inner_next(
double u,
int steps,
bool *align = NULL)
2315 return(outer_next(u, steps, align));
2331 virtual vec3 point(
double u,
double v) = 0;
2333 virtual vec3 normal(
double u,
double v,
double d,
2334 bool swapx,
bool swapy)
2336 vec3 p1 = point(u-d, v);
2337 vec3 p2 = point(u+d, v);
2338 vec3 p3 = point(u, v-d);
2339 vec3 p4 = point(u, v+d);
2341 double dx = swapx? -d : d;
2342 double dy = swapy? -d : d;
2344 vec3 p5 = point(u-d, v-d);
2345 vec3 p6 = point(u+dx, v+dy);
2346 vec3 p7 = point(u-dx, v+d);
2347 vec3 p8 = point(u+d, v-dy);
2349 vec3 du = p2-p1+p6-p5+p8-p7;
2350 vec3 dv = p4-p3+p7-p8+p6-p5;
2357 virtual vec3 normal(
double u,
double v,
double d = 0.001)
2359 return(normal(u, v, d,
false,
false));
2374 void setRange(
double begin,
double end)
2380 void create(
int tessel = 8,
bool color =
false)
2383 addTo(
this, tessel, color);
2386 void addTo(
lglVBO *vbo,
int tessel = 8,
bool color =
false)
2393 int alpha_steps = 4*tessel;
2394 int beta_steps = (int)ceil(tessel*(end_-begin_));
2398 for (j=-beta_steps; j<beta_steps; j++)
2402 if (color) vbo->lglColor(col);
2404 for (i=0; i<=alpha_steps; i++)
2406 u = (double)i/alpha_steps;
2407 v = (double)j/beta_steps;
2409 w = (1-v)*begin_ + v*end_;
2415 vbo->lglTexCoord(1.0f-(
float)u,0.5f-(
float)v/2);
2418 v = (double)(j+1)/beta_steps;
2420 w = (1-v)*begin_ + v*end_;
2426 vbo->lglTexCoord(1.0f-(
float)u,0.5f-(
float)v/2);
2436 double begin_, end_;
2438 virtual vec3 point(
double u,
double v)
2440 vec2 p = evaluate(u, v);
2443 double alpha = u*360;
2449 virtual vec3 normal(
double u,
double v,
double d = 0.001)
2455 return(-lglFunctional::normal(u, v, d,
true,
false));
2457 return(lglFunctional::normal(u, v, d,
true,
false));
2460 return(lglFunctional::normal(u, v, d));
2463 virtual vec2 evaluate(
double u,
double v) = 0;
2504 virtual vec2 evaluate(
double u,
double v)
2506 double w = 0.5*v+0.5;
2527 void setRange(
double begin,
double end)
2533 void create(
int tessel = 8,
bool color =
false)
2536 addTo(
this, tessel, color);
2539 void addTo(
lglVBO *vbo,
int tessel = 8,
bool color =
false)
2546 int alpha_steps = 4*tessel;
2547 int beta_steps = (int)ceil(tessel*(end_-begin_));
2551 for (j=-beta_steps; j<beta_steps; j++)
2555 if (color) vbo->lglColor(col);
2557 for (i=0; i<=alpha_steps; i++)
2559 u = (double)i/alpha_steps;
2560 v = (double)j/beta_steps;
2562 w = (1-v)*begin_ + v*end_;
2568 vbo->lglTexCoord(1.0f-(
float)u,0.5f-(
float)v/2);
2571 v = (double)(j+1)/beta_steps;
2573 w = (1-v)*begin_ + v*end_;
2579 vbo->lglTexCoord(1.0f-(
float)u,0.5f-(
float)v/2);
2589 double begin_, end_;
2591 virtual vec3 point(
double u,
double v)
2593 double alpha = u*2*PI;
2598 double f = evaluate(u, v);
2600 return(
vec3(f*p, v));
2603 virtual vec3 normal(
double u,
double v,
double d = 0.001)
2609 return(-lglFunctional::normal(u, v, d,
true,
false));
2611 return(lglFunctional::normal(u, v, d,
true,
false));
2614 return(lglFunctional::normal(u, v, d));
2617 virtual double evaluate(
double u,
double v) = 0;
2635 void setRange(
double begin,
double end)
2641 void create(
int tessel = 8,
bool color =
false)
2644 addTo(
this, tessel, color);
2647 void addTo(
lglVBO *vbo,
int tessel = 8,
bool color =
false)
2654 int alpha_steps = 4*tessel;
2655 int beta_steps = (int)ceil(tessel*(end_-begin_));
2659 for (j=-beta_steps; j<beta_steps; j++)
2663 if (color) vbo->lglColor(col);
2665 for (i=0; i<=alpha_steps; i++)
2667 u = (double)i/alpha_steps;
2668 v = (double)j/beta_steps;
2670 w = (1-v)*begin_ + v*end_;
2676 vbo->lglTexCoord(1.0f-(
float)u,0.5f-(
float)v/2);
2679 v = (double)(j+1)/beta_steps;
2681 w = (1-v)*begin_ + v*end_;
2687 vbo->lglTexCoord(1.0f-(
float)u,0.5f-(
float)v/2);
2697 double begin_, end_;
2699 virtual vec3 point(
double u,
double v)
2701 double alpha = u*2*PI;
2702 double beta = v*PI/2;
2704 vec3 p =
vec3(sin(alpha)*cos(beta),
2705 cos(alpha)*cos(beta),
2708 double f = evaluate(u, v);
2713 virtual vec3 normal(
double u,
double v,
double d = 0.001)
2719 return(-lglFunctional::normal(u, v, d,
true,
false));
2721 return(lglFunctional::normal(u, v, d,
true,
false));
2724 return(lglFunctional::normal(u, v, d));
2727 virtual double evaluate(
double u,
double v) = 0;
2746 void setRange(
double begin,
double end)
2752 void setDiameter(
double diameter)
2754 diameter_ = diameter;
2757 void create(
int tessel = 8,
bool color =
false)
2760 addTo(
this, tessel, color);
2763 void addTo(
lglVBO *vbo,
int tessel = 8,
bool color =
false)
2770 int alpha_steps = 4*tessel;
2771 int beta_steps = (int)ceil(8*tessel*(end_-begin_));
2775 for (j=0; j<=beta_steps; j++)
2779 if (color) vbo->lglColor(col);
2781 for (i=0; i<=alpha_steps; i++)
2783 u = (double)i/alpha_steps;
2784 v = (double)j/beta_steps;
2786 w = (1-v)*begin_ + v*end_;
2792 vbo->lglTexCoord((
float)u,(
float)v);
2795 v = (double)(j+1)/beta_steps;
2797 w = (1-v)*begin_ + v*end_;
2803 vbo->lglTexCoord((
float)u,(
float)v);
2813 double begin_, end_;
2816 virtual vec3 point(
double u,
double v)
2818 double alpha = u*2*PI;
2819 double beta = v*360;
2821 double f = evaluate(u, v)/2;
2826 vec4 p4 =
vec4(p.x*f-diameter_/2, p.y*f, 0);
2833 virtual double evaluate(
double u,
double v) = 0;
2845 lglTorus(
double diameter,
double radius)
2849 setDiameter(diameter);
2857 virtual double evaluate(
double u,
double v)
2873 double begin = 0,
double end = 180)
2877 setRange(begin, end);
2878 setDiameter(diameter);
2886 virtual double evaluate(
double u,
double v)
2902 void create(
int tessel = 8,
bool color =
false)
2905 addTo(
this, tessel, color);
2908 void addTo(
lglVBO *vbo,
int tessel = 8,
bool color =
false)
2915 int alpha_steps = tessel * tessel_u();
2916 int beta_steps = tessel * tessel_v();
2920 for (j=0; j<beta_steps; j++)
2924 if (color) vbo->lglColor(col);
2926 for (i=0; i<=alpha_steps; i++)
2928 u = (double)i/alpha_steps;
2929 v = (double)(j+1)/beta_steps;
2935 vbo->lglTexCoord((
float)u,1.0f-(
float)v);
2938 v = (double)j/beta_steps;
2944 vbo->lglTexCoord((
float)u,1.0f-(
float)v);
2954 virtual vec3 point(
double u,
double v)
2956 vec2 p = evaluate(u, v);
2957 return(extrude(p, v));
2960 virtual vec3 normal(
double u,
double v,
double d = 0.001)
2966 if (i > 0) maxdu = 0.01/i;
2967 if (maxdu < d) d = maxdu;
2970 if (j > 0) maxdv = 0.01/j;
2971 if (maxdv < d) d = maxdv;
2973 return(-lglFunctional::normal(u, v, d));
2976 virtual int tessel_u() {
return(1);}
2977 virtual int tessel_v() {
return(1);}
2979 virtual vec2 evaluate(
double u,
double v) = 0;
2980 virtual vec3 extrude(
vec2 p,
double v) = 0;
2996 extrusion_(extrusion)
3003 extrusion_(extrusion)
3010 extrusion_(extrusion)
3017 extrusion_(extrusion)
3031 virtual vec2 evaluate(
double u,
double v)
3036 virtual vec3 extrude(
vec2 p,
double v)
3038 static const int steps = 2*tessel_v();
3040 int n = (int)ceil(v*steps);
3044 for (
int i=0; i<n; i++)
3046 double w1 = (double)i/n*v;
3047 double w2 = (double)(i+1)/n*v;
3059 virtual int tessel_v() {
return(extrusion_.size());}
3070 :
lglVBO(
"replicated_geometry")
3078 for (
int i=0; i<n; i++)
3080 double w = (double)(i+0.5)/n;
3099 lglPlanar(
const std::string &name =
"planar")
3103 void create(
int tessel = 8,
bool color =
false)
3106 addTo(
this, tessel, color);
3109 void addTo(
lglVBO *vbo,
int tessel = 8,
bool color =
false)
3116 int alpha_steps = tessel * tessel_u();
3117 int beta_steps = tessel * tessel_v();
3121 for (j=0; j<beta_steps; j++)
3125 if (color) vbo->lglColor(col);
3127 for (i=0; i<=alpha_steps; i++)
3129 u = (double)i/alpha_steps;
3130 v = (double)(j+1)/beta_steps;
3136 vbo->lglTexCoord((
float)u,1.0f-(
float)v);
3139 v = (double)j/beta_steps;
3145 vbo->lglTexCoord((
float)u,1.0f-(
float)v);
3155 virtual vec3 point(
double u,
double v)
3157 return(evaluate(u, v));
3160 virtual vec3 normal(
double u,
double v,
double d = 0.001)
3166 if (i > 0) maxdu = 0.01/i;
3167 if (maxdu < d) d = maxdu;
3170 if (j > 0) maxdv = 0.01/j;
3171 if (maxdv < d) d = maxdv;
3173 return(-lglFunctional::normal(u, v, d));
3176 virtual vec3 evaluate(
double u,
double v) = 0;
3178 virtual int tessel_u() {
return(1);}
3179 virtual int tessel_v() {
return(1);}
3205 virtual vec3 evaluate(
double u,
double v)
3210 virtual int tessel_u() {
return(mesh_.getCols()-1);}
3211 virtual int tessel_v() {
return(mesh_.getRows()-1);}
3225 :
lglVBO(
"wireframe_cube")
3230 static void addLines(
lglVBO *vbo)
3235 vbo->lglVertex(-0.5,-0.5,0.5);
3236 vbo->lglVertex(-0.5,0.5,0.5);
3237 vbo->lglVertex(0.5,-0.5,0.5);
3238 vbo->lglVertex(0.5,0.5,0.5);
3239 vbo->lglVertex(0.5,-0.5,-0.5);
3240 vbo->lglVertex(0.5,0.5,-0.5);
3241 vbo->lglVertex(-0.5,-0.5,-0.5);
3242 vbo->lglVertex(-0.5,0.5,-0.5);
3245 vbo->lglVertex(-0.5,-0.5,0.5);
3246 vbo->lglVertex(0.5,-0.5,0.5);
3247 vbo->lglVertex(0.5,-0.5,0.5);
3248 vbo->lglVertex(0.5,-0.5,-0.5);
3249 vbo->lglVertex(0.5,-0.5,-0.5);
3250 vbo->lglVertex(-0.5,-0.5,-0.5);
3251 vbo->lglVertex(-0.5,-0.5,-0.5);
3252 vbo->lglVertex(-0.5,-0.5,0.5);
3255 vbo->lglVertex(-0.5,0.5,0.5);
3256 vbo->lglVertex(0.5,0.5,0.5);
3257 vbo->lglVertex(0.5,0.5,0.5);
3258 vbo->lglVertex(0.5,0.5,-0.5);
3259 vbo->lglVertex(0.5,0.5,-0.5);
3260 vbo->lglVertex(-0.5,0.5,-0.5);
3261 vbo->lglVertex(-0.5,0.5,-0.5);
3262 vbo->lglVertex(-0.5,0.5,0.5);
3281 :
lglVBO(
"coordinate_system_axis")
3286 static void addLines(
lglVBO *vbo)
3288 static const double a = 0.1;
3289 static const double b = 0.3*a;
3294 vbo->lglColor(1,0,0);
3295 vbo->lglVertex(0,0,0);
3296 vbo->lglVertex(1,0,0);
3297 vbo->lglVertex(1-a,-b,0);
3298 vbo->lglVertex(1,0,0);
3299 vbo->lglVertex(1-a,b,0);
3300 vbo->lglVertex(1,0,0);
3303 vbo->lglColor(0,1,0);
3304 vbo->lglVertex(0,0,0);
3305 vbo->lglVertex(0,1,0);
3306 vbo->lglVertex(-b,1-a,0);
3307 vbo->lglVertex(0,1,0);
3308 vbo->lglVertex(b,1-a,0);
3309 vbo->lglVertex(0,1,0);
3312 vbo->lglColor(0,0,1);
3313 vbo->lglVertex(0,0,0);
3314 vbo->lglVertex(0,0,1);
3315 vbo->lglVertex(0,-b,1-a);
3316 vbo->lglVertex(0,0,1);
3317 vbo->lglVertex(0,b,1-a);
3318 vbo->lglVertex(0,0,1);
3324 vbo->lglColor(1,0,0);
3337 vbo->lglColor(0,1,0);
3350 vbo->lglColor(0,0,1);
3376 addLines(
this, text);
3379 static void addLines(
lglVBO *vbo, std::string text)
3407 std::vector<mat4>::push_back(m);
3422 for (
size_t i=0; i<size(); i++)