bool ShapeBase::playThread(U32 slot) { Thread& st = mScriptThread[slot]; if (st.sequence != -1 && st.state != Thread::Play) { setMaskBits(ThreadMaskN << slot); st.state = Thread::Play; updateThread(st); return true; } return false; } bool ShapeBase::setThreadPosition( U32 slot, F32 pos ) { Thread& st = mScriptThread[slot]; if (st.sequence != -1) { setMaskBits(ThreadMaskN << slot); st.position = pos; st.atEnd = false; updateThread(st); return true; } return false; } bool ShapeBase::setThreadDir(U32 slot,bool forward) { Thread& st = mScriptThread[slot]; if (st.sequence != -1) { if ( ( st.timescale >= 0.f ) != forward ) { setMaskBits(ThreadMaskN << slot); st.timescale *= -1.f ; st.atEnd = false; updateThread(st); } return true; } return false; } bool ShapeBase::setThreadTimeScale( U32 slot, F32 timeScale ) { Thread& st = mScriptThread[slot]; if (st.sequence != -1) { if (st.timescale != timeScale) { setMaskBits(ThreadMaskN << slot); st.timescale = timeScale; updateThread(st); } return true; } return false; } void ShapeBase::updateThread(Thread& st) { switch (st.state) { case Thread::Stop: { mShapeInstance->setTimeScale( st.thread, 1.f ); mShapeInstance->setPos( st.thread, ( st.timescale > 0.f ) ? 0.0f : 1.0f ); } // Drop through to pause state case Thread::Pause: { if ( st.position != -1.f ) { mShapeInstance->setTimeScale( st.thread, 1.f ); mShapeInstance->setPos( st.thread, st.position ); } mShapeInstance->setTimeScale( st.thread, 0.f ); stopThreadSound( st ); } break; case Thread::Play: { if (st.atEnd) { //mShapeInstance->setTimeScale(st.thread,1); mShapeInstance->setPos( st.thread, ( st.timescale > 0.f ) ? 1.0f : 0.0f ); //mShapeInstance->setTimeScale(st.thread,0); stopThreadSound(st); st.state = Thread::Stop; } else { if ( st.position != -1.f ) { //mShapeInstance->setTimeScale( st.thread, 1.f ); mShapeInstance->setPos( st.thread, st.position ); } //mShapeInstance->setTimeScale(st.thread, st.timescale ); if (!st.sound) { startSequenceSound(st); } } } break; case Thread::Destroy: { stopThreadSound(st); st.atEnd = true; st.sequence = -1; if(st.thread) { mShapeInstance->destroyThread(st.thread); st.thread = 0; } } break; } } bool ShapeBase::stopThread(U32 slot) { Thread& st = mScriptThread[slot]; if (st.sequence != -1 && st.state != Thread::Stop) { setMaskBits(ThreadMaskN << slot); st.state = Thread::Stop; updateThread(st); return true; } return false; }