// ---------------------------------------------------------------------------- // void SceneChannelFilterTask::generateProgram( AnimationDefinition* definition ) { double start_angle = 0.0; SceneChannelFilter* config = dynamic_cast<SceneChannelFilter *>( definition ); // Determine which channels will be participating for ( SceneActor& actor : getActors() ) { Fixture* pf = getActorRepresentative( actor.getActorUID() ); if ( !pf ) continue; for ( channel_address channel : config->getChannels() ) { if ( pf->getNumChannels() <= channel ) continue; // Each fixture may have a different start value so do independantly (and for random) ChannelValueArray value_array; // Get unmodified initial value BYTE start_value = actor.getFinalChannelValue( pf->getUID(), channel ); switch ( config->getFilter() ) { case CF_SINE_WAVE: start_angle += config->getOffset(); // We want this first to be able to offset multiple filters value_array = generateSineWave( start_value, start_angle, config->getAmplitude(), config->getStep() ); break; case CF_STEP_WAVE: value_array = generateStepWave( start_value, config->getStep() ); break; case CF_RAMP_UP: value_array = generateRampUp( start_value, config->getStep(), config->getAmplitude() ); break; case CF_RAMP_DOWN: value_array = generateRampDown( start_value, config->getStep(), config->getAmplitude() ); break; case CF_RANDOM: value_array = generateRandom( start_value, config->getAmplitude() ); break; } add( actor.getActorUID(), channel, CAM_LIST, value_array ); } } }
// ---------------------------------------------------------------------------- // bool HttpRestServices::query_scenes( CString& response, LPCSTR data ) { if ( !studio.getVenue() || !studio.getVenue()->isRunning() ) return false; JsonBuilder json( response ); json.startArray(); ScenePtrArray scenes = studio.getVenue()->getScenes(); std::sort( scenes.begin(), scenes.end(), CompareObjectNumber ); Scene* default_scene = studio.getVenue()->getDefaultScene(); UID active_uid = studio.getVenue()->getCurrentSceneUID(); for ( ScenePtrArray::iterator it=scenes.begin(); it != scenes.end(); it++ ) { Scene* scene = (*it); json.startObject(); json.add( "id", scene->getUID() ); json.add( "number", scene->getSceneNumber() ); json.add( "name", scene->getName() ); json.add( "bpm_rating", scene->getBPMRating() ); json.add( "description", scene->getDescription() ); json.add( "is_default", (scene == default_scene) ); json.add( "is_running", (active_uid == scene->getUID()) ); json.addArray<Acts>( "acts", scene->getActs() ); json.startArray( "actors" ); ActorPtrArray actors = scene->getActors(); for ( ActorPtrArray::iterator it=actors.begin(); it != actors.end(); ++it ) { Fixture* fixture = NULL; json.startObject(); json.add( "id", (*it)->getActorUID() ); json.add( "is_group", (*it)->isGroup() ); if ( (*it)->isGroup() ) { fixture = studio.getVenue()->getGroupRepresentative( (*it)->getActorUID() ); } else { fixture = studio.getVenue()->getFixture( (*it)->getActorUID() ); json.add( "address", (int)fixture->getAddress() ); } json.startArray( "channels" ); if ( fixture != NULL ) { for ( channel_t channel=0; channel < fixture->getNumChannels(); channel++ ) { Channel* ch = fixture->getChannel( channel ); BYTE value = (*it)->getChannelValue( fixture->mapChannel( channel ) ); ChannelValueRange* range = ch->getRange( value ); LPCSTR range_name = range ? range->getName() : ""; json.startObject(); json.add( "channel", (int)channel ); json.add( "name", ch->getName() ); json.add( "value", value ); json.add( "range_name", range_name ); json.endObject(); } } json.endArray( "channels" ); json.endObject(); } json.endArray( "actors" ); json.startArray( "animations" ); for ( size_t a=0; a < scene->getNumAnimations(); a++ ) { AbstractAnimation* animation = scene->getAnimation( a ); json.startObject(); json.add( "class_name", animation->getClassName() ); json.add( "name", animation->getName() ); json.add( "number", animation->getNumber() ); json.addArray<UIDArray>( "actors", animation->getActors() ); // Add common signal data AnimationSignal& signal = animation->signal(); json.startObject( "signal" ); json.add( "sample_rate_ms", signal.getSampleRateMS() ); json.add( "input_type", signal.getInputType() ); json.add( "input_low", signal.getInputLow() ); json.add( "input_high", signal.getInputHigh() ); json.add( "sample_decay_ms", signal.getSampleDecayMS() ); json.add( "scale_factor", signal.getScaleFactor() ); json.add( "max_threshold", signal.getMaxThreshold() ); json.add( "apply_to", signal.getApplyTo() ); json.endObject(); // Add animation specific data CString json_anim_name = JsonObject::encodeJsonString( animation->getClassName() ); json.startObject( json_anim_name ); if ( !strcmp( animation->getClassName(), SceneStrobeAnimator::className ) ) { SceneStrobeAnimator* ssa = (SceneStrobeAnimator*)animation; json.add( "strobe_neg_color", ssa->getStrobeNegColor() ); json.add( "strobe_pos_ms", ssa->getStrobePosMS() ); json.add( "strobe_neg_ms", ssa->getStrobeNegMS() ); } else if ( !strcmp( animation->getClassName(), ScenePatternDimmer::className ) ) { ScenePatternDimmer* spd = (ScenePatternDimmer*)animation; json.add( "dimmer_pattern", spd->getDimmerPattern() ); } else if ( !strcmp( animation->getClassName(), SceneSoundLevel::className ) ) { SceneSoundLevel* ssl = (SceneSoundLevel*)animation; json.add( "fade_what", ssl->getFadeWhat() ); } else if ( !strcmp( animation->getClassName(), SceneColorFader::className ) ) { SceneColorFader* scs = (SceneColorFader*)animation; json.add( "fader_effect", scs->getFaderEffect() ); json.add( "strobe_neg_color", scs->getStrobeNegColor() ); json.add( "strobe_pos_ms", scs->getStrobePosMS() ); json.add( "strobe_neg_ms", scs->getStrobeNegMS() ); json.addColorArray<RGBWAArray>( "color_progression", scs->getCustomColors() ); } else if ( !strcmp( animation->getClassName(), ScenePixelAnimator::className ) ) { ScenePixelAnimator* spa = (ScenePixelAnimator*)animation; json.add( "pixel_effect", spa->getEffect() ); json.add( "generations", spa->getGenerations() ); json.add( "pixels", spa->getPixels() ); json.add( "increment", spa->getIncrement() ); json.add( "fade", spa->isFadeColors() ); json.add( "combine", spa->getCombineFixtures() ); json.add( "pixel_off_color", spa->getEmptyColor() ); json.addColorArray<RGBWAArray>( "color_progression", spa->getCustomColors() ); } else if ( !strcmp( animation->getClassName(), SceneChannelFilter::className ) ) { SceneChannelFilter* scf = (SceneChannelFilter*)animation; json.add( "filter", scf->getFilter() ); json.add( "channel", scf->getChannel() ); json.add( "step", scf->getStep() ); json.add( "amplitude", scf->getAmplitude() ); json.add( "offset", scf->getOffset() ); } else if ( !strcmp( animation->getClassName(), SceneMovementAnimator::className ) ) { SceneMovementAnimator* sma = (SceneMovementAnimator*)animation; MovementAnimation& movement = sma->movement(); json.add( "movement_type", movement.m_movement_type ); json.add( "tilt_start_angle", movement.m_tilt_start ); json.add( "tilt_end_angle", movement.m_tilt_end ); json.add( "pan_start_angle", movement.m_pan_start ); json.add( "pan_end_angle", movement.m_pan_end ); json.add( "pan_increment", movement.m_pan_increment ); json.add( "speed", movement.m_speed ); json.add( "home_wait_periods", movement.m_home_wait_periods ); json.add( "dest_wait_periods", movement.m_dest_wait_periods ); json.add( "group_size", movement.m_group_size ); json.add( "positions", movement.m_positions ); json.add( "alternate_groups", movement.m_alternate_groups ); json.add( "blackout_return", movement.m_backout_home_return ); json.add( "run_once", movement.m_run_once ); json.add( "home_x", movement.m_home_x ); json.add( "home_y", movement.m_home_y ); json.add( "height", movement.m_height ); json.add( "fixture_spacing", movement.m_fixture_spacing ); json.add( "radius", movement.m_radius ); json.add( "head_number", movement.m_head_number ); json.startArray( "coordinates" ); for ( size_t index=0; index < movement.m_coordinates.size(); index++ ) { json.startObject(); json.add( "pan", movement.m_coordinates[index].m_pan ); json.add( "tilt", movement.m_coordinates[index].m_tilt ); json.endObject(); } json.endArray( "coordinates" ); } else if ( !strcmp( animation->getClassName(), SceneChannelAnimator::className ) ) { SceneChannelAnimator* sca = (SceneChannelAnimator*)animation; ChannelAnimationArray& chan_anims = sca->channelAnimations(); json.startArray( "channel_animations" ); for ( ChannelAnimationArray::iterator it=chan_anims.begin(); it != chan_anims.end(); ++it ) { json.startObject(); json.add( "actor_uid", (*it).getActorUID() ); json.add( "channel", (*it).getChannel() ); json.add( "style", (*it).getAnimationStyle() ); json.addArray<ChannelValueArray>( "values", (*it).getChannelValues() ); json.endObject(); } json.endArray( "channel_animations" ); } json.endObject( json_anim_name ); json.endObject(); } json.endArray( "animations" ); json.endObject(); } json.endArray(); return true; }