class Stage{ public: int ID; FaceGroup **faceGroup; int faceGroupSize; Fold fold; Stage( FILE *fp ){ ID = 0; faceGroup = new FaceGroup *[faceGroupSize = 1]; faceGroup[0] = new FaceGroup( fp ); } // pick Vector closestVertexPosition( Line &line ){ Vertex *closest=NULL; double distance = DBL_MAX; for( int i=0; iclosestVertex( line, v, d ); if( d < distance ){ closest = v; distance = d; } } return closest->position; } void labelPickedCandidate( Vector &position ){ for( int i=0; ilabelPickedCandidate( position ); } Vector pick( Line &cursorLine ){ this->labelPickedCandidate( this->closestVertexPosition(cursorLine) ); for( int i=0; faceGroupSize; i++ ){ if( fold.setPick( *faceGroup[i], cursorLine.direction ) ) return fold.pickedVertexPosition(); } Vector v(0,0,0); return v; } //renew bool renew(){ if( fold.pickedFaceGroup()->renew( ID+1, fold )==RenewFailure ) return true; else return false; } bool renew( Vector &destination, Vector &eyePosition, bool inBending ){ if( fold.update( destination, eyePosition, inBending ) ) return true; // error return this->renew(); } int childFaceGroupSize(){ return fold.isBend() ? faceGroupSize + 1 : faceGroupSize; }; bool isPickedFaceGroup( int n ){ return faceGroup[n] == fold.pickedFaceGroup(); } Stage( Stage &parentStage ){ ID = parentStage.ID + 1; faceGroupSize = parentStage.childFaceGroupSize(); faceGroup = new FaceGroup *[faceGroupSize]; for( int i=0; inormal = parentStage.fold.rotateNormal( parentStage.fold.pickedFaceGroup()->normal ); } } //reset ~Stage(){ if( faceGroup == NULL ) return; if( faceGroup[faceGroupSize-1]->birthStage == ID ) delete faceGroup[faceGroupSize-1]; delete faceGroup; } void reset(){ fold.pickedFaceGroup()->reset( ID+1 ); } //draw void draw( Vector &eyePosition, FaceProperty &faceProperty ){ FaceGroup **renderGroup = new FaceGroup *[faceGroupSize]; renderGroup[0] = faceGroup[0]; int i; for( i=1; i=0 && renderGroup[j]->sort( *renderGroup[j+1], eyePosition ) == 1 ){ FaceGroup *tmp = renderGroup[j]; renderGroup[j] = renderGroup[j+1]; renderGroup[j+1] = tmp; j--; } } for( i=faceGroupSize-1; i>=0; i-- ) renderGroup[i]->draw( eyePosition, faceProperty );//render from far to near delete renderGroup; } // file io void saveFold( FILE *fp ){ fold.save( fp ); } bool loadFold( FILE *fp ){ return fold.load( fp, faceGroup ); } };