# include # include # include # include // GLOBAL CONSTANTS // ---------------- # ifndef PI const double PI = 3.1415926535897932385; # endif # define _SGL_SHAPES typedef enum boolean {false=0, true=1}; /******************************************************* * virtual * shape *******************************************************/ class Shape { private: public: GLint lindex; GLfloat color[4]; GLdouble x,y,z; GLdouble sfx,sfy,sfz; GLdouble rot_x,rot_y,rot_z; // use quaternions ? // Constructor and distructores Shape () { x=0.0; y=0.0; z=0.0; lindex=NULL; sfx=1.0; sfy=1.0; sfz=1.0; rot_x=0.0; rot_y=0.0; rot_z=0.0; color[0]=color[1]=color[2]=0.0; color[3]=1.0;}; Shape (GLdouble xi, GLdouble yi, GLdouble zi) { x=xi; y=yi; z=zi; lindex=NULL; sfx=1.0; sfy=1.0; sfz=1.0; rot_x=0.0; rot_y=0.0; rot_z=0.0; color[0]= color[1]= color[2]= 0.0; color[3]= 1.0;}; Shape (GLdouble xi, GLdouble yi, GLdouble zi, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { x=xi; y=yi; z=zi; lindex=NULL; sfx=1.0; sfy=1.0; sfz=1.0; rot_x=0.0; rot_y=0.0; rot_z=0.0; color[0]=red; color[1]=green; color[2]=blue; color[3]=alpha;}; ~Shape() {}; // Accessor and set function int getIndex() { return lindex; } void setScale(GLdouble sfxi, GLdouble sfyi, GLdouble sfzi) { sfx=sfxi; sfy=sfyi; sfz=sfzi; }; void setColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) {color[0]=red; color[1]=green; color[2]=blue; color[3]=alpha;}; void setRGBColor(GLint red, GLint green, GLint blue) { color[0]=red/255.0; color[1]=green/255.0; color[2]=blue/255.0; color[3]=1.0;}; void setPosition(GLdouble xi, GLdouble yi, GLdouble zi) { x=xi; y=yi; z=zi;} void setRotation(GLdouble rot_xi, GLdouble rot_yi, GLdouble rot_zi) { rot_x=rot_xi; rot_y=rot_yi; rot_z=rot_zi;} boolean optimizable() { return true; } boolean optimized() { return (lindex>0) ? true : false; } void optimizePaint(); // Functions that MUST be overloaded virtual void paint() {}; virtual void print(); virtual GLdouble volume() { return 0; } }; /******************************************************* * virtual * box *******************************************************/ class Box: public Shape { public: GLdouble width; GLdouble height; GLdouble depth; Box () : Shape() { width=height=depth=1.0; } Box (GLdouble widthi, GLdouble heighti, GLdouble depthi, GLdouble xi, GLdouble yi, GLdouble zi) : Shape(xi,yi,zi) { width= widthi; height= heighti; depth= depthi; } Box (GLdouble widthi, GLdouble heighti, GLdouble depthi, GLdouble xi, GLdouble yi, GLdouble zi, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) : Shape(xi,yi,zi,red,green,blue,alpha) { width= widthi; height= heighti; depth= depthi; } ~Box() {}; virtual void paint() {}; void print(); GLdouble volume() { return width*height*depth;} }; /******************************************************* * wire box *******************************************************/ class WireBox: public Box { public: WireBox () : Box() {}; WireBox (GLdouble widthi, GLdouble heighti, GLdouble depthi, GLdouble xi, GLdouble yi, GLdouble zi) : Box(widthi,heighti,depthi,xi,yi,zi) {} WireBox (GLdouble widthi, GLdouble heighti, GLdouble depthi, GLdouble xi, GLdouble yi, GLdouble zi, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) : Box(widthi,heighti,depthi,xi,yi,zi,red,green,blue,alpha) {} ~WireBox() {}; void paint(); }; /******************************************************* * solid box *******************************************************/ class SolidBox: public Box { public: SolidBox () : Box() {}; SolidBox (GLdouble widthi, GLdouble heighti, GLdouble depthi, GLdouble xi, GLdouble yi, GLdouble zi) : Box(widthi,heighti,depthi,xi,yi,zi) {} SolidBox (GLdouble widthi, GLdouble heighti, GLdouble depthi, GLdouble xi, GLdouble yi, GLdouble zi, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) : Box(widthi,heighti,depthi,xi,yi,zi,red,green,blue,alpha) {} ~SolidBox() {}; void paint(); }; /******************************************************* * wire cube *******************************************************/ class WireCube: public WireBox { public: WireCube () : WireBox() {}; WireCube (GLdouble widthi, GLdouble xi, GLdouble yi, GLdouble zi) : WireBox(widthi,widthi,widthi,xi,yi,zi) {} WireCube (GLdouble widthi, GLdouble xi, GLdouble yi, GLdouble zi, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) : WireBox(widthi,widthi,widthi,xi,yi,zi,red,green,blue,alpha) {} ~WireCube() {}; }; /******************************************************* * solid box *******************************************************/ class SolidCube: public SolidBox { public: SolidCube () : SolidBox() {}; SolidCube (GLdouble widthi, GLdouble xi, GLdouble yi, GLdouble zi) : SolidBox(widthi,widthi,widthi,xi,yi,zi) {} SolidCube (GLdouble widthi, GLdouble xi, GLdouble yi, GLdouble zi, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) : SolidBox(widthi,widthi,widthi,xi,yi,zi,red,green,blue,alpha) {} ~SolidCube() {}; }; /******************************************************* * rounded box *******************************************************/ class RoundedBox: public Box { public: GLfloat widthr, heightr, depthr; boolean hollow; RoundedBox () : Box() {}; RoundedBox (GLdouble widthi, GLdouble heighti, GLdouble depthi, GLdouble xi, GLdouble yi, GLdouble zi) : Box(widthi,heighti,depthi,xi,yi,zi) { widthr= heightr=depthr=0.0; hollow=false;} RoundedBox (GLdouble widthi, GLdouble heighti, GLdouble depthi, GLdouble widthri, GLdouble heightri, GLdouble depthri, GLdouble xi, GLdouble yi, GLdouble zi) : Box(widthi,heighti,depthi,xi,yi,zi) { widthr= widthri; heightr= heightri; depthr= depthri; hollow=false;} ~RoundedBox() {}; void setCornerRadius (GLdouble widthri, GLdouble heightri, GLdouble depthri) { widthr= widthri; heightr= heightri; depthr= depthri; } void setHollow (boolean hollowness) { hollow=hollowness; } void paint(); }; /******************************************************* * virtual * sphere *******************************************************/ class Sphere: public Shape { public: GLdouble r; Sphere () : Shape() { r=1.0; } Sphere (GLdouble ri, GLdouble xi, GLdouble yi, GLdouble zi) : Shape(xi,yi,zi) { r=ri; } Sphere (GLdouble ri, GLdouble xi, GLdouble yi, GLdouble zi, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) : Shape(xi,yi,zi,red,green,blue,alpha) { r=ri; } ~Sphere() {}; virtual void paint() {}; virtual void print(); GLdouble volume() { return r*PI*PI*PI*0.75; } }; /******************************************************* * solid sphere *******************************************************/ class SolidSphere: public Sphere { public: SolidSphere () : Sphere() {} SolidSphere (GLdouble ri, GLdouble xi, GLdouble yi, GLdouble zi) : Sphere(ri,xi,yi,zi) {} SolidSphere (GLdouble ri, GLdouble xi, GLdouble yi, GLdouble zi, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) : Sphere(ri,xi,yi,zi,red,green,blue,alpha) {} ~SolidSphere() {}; void paint(); }; /******************************************************* * wire sphere *******************************************************/ class WireSphere: public Sphere { public: WireSphere () : Sphere() {} WireSphere (GLdouble ri, GLdouble xi, GLdouble yi, GLdouble zi) : Sphere(ri,xi,yi,zi) {} WireSphere (GLdouble ri, GLdouble xi, GLdouble yi, GLdouble zi, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) : Sphere(ri,xi,yi,zi,red,green,blue,alpha) {} ~WireSphere() {}; void paint(); }; /******************************************************* * virtual * torus *******************************************************/ class Torus: public Shape { public: GLdouble innerr; GLdouble outerr; Torus() : Shape() { innerr=0.3; outerr=1.0; } Torus(GLdouble innerri, GLdouble outerri, GLdouble xi, GLdouble yi, GLdouble zi) : Shape(xi,yi,zi) { innerr=innerri; outerr=outerri; } Torus(GLdouble innerri, GLdouble outerri, GLdouble xi, GLdouble yi, GLdouble zi, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) : Shape(xi,yi,zi,red,green,blue,alpha) { innerr=innerri; outerr=outerri; } ~Torus() {}; virtual void paint() {}; virtual void print(); GLdouble volume() {return (innerr+outerr)*PI*PI*(innerr-outerr)*(innerr-outerr)/4;} }; /******************************************************* * solid torus *******************************************************/ class SolidTorus: public Torus { public: SolidTorus() : Torus() {} SolidTorus (GLdouble innerri, GLdouble outerri, GLdouble xi, GLdouble yi, GLdouble zi) : Torus(innerri,outerri,xi,yi,zi) {} SolidTorus (GLdouble innerri, GLdouble outerri, GLdouble xi, GLdouble yi, GLdouble zi, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) : Torus(innerri,outerri, xi,yi,zi,red,green,blue,alpha) {} ~SolidTorus() {}; void paint(); }; /******************************************************* * wire torus *******************************************************/ class WireTorus: public Torus { public: WireTorus() : Torus() {} WireTorus (GLdouble innerri, GLdouble outerri, GLdouble xi, GLdouble yi, GLdouble zi) : Torus(innerri,outerri,xi,yi,zi) {} WireTorus (GLdouble innerri, GLdouble outerri, GLdouble xi, GLdouble yi, GLdouble zi, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) : Torus(innerri,outerri,xi,yi,zi,red,green,blue,alpha) {} ~WireTorus() {}; void paint(); }; /******************************************************* * virtual * cone *******************************************************/ class Cone: public Shape { public: GLdouble height; GLdouble topr; GLdouble baser; Cone () : Shape() { height=1.0; baser=0.5; topr=0.0; } Cone (GLdouble heighti, GLdouble baseri, GLdouble topri, GLdouble xi, GLdouble yi, GLdouble zi) : Shape(xi,yi,zi) { height=heighti; topr=topri; baser=baseri; } Cone (GLdouble heighti, GLdouble baseri, GLdouble topri, GLdouble xi, GLdouble yi, GLdouble zi, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) : Shape(xi,yi,zi,red,green,blue,alpha) { height=heighti; topr=topri; baser=baseri; } ~Cone() {}; virtual void paint() {}; virtual void print(); GLdouble volume() { return (baser+topr)*PI*PI*height/2; } }; /******************************************************* * solid cone *******************************************************/ class SolidCone: public Cone { public: SolidCone() : Cone() {} SolidCone (GLdouble heighti, GLdouble baseri, GLdouble topri, GLdouble xi, GLdouble yi, GLdouble zi) : Cone(heighti,baseri,topri,xi,yi,zi) {} SolidCone (GLdouble heighti, GLdouble baseri, GLdouble xi, GLdouble yi, GLdouble zi) : Cone(heighti,baseri,0.0,xi,yi,zi) {} SolidCone (GLdouble heighti, GLdouble baseri, GLdouble xi, GLdouble yi, GLdouble zi, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) : Cone(heighti,baseri,0.0,xi,yi,zi,red,green,blue,alpha) {} SolidCone (GLdouble heighti, GLdouble baseri, GLdouble topri, GLdouble xi, GLdouble yi, GLdouble zi, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) : Cone(heighti,baseri,topri,xi,yi,zi,red,green,blue,alpha) {} ~SolidCone() {}; void paint(); }; /******************************************************* * wire cone *******************************************************/ class WireCone: public Cone { public: WireCone() : Cone() {} WireCone (GLdouble heighti, GLdouble baseri, GLdouble topri, GLdouble xi, GLdouble yi, GLdouble zi) : Cone(heighti,baseri,topri,xi,yi,zi) {} WireCone (GLdouble heighti, GLdouble baseri, GLdouble xi, GLdouble yi, GLdouble zi) : Cone(heighti,baseri,0.0,xi,yi,zi) {} WireCone (GLdouble heighti, GLdouble baseri, GLdouble topri, GLdouble xi, GLdouble yi, GLdouble zi, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) : Cone(heighti,baseri,topri,xi,yi,zi,red,green,blue,alpha) {} WireCone (GLdouble heighti, GLdouble baseri, GLdouble xi, GLdouble yi, GLdouble zi, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) : Cone(heighti,baseri,0.0,xi,yi,zi,red,green,blue,alpha) {} ~WireCone() {}; void paint(); }; /******************************************************* * solid cylinder *******************************************************/ class SolidCylinder: public SolidCone { public: SolidCylinder() : SolidCone() {topr=baser;} SolidCylinder (GLdouble heighti, GLdouble baseri, GLdouble xi, GLdouble yi, GLdouble zi) : SolidCone(heighti,baseri,baseri,xi,yi,zi) {} SolidCylinder (GLdouble heighti, GLdouble baseri, GLdouble xi, GLdouble yi, GLdouble zi, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) : SolidCone(heighti,baseri,baseri,xi,yi,zi,red,green,blue,alpha) {} ~SolidCylinder() {}; }; /******************************************************* * wire cylinder *******************************************************/ class WireCylinder: public WireCone { public: WireCylinder() : WireCone() {topr=baser;} WireCylinder (GLdouble heighti, GLdouble baseri, GLdouble xi, GLdouble yi, GLdouble zi) : WireCone(heighti,baseri,baseri,xi,yi,zi) {} WireCylinder (GLdouble heighti, GLdouble baseri, GLdouble xi, GLdouble yi, GLdouble zi, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) : WireCone(heighti,baseri,baseri,xi,yi,zi,red,green,blue,alpha) {} ~WireCylinder() {}; }; /******************************************************* * gear *******************************************************/ class Gear: public Shape { public: GLdouble ir,or,width,tsize; GLint teeth; Gear () : Shape() { ir=0.0; or=1.0; width=0.2; teeth=10; tsize=.2;} Gear (GLdouble iri, GLdouble ori, GLdouble withi, GLint teethi, GLdouble tsizei, GLdouble xi, GLdouble yi, GLdouble zi) : Shape(xi,yi,zi) { ir=iri; or=ori; width=withi; teeth=teethi; tsize=tsizei; } Gear (GLdouble iri, GLdouble ori, GLdouble withi, GLint teethi, GLdouble tsizei, GLdouble xi, GLdouble yi, GLdouble zi, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) : Shape(xi,yi,zi,red,green,blue,alpha) { ir=iri; or=ori; width=withi; teeth=teethi; tsize=tsizei; } ~ Gear () {}; void paint(); void print(); GLdouble volume() { return (ir-or)*PI*width; } };