afterpresets 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -6
- package/native-runtime/CMakeLists.txt +82 -0
- package/native-runtime/README.md +40 -0
- package/native-runtime/THIRD_PARTY_NOTICES.md +14 -0
- package/native-runtime/include/ap_native.h +223 -0
- package/native-runtime/src/apply.cpp +199 -0
- package/native-runtime/src/crypto.cpp +225 -0
- package/native-runtime/src/crypto.hpp +51 -0
- package/native-runtime/src/dialog.cpp +62 -0
- package/native-runtime/src/dialog.hpp +35 -0
- package/native-runtime/src/engine.cpp +909 -0
- package/native-runtime/src/engine.hpp +232 -0
- package/native-runtime/src/fsutil.cpp +291 -0
- package/native-runtime/src/fsutil.hpp +57 -0
- package/native-runtime/src/json.cpp +326 -0
- package/native-runtime/src/json.hpp +70 -0
- package/native-runtime/src/platform.hpp +83 -0
- package/native-runtime/src/platform_common.cpp +60 -0
- package/native-runtime/src/platform_mac.mm +314 -0
- package/native-runtime/src/platform_win.cpp +277 -0
- package/native-runtime/src/runtime.cpp +473 -0
- package/native-runtime/src/util.cpp +169 -0
- package/native-runtime/src/util.hpp +32 -0
- package/native-runtime/src/zip.cpp +243 -0
- package/native-runtime/src/zip.hpp +58 -0
- package/native-runtime/third_party/monocypher/LICENCE.md +167 -0
- package/native-runtime/third_party/monocypher/monocypher-ed25519.c +500 -0
- package/native-runtime/third_party/monocypher/monocypher-ed25519.h +140 -0
- package/native-runtime/third_party/monocypher/monocypher.c +2956 -0
- package/native-runtime/third_party/monocypher/monocypher.h +321 -0
- package/native-runtime/third_party/tinf/LICENSE +22 -0
- package/native-runtime/third_party/tinf/crc32.c +57 -0
- package/native-runtime/third_party/tinf/tinf.h +140 -0
- package/native-runtime/third_party/tinf/tinflate.c +636 -0
- package/native-runtime/vendor-files.json +39 -0
- package/package.json +7 -4
- package/runtime/docs/cep/host-after-effects.md +3 -3
- package/runtime/docs/cep/host-premiere.md +4 -4
- package/runtime/docs/cep/host.md +10 -2
- package/runtime/docs/common/README.md +1 -1
- package/runtime/docs/native/README.md +44 -0
- package/runtime/docs/native/debugging.md +140 -0
- package/runtime/docs/native/rules.md +402 -0
- package/runtime/docs/native/testing.md +154 -0
- package/runtime/package.json +1 -1
- package/runtime/scripts/ae-sdk-docs/config.js +102 -0
- package/runtime/scripts/ae-sdk-docs/convert.js +430 -0
- package/runtime/scripts/ae-sdk-docs/index.js +314 -0
- package/runtime/scripts/ae-sdk-docs/source.js +205 -0
- package/runtime/scripts/ae-sdk-docs/split.js +170 -0
- package/runtime/scripts/ae-sdk-docs.js +72 -0
- package/runtime/src/host.js +1 -1
- package/src/agent/cli-group.js +9 -0
- package/src/agent/extendscript.js +10 -0
- package/src/agent/host-target.js +1 -0
- package/src/agent/panels.js +1 -0
- package/src/agent/png.js +1 -0
- package/src/agent/run-tool.js +3 -0
- package/src/{mcp → agent}/snapshot.js +2 -2
- package/src/agent/tool-error.js +1 -0
- package/src/agent/tools/capture.js +3 -0
- package/src/agent/tools/host.js +1 -0
- package/src/agent/tools/native.js +1 -0
- package/src/agent/tools/panel.js +7 -0
- package/src/agent/tools.js +2 -0
- package/src/api/error-messages.js +1 -1
- package/src/build/build.js +9 -8
- package/src/check/check.js +3 -3
- package/src/check/native.js +14 -0
- package/src/check/pricing.js +1 -1
- package/src/cli.js +3 -3
- package/src/commands/build.js +8 -2
- package/src/commands/check.js +10 -2
- package/src/commands/comp.js +6 -0
- package/src/commands/dev.js +29 -2
- package/src/commands/docs.js +5 -1
- package/src/commands/host.js +1 -0
- package/src/commands/init.js +12 -7
- package/src/commands/panel.js +1 -0
- package/src/commands/push.js +9 -2
- package/src/commands/releases.js +8 -3
- package/src/commands/sdk.js +14 -0
- package/src/commands/testers.js +1 -1
- package/src/commands/upgrade.js +2 -2
- package/src/commands/whoami.js +1 -1
- package/src/dev/bridge.js +8 -0
- package/src/dev/native.js +3 -0
- package/src/dev/session.js +5 -4
- package/src/native/build.js +27 -0
- package/src/native/cmake/CMakeLists.txt +88 -0
- package/src/native/cmake/zig-windows.cmake +19 -0
- package/src/native/effect.js +3 -0
- package/src/native/install.js +8 -0
- package/src/native/installers.js +4 -0
- package/src/native/pipl.js +20 -0
- package/src/native/restart.js +2 -0
- package/src/native/sdk.js +8 -0
- package/src/project/docs.js +3 -3
- package/src/project/project.js +2 -2
- package/src/project/template.js +5 -4
- package/src/prompt.js +1 -1
- package/src/release/confirm.js +5 -0
- package/src/release/native.js +3 -0
- package/src/release/publish.js +1 -1
- package/src/system/run-command.js +1 -1
- package/src/targets.js +1 -1
- package/template/cep/AGENTS.md +102 -164
- package/template/cep/README.md +7 -3
- package/template/cep/docs/code_guide.md +67 -0
- package/template/cep/docs/initial_setup.md +63 -42
- package/template/cep/docs/release_checklist.md +25 -0
- package/template/cep/gitignore +2 -1
- package/template/cep/src/features/update-screen/update-screen.js +1 -1
- package/template/hosts/AGENTS.two-apps.md +12 -0
- package/template/native/AGENTS.md +106 -0
- package/template/native/README.md +71 -0
- package/template/native/docs/code_guide.md +72 -0
- package/template/native/docs/initial_setup.md +154 -0
- package/template/native/docs/release_checklist.md +25 -0
- package/template/native/effect.json +16 -0
- package/template/native/gitignore +9 -0
- package/template/native/package.json +14 -0
- package/template/native/src/Effect.cpp +224 -0
- package/template/native/src/License.cpp +95 -0
- package/template/native/src/License.h +29 -0
- package/template/native/src/Render.h +68 -0
- package/src/commands/mcp.js +0 -7
- package/src/mcp/extendscript.js +0 -9
- package/src/mcp/panels.js +0 -1
- package/src/mcp/protocol.js +0 -4
- package/src/mcp/server.js +0 -2
- package/src/mcp/tools/account.js +0 -3
- package/src/mcp/tools/host.js +0 -1
- package/src/mcp/tools/panel.js +0 -7
- package/src/mcp/tools/project.js +0 -40
- package/src/mcp/tools/releases.js +0 -29
- package/template/cep/.mcp.json +0 -8
- /package/src/{mcp → agent}/capture.js +0 -0
- /package/src/{mcp → agent}/redact.js +0 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Testing a native effect
|
|
3
|
+
description: How the agent tests every change itself in After Effects - build, apply the effect with ap host eval, render frames with ap comp capture and look at them - plus the checks to run before saying done.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Testing a native effect
|
|
7
|
+
|
|
8
|
+
You test your own work. A change is done only when you have built it, applied
|
|
9
|
+
the effect in After Effects, rendered frames, **looked at them**, and shown
|
|
10
|
+
them to the user. "It compiles" is not done.
|
|
11
|
+
|
|
12
|
+
The commands (run them from the project folder as `npx ap ...`):
|
|
13
|
+
|
|
14
|
+
| Command | Use |
|
|
15
|
+
|---|---|
|
|
16
|
+
| `ap host bridge` | Status, install or removal of the dev bridge that lets these commands reach After Effects when the project has no panel |
|
|
17
|
+
| `ap host scratch` | Switch After Effects to a scratch project before changing anything |
|
|
18
|
+
| `ap host eval` | Run ExtendScript in After Effects: build a test comp, apply the effect, set parameters, read values |
|
|
19
|
+
| `ap comp capture` | Render frames of a comp at full quality and save them as PNG files (up to 12 per run) |
|
|
20
|
+
|
|
21
|
+
## One-time setup
|
|
22
|
+
|
|
23
|
+
1. The first `ap dev` installs the dev bridge. Run `ap host bridge`; if
|
|
24
|
+
the bridge is not installed, run `ap host bridge install`.
|
|
25
|
+
Then ask the user to save their work and restart After Effects once. Afterwards `ap host bridge` must report the bridge as
|
|
26
|
+
loaded in After Effects.
|
|
27
|
+
2. Never quit or restart After Effects yourself while the user may have
|
|
28
|
+
unsaved work. Ask them.
|
|
29
|
+
|
|
30
|
+
## Every change
|
|
31
|
+
|
|
32
|
+
1. **Build and install.** Save; `ap dev` (or `ap dev --background`) rebuilds, signs
|
|
33
|
+
the plugin for local use and installs it into
|
|
34
|
+
`/Library/Application Support/Adobe/Common/Plug-ins/7.0/MediaCore/AfterPresets Dev/<bundleId>/`.
|
|
35
|
+
Run `ap dev status` until the build is ok; fix compiler errors from its
|
|
36
|
+
`file:line` list. After Effects loads plugins only when it starts, so when
|
|
37
|
+
`ap dev status` says **RESTART NEEDED**: `ap dev` restarts After Effects by
|
|
38
|
+
itself only when that is safe (a saved or scratch project, no dialog
|
|
39
|
+
open); otherwise ask the user to save their work and restart it. Never
|
|
40
|
+
quit, kill or restart After Effects yourself.
|
|
41
|
+
2. **Scratch project.** Run `ap host scratch` before you add, change or
|
|
42
|
+
delete anything in After Effects. Never test in the user's project.
|
|
43
|
+
3. **Apply the effect by match name** in a test comp with `ap host eval`:
|
|
44
|
+
|
|
45
|
+
```js
|
|
46
|
+
var c = app.project.items.addComp("AP Test", 1920, 1080, 1, 4, 30);
|
|
47
|
+
var bg = c.layers.addSolid([0.15, 0.3, 0.6], "Base", 1920, 1080, 1, 4);
|
|
48
|
+
var t = c.layers.addText("Hello"); // something with edges and alpha
|
|
49
|
+
t.property("ADBE Transform Group").property("ADBE Scale").setValue([400, 400]);
|
|
50
|
+
var fx = t.property("ADBE Effect Parade").addProperty("ACME Soft Glow"); // your match name
|
|
51
|
+
if (!fx) return "not applied";
|
|
52
|
+
fx.property(1).setValue(40); // first parameter after the layer
|
|
53
|
+
c.openInViewer();
|
|
54
|
+
return fx.name + " | " + fx.numProperties + " properties";
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
If `addProperty` throws or returns null, the match name is wrong or After
|
|
58
|
+
Effects did not load the plugin: see [debugging.md](debugging.md).
|
|
59
|
+
4. **Render and look.** Run `ap comp capture` (for example `--frames 0,60,119`,
|
|
60
|
+
or `--seconds 1.5`). It clears After Effects' caches first by default, so
|
|
61
|
+
every frame comes from the build that is loaded now (undo history is kept).
|
|
62
|
+
Open each image and check what the change
|
|
63
|
+
was meant to do, plus edges, transparency and colour.
|
|
64
|
+
5. **Show the user** the frames and say what you checked and what you did not.
|
|
65
|
+
|
|
66
|
+
## Testing the locked (signed-out) state
|
|
67
|
+
|
|
68
|
+
Dev builds from `ap dev` render **without** the licence watermark, so you
|
|
69
|
+
can judge the look. To test what a signed-out buyer sees, create the file
|
|
70
|
+
`~/.afterpresets/native-dev-enforce-license` (or start After Effects with
|
|
71
|
+
`AP_DEV_ENFORCE_LICENSE=1`), restart After Effects (ask the user), and
|
|
72
|
+
capture frames. Delete the file afterwards. Release builds always enforce
|
|
73
|
+
the licence. The status button (`params[AP_PARAM_LICENSE]`, caption
|
|
74
|
+
"License...") shows the state in its name, e.g. "License: sign in"; read it
|
|
75
|
+
with `ap host eval` if needed.
|
|
76
|
+
|
|
77
|
+
## Before saying done
|
|
78
|
+
|
|
79
|
+
Run what applies to the change. Each line names the classic bug it catches
|
|
80
|
+
(the rules are in [rules.md](rules.md)).
|
|
81
|
+
|
|
82
|
+
| Check | How | Catches |
|
|
83
|
+
|---|---|---|
|
|
84
|
+
| Every parameter | Set each to its minimum, default and maximum; capture | Wrong union member, ranges, division by zero |
|
|
85
|
+
| Animation | Keyframe a parameter (`setValueAtTime`), capture several frames | Values read at the wrong time, cached state |
|
|
86
|
+
| 16 and 32 bpc | `app.project.bitsPerChannel = 16` then `32`, capture the same frames; compare with 8 | Missing depth paths, 32767/65535 white, clamped overbrights |
|
|
87
|
+
| Half resolution | `c.resolutionFactor = [2, 2]`, capture; the result must look like a smaller copy of full resolution | Ignored downsample factors |
|
|
88
|
+
| Small or moved layer | Layer smaller than the comp, partly outside it | Hard-coded sizes, `rowbytes`, origin |
|
|
89
|
+
| Upstream expansion | Put a Gaussian Blur before your effect, capture with the blur on and off | Buffer origin, point parameters |
|
|
90
|
+
| Two instances | Apply the effect to two layers with different settings, capture | Globals and statics shared between instances |
|
|
91
|
+
| Save and reopen | Save the scratch project, `app.open()` it again, capture the same frame | Parameter disk IDs, sequence data flattening |
|
|
92
|
+
| Render speed | Read the render times `ap comp capture` reports (caches are cleared first) | Slow paths, blocking work in render |
|
|
93
|
+
|
|
94
|
+
Not covered yet (say so to the user when it matters): the Windows `.aex` is
|
|
95
|
+
built on the Mac but tested by the user on a Windows PC; Premiere Pro;
|
|
96
|
+
multi-frame rendering under load. For the last one, when the effect declares
|
|
97
|
+
multi-frame rendering, ask the user to render the test comp from the Render
|
|
98
|
+
Queue with Multi-Frame Rendering on and compare it with your captures.
|
|
99
|
+
|
|
100
|
+
## Scripting pitfalls
|
|
101
|
+
|
|
102
|
+
Some After Effects scripting errors abort the whole `ap host eval` script, and
|
|
103
|
+
`try/catch` cannot catch them. Avoid them:
|
|
104
|
+
|
|
105
|
+
- **Re-fetch an effect after `moveTo()`.** `fx.moveTo(1)` invalidates `fx`;
|
|
106
|
+
the next access to the old reference aborts the script. Get it again by
|
|
107
|
+
index or name:
|
|
108
|
+
|
|
109
|
+
```js
|
|
110
|
+
fx.moveTo(1);
|
|
111
|
+
fx = layer.property("ADBE Effect Parade").property(1);
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
- **Never turn an array into a string implicitly** (`"" + value`, `alert(arr)`,
|
|
115
|
+
string concatenation with a colour or point value). Use `value.join(",")`
|
|
116
|
+
or `JSON.stringify(value)`.
|
|
117
|
+
- **Never open a modal dialog** from a script: no `alert`, `confirm`,
|
|
118
|
+
`prompt`, `File.openDialog`, and no `app.project.save()` without a file
|
|
119
|
+
(it shows the Save dialog). While a dialog is open After Effects answers
|
|
120
|
+
no commands.
|
|
121
|
+
- **Save and reopen** (the "Save and reopen" check) without dialogs: save the
|
|
122
|
+
scratch project to an explicit file, open it again, then look everything
|
|
123
|
+
up again by name, because every comp, layer and effect reference from
|
|
124
|
+
before is invalid:
|
|
125
|
+
|
|
126
|
+
```js
|
|
127
|
+
var f = new File(Folder.temp.fsName + "/ap-test-reopen.aep");
|
|
128
|
+
app.project.save(f);
|
|
129
|
+
app.open(f);
|
|
130
|
+
var c = null;
|
|
131
|
+
for (var i = 1; i <= app.project.numItems; i++) {
|
|
132
|
+
if (app.project.item(i).name === "AP Test") c = app.project.item(i);
|
|
133
|
+
}
|
|
134
|
+
var fx = c.layer("Hello").property("ADBE Effect Parade").property(1);
|
|
135
|
+
return fx.matchName;
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Then `ap comp capture` the same frames as before saving and compare them.
|
|
139
|
+
- **The effect's Options dialog is modal.** Never open or click it from a
|
|
140
|
+
script or tool. When it needs checking (sign-in, licence status, update
|
|
141
|
+
text), ask the user to click the effect's **Options** link or its
|
|
142
|
+
**License...** button, and to tell you or screenshot what it shows.
|
|
143
|
+
|
|
144
|
+
## If something goes wrong
|
|
145
|
+
|
|
146
|
+
- `ap comp capture` times out or After Effects stops answering: a modal dialog
|
|
147
|
+
(error, crash report, licence) may be open. Ask the user what After Effects
|
|
148
|
+
shows; do not retry in a loop.
|
|
149
|
+
- The frame did not change after a rebuild: the old binary is still loaded.
|
|
150
|
+
`ap dev status` says whether a restart is needed; After Effects must restart
|
|
151
|
+
to load a new build.
|
|
152
|
+
- `ap host eval` or `ap comp capture` returns nothing or says the script engine
|
|
153
|
+
is busy: After Effects is probably showing a dialog. Ask the user.
|
|
154
|
+
- Crashes and load failures: [debugging.md](debugging.md).
|
package/runtime/package.json
CHANGED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// What the generator reads and how the result is organised.
|
|
4
|
+
//
|
|
5
|
+
// Bumping the pin: clone the repository, check out the new commit, run
|
|
6
|
+
// node scripts/ae-sdk-docs.js --source <checkout> --out <tmp> --allow-unpinned
|
|
7
|
+
// read the output, then copy the printed commit and digest here. The run fails
|
|
8
|
+
// if a page or anchor named in TASKS no longer exists; fix TASKS first.
|
|
9
|
+
|
|
10
|
+
const PIN = {
|
|
11
|
+
repo: "docsforadobe/after-effects-plugin-guide",
|
|
12
|
+
commit: "c3fc3fc4132bbd0088b0b32461a5f21b2a88eb7b",
|
|
13
|
+
date: "2026-11-03",
|
|
14
|
+
sdk: "After Effects 27.0 SDK",
|
|
15
|
+
digest: "sha256:246909fbbd4d9e275ef4355649e4f68039e15eeec63ae3f121fc0c4a69fa2d02",
|
|
16
|
+
site: "https://ae-plugins.docsforadobe.dev",
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/** Source pages left out: not about effect plug-ins (3D renderers, file importers) or no use to an agent. */
|
|
20
|
+
const EXCLUDE = [/^index\.md$/, /^history\.md$/, /^artisans\//, /^aeios\//];
|
|
21
|
+
|
|
22
|
+
const RENAME = {
|
|
23
|
+
"effect-details/tips-tricks.md": "effect-tips",
|
|
24
|
+
"effect-ui-events/tips-and-tricks.md": "ui-tips",
|
|
25
|
+
"intro/next-steps.md": "intro-next-steps",
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// Sections whose page names are too generic on their own ("overview",
|
|
29
|
+
// "multithreading", "global-outflags").
|
|
30
|
+
const PREFIX = { "ppro/": "ppro", "audio/": "audio", "aegps/": "aegp" };
|
|
31
|
+
|
|
32
|
+
/** Output file name (without .md) for a source page path like "effect-basics/PF_InData.md". */
|
|
33
|
+
function outputName(sourcePath) {
|
|
34
|
+
if (RENAME[sourcePath]) return RENAME[sourcePath];
|
|
35
|
+
const base = sourcePath
|
|
36
|
+
.split("/")
|
|
37
|
+
.pop()
|
|
38
|
+
.replace(/\.md$/, "")
|
|
39
|
+
.toLowerCase()
|
|
40
|
+
.replace(/_/g, "-");
|
|
41
|
+
const dir = Object.keys(PREFIX).find((d) => sourcePath.indexOf(d) === 0);
|
|
42
|
+
if (!dir) return base;
|
|
43
|
+
const stem = PREFIX[dir];
|
|
44
|
+
if (base === stem || base === stem + "s" || base.indexOf(stem + "-") === 0) return base;
|
|
45
|
+
return stem + "-" + base;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Split thresholds in characters (about 4 characters per token).
|
|
49
|
+
const LIMITS = { maxChars: 14000, singleMax: 18000, minChars: 4000, mergeMax: 9000 };
|
|
50
|
+
|
|
51
|
+
/** Reading order for a first effect. */
|
|
52
|
+
const START_HERE = [
|
|
53
|
+
"intro/what-can-i-do.md",
|
|
54
|
+
"effect-basics/entry-point.md",
|
|
55
|
+
"effect-basics/command-selectors.md#calling-sequence",
|
|
56
|
+
"effect-basics/parameters.md",
|
|
57
|
+
"smartfx/smartfx.md",
|
|
58
|
+
"effect-details/multi-frame-rendering-in-ae.md",
|
|
59
|
+
];
|
|
60
|
+
|
|
61
|
+
/** Task -> source references ("page.md" or "page.md#anchor"). Every reference must resolve. */
|
|
62
|
+
const TASKS = [
|
|
63
|
+
["Start a new effect: how plug-ins work, the entry point", ["intro/what-can-i-do.md", "effect-basics/effect-basics.md", "effect-basics/entry-point.md"]],
|
|
64
|
+
["Copy from an Adobe sample project", ["intro/sample-projects.md#sample-project-descriptions"]],
|
|
65
|
+
["Handle a command (PF_Cmd_*), know which command comes when", ["effect-basics/command-selectors.md#calling-sequence", "effect-basics/command-selectors.md#command-selectors-table"]],
|
|
66
|
+
["Read what After Effects passes in (in_data: time, downsampling, extent_hint)", ["effect-basics/PF_InData.md#pf_indata-members", "effect-basics/PF_InData.md#extent_hint-usage"]],
|
|
67
|
+
["Set capabilities: out_flags / out_flags2", ["effect-basics/PF_OutData.md#pf_outflags", "effect-basics/PF_OutData.md#pf_outflags2"]],
|
|
68
|
+
["Write or change the PiPL (match name, category, version, flags)", ["intro/pipl-resources.md", "intro/pipl-resources.md#multiple-pipls"]],
|
|
69
|
+
["Add a parameter (slider, color, point, popup, checkbox, layer...)", ["effect-basics/parameters.md#parameter-types", "effect-basics/PF_ParamDef.md#pf_paramdef-members", "effect-basics/PF_ParamDef.md#parameter-flags"]],
|
|
70
|
+
["Add, remove or reorder parameters in an effect that has shipped", ["effect-details/changing-parameter-orders.md"]],
|
|
71
|
+
["Show, hide, enable or change parameters from code", ["effect-details/parameter-supervision.md#updating-parameter-ui", "effect-details/parameter-supervision.md#updating-parameter-values"]],
|
|
72
|
+
["Read a parameter at another time, or a layer parameter's pixels", ["effect-details/interaction-callback-functions.md#interaction-callbacks", "effect-details/interaction-callback-functions.md#parameter-checkout-behavior"]],
|
|
73
|
+
["Float values for color, point and angle parameters", ["effect-details/parameters-floating-point-values.md"]],
|
|
74
|
+
["Store custom data in a parameter (arbitrary data)", ["effect-details/arbitrary-data-parameters.md"]],
|
|
75
|
+
["Loop over pixels (iterate 8/16/32 bpc)", ["effect-details/iteration-suites.md", "effect-basics/PF_EffectWorld.md#pf_effectworld-structure", "effect-basics/PF_EffectWorld.md#rowbytes-in-pf_effectworlds"]],
|
|
76
|
+
["Smart Render (PreRender / SmartRender, checking out layers)", ["smartfx/smartfx.md#how-to-smartify", "smartfx/smartfx.md#pf_cmd_smart_pre_render", "smartfx/smartfx.md#pf_cmd_smart_render"]],
|
|
77
|
+
["Support 16 bpc and 32 bpc (float) color", ["smartfx/smartfx.md#the-way-things-are-now", "effect-ui-events/tips-and-tricks.md#how-deep-are-my-pixels", "effect-basics/PF_EffectWorld.md#pf_pixelptr-accessor-macros"]],
|
|
78
|
+
["Draw outside the layer bounds (glows, shadows: expand the output)", ["effect-basics/PF_InData.md#point-controls-and-buffer-expansion", "smartfx/smartfx.md#rectangles", "smartfx/smartfx.md#the-size-of-a-layer"]],
|
|
79
|
+
["Multi-frame rendering and thread safety", ["effect-details/multi-frame-rendering-in-ae.md", "effect-details/multi-frame-rendering-in-ae.md#what-does-it-mean-for-an-effect-to-be-thread-safe", "effect-details/accessing-function-suites.md#threading"]],
|
|
80
|
+
["Cache expensive results across frames and threads (Compute Cache)", ["effect-details/compute-cache-api.md"]],
|
|
81
|
+
["Global, sequence and frame data (and flattening)", ["effect-details/global-sequence-frame-data.md", "effect-details/multi-frame-rendering-in-ae.md#sequence-data-in-multi-frame-rendering"]],
|
|
82
|
+
["Allocate memory and image buffers", ["effect-details/memory-allocation.md", "effect-details/image-buffer-management-functions.md"]],
|
|
83
|
+
["Use a function suite (AcquireSuite, versions)", ["effect-details/accessing-function-suites.md", "intro/compatibility-across-multiple-versions.md#api-versions"]],
|
|
84
|
+
["Sample, transform, blend, fill and convert color (utility callbacks)", ["effect-details/graphics-utility-suites.md", "effect-details/color-space-conversion.md", "effect-details/useful-utility-functions.md"]],
|
|
85
|
+
["Non-square pixels and downsampled previews", ["effect-details/pixel-aspect-ratio.md"]],
|
|
86
|
+
["Masks and paths, cameras and lights, motion blur", ["effect-details/working-with-paths.md", "effect-details/accessing-camera-light-information.md", "effect-details/motion-blur.md"]],
|
|
87
|
+
["Custom UI in the comp or Effect Controls (events, Drawbot)", ["effect-ui-events/effect-ui-events.md", "effect-ui-events/custom-ui-and-drawbot.md", "effect-ui-events/PF_EventExtra.md", "effect-ui-events/ui-callbacks.md"]],
|
|
88
|
+
["GPU rendering (Metal, CUDA, OpenCL, DirectX)", ["intro/gpu-build-instructions.md"]],
|
|
89
|
+
["Call AEGP suites from an effect (project, layers, streams)", ["aegps/cheating-effect-usage-of-aegp-suites.md", "aegps/aegp-suites.md", "aegps/aegp-details.md#accessing-pixels-from-effect-layer-parameters"]],
|
|
90
|
+
["Report errors, handle exceptions, out-of-memory", ["effect-basics/errors.md", "intro/exceptions.md"]],
|
|
91
|
+
["Debug a plug-in (attach a debugger, reset preferences)", ["intro/debugging-plug-ins.md", "intro/debugging-ae-macos.md"]],
|
|
92
|
+
["Build for Apple silicon (universal) and Windows on Arm, export only the entry point", ["intro/apple-silicon-support.md", "intro/windows-on-arm-support.md", "intro/symbol-export.md"]],
|
|
93
|
+
["Where the plug-in is installed", ["intro/where-installers-should-put-plug-ins.md", "ppro/plug-in-installation.md"]],
|
|
94
|
+
["Support older After Effects versions, see what changed in each SDK", ["intro/compatibility-across-multiple-versions.md", "intro/whats-new.md"]],
|
|
95
|
+
["Effects panel: search keywords, description and preview media", ["intro/pipl-resources.md#search-keywords-and-description", "effect-details/effect-preview-media.md"]],
|
|
96
|
+
["Localized names and UTF-8 strings", ["intro/localization.md"]],
|
|
97
|
+
["Make the effect work in Premiere Pro", ["ppro/ppro.md", "ppro/basic-host-differences.md", "ppro/bigger-differences.md", "ppro/multithreading.md", "ppro/unsupported-features.md"]],
|
|
98
|
+
["Audio effects", ["audio/audio.md", "audio/accessing-audio-data.md"]],
|
|
99
|
+
["Performance, caching and testing tips from Adobe", ["effect-details/tips-tricks.md", "effect-details/tips-tricks.md#testing", "effect-ui-events/tips-and-tricks.md#ui-performance"]],
|
|
100
|
+
];
|
|
101
|
+
|
|
102
|
+
module.exports = { PIN, EXCLUDE, RENAME, PREFIX, LIMITS, START_HERE, TASKS, outputName };
|