diff --git a/docs/aegps/aegp-details.md b/docs/aegps/aegp-details.md index 38738ef..7542aff 100644 --- a/docs/aegps/aegp-details.md +++ b/docs/aegps/aegp-details.md @@ -36,4 +36,4 @@ After Effects computes rotation based on auto-orientation (towards path, or poin ## Accessing Pixels From Effect Layer Parameters -Use `AEGP_GetNewStreamValue` (in [AEGP_StreamSuite5](aegp-suites.md#aegp_streamsuite5)) to get the layer's `layer_id`, then the new `AEGP_GetLayerFromLayerID` (in [AEGP_LayerSuite9](aegp-suites.md#aegp_layersuite9)) to get the `AEGP_LayerH`. +Use `AEGP_GetNewStreamValue` (in [AEGP_StreamSuite7](aegp-suites.md#aegp_streamsuite7)) to get the layer's `layer_id`, then the new `AEGP_GetLayerFromLayerID` (in [AEGP_LayerSuite9](aegp-suites.md#aegp_layersuite9)) to get the `AEGP_LayerH`. diff --git a/docs/aegps/aegp-suites.md b/docs/aegps/aegp-suites.md index 656114f..434b7b5 100644 --- a/docs/aegps/aegp-suites.md +++ b/docs/aegps/aegp-suites.md @@ -45,7 +45,7 @@ As mentioned earlier, AEGPs do everything through suites. The following suites a +---------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ | [Keyframe Suite](#aegp_keyframesuite3) | Used to access and manipulate all keyframe data. | +---------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| [Marker Suite](#aegp_markersuite2) | Used to manipulate markers. Use `AEGP_GetNewCompMarkerStream()` (in [AEGP_CompSuite11](#aegp_compsuite11)) to get the composition marker stream. | +| [Marker Suite](#aegp_markersuite2) | Used to manipulate markers. Use `AEGP_GetNewCompMarkerStream()` (in [AEGP_CompSuite13](#aegp_compsuite13)) to get the composition marker stream. | +---------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ | [Mask Suite](#aegp_masksuite6) | Provides access to retrieve information about a layer's masks. | +---------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -87,6 +87,10 @@ As mentioned earlier, AEGPs do everything through suites. The following suites a +---------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ | [File Import Manager Suite](#file-import-manager-suite) | Registers AEGP file and project importers as part of After Effects' file handling. | +---------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [Guide Suite](#aegp_guidesuite2) | Read and write the guides shown in Composition, Layer, and Footage views, including orientation, position, color, and edge pinning. | ++---------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [Item View Suite](#aegp_itemviewsuite2) | Query and set the per-view guide display options: visible, snap, and locked. | ++---------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ --- @@ -467,7 +471,7 @@ Unless more specificity is required for the function(s) you're using, remain as +--------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | `AEGP_SelectItem` | Toggles the selection state of the item, and (depending on `deselect_othersB`) can deselect other items. This call selects items in the Project panel. | | | | -| | To make selections in the Composition panel, use `AEGP_SetSelection` from [AEGP_CompSuite11](#aegp_compsuite11). | +| | To make selections in the Composition panel, use `AEGP_SetSelection` from [AEGP_CompSuite13](#aegp_compsuite13). | | | | | |
AEGP_SelectItem(
AEGP_ItemH itemH,
A_Boolean selectB,
A_Boolean deselect_othersB); |
+--------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
@@ -612,6 +616,164 @@ Unless more specificity is required for the function(s) you're using, remain as
---
+## Guides
+
+The `AEGP_GuideSuite` lets plug-ins read and write the guides shown in Composition, Layer, and Footage views. Guides are accessed per item or per layer, by index.
+
+The suite exposes two generations of accessors. The base functions cover orientation plus a pixel position. The extended `*2` functions (new in `AEGP_GuideSuite2`) add percentage positioning, a per-guide color, and edge pinning. Acquiring `AEGP_GuideSuite2` gives you both.
+
+!!! note
+ Guide position values are normalized when applied: pixel positions are clamped to ±100,000 px, percentage positions to ±300%. Non-finite values (NaN, Infinity) are rejected and not applied.
+
+!!! note
+ When guide colors, percentage positioning, or edge pinning are in use, the base accessors still operate, but they report only the orientation and raw position value; a base getter may therefore return a percentage value in `outPositionP` without indicating the position type. Use the `*2` accessors to read the position type, color, and pinned flag.
+
+### Guide types
+
+```cpp
+enum {
+ AEGP_GuideOrientationType_HORIZONTAL = 0,
+ AEGP_GuideOrientationType_VERTICAL = 1
+};
+typedef A_long AEGP_GuideOrientationType;
+
+enum {
+ AEGP_GuidePositionType_PIXEL = 0,
+ AEGP_GuidePositionType_PERCENTAGE = 1
+};
+typedef A_long AEGP_GuidePositionType;
+
+typedef struct {
+ A_FpLong red; // 0.0 - 1.0
+ A_FpLong green; // 0.0 - 1.0
+ A_FpLong blue; // 0.0 - 1.0
+} AEGP_GuideColor;
+```
+
+### AEGP_GuideSuite2
+
+!!! note
+ Suite version 2 (`kAEGPGuideSuiteVersion2`), available in After Effects 26.2 and later. The base functions were introduced in `AEGP_GuideSuite1` (available in After Effects 26.0 and later) and are re-exposed here unchanged; the extended `*2` functions are new in version 2.
+
+The `*2` functions add a position type (pixel or percentage), a per-guide color, and a pinned flag (pin to the opposite edge - bottom for horizontal guides, right for vertical guides). Position clamping and non-finite rejection apply as described above.
+
+
++------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Function | Purpose |
++==============================+=======================================================================================================================================================================================================================================================================================================================================================================================================+
+| `AEGP_GetLayerNumGuides` | Returns the number of guides on a layer. |
+| | |
+| | AEGP_GetLayerNumGuides(
AEGP_LayerH inLayerH,
A_long \*outNumGuidesP); |
++------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_GetItemNumGuides` | Returns the number of guides on an item. |
+| | |
+| | AEGP_GetItemNumGuides(
AEGP_ItemH inItemH,
A_long \*outNumGuidesP); |
++------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_GetLayerGuideByIndex` | Retrieves a layer guide's orientation and pixel position. |
+| | |
+| | AEGP_GetLayerGuideByIndex(
AEGP_LayerH inLayerH,
A_long inGuideIndex,
AEGP_GuideOrientationType \*outOrientationP,
A_FpLong \*outPositionP); |
++------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_GetItemGuideByIndex` | Retrieves an item guide's orientation and pixel position. |
+| | |
+| | AEGP_GetItemGuideByIndex(
AEGP_ItemH inItemH,
A_long inGuideIndex,
AEGP_GuideOrientationType \*outOrientationP,
A_FpLong \*outPositionP); |
++------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_AddLayerGuide` | Adds a guide to a layer and returns its index. |
+| | |
+| | AEGP_AddLayerGuide(
AEGP_LayerH inLayerH,
AEGP_GuideOrientationType inOrientation,
A_FpLong inPosition,
A_long \*outGuideIndexP); |
++------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_AddItemGuide` | Adds a guide to an item and returns its index. |
+| | |
+| | AEGP_AddItemGuide(
AEGP_ItemH inItemH,
AEGP_GuideOrientationType inOrientation,
A_FpLong inPosition,
A_long \*outGuideIndexP); |
++------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_SetLayerGuide` | Sets the pixel position of an existing layer guide. |
+| | |
+| | AEGP_SetLayerGuide(
AEGP_LayerH inLayerH,
A_long inGuideIndex,
A_FpLong inPosition); |
++------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_SetItemGuide` | Sets the pixel position of an existing item guide. |
+| | |
+| | AEGP_SetItemGuide(
AEGP_ItemH inItemH,
A_long inGuideIndex,
A_FpLong inPosition); |
++------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_RemoveLayerGuide` | Removes the guide at the given index from a layer. |
+| | |
+| | AEGP_RemoveLayerGuide(
AEGP_LayerH inLayerH,
A_long inGuideIndex); |
++------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_RemoveItemGuide` | Removes the guide at the given index from an item. |
+| | |
+| | AEGP_RemoveItemGuide(
AEGP_ItemH inItemH,
A_long inGuideIndex); |
++------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_GetLayerGuideByIndex2` | New in `AEGP_GuideSuite2`. Retrieves a layer guide's full state. |
+| | |
+| | AEGP_GetLayerGuideByIndex2(
AEGP_LayerH inLayerH,
A_long inGuideIndex,
AEGP_GuideOrientationType \*outOrientationP,
AEGP_GuidePositionType \*outPositionTypeP,
A_FpLong \*outPositionP,
AEGP_GuideColor \*outColorP,
A_Boolean \*outPinnedP); |
++------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_GetItemGuideByIndex2` | New in `AEGP_GuideSuite2`. Retrieves an item guide's full state. |
+| | |
+| | AEGP_GetItemGuideByIndex2(
AEGP_ItemH inItemH,
A_long inGuideIndex,
AEGP_GuideOrientationType \*outOrientationP,
AEGP_GuidePositionType \*outPositionTypeP,
A_FpLong \*outPositionP,
AEGP_GuideColor \*outColorP,
A_Boolean \*outPinnedP); |
++------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_AddLayerGuide2` | New in `AEGP_GuideSuite2`. Adds a fully-specified guide to a layer and returns its index. Position is clamped to the allowed range. |
+| | |
+| | AEGP_AddLayerGuide2(
AEGP_LayerH inLayerH,
AEGP_GuideOrientationType inOrientation,
AEGP_GuidePositionType inPositionType,
A_FpLong inPosition,
const AEGP_GuideColor \*inColorP,
A_Boolean inPinned,
A_long \*outGuideIndexP); |
++------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_AddItemGuide2` | New in `AEGP_GuideSuite2`. Adds a fully-specified guide to an item and returns its index. Position is clamped to the allowed range. |
+| | |
+| | AEGP_AddItemGuide2(
AEGP_ItemH inItemH,
AEGP_GuideOrientationType inOrientation,
AEGP_GuidePositionType inPositionType,
A_FpLong inPosition,
const AEGP_GuideColor \*inColorP,
A_Boolean inPinned,
A_long \*outGuideIndexP); |
++------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_SetLayerGuide2` | New in `AEGP_GuideSuite2`. Updates all properties of an existing layer guide. Position is clamped (pixel ±100,000, percentage ±300%). |
+| | |
+| | AEGP_SetLayerGuide2(
AEGP_LayerH inLayerH,
A_long inGuideIndex,
AEGP_GuideOrientationType inOrientation,
AEGP_GuidePositionType inPositionType,
A_FpLong inPosition,
const AEGP_GuideColor \*inColorP,
A_Boolean inPinned); |
++------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_SetItemGuide2` | New in `AEGP_GuideSuite2`. Updates all properties of an existing item guide. Position is clamped (pixel ±100,000, percentage ±300%). |
+| | |
+| | AEGP_SetItemGuide2(
AEGP_ItemH inItemH,
A_long inGuideIndex,
AEGP_GuideOrientationType inOrientation,
AEGP_GuidePositionType inPositionType,
A_FpLong inPosition,
const AEGP_GuideColor \*inColorP,
A_Boolean inPinned); |
++------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+
+---
+
+## Item Views
+
+The `AEGP_ItemViewSuite` provides access to the per-view guide display toggles (visible, snap, locked). These mirror the `ViewOptions` guide properties available to scripting.
+
+### AEGP_ItemViewSuite2
+
+!!! note
+ The guide display functions were added to `AEGP_ItemViewSuite` version 2 (`kAEGPItemViewSuiteVersion2`, available in After Effects 26.0 and later). `AEGP_GetItemViewPlaybackTime` is unchanged from the prior version.
+
+
++---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Function | Purpose |
++=================================+=======================================================================================================================================================================+
+| `AEGP_GetItemViewPlaybackTime` | Returns the view's playback time if previewing is active, otherwise the current associated item time. |
+| | `is_currently_previewingPB0` reports whether the returned time is the playback time (`TRUE`) or the item's current time |
+| | (`FALSE`). |
+| | |
+| | AEGP_GetItemViewPlaybackTime(
AEGP_ItemViewP item_viewP,
A_Boolean \*is_currently_previewingPB0,
A_Time \*curr_timePT); |
++---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_GetItemViewGuidesVisible` | Returns whether guides are visible in the view. |
+| | |
+| | AEGP_GetItemViewGuidesVisible(
AEGP_ItemViewP item_viewP,
A_Boolean \*guides_visiblePB); |
++---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_SetItemViewGuidesVisible` | Sets whether guides are visible in the view. |
+| | |
+| | AEGP_SetItemViewGuidesVisible(
AEGP_ItemViewP item_viewP,
A_Boolean guides_visibleB); |
++---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_GetItemViewGuidesSnap` | Returns whether snapping to guides is enabled. |
+| | |
+| | AEGP_GetItemViewGuidesSnap(
AEGP_ItemViewP item_viewP,
A_Boolean \*guides_snapPB); |
++---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_SetItemViewGuidesSnap` | Sets whether snapping to guides is enabled. |
+| | |
+| | AEGP_SetItemViewGuidesSnap(
AEGP_ItemViewP item_viewP,
A_Boolean guides_snapB); |
++---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_GetItemViewGuidesLocked` | Returns whether guides are locked in the view. |
+| | |
+| | AEGP_GetItemViewGuidesLocked(
AEGP_ItemViewP item_viewP,
A_Boolean \*guides_lockedPB); |
++---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_SetItemViewGuidesLocked` | Sets whether guides are locked in the view. |
+| | |
+| | AEGP_SetItemViewGuidesLocked(
AEGP_ItemViewP item_viewP,
A_Boolean guides_lockedB); |
++---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+
+---
+
## Managing Selections
This suite manages selection states, mirroring the functionality supplied by vectors in the C++ Standard Template Library.
@@ -664,9 +826,9 @@ When `AEGP_StreamRefHs` are inserted into a collection, they are adopted by the
## Manipulate Compositions
-Provide information about the compositions in a project, and create cameras, lights, and solids.
+Provide information about the compositions in a project, and create cameras, lights, solids, and parametric mesh layers.
-### AEGP_CompSuite11
+### AEGP_CompSuite13
+---------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Function | Purpose |
@@ -876,7 +1038,18 @@ Provide information about the compositions in a project, and create cameras, lig
+---------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| `AEGP_ReorderCompSelection` | Move the selection to a certain layer index. Use along with `AEGP_SetSelection().` |
| | |
-| | AEGP_SetCompDisplayDropFrame(
AEGP_CompH compH,
A_long index); |
+| | AEGP_ReorderCompSelection(
AEGP_CompH compH,
A_long index); |
++---------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_CreateParametricMeshLayerInComp` | New in 26.5. Creates and adds a parametric mesh layer to the specified composition. |
+| | |
+| | AEGP_CreateParametricMeshLayerInComp(
AEGP_CompH parent_compH,
AEGP_ParametricMeshType mesh_type,
AEGP_LayerH \*new_parametric_mesh_layerPH); |
+| | |
+| | - `AEGP_ParametricMeshType_CUBE` |
+| | - `AEGP_ParametricMeshType_SPHERE` |
+| | - `AEGP_ParametricMeshType_PLANE` |
+| | - `AEGP_ParametricMeshType_TORUS` |
+| | - `AEGP_ParametricMeshType_CONE` |
+| | - `AEGP_ParametricMeshType_CYLINDER` |
+---------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
---
@@ -1302,7 +1475,9 @@ As most After Effects usage boils down to layer manipulation, this is among the
| | - `AEGP_ObjectType_LIGHT` |
| | - `AEGP_ObjectType_CAMERA` |
| | - `AEGP_ObjectType_TEXT` |
+| | - `AEGP_ObjectType_VECTOR` |
| | - `AEGP_ObjectType_3D_MODEL`, New in 24.4. |
+| | - `AEGP_ObjectType_3D_PARAMETRIC_MESH`, New in 26.5. |
+-------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| `AEGP_IsLayer3D` | Is the footage item a 3D layer. All AV layers are either 2D or 3D. |
| | |
@@ -1469,7 +1644,7 @@ If Foobarocity is applied to a layer twice, there will be two distinct `AEGP_Eff
| | |
| | Do not use the value(s) in the ParamDef returned by this function (Use `AEGP_GetNewStreamValue()` instead); it's provided so AEGPs can access parameter defaults, checkbox names, and pop-up strings. |
| | |
-| | Use `AEGP_GetEffectNumParamStreams()` from [AEGP_StreamSuite5](#aegp_streamsuite5) to get the stream count, useful for determining the maximum `param_index`. The last parameter is optional. |
+| | Use `AEGP_GetEffectNumParamStreams()` from [AEGP_StreamSuite7](#aegp_streamsuite7) to get the stream count, useful for determining the maximum `param_index`. The last parameter is optional. |
| | |
| | AEGP_GetEffectParamUnionByIndex(
AEGP_PluginID aegp_plugin_id,
AEGP_EffectRefH effectH,
PF_ParamIndex param_index,
PF_ParamType \*param_typeP
PF_ParamDefUnion \*uP0); |
+---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
@@ -1612,7 +1787,7 @@ A stream, once acquired, represents a value which may change over time. Not all
There are two ways to access the value of a stream. If the stream has keyframes, you can use the [Working With Keyframes](#working-with-keyframes). The values provided won't reflect the influence of expressions. Note: In any expression, the current keyframed value is always available as the variable value.
-You can also use `AEGP_GetNewStreamValue` from [AEGP_StreamSuite5](#aegp_streamsuite5), which samples the value of the stream at a particular time. For streams without expressions or keyframes, the time parameter is meaningless, and the function returns what essentially is the constant value of the stream. Use `AEGP_SetStreamValue` (which doesn't take a time as a parameter) to set these streams.
+You can also use `AEGP_GetNewStreamValue` from [AEGP_StreamSuite7](#aegp_streamsuite7), which samples the value of the stream at a particular time. For streams without expressions or keyframes, the time parameter is meaningless, and the function returns what essentially is the constant value of the stream. Use `AEGP_SetStreamValue` (which doesn't take a time as a parameter) to set these streams.
Many StreamSuite functions populate a StreamH, which your AEGP must dispose. when done. After Effects allocates and passes you a copy of the values, not a direct handle to the original value. `AEGP_GetNewLayerStream()` is restricted to streams for which no memory allocation is required to access their values.
@@ -1652,7 +1827,7 @@ Use `IsStreamLegal` to allow you to determine if that stream type is offered on
Since a layer can have multiple masks, access the masks using `AEGP_GetLayerMaskByIndex` from [AEGP_MaskSuite6](#aegp_masksuite6).
-Masks don't have streams like layers do; they get their own enumeration. Access their streams using `AEGP_GetNewMaskStream` from [AEGP_StreamSuite5](#aegp_streamsuite5).
+Masks don't have streams like layers do; they get their own enumeration. Access their streams using `AEGP_GetNewMaskStream` from [AEGP_StreamSuite7](#aegp_streamsuite7).
---
@@ -1660,7 +1835,7 @@ Masks don't have streams like layers do; they get their own enumeration. Access
They can have a variable number of streams/parameters, and the order and definition of them is not known when the AEGP is written.
-Therefore we cannot offer an enum for selecting them, and instead you must get them by index, hence `GetNewEffectStreamByIndex` from [AEGP_StreamSuite5](#aegp_streamsuite5).
+Therefore we cannot offer an enum for selecting them, and instead you must get them by index, hence `GetNewEffectStreamByIndex` from [AEGP_StreamSuite7](#aegp_streamsuite7).
---
@@ -1668,7 +1843,10 @@ Therefore we cannot offer an enum for selecting them, and instead you must get t
Access and manipulate the values of a layer's streams. For paint and text streams, use [Dynamic Streams](#aegp_dynamicstreamsuite4) instead.
-### AEGP_StreamSuite5
+### AEGP_StreamSuite7
+
+!!! note
+ Suite version 7. Version 6 (available in After Effects 22.5 and later) added `AEGP_GetUniqueStreamID`; version 7 adds independent get/set of the render stage of a `PF_Param_LAYER` stream (the `AEGP_LayerParamStage` accessors at the end of this section). All earlier functions are unchanged, so acquiring `AEGP_StreamSuite7` gives you the whole API.
+----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Function | Purpose |
@@ -1683,8 +1861,6 @@ Access and manipulate the values of a layer's streams. For paint and text stream
+----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| `AEGP_GetValidInterpolations` | Retrieves an `AEGP_KeyInterpolationMask` indicating which interpolation types are valid for the `AEGP_StreamRefH`. |
| | |
-| | AEGP_GetValidInterpolations(
AEGP_StreamRefH streamH,
AEGP_KeyInterpolationMask \*valid_interpP); |
-+----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| | `AEGP_KeyInterpolationMask` will be a combination of the following: |
| | |
| | - `AEGP_KeyInterpMask_NONE` |
@@ -1693,6 +1869,8 @@ Access and manipulate the values of a layer's streams. For paint and text stream
| | - `AEGP_KeyInterpMask_HOLD` |
| | - `AEGP_KeyInterpMask_CUSTOM` |
| | - `AEGP_KeyInterpMask_ANY` |
+| | |
+| | AEGP_GetValidInterpolations(
AEGP_StreamRefH streamH,
AEGP_KeyInterpolationMask \*valid_interpP); |
+----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| `AEGP_GetNewLayerStream` | Get a layer's data stream. Plug-in must dispose of `streamPH`. Note that this will not provide keyframe access; use the [AEGP_KeyframeSuite](#aegp_keyframesuite3) instead. |
| | |
@@ -1774,7 +1952,7 @@ Access and manipulate the values of a layer's streams. For paint and text stream
| | - `AEGP_LayerStream_BEGIN` = `AEGP_LayerStream_ANCHORPOINT` |
| | - `AEGP_LayerStream_END` = `AEGP_LayerStream_LIGHT_FALLOFF_DISTANCE + 1` |
| | |
-| | enum {
AEGP_LightFalloff_NONE = 0,
AEGP_LightFalloff_SMOOTH,
AEGP_LightFalloff_INVERSE_SQUARE_CLAMPED
};
typedef A_u_long AEGP_LightFalloffType; |
+| | enum {
AEGP_LightFalloff_NONE = 0,
AEGP_LightFalloff_SMOOTH,
AEGP_LightFalloff_INVERSE_SQUARE_CLAMPED
};
typedef A_u_long AEGP_LightFalloffType; |
+----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| `AEGP_GetEffectNumParamStreams` | Get number of parameter streams associated with an effect. |
| | |
@@ -1891,6 +2069,55 @@ Access and manipulate the values of a layer's streams. For paint and text stream
| | AEGP_DuplicateStreamRef(
AEGP_PluginID aegp_plugin_id,
AEGP_StreamRefH streamH,
AEGP_StreamRefH \*dup_streamPH); |
+----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+The following function was added after version 5:
+
++------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Function | Purpose |
++==========================================+=============================================================================================================================================================================================================================================================================================================+
+| `AEGP_GetUniqueStreamID` | New in version 6 (available in After Effects 22.5 and later). Returns a session-unique numeric ID for the stream referenced by `streamH`. |
+| | |
+| | AEGP_GetUniqueStreamID(
AEGP_StreamRefH streamH,
A_long \*outIDP); |
++------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+
+Version 7 adds independent access to the *render stage* of a `PF_Param_LAYER` stream — the point in the source layer's render pipeline at which its output is sampled. Such a stream carries two independent values: the source layer (`AEGP_StreamValue2::layer_id`) and the render stage, an `AEGP_LayerParamStage`:
+
+```cpp
+enum {
+ AEGP_LayerParamStage_SOURCE = 0, // source layer pixels, before masks and effects (default)
+ AEGP_LayerParamStage_ONLY_MASKS = -2, // source layer with masks applied, effects skipped
+ AEGP_LayerParamStage_ALL_EFFECTS = -1 // source layer with masks and all effects applied
+ // 1..N - render the source layer through effect index N (1-based)
+};
+typedef A_long AEGP_LayerParamStage;
+```
+
+!!! note
+ All five functions below require `streamH` to be a `PF_Param_LAYER` stream and return `Err_PARAMETER` otherwise. Stage values need no disposal; any `AEGP_StreamValue2` output must be freed with `AEGP_DisposeStreamValue`.
+
++------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Function | Purpose |
++==========================================+=============================================================================================================================================================================================================================================================================================================+
+| `AEGP_GetStreamLayerParamStageValue` | Returns the current render stage of a `PF_Param_LAYER` stream. |
+| | |
+| | AEGP_GetStreamLayerParamStageValue(
AEGP_PluginID aegp_plugin_id,
AEGP_StreamRefH streamH,
AEGP_LayerParamStage \*stage_outP); |
++------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_SetStreamLayerParamStageValue` | Sets the render stage without changing the source layer. |
+| | |
+| | AEGP_SetStreamLayerParamStageValue(
AEGP_PluginID aegp_plugin_id,
AEGP_StreamRefH streamH,
AEGP_LayerParamStage stage); |
++------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_GetStreamLayerParamAndStageValue` | Returns both the source layer and the render stage in one call. Dispose `valueP` with `AEGP_DisposeStreamValue`. |
+| | |
+| | AEGP_GetStreamLayerParamAndStageValue(
AEGP_PluginID aegp_plugin_id,
AEGP_StreamRefH streamH,
AEGP_StreamValue2 \*valueP,
AEGP_LayerParamStage \*stage_outP); |
++------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_SetStreamLayerParamAndStageValue` | Sets both the source layer and the render stage atomically, as a single undo step. |
+| | |
+| | AEGP_SetStreamLayerParamAndStageValue(
AEGP_PluginID aegp_plugin_id,
AEGP_StreamRefH streamH,
AEGP_StreamValue2 \*valueP,
AEGP_LayerParamStage stage); |
++------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| `AEGP_GetStreamInputStageCycleSafeLimit` | Returns the highest stage value that will not introduce a render cycle, given the current project state. Re-query before each use, as the result changes when effects are added, removed, or reordered, or when the source layer changes. `AEGP_LayerParamStage_SOURCE` (0) is always safe. |
+| | |
+| | AEGP_GetStreamInputStageCycleSafeLimit(
AEGP_PluginID aegp_plugin_id,
AEGP_StreamRefH streamH,
AEGP_LayerParamStage \*max_stage_outP); |
++------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+
---
## Dynamic Streams
@@ -2031,7 +2258,7 @@ Also note that, often, you can simply use [Stream Suite](#stream-suite) calls to
+-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| `AEGP_GetMatchName` | Retrieves the match name for the specified `AEGP_StreamRefH`. |
| | |
-| | Note that this may differ from the display name, which can be retrieves using `AEGP_GetStreamName`, in [AEGP_StreamSuite5](#aegp_streamsuite5). |
+| | Note that this may differ from the display name, which can be retrieves using `AEGP_GetStreamName`, in [AEGP_StreamSuite7](#aegp_streamsuite7). |
| | |
| | `nameZ` can be up to `AEGP_MAX_STREAM_MATCH_NAME_SIZE` in length. |
| | |
diff --git a/docs/aegps/cheating-effect-usage-of-aegp-suites.md b/docs/aegps/cheating-effect-usage-of-aegp-suites.md
index 74a3561..0b1794b 100644
--- a/docs/aegps/cheating-effect-usage-of-aegp-suites.md
+++ b/docs/aegps/cheating-effect-usage-of-aegp-suites.md
@@ -2,7 +2,7 @@
As soon as we showed developers the initial implementation of AEGP suites, they wanted to "cheat" and use them from within effects. This is certainly possible, but please keep in mind that depending on factors outside the effect API (i.e., any information you get from the AEGP APIs) can lead to trouble. If After Effects thinks an effect has all the information it needs to render, it won't (for example) update its parameters based on changes made through an AEGP function. We're actively working on this dependency issue for future versions, but bear it in mind as you write effects which "masquerade" as AEGPs.
-Effects can use some AEGP suites to take advantage of camera and lighting information, as well as the `AEGP_GetLayerParentComp` and `AEGP_GetCompBGColor` functions, from [AEGP_CompSuite11](aegp-suites.md#aegp_compsuite11). This should not be interpreted to mean that effects can use *any* AEGP suite calls. Also, see [Effect UI & Events](../effect-ui-events/effect-ui-events.md) for more information on effects adding keyframes.
+Effects can use some AEGP suites to take advantage of camera and lighting information, as well as the `AEGP_GetLayerParentComp` and `AEGP_GetCompBGColor` functions, from [AEGP_CompSuite13](aegp-suites.md#aegp_compsuite13). This should not be interpreted to mean that effects can use *any* AEGP suite calls. Also, see [Effect UI & Events](../effect-ui-events/effect-ui-events.md) for more information on effects adding keyframes.
[AEGP_PFInterfaceSuite](aegp-suites.md#aegp_pfinterfacesuite1) is the starting point. The functions in this suite allow you to retrieve the AEGP_LayerH for the layer to which the effect is applied, and the AEGP_EffectRefH for the instance of your effect. `AEGP_RegisterWithAEGP` from [AEGP_UtilitySuite6](aegp-suites.md#aegp_utilitysuite6) allows you to get an AEGP_PluginID, which is needed for many AEGP calls.
diff --git a/docs/aegps/data-types.md b/docs/aegps/data-types.md
index 52db9ce..39e8feb 100644
--- a/docs/aegps/data-types.md
+++ b/docs/aegps/data-types.md
@@ -45,7 +45,7 @@ Whenever possible, After Effects presents plug-ins with opaque data types, and p
+----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+
| `AEGP_StreamRefH` | Any [parameter stream](aegp-suites.md#diving-into-streams) attached to a layer, in a composition. | [AEGP Stream Suite](aegp-suites.md#stream-suite), |
| | | [AEGP Dynamic Stream Suite](aegp-suites.md#aegp_dynamicstreamsuite4), |
-| | See the description of `AEGP_GetNewLayerStream` from [AEGP_StreamSuite5](aegp-suites.md#stream-suite) for a full list of stream types. | [AEGP Keyframe Suite](aegp-suites.md#aegp_keyframesuite3) |
+| | See the description of `AEGP_GetNewLayerStream` from [AEGP_StreamSuite7](aegp-suites.md#stream-suite) for a full list of stream types. | [AEGP Keyframe Suite](aegp-suites.md#aegp_keyframesuite3) |
+----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------+
| `AEGP_MaskRefH` | A mask applied to a layer. An AEGP_MaskRefH is used to access details about the mask stream, not the specific points which constitute the mask. | [AEGP Mask Suite](aegp-suites.md#aegp_masksuite6) |
| | | |
diff --git a/docs/artisans/artisan-data-types.md b/docs/artisans/artisan-data-types.md
index 4708d7c..56c7dd9 100644
--- a/docs/artisans/artisan-data-types.md
+++ b/docs/artisans/artisan-data-types.md
@@ -648,6 +648,6 @@ We've added the ability for artisans to provide functions After Effects can use
`AEGP_QueryXformGetTransformTime()` and `AEGP_QueryXformGetViewTime()` are both necessary for an artisan to build a representation of the scene to render.
-`AEGP_QueryXformGetTransformTime()` gets the time of the transform, which is then passed to `AEGP_GetCompShutterFrameRange()` from [AEGP_CompSuite11](../aegps/aegp-suites.md#aegp_compsuite11).
+`AEGP_QueryXformGetTransformTime()` gets the time of the transform, which is then passed to `AEGP_GetCompShutterFrameRange()` from [AEGP_CompSuite13](../aegps/aegp-suites.md#aegp_compsuite13).
`AEGP_QueryXformGetViewTime()` gets the time of the view, which is used in calling `AEGP_GetLayerToWorldXformFromView()` from [AEGP_LayerSuite9](../aegps/aegp-suites.md#aegp_layersuite9).
diff --git a/docs/effect-details/effect-preview-media.md b/docs/effect-details/effect-preview-media.md
new file mode 100644
index 0000000..69465f0
--- /dev/null
+++ b/docs/effect-details/effect-preview-media.md
@@ -0,0 +1,49 @@
+# Effect Preview Media (Effects Panel)
+
+!!! note
+ These features apply to Premiere Pro Beta only, starting with version 27.0. It does not currently apply to After Effects, though After Effects may adopt it in the future.
+
+Third-party effects can ship their own preview media to be shown in the host's Effects panel: a still thumbnail for the effect grid, and a short video that plays on hover. If you don't provide media, the host falls back to a generic category placeholder.
+
+## Where to put the media
+
+Preview media lives in a folder named `Preview`, and each file is named after your plug-in's binary file title (the plug-in filename without its extension). Because the media is keyed on the binary, all effects contained in a single plug-in share the same preview media.
+
+* **Thumbnail (still):** `