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