bool AVISurface::play(int startFrame, int endFrame, int initialFrame, uint flags, CGameObject *obj) { CMovieRangeInfo *info = new CMovieRangeInfo(); info->_startFrame = startFrame; info->_endFrame = endFrame; info->_isReversed = endFrame < startFrame; info->_initialFrame = 0; info->_isRepeat = flags & MOVIE_REPEAT; if (obj) { CMovieEvent *me = new CMovieEvent(); me->_type = MET_MOVIE_END; me->_startFrame = startFrame; me->_endFrame = endFrame; me->_initialFrame = 0; me->_gameObject = obj; info->addEvent(me); } _movieRangeInfo.push_back(info); if (_movieRangeInfo.size() == 1) { // First play call, so start the movie playing setReversed(info->_isReversed); return startAtFrame(initialFrame); } else { return true; } }
void insertClumpAfter(QueryState_t * QS, Clump_t * prevClump, Clump_t * newClump) { setReversed(newClump, QS->reversed); newClump->next = prevClump->next; prevClump->next = newClump; QS->clumpCount += 1; }
bool AVISurface::handleEvents(CMovieEventList &events) { if (!isPlaying()) return true; CMovieRangeInfo *info = _movieRangeInfo.front(); _priorFrame = _currentFrame; _currentFrame += _isReversed ? -1 : 1; int newFrame = _currentFrame; if ((info->_isReversed && newFrame < info->_endFrame) || (!info->_isReversed && newFrame > info->_endFrame)) { if (info->_isRepeat) { newFrame = info->_startFrame; } else { info->getMovieEnd(events); _movieRangeInfo.remove(info); delete info; if (_movieRangeInfo.empty()) { // No more ranges, so stop playback stop(); } else { // Not empty, so move onto new first one info = _movieRangeInfo.front(); newFrame = info->_startFrame; setReversed(info->_isReversed); } } } if (isPlaying()) { if (newFrame != getFrame()) { // The frame has been changed, so move to new position seekToFrame(newFrame); renderFrame(); } // Get any events for the given position info->getMovieFrame(events, newFrame); return renderFrame(); } else { return false; } }
/** * mirror by the axis defined by axisPoint1 and axisPoint2 */ void RS_Ellipse::mirror(RS_Vector axisPoint1, RS_Vector axisPoint2) { RS_Vector center=getCenter(); RS_Vector mp = center + getMajorP(); RS_Vector startpoint = getStartpoint(); RS_Vector endpoint = getEndpoint(); center.mirror(axisPoint1, axisPoint2); mp.mirror(axisPoint1, axisPoint2); startpoint.mirror(axisPoint1, axisPoint2); endpoint.mirror(axisPoint1, axisPoint2); setCenter(center); setReversed(!isReversed()); setMajorP(mp - center); if( std::isnormal(getAngle1()) || std::isnormal(getAngle2() ) ) { //only reset start/end points for ellipse arcs, i.e., angle1 angle2 are not both zero setAngle1( getEllipseAngle(startpoint)); setAngle2( getEllipseAngle(endpoint)); } /* old version data.majorP = mp - data.center; double a = axisPoint1.angleTo(axisPoint2); RS_Vector vec; vec.setPolar(1.0, data.angle1); vec.mirror(RS_Vector(0.0,0.0), axisPoint2-axisPoint1); data.angle1 = vec.angle() - 2*a; vec.setPolar(1.0, data.angle2); vec.mirror(RS_Vector(0.0,0.0), axisPoint2-axisPoint1); data.angle2 = vec.angle() - 2*a; data.reversed = (!data.reversed); */ //calculateEndpoints(); correctAngles();//avoid extra 2.*M_PI in angles calculateBorders(); }
void RS_ActionDrawArc::commandEvent(RS_CommandEvent* e) { QString c = e->getCommand().toLower(); if (RS_COMMANDS->checkCommand("help", c)) { if (RS_DIALOGFACTORY!=NULL) { RS_DIALOGFACTORY->commandMessage(msgAvailableCommands() + getAvailableCommands().join(", ")); } return; } if (RS_COMMANDS->checkCommand("reversed", c)) { e->accept(); setReversed(!isReversed()); if (RS_DIALOGFACTORY!=NULL) { RS_DIALOGFACTORY->requestOptions(this, true, true); } return; } switch (getStatus()) { case SetRadius: { bool ok; double r = RS_Math::eval(c, &ok); if (ok) { data.radius = r; setStatus(SetAngle1); e->accept(); } else { if (RS_DIALOGFACTORY!=NULL) { RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression")); } } } break; case SetAngle1: { bool ok; double a = RS_Math::eval(c, &ok); if (ok) { data.angle1 = RS_Math::deg2rad(a); e->accept(); setStatus(SetAngle2); } else { if (RS_DIALOGFACTORY!=NULL) { RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression")); } } } break; case SetAngle2: { if (RS_COMMANDS->checkCommand("angle", c)) { setStatus(SetIncAngle); } else if (RS_COMMANDS->checkCommand("chord length", c)) { setStatus(SetChordLength); } else { bool ok; double a = RS_Math::eval(c, &ok); if (ok) { data.angle2 = RS_Math::deg2rad(a); e->accept(); trigger(); } else { if (RS_DIALOGFACTORY!=NULL) { RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression")); } } } } break; case SetIncAngle: { bool ok; double a = RS_Math::eval(c, &ok); if (ok) { data.angle2 = data.angle1 + RS_Math::deg2rad(a); e->accept(); trigger(); } else { if (RS_DIALOGFACTORY!=NULL) { RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression")); } } } break; case SetChordLength: { bool ok; double l = RS_Math::eval(c, &ok); if (ok) { if (fabs(l/(2*data.radius))<=1.0) { data.angle2 = data.angle1 + asin(l/(2*data.radius)) * 2; trigger(); } else { if (RS_DIALOGFACTORY!=NULL) { RS_DIALOGFACTORY->commandMessage( tr("Not a valid chord length")); } } e->accept(); } else { if (RS_DIALOGFACTORY!=NULL) { RS_DIALOGFACTORY->commandMessage(tr("Not a valid expression")); } } } break; default: break; } }
// The nest two add clumps into the linked list of clumps for the query. void addClump(QueryState_t * QS, Clump_t * clump) { setReversed(clump, QS->reversed); QS->clumps = pushClump(clump, QS->clumps); QS->clumpCount += 1; }