22 #ifndef PGL_PRIMITIVE_H_ 23 #define PGL_PRIMITIVE_H_ 58 list_ = glGenLists(1);
63 glDeleteLists(list_, 1);
69 glColor3d(color.x, color.y, color.z);
75 for (
size_t ii=0; ii !=
children.size(); ++ii)
91 double len = vec.norm();
94 double angle = acos(vec.z);
107 glNormal3d(n.x, n.y, n.z);
113 glVertex3d(v.x, v.y, v.z);
151 make({thickness, thickness,
align(start, end)});
159 Vector3 vppp( s2.x, s2.y, s2.z), vnpp(-s2.x, s2.y, s2.z), vnnp(-s2.x, -s2.y, s2.z), vpnp( s2.x, -s2.y, s2.z),
160 vppn( s2.x, s2.y, -s2.z), vnpn(-s2.x, s2.y, -s2.z), vnnn(-s2.x, -s2.y, -s2.z), vpnn( s2.x, -s2.y, -s2.z);
162 glNewList(
list_, GL_COMPILE);
163 glBegin(GL_TRIANGLES);
165 quad(vnnp, vpnp, vppp, vnpp);
166 glNormal3d(0, 0, -1);
167 quad(vnnn, vnpn, vppn, vpnn);
169 quad(vpnn, vppn, vppp, vpnp);
170 glNormal3d(-1, 0, 0);
171 quad(vnnn, vnnp, vnpp, vnpn);
173 quad(vnpn, vnpp, vppp, vppn);
174 glNormal3d(0, -1, 0);
175 quad(vnnn, vpnn, vpnp, vnnp);
197 Vector3 vppp( s2.x, s2.y, s2.z), vnpp(-s2.x, s2.y, s2.z), vnnp(-s2.x, -s2.y, s2.z), vpnp( s2.x, -s2.y, s2.z),
198 vppn( s2.x, s2.y, -s2.z), vnpn(-s2.x, s2.y, -s2.z), vnnn(-s2.x, -s2.y, -s2.z), vpnn( s2.x, -s2.y, -s2.z);
200 glNewList(
list_, GL_COMPILE);
201 glDisable(GL_LIGHTING);
216 glEnable(GL_LIGHTING);
233 void make(
double radius)
235 glNewList(
list_, GL_COMPILE);
236 glBegin(GL_TRIANGLES);
237 for (
size_t jj=0; jj != FACETS/2; ++jj)
239 double phi1 = jj*2.*M_PI/FACETS, phi2 = (jj+1)*2.*M_PI/FACETS;
240 double r1 = radius*sin(phi1), r2 = radius*sin(phi2);
241 double z1 = -radius*cos(phi1), z2 = -radius*cos(phi2);
243 for (
size_t ii=0; ii != FACETS; ++ii)
245 double theta1 = ii*2.*M_PI/FACETS, theta2 = (ii+1)*2.*M_PI/FACETS;
247 quad({r1*cos(theta1), r1*sin(theta1), z1},
248 {r1*cos(theta2), r1*sin(theta2), z1},
249 {r2*cos(theta2), r2*sin(theta2), z2},
250 {r2*cos(theta1), r2*sin(theta1), z2});
275 Cylinder(
double length,
double radius,
double endradius=-1)
277 make(length, radius, endradius);
286 make(
align(start, end), radius, endradius);
290 void make(
double length,
double radius,
double endradius)
295 glNewList(
list_, GL_COMPILE);
298 glBegin(GL_TRIANGLES);
299 for (
size_t ii=0; ii != FACETS; ++ii)
301 double theta1 = ii*2*M_PI/FACETS, theta2 = (ii+1.)*2*M_PI/FACETS;
303 quad({ radius*cos(theta1), radius*sin(theta1), -length/2},
304 { radius*cos(theta2), radius*sin(theta2), -length/2},
305 {endradius*cos(theta2), endradius*sin(theta2), length/2},
306 {endradius*cos(theta1), endradius*sin(theta1), length/2});
311 glBegin(GL_TRIANGLE_FAN);
313 for (
size_t ii=0; ii != FACETS; ++ii)
315 double theta = ii*2*M_PI/FACETS;
316 vertex({endradius*cos(theta), endradius*sin(theta), length/2});
321 glBegin(GL_TRIANGLE_FAN);
323 for (
size_t ii=0; ii != FACETS; ++ii)
325 double theta = ii*2.*M_PI/-FACETS;
326 vertex({radius*cos(theta), radius*sin(theta), -length/2});
365 Arrow(
double length,
double radius,
double headlength=-1,
double headradius=-1)
367 make(length, radius, headlength, headradius);
374 Arrow(
const Vector3 &start,
const Vector3 &end,
double radius,
double headlength=-1,
double headradius=-1)
376 make(
align(start, end), radius, headlength, headradius);
388 void make(
double length,
double radius,
double headlength,
double headradius)
391 headlength = radius*6;
393 headradius = headlength/3;
410 make(length, radius);
416 make(
align(start, end), radius);
420 void make(
double length,
double radius)
422 glNewList(
list_, GL_COMPILE);
423 glBegin(GL_TRIANGLES);
426 int jadj1=0, jadj2=1;
427 double zadj1 = -length/2, zadj2 = -length/2;
429 for (
size_t jj=0; jj != FACETS/2+1; ++jj)
437 else if (jj == FACETS/4 + 1)
444 double phi1 = (jj+jadj1)*2.*M_PI/FACETS, phi2 = (jj+jadj2)*2.*M_PI/FACETS;
445 double r1 = radius*sin(phi1), r2 = radius*sin(phi2);
446 double z1 = -radius*cos(phi1)+zadj1, z2 = -radius*cos(phi2)+zadj2;
448 for (
size_t ii=0; ii != FACETS; ++ii)
450 double theta1 = ii*2.*M_PI/FACETS, theta2 = (ii+1)*2.*M_PI/FACETS;
452 quad({r1*cos(theta1), r1*sin(theta1), z1}, zadj1,
453 {r1*cos(theta2), r1*sin(theta2), z1}, zadj1,
454 {r2*cos(theta2), r2*sin(theta2), z2}, zadj2,
455 {r2*cos(theta1), r2*sin(theta1), z2}, zadj2);
477 normal({v.x, v.y, v.z-z});
505 make(vx, vy, repeat);
513 Vector3 v1 = -vx-vy, v2 = vx-vy, v3=vx+vy, v4=-vx+vy;
515 glNewList(
list_, GL_COMPILE);
518 glEnable(GL_TEXTURE_2D);
524 glTexCoord2d(repeat, 0);
526 glTexCoord2d(repeat, repeat);
528 glTexCoord2d(0, repeat);
531 glDisable(GL_TEXTURE_2D);
562 float n[3], v1[3], v2[3], v3[3];
568 Model(
const std::string &file,
double scale=1)
581 void make(
const std::string &file,
double scale)
583 std::ifstream ifs(file);
589 ifs.read((
char*)header, 80);
590 ifs.read((
char*)numchar, 4);
594 std::cerr << file <<
" is not a valid binary STL" << std::endl;
598 uint32_t numint = ((uint32_t)numchar[0]<<0) + ((uint32_t)numchar[1]<<8) + ((uint32_t)numchar[2]<<16) + ((uint32_t)numchar[3]<<24);
600 glNewList(
list_, GL_COMPILE);
601 glBegin(GL_TRIANGLES);
604 for (
size_t ii=0; ii != numint; ++ii)
607 ifs.read((
char*)&t, 50);
611 std::cerr << file <<
" is truncated" << std::endl;
616 Vector3 v1(t.v1), v2(t.v2), v3(t.v3);
620 n = (v2-v1).cross(v3-v1);
635 #endif // PGL_PRIMITIVE_H_ virtual void triangle(const Vector3 &v1, const Vector3 &v2, const Vector3 &v3)
Draws triangle.
Definition: primitive.h:128
Box Primitive.
Definition: primitive.h:137
Transform transform
Position and orientation.
Definition: pgl.h:177
Box(const Vector3 &size, const Vector3 &offset={0, 0, 0})
Specfies box size and optional offset.
Definition: primitive.h:141
virtual void quad(const Vector3 &v1, const Vector3 &v2, const Vector3 &v3, const Vector3 &v4)
Draws a four-sided polygon using two triangles.
Definition: primitive.h:121
std::vector< Node * > children
Sub-objects.
Definition: pgl.h:132
Capsule(double length, double radius)
Specifies length and radius.
Definition: primitive.h:408
virtual void draw()
Draw children relative to this object.
Definition: pgl.h:188
Sphere(double radius, const Vector3 &offset={0, 0, 0})
Specifies sphere radius and optional offset.
Definition: primitive.h:226
Model(const std::string &file, double scale=1)
Specifies model file name and optional scale.
Definition: primitive.h:568
Plane Primitive.
Definition: primitive.h:487
Arrow Primitive.
Definition: primitive.h:354
Texture.
Definition: pgl.h:299
virtual void normal(const Vector3 &v)
Sets norm for subsequent vertices.
Definition: primitive.h:103
Cone(const Vector3 &start, const Vector3 &end, double radius)
Specifies start and end coordinates, as well as radius.
Definition: primitive.h:347
Generalized cylinder Primitive.
Definition: primitive.h:268
Definition: controller.h:27
void draw()
Draw primitive and its children.
Definition: primitive.h:379
Capsule Primitive.
Definition: primitive.h:404
double align(const Vector3 &start, const Vector3 &end)
Align primitive along axis.
Definition: primitive.h:88
Arrow(double length, double radius, double headlength=-1, double headradius=-1)
Specifies arrow length, radius, head length, and head radius.
Definition: primitive.h:365
Cylinder ending in a point.
Definition: primitive.h:340
Box(const Vector3 &start, const Vector3 &end, double thickness)
Specfies box start and end coordinates, as well as thickness.
Definition: primitive.h:149
Plane(const Vector3 &vx, const Vector3 &vy, const Vector3 &offset={0, 0, 0}, const Texture &texture=Texture(), int repeat=1)
Specifies vectors along which the plane is aligned.
Definition: primitive.h:502
Arrow(const Vector3 &start, const Vector3 &end, double radius, double headlength=-1, double headradius=-1)
Specifies start and end coordinates, as well as radius, head length, and head radius.
Definition: primitive.h:374
virtual void vertex(const Vector3 &v)
Enters vertex into display list.
Definition: primitive.h:111
GLuint list_
OpenGL display list identifier.
Definition: primitive.h:49
Cone(double length, double radius)
Specifies length and radius.
Definition: primitive.h:344
Definition: primitive.h:560
3-component vector.
Definition: math.h:43
Primitive()
Default constructor.
Definition: primitive.h:56
Cylinder(double length, double radius, double endradius=-1)
Specifies length, radius, and end radius.
Definition: primitive.h:275
Model(const std::string &file, const Vector3 &offset, double scale=1)
Specifies model file name, offset, and optional scale.
Definition: primitive.h:574
void bind() const
Use this texture as the current OpenGL 2D texture.
Definition: pgl.h:371
Wireframe box Primitive.
Definition: primitive.h:182
Cylinder(const Vector3 &start, const Vector3 &end, double radius, double endradius=-1)
Specifies start and end coordinates, as well as radius and end radius.
Definition: primitive.h:284
WireBox(const Vector3 &size, const Vector3 &offset={0, 0, 0})
Specfies box size and optional offset.
Definition: primitive.h:186
Capsule(const Vector3 &start, const Vector3 &end, double radius)
Specifies start and end coordinates, as well as radius.
Definition: primitive.h:414
Cone * head_
Arrow head.
Definition: primitive.h:358
Sphere Primitive.
Definition: primitive.h:222
Transform with identity rotation.
Definition: math.h:289
void vertex(const Vector3 &v)
Enters vertex into display list.
Definition: primitive.h:257
Basic 3D primitive.
Definition: primitive.h:43
void vertex(const Vector3 &v)
Enters vertex into display list.
Definition: primitive.h:332
STL model.
Definition: primitive.h:557
Cylinder * body_
Arrow body.
Definition: primitive.h:357
Vector3 color
Primitive color.
Definition: primitive.h:46
Object in a scene.
Definition: pgl.h:174
virtual void draw()
Draw primitive and its children.
Definition: primitive.h:67
T * attach(T *child)
Add child to list of sub-objects.
Definition: pgl.h:160