void VariableAnimationSignalTransition::setAnimation(QAbstractAnimation * p_anim)
{
	if (!p_anim)
		return;
	clearAnimations();
	addAnimation(p_anim);
}
示例#2
0
// ----------------------------------------------------------------------------
//
void AnimationTask::stageScene( Scene* scene )
{
    CSingleLock lock( &m_animation_mutex, TRUE );

    clearAnimations();

    // Stage new scene animations
    m_scene = scene;

    memset( m_dmx_packet, 0, sizeof(m_dmx_packet) );

    m_venue->setHomePositions( m_dmx_packet );

    // Latch in scene actors
    m_venue->loadSceneChannels( m_dmx_packet, m_scene );

    // Initialize animations
    DWORD time_ms = GetCurrentTime();

    // Create animation clones and initialize
    AnimationPtrArray& animationPtrs = m_scene->animations();
    for ( size_t i=0; i < animationPtrs.size(); i++ ) {
        AbstractAnimation* anim = animationPtrs[i]->clone();
        anim->initAnimation( this, time_ms, m_dmx_packet );
        m_animations.push_back( anim );
    }

    m_load_channels = true;             // Make sure we load channels at least once
}
示例#3
0
// ----------------------------------------------------------------------------
//
bool AnimationTask::stop()
{
    clearAnimations();

    if ( !stopThread() )
        return false;

    return true;
}
示例#4
0
// ----------------------------------------------------------------------------
//
UINT AnimationTask::run(void) {
    DMXStudio::log_status( "Scene animator running" );

    m_load_channels = true;

    CSingleLock lock( &m_animation_mutex, FALSE );

    while ( isRunning() ) {
        try { 
            lock.Lock();

            DWORD time_ms = GetCurrentTime();
            bool changed = m_load_channels;
            m_load_channels = false;

            for ( AnimationPtrArray::iterator it=m_animations.begin(); it != m_animations.end(); ++it )
                changed |= (*it)->sliceAnimation( time_ms, m_dmx_packet );

            if ( m_venue->getWhiteout() == WHITEOUT_STROBE_SLOW ||
                 m_venue->getWhiteout() == WHITEOUT_STROBE_FAST ||
                 m_venue->getWhiteout() == WHITEOUT_STROBE_MANUAL )
                changed |= m_venue->m_whiteout_strobe.strobe( time_ms );

            if ( m_venue->isLightBlackout() )   // Already in blackout - don't need to push changes
                changed = false;

            // Check auto blackout situation
            if ( m_venue->getAutoBlackout() != 0 && m_venue->isMute() && !m_venue->isLightBlackout() ) {
                m_venue->setLightBlackout( true );
                if ( m_scene )
                    m_venue->loadSceneChannels( m_dmx_packet, m_scene );
                changed = true;
            }
            else if ( !m_venue->isMute() && m_venue->isLightBlackout() ) {
                m_venue->setLightBlackout( false );
                if ( m_scene )
                    m_venue->loadSceneChannels( m_dmx_packet, m_scene );
                // We should apply animation slice values here ...
                changed = true;
            }

            lock.Unlock();

            if ( changed )
                m_venue->writePacket( m_dmx_packet );

            Sleep(1);
        }
        catch ( std::exception& ex ) {
            DMXStudio::log( ex );

            if ( lock.IsLocked() )
                lock.Unlock();

            clearAnimations();
        }
    }

    DMXStudio::log_status( "Scene animator stopped" );

    return 0;
}