# ifndef _SGL_SHAPES # include "sgl_shapes.h" # endif # define _SGL_LINKS typedef enum { NO_ACTION = 0, POINT_TO_POINT, ROTATE_ABOUT_POINT, SCALE_FACTOR } SGLLinkMode; typedef enum { LINEAR, QUADRATIC, SINE } SGLLinkIterMode; /******************************************************* * link ptr *******************************************************/ class linkptr { public: Shape * link; linkptr * next; linkptr() { link=NULL; next=NULL; } linkptr(Shape & newlink) { link = & newlink; next = NULL; } linkptr(Shape & newlink, linkptr & previous) { next = & previous; link = & newlink; } ~linkptr() {} }; /******************************************************* * links *******************************************************/ class Link: public Shape { public: SGLLinkMode mode; SGLLinkIterMode imode; GLdouble xf,yf,zf; GLdouble dx, dy, dz; GLdouble p0, p1, p2; GLfloat * time; boolean enabled; long tstart,tend; linkptr * head; linkptr * tail; Link() : Shape() { head=tail=NULL; xf=yf=zf=1.0; mode=NO_ACTION; time=NULL; enabled=true; }; Link(SGLLinkMode modei) : Shape() { head=tail=NULL; xf=yf=zf=1.0; enabled=true; time=NULL; setMode(modei); }; Link(Shape & newlink) : Shape() { tail=head= new linkptr(newlink); xf=yf=zf=1.0; mode=NO_ACTION; enabled=true; time=NULL; }; Link(Shape & newlink, SGLLinkMode modei) : Shape() { tail=head= new linkptr(newlink); xf=yf=zf=1.0; setMode(modei); time=NULL; enabled=true; }; ~Link(); SGLLinkMode getMode() { return mode; } SGLLinkIterMode getIterMode() { return imode; } long getStartTime() { return tstart; } long getEndTime() { return tend; } boolean isEnabled() { return enabled; } void setEnabled(boolean enabledi) { enabled=enabledi; }; void enable() { enabled=true; } void disable() { enabled=false; } boolean active(); void setScale(GLdouble xfi,GLdouble yfi,GLdouble zfi) { xf=xfi; yf=yfi; zf=zfi; }; void setMode(SGLLinkMode modei); void setMode(SGLLinkMode modei, SGLLinkIterMode imodei); void setMode(SGLLinkMode modei, SGLLinkIterMode imodei, GLdouble dxi, GLdouble dyi, GLdouble dzi); void setIterMode(SGLLinkIterMode imodei); void setIterMode(SGLLinkIterMode imodei, GLdouble p0i, GLdouble p1i, GLdouble p2i); void setChange (GLdouble dxi, GLdouble dyi, GLdouble dzi) { dx=dxi; dy=dyi; dz=dzi; } ; void setIterParms (GLdouble p0i, GLdouble p1i, GLdouble p2i) { p0=p0i; p1=p1i; p2=p2i; } ; void setTimeInterval (long tstarti, long tendi) { tstart=tstarti; tend=tendi; }; void setStartTime (long tstarti) { tstart=tstarti; }; void setEndTime (long tendi) { tend=tendi; }; void add(Shape & newlink); void iterate(); void paint(); void print(); boolean linksOptimizable(); boolean optimizable(); void optimizePaint(); void settime(GLfloat & timei) { time= & timei; } long gettime() { if (time==NULL) { cerr << "time not initialized for "; print(); exit(0); } return *time; } };