// ---------------------------------------------------------------------------- // void ActorSelectField::init( ActorPtrArray& actors, UIDArray& selected_actor_uids ) { if ( actors.size() == 0 ) return; CString default_value; CString values; std::map<UID,CString> actor_to_id; for ( SceneActor * actor : actors ) { CString label; CString id; if ( actor->isGroup() ) { FixtureGroup* group = m_venue->getFixtureGroup( actor->getActorUID() ); label.Format( "%s", group->getName() ); id.Format( "G%lu", group->getNumber() ); } else { Fixture* pf = m_venue->getFixture( actor->getActorUID() ); label.Format( "%s @ %d", pf->getFullName(), pf->getAddress() ); id.Format( "%lu", pf->getFixtureNumber() ); } m_entries[ id ] = ActorSelectField::entry( id, label, *actor ); actor_to_id[ actor->getActorUID() ] = id; if ( default_value.GetLength() == 0 ) default_value = id; } // Preseve selected actor order for ( UID selected_uid : selected_actor_uids ) { std::map<UID,CString>::iterator it = actor_to_id.find( selected_uid ); if ( it != actor_to_id.end() ) { if ( values.GetLength() != 0 ) values += ","; values.Append( (*it).second ); } } if ( values.GetLength() == 0 ) setValue( default_value ); else setValue( values ); }
// ---------------------------------------------------------------------------- // NOTE: Dimmer channel should contain 0 for full off and 255 for full on and // no other values // void SceneMovementAnimatorTask::populateChannelAnimations( ParticipantArray& participants, size_t& particpant_index, AngleList& tilt, AngleList& pan, ChannelValueArray& dimmer, ChannelValueArray& speed, size_t group_size, bool run_once ) { size_t end = particpant_index + group_size; // If run once, add last entry to shut down the lights if ( run_once && dimmer.size() > 0 ) { dimmer.push_back( 0 ); } ChannelAnimationStyle style( run_once ? CAM_LIST_ONCE : CAM_LIST ); for ( ; particpant_index < end && particpant_index < participants.size(); particpant_index++ ) { channel_address pan_channel = participants[ particpant_index ].m_head.m_pan; channel_address tilt_channel = participants[ particpant_index ].m_head.m_tilt; channel_address dimmer_channel = participants[ particpant_index ].m_head.m_dimmer; channel_address speed_channel = participants[ particpant_index ].m_head.m_speed; UID actor_uid = participants[ particpant_index ].m_actor_uid; Fixture* pf = getActorRepresentative( actor_uid ); if ( !pf ) continue; if ( tilt_channel != INVALID_CHANNEL && tilt.size() ) { Channel* cp = pf->getChannel( tilt_channel ); add( actor_uid, tilt_channel, style, anglesToValues( cp, tilt, cp->getMinAngle(), cp->getMaxAngle() ) ); } if ( pan_channel != INVALID_CHANNEL && pan.size() ) { Channel* cp = pf->getChannel( pan_channel ); add( actor_uid, pan_channel, style, anglesToValues( cp, pan, cp->getMinAngle(), cp->getMaxAngle() ) ); } if ( speed_channel != INVALID_CHANNEL && speed.size() ) { add( actor_uid, speed_channel, style, speed ); } if ( dimmer_channel != INVALID_CHANNEL && dimmer.size() ) { Channel* ch = pf->getChannel( dimmer_channel ); STUDIO_ASSERT( ch, "Can't access dimmer channel %d on fixture %s", dimmer_channel, pf->getFullName() ); BYTE low = ch->getDimmerLowestIntensity(); BYTE high = ch->getDimmerHighestIntensity(); // Replace all 255 dimmer high value with the fixture's dimmer value iff the actors value != 0 SceneActor* actor = getActor( actor_uid ); if ( actor && actor->getFinalChannelValue( pf->getUID(), dimmer_channel ) != 0 ) high = actor->getFinalChannelValue( pf->getUID(), dimmer_channel ); if ( low != 0 || high != 255 ) { // Special case odd dimmer values for ( size_t i=0; i < dimmer.size(); i++ ) dimmer[i] = ( dimmer[i] == 255 ) ? high : low; } add( actor_uid, dimmer_channel, style, dimmer ); } } }