iterator.c
Go to the documentation of this file.00001
00007 #include "../ctl/ctldef.h"
00008 #include "iterator.h"
00009
00010
00019 void LinePath_init( LinePath* self, int x1,int y1,int z1, unsigned msBegin, int x2,int y2,int z2, unsigned msFinish )
00020 {
00021 self->begin = msBegin;
00022 self->end = msFinish;
00023 self->x1 = x1;
00024 self->y1 = y1;
00025 self->z1 = z1;
00026 self->x2 = x2;
00027 self->y2 = y2;
00028 self->z2 = z2;
00029 }
00030
00037 void LinePath_setpos( LinePath* self, int x,int y,int z, unsigned msCurrent )
00038 {
00039 self->begin = msCurrent;
00040 self->end = msCurrent;
00041 self->x2 = self->x1 = x;
00042 self->y2 = self->y1 = y;
00043 self->z2 = self->z1 = z;
00044 }
00045
00053 void LinePath_moveto( LinePath* self, int x,int y,int z, unsigned msCurrent, unsigned msArrive )
00054 {
00055 LinePath_curr( self, &self->x1,&self->y1,&self->z1, msCurrent );
00056 self->begin = msCurrent;
00057 self->end = msArrive;
00058 self->x2 = x;
00059 self->y2 = y;
00060 self->z2 = z;
00061 }
00062
00070 bool LinePath_curr( const LinePath* self, int *x,int *y,int *z, unsigned msCurrent )
00071 {
00072 if( msCurrent <= self->begin )
00073 {
00074 *x = self->x1;
00075 *y = self->y1;
00076 *z = self->z1;
00077 return true;
00078 }
00079 else if( msCurrent >= self->end )
00080 {
00081 *x = self->x2;
00082 *y = self->y2;
00083 *z = self->z2;
00084 return false;
00085 }
00086 else
00087 {
00088 int total = (int)(1u + self->end - self->begin);
00089 int elapsed = (int)(msCurrent - self->begin);
00090 *x = self->x1 + ((self->x2-self->x1) * elapsed / total);
00091 *y = self->y1 + ((self->y2-self->y1) * elapsed / total);
00092 *z = self->z1 + ((self->z2-self->z1) * elapsed / total);
00093 return true;
00094 }
00095 }
00096
00106 int Animator_init( Animator* self, int firstFrame, int lastFrame, Animator_Dir dir, unsigned msPerFrame )
00107 {
00108 self->msprev = 0;
00109 self->msframe = msPerFrame;
00110 self->firstFrame = firstFrame;
00111 self->lastFrame = lastFrame;
00112 self->aDir = dir;
00113 switch( dir )
00114 {
00115 case an_Stop:
00116 case an_ForwardOneshot:
00117 case an_ForwardLoop:
00118 case an_ForwardPingPong:
00119 case an_Random:
00120 self->iFrame = firstFrame;
00121 break;
00122 case an_BackwardOneshot:
00123 case an_BackwardLoop:
00124 case an_BackwardPingPong:
00125 self->iFrame = lastFrame;
00126 break;
00127 }
00128 return firstFrame;
00129 }
00130
00136 int Animator_set( Animator* self, int frame )
00137 {
00138 self->msprev = 0;
00139 self->msframe = 0;
00140 self->aDir = an_Stop;
00141 self->firstFrame = frame;
00142 self->lastFrame = frame;
00143 self->iFrame = frame;
00144 return frame;
00145 }
00146
00151 bool Animator_pending( const Animator* self )
00152 {
00153 if( self->aDir == an_ForwardOneshot )
00154 return self->iFrame <= self->lastFrame;
00155 else if( self->aDir == an_BackwardOneshot )
00156 return self->iFrame >= self->firstFrame;
00157 return false;
00158 }
00159
00160
00168 bool Animator_curr( Animator* self, int* frame, unsigned msCurrent )
00169 {
00170 if( msCurrent - self->msprev > self->msframe )
00171 {
00172 if( !self->msprev )
00173 {
00174 self->msprev = msCurrent;
00175 *frame = self->iFrame;
00176 return false;
00177 }
00178 self->msprev = msCurrent;
00179 switch( self->aDir )
00180 {
00181 case an_Stop:
00182 break;
00183 case an_ForwardOneshot:
00184 if( ++self->iFrame > self->lastFrame )
00185 {
00186 *frame = self->iFrame = self->lastFrame;
00187 self->aDir = an_Stop;
00188 return false;
00189 }
00190 break;
00191 case an_BackwardOneshot:
00192 if( --self->iFrame < self->firstFrame )
00193 {
00194 *frame = self->iFrame = self->firstFrame;
00195 self->aDir = an_Stop;
00196 return false;
00197 }
00198 break;
00199 case an_ForwardLoop:
00200 if( ++self->iFrame > self->lastFrame )
00201 self->iFrame = self->firstFrame;
00202 break;
00203 case an_BackwardLoop:
00204 if( --self->iFrame < self->firstFrame )
00205 self->iFrame = self->lastFrame;
00206 break;
00207 case an_ForwardPingPong:
00208 if( ++self->iFrame > self->lastFrame )
00209 {
00210 self->iFrame = self->lastFrame-1;
00211 self->aDir = an_BackwardPingPong;
00212 }
00213 break;
00214 case an_BackwardPingPong:
00215 if( --self->iFrame < self->firstFrame )
00216 {
00217 self->iFrame = self->firstFrame + 1;
00218 self->aDir = an_ForwardPingPong;
00219 }
00220 break;
00221 case an_Random:
00222 self->iFrame = self->firstFrame + (rand() % (1+self->lastFrame-self->firstFrame));
00223 break;
00224 }
00225
00226 }
00227 *frame = self->iFrame;
00228 return true;
00229 }
00230