Skip to main content
Inspiring
July 27, 2014
Answered

AEGP_LayerH from a PF_Param_LAYER?

  • July 27, 2014
  • 1 reply
  • 1225 views

After defining a layer parameter with PF_ADD_LAYER, how do I get a handle to the layer?  It's simple to get this from an expression, but I don't see where to get it from a plugin.

Even if I PF_CHECKOUT_PARAM explicitly, there doesn't seem to be any way to get from PF_ParamDef to AEGP_LayerH.

If it matters, this is during PF_Cmd_USER_CHANGED_PARAM.  I can get pixel data with PF_CHECKOUT_PARAM, but I need the layer handle to look at markers on the selected layer.  It seems like there the selected layer index should be in paramDef.uu.id, but it's always 0.

This topic has been closed for replies.
Correct answer zewt

Wow:

PF_Err get_layer_handle(PF_InData *in_data, AEGP_LayerH *layer_handle)

{

    AEGP_SuiteHandler suites(in_data->pica_basicP);

    PF_Err err = PF_Err_NONE;

    AEGP_EffectRefH  effect_handle = NULL;

    ERR(suites.PFInterfaceSuite1()->AEGP_GetNewEffectForEffect(plugin_id, in_data->effect_ref, &effect_handle));

    AEGP_StreamRefH stream_handle = NULL;

    ERR(suites.StreamSuite2()->AEGP_GetNewEffectStreamByIndex(CG_FRAME_DATA_LAYER, effect_handle, CG_FRAME_DATA_LAYER, &stream_handle));

    AEGP_LayerIDVal layer_id;

    {

        // Layer effects can't be keyframed, so the timestamp doesn't matter.

        A_Time timeT = {0,1};

        AEGP_StreamValue value;

        ERR(suites.StreamSuite2()->AEGP_GetNewStreamValue(plugin_id, stream_handle, AEGP_LTimeMode_LayerTime, &timeT, TRUE, &value));

        layer_id = value.val.layer_id;

        ERR(suites.StreamSuite2()->AEGP_DisposeStreamValue(&value));

    }

    AEGP_LayerH effect_layer_handle = NULL;

    ERR(suites.PFInterfaceSuite1()->AEGP_GetEffectLayer(in_data->effect_ref, &effect_layer_handle));

    AEGP_CompH comp_handle = NULL;

    ERR(suites.LayerSuite5()->AEGP_GetLayerParentComp(effect_layer_handle, &comp_handle));

    ERR(suites.LayerSuite8()->AEGP_GetLayerFromLayerID(comp_handle, layer_id, layer_handle));

    if(effect_handle != NULL)

        ERR(suites.EffectSuite2()->AEGP_DisposeEffect(effect_handle));

    return err;

}

I hope there's a simpler way to do something this basic.  The SDK documentation needs a major overhaul; I was only able to get this to work by combining several of the (not very cleanly-written) examples and a huge amount of web searching.

1 reply

zewtAuthorCorrect answer
Inspiring
July 27, 2014

Wow:

PF_Err get_layer_handle(PF_InData *in_data, AEGP_LayerH *layer_handle)

{

    AEGP_SuiteHandler suites(in_data->pica_basicP);

    PF_Err err = PF_Err_NONE;

    AEGP_EffectRefH  effect_handle = NULL;

    ERR(suites.PFInterfaceSuite1()->AEGP_GetNewEffectForEffect(plugin_id, in_data->effect_ref, &effect_handle));

    AEGP_StreamRefH stream_handle = NULL;

    ERR(suites.StreamSuite2()->AEGP_GetNewEffectStreamByIndex(CG_FRAME_DATA_LAYER, effect_handle, CG_FRAME_DATA_LAYER, &stream_handle));

    AEGP_LayerIDVal layer_id;

    {

        // Layer effects can't be keyframed, so the timestamp doesn't matter.

        A_Time timeT = {0,1};

        AEGP_StreamValue value;

        ERR(suites.StreamSuite2()->AEGP_GetNewStreamValue(plugin_id, stream_handle, AEGP_LTimeMode_LayerTime, &timeT, TRUE, &value));

        layer_id = value.val.layer_id;

        ERR(suites.StreamSuite2()->AEGP_DisposeStreamValue(&value));

    }

    AEGP_LayerH effect_layer_handle = NULL;

    ERR(suites.PFInterfaceSuite1()->AEGP_GetEffectLayer(in_data->effect_ref, &effect_layer_handle));

    AEGP_CompH comp_handle = NULL;

    ERR(suites.LayerSuite5()->AEGP_GetLayerParentComp(effect_layer_handle, &comp_handle));

    ERR(suites.LayerSuite8()->AEGP_GetLayerFromLayerID(comp_handle, layer_id, layer_handle));

    if(effect_handle != NULL)

        ERR(suites.EffectSuite2()->AEGP_DisposeEffect(effect_handle));

    return err;

}

I hope there's a simpler way to do something this basic.  The SDK documentation needs a major overhaul; I was only able to get this to work by combining several of the (not very cleanly-written) examples and a huge amount of web searching.

gabgren
Inspiring
January 31, 2019

Thanks !