@pinepaper.studio/mcp-server 1.6.13 → 1.6.15
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.de.md +6 -1
- package/README.es.md +6 -1
- package/README.fr.md +6 -1
- package/README.hi.md +6 -1
- package/README.ja.md +6 -1
- package/README.ko.md +6 -1
- package/README.md +245 -6
- package/README.pt-BR.md +6 -1
- package/README.zh-CN.md +6 -1
- package/assets/brand/pinepaper-lockup-horizontal-white.svg +1 -0
- package/assets/brand/pinepaper-lockup-horizontal.svg +1 -0
- package/assets/edit-whenever.svg +1 -1
- package/dist/browser/puppeteer-controller.js +2 -2
- package/dist/browser/puppeteer-controller.js.map +1 -1
- package/dist/build-info.json +5 -0
- package/dist/design/design-systems.js +1 -1
- package/dist/design/design-systems.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/ontology/upstream-vocabulary.d.ts +23 -0
- package/dist/ontology/upstream-vocabulary.d.ts.map +1 -0
- package/dist/ontology/upstream-vocabulary.js +1172 -0
- package/dist/ontology/upstream-vocabulary.js.map +1 -0
- package/dist/ontology/vocabulary.d.ts.map +1 -1
- package/dist/ontology/vocabulary.js +19 -0
- package/dist/ontology/vocabulary.js.map +1 -1
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +264 -70
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/engine-methods.d.ts.map +1 -1
- package/dist/tools/engine-methods.js +24 -2
- package/dist/tools/engine-methods.js.map +1 -1
- package/dist/tools/engine-surface.d.ts +1 -1
- package/dist/tools/engine-surface.d.ts.map +1 -1
- package/dist/tools/engine-surface.js +37 -10
- package/dist/tools/engine-surface.js.map +1 -1
- package/dist/tools/handlers/camera.d.ts.map +1 -1
- package/dist/tools/handlers/camera.js +17 -2
- package/dist/tools/handlers/camera.js.map +1 -1
- package/dist/tools/handlers/font.d.ts.map +1 -1
- package/dist/tools/handlers/font.js +48 -3
- package/dist/tools/handlers/font.js.map +1 -1
- package/dist/tools/handlers/maps.d.ts.map +1 -1
- package/dist/tools/handlers/maps.js +16 -0
- package/dist/tools/handlers/maps.js.map +1 -1
- package/dist/tools/handlers.d.ts +11 -1
- package/dist/tools/handlers.d.ts.map +1 -1
- package/dist/tools/handlers.js +426 -14
- package/dist/tools/handlers.js.map +1 -1
- package/dist/tools/minimal-descriptions.d.ts.map +1 -1
- package/dist/tools/minimal-descriptions.js +2 -0
- package/dist/tools/minimal-descriptions.js.map +1 -1
- package/dist/tools/shape-params.d.ts +13 -2
- package/dist/tools/shape-params.d.ts.map +1 -1
- package/dist/tools/shape-params.js +98 -3
- package/dist/tools/shape-params.js.map +1 -1
- package/dist/tools/stick-vocabulary.d.ts +1 -1
- package/dist/tools/stick-vocabulary.js +1 -1
- package/dist/tools/toolkits.d.ts.map +1 -1
- package/dist/tools/toolkits.js +2 -0
- package/dist/tools/toolkits.js.map +1 -1
- package/dist/types/code-generator.d.ts +27 -1
- package/dist/types/code-generator.d.ts.map +1 -1
- package/dist/types/code-generator.js +2506 -273
- package/dist/types/code-generator.js.map +1 -1
- package/dist/types/schemas.d.ts +1483 -239
- package/dist/types/schemas.d.ts.map +1 -1
- package/dist/types/schemas.js +259 -26
- package/dist/types/schemas.js.map +1 -1
- package/dist/utils/a11y.d.ts +67 -0
- package/dist/utils/a11y.d.ts.map +1 -0
- package/dist/utils/a11y.js +117 -0
- package/dist/utils/a11y.js.map +1 -0
- package/dist/utils/ad-package.d.ts +44 -0
- package/dist/utils/ad-package.d.ts.map +1 -0
- package/dist/utils/ad-package.js +121 -0
- package/dist/utils/ad-package.js.map +1 -0
- package/dist/utils/scc.d.ts +41 -0
- package/dist/utils/scc.d.ts.map +1 -0
- package/dist/utils/scc.js +185 -0
- package/dist/utils/scc.js.map +1 -0
- package/dist/utils/zip.d.ts +7 -0
- package/dist/utils/zip.d.ts.map +1 -0
- package/dist/utils/zip.js +82 -0
- package/dist/utils/zip.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +31 -1
- package/dist/version.js.map +1 -1
- package/icon.png +0 -0
- package/icon.svg +1 -0
- package/manifest.json +11 -2
- package/package.json +8 -4
|
@@ -0,0 +1,1172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GENERATED — DO NOT EDIT. Run `bun run sync:ontology-vocabulary`.
|
|
3
|
+
*
|
|
4
|
+
* FxTool's ITEM_TYPE_MAP and type classes (anchor, description, parentType,
|
|
5
|
+
* mcpTool, mcpAction), read from the loaded module.
|
|
6
|
+
*
|
|
7
|
+
* Source: FxTool origin/main 253a01a04c886713f610e619ac6205e59751dbb4
|
|
8
|
+
* js/ontology/Vocabulary.js
|
|
9
|
+
* sha256: 8c39f8ad6d2da359
|
|
10
|
+
*
|
|
11
|
+
* vocabulary.ts merges these over its hand-written port: the engine's map
|
|
12
|
+
* wins where the two disagree, and a class the port lacks is added.
|
|
13
|
+
*/
|
|
14
|
+
export const UPSTREAM_ITEM_TYPE_MAP = Object.freeze({
|
|
15
|
+
"arc": "pp:Arc",
|
|
16
|
+
"areaChart": "pp:AreaChart",
|
|
17
|
+
"areachart": "pp:AreaChart",
|
|
18
|
+
"audio": "pp:AudioClip",
|
|
19
|
+
"barChart": "pp:BarChart",
|
|
20
|
+
"barchart": "pp:BarChart",
|
|
21
|
+
"causticsraster": "pp:CausticsField",
|
|
22
|
+
"character-eye": "pp:CharacterEye",
|
|
23
|
+
"character-eyes": "pp:CharacterEye",
|
|
24
|
+
"circle": "pp:Circle",
|
|
25
|
+
"circle-outline": "pp:Circle",
|
|
26
|
+
"closed-path": "pp:ClosedPath",
|
|
27
|
+
"cloudsraster": "pp:CloudField",
|
|
28
|
+
"compound-path": "pp:CompoundPath",
|
|
29
|
+
"compoundpath": "pp:CompoundPath",
|
|
30
|
+
"connector": "pp:Connector",
|
|
31
|
+
"diagram-shape": "pp:DiagramShape",
|
|
32
|
+
"disk": "pp:Disk",
|
|
33
|
+
"ellipse": "pp:Ellipse",
|
|
34
|
+
"event": "pp:Event",
|
|
35
|
+
"formularaster": "pp:ProceduralField",
|
|
36
|
+
"group": "pp:Group",
|
|
37
|
+
"image": "pp:Image",
|
|
38
|
+
"indexed-store": "pp:IndexedStore",
|
|
39
|
+
"intro-scene": "pp:IntroScene",
|
|
40
|
+
"letter-collage": "pp:LetterCollage",
|
|
41
|
+
"letterCollage": "pp:LetterCollage",
|
|
42
|
+
"lettercollage": "pp:LetterCollage",
|
|
43
|
+
"line": "pp:Line",
|
|
44
|
+
"lineChart": "pp:LineChart",
|
|
45
|
+
"linechart": "pp:LineChart",
|
|
46
|
+
"local-store": "pp:LocalStore",
|
|
47
|
+
"marker": "pp:Marker",
|
|
48
|
+
"motion-scene": "pp:MotionScene",
|
|
49
|
+
"mountainsraster": "pp:ProceduralField",
|
|
50
|
+
"oceanraster": "pp:OceanField",
|
|
51
|
+
"open-path": "pp:OpenPath",
|
|
52
|
+
"outro-scene": "pp:OutroScene",
|
|
53
|
+
"path": "pp:Path",
|
|
54
|
+
"pattern": "pp:Pattern",
|
|
55
|
+
"plasmaraster": "pp:PlasmaField",
|
|
56
|
+
"polygon": "pp:Polygon",
|
|
57
|
+
"precomp": "pp:Precomp",
|
|
58
|
+
"raster": "pp:Image",
|
|
59
|
+
"rectangle": "pp:Rectangle",
|
|
60
|
+
"region": "pp:MapRegion",
|
|
61
|
+
"rigged-character": "pp:RiggedCharacter",
|
|
62
|
+
"scatterPlot": "pp:ScatterPlot",
|
|
63
|
+
"scatterplot": "pp:ScatterPlot",
|
|
64
|
+
"shaderraster": "pp:ProceduralField",
|
|
65
|
+
"sound": "pp:Sound",
|
|
66
|
+
"star": "pp:Star",
|
|
67
|
+
"starfieldraster": "pp:StarfieldField",
|
|
68
|
+
"text": "pp:Text",
|
|
69
|
+
"text-effect": "pp:TextEffect",
|
|
70
|
+
"text-effect-glyph": "pp:TextEffectGlyph",
|
|
71
|
+
"transition-scene": "pp:TransitionScene",
|
|
72
|
+
"triangle": "pp:Triangle",
|
|
73
|
+
"tunnelraster": "pp:TunnelField",
|
|
74
|
+
"unclassified": "pp:Unclassified",
|
|
75
|
+
"video": "pp:VideoClip",
|
|
76
|
+
"voronoiraster": "pp:VoronoiField",
|
|
77
|
+
"world-character": "pp:WorldCharacter",
|
|
78
|
+
"world-light": "pp:WorldLight",
|
|
79
|
+
"world-material": "pp:WorldMaterial",
|
|
80
|
+
"world-mesh": "pp:ShaderMesh",
|
|
81
|
+
"world-object": "pp:WorldObject"
|
|
82
|
+
});
|
|
83
|
+
export const UPSTREAM_TYPES = Object.freeze({
|
|
84
|
+
"pp:AnalyticalTask": {
|
|
85
|
+
"description": "Abstract analytical task — the question a visualization helps answer"
|
|
86
|
+
},
|
|
87
|
+
"pp:AngleEncoding": {
|
|
88
|
+
"description": "Rotation or arc sweep — encodes proportion Read least accurately of the common channels — acceptable for part-to-whole, poor for comparison.",
|
|
89
|
+
"parentType": "pp:EncodingChannel"
|
|
90
|
+
},
|
|
91
|
+
"pp:Arc": {
|
|
92
|
+
"anchor": null,
|
|
93
|
+
"description": "An open curved path through three points — `from`, `through`, `to` — where the middle point sets the bulge. The curve is defined by geometry rather than by control handles, so it is the cheapest way to get a controlled curve without authoring béziers. Choose pp:Path for anything needing more than one bend.",
|
|
94
|
+
"parentType": "pp:CanvasShape",
|
|
95
|
+
"mcpTool": "pinepaper_create_item"
|
|
96
|
+
},
|
|
97
|
+
"pp:ArcMark": {
|
|
98
|
+
"description": "Angular sector mark (pie slice, donut, sunburst) Angle is read poorly, so reserve it for part-to-whole with few slices — a pie with many segments is a bar chart that has been made harder.",
|
|
99
|
+
"parentType": "pp:MarkType"
|
|
100
|
+
},
|
|
101
|
+
"pp:AreaChart": {
|
|
102
|
+
"description": "Area chart — filled region under a line, showing volume and trends",
|
|
103
|
+
"parentType": "pp:DataVisualization",
|
|
104
|
+
"mcpTool": "pinepaper_create_chart",
|
|
105
|
+
"mcpAction": "create"
|
|
106
|
+
},
|
|
107
|
+
"pp:AreaMark": {
|
|
108
|
+
"description": "Filled region mark (area, stream, band) Fills emphasise volume and accumulation; stacked areas make the TOTAL easy and the individual series hard.",
|
|
109
|
+
"parentType": "pp:MarkType"
|
|
110
|
+
},
|
|
111
|
+
"pp:AssociationConnector": {
|
|
112
|
+
"anchor": null,
|
|
113
|
+
"description": "A plain link between elements with no direction of control or data implied — UML's weakest relationship. Use it when a stronger edge would overstate the coupling.",
|
|
114
|
+
"parentType": "pp:Connector",
|
|
115
|
+
"mcpTool": "pinepaper_connect"
|
|
116
|
+
},
|
|
117
|
+
"pp:AudioClip": {
|
|
118
|
+
"anchor": "schema:AudioObject",
|
|
119
|
+
"description": "Audio media item — sample-buffer source with volume, gain, and timeline placement. May coexist with a video pp:MediaRef or stand alone.",
|
|
120
|
+
"parentType": "pp:CanvasElement",
|
|
121
|
+
"mcpTool": "pinepaper_media",
|
|
122
|
+
"mcpAction": "upload_audio"
|
|
123
|
+
},
|
|
124
|
+
"pp:AudioSync": {
|
|
125
|
+
"anchor": null,
|
|
126
|
+
"description": "A composition timed to an audio track — the detected tempo and onset times that decide when each item lands. Held in the graph so a beat-synced piece can be re-cut or re-timed rather than re-detected.",
|
|
127
|
+
"parentType": "pp:Concept",
|
|
128
|
+
"mcpTool": "pinepaper_compose",
|
|
129
|
+
"mcpAction": "set_treatment"
|
|
130
|
+
},
|
|
131
|
+
"pp:BarChart": {
|
|
132
|
+
"description": "Bar chart — rectangular marks on Cartesian axes for categorical comparison",
|
|
133
|
+
"parentType": "pp:DataVisualization",
|
|
134
|
+
"mcpTool": "pinepaper_create_chart",
|
|
135
|
+
"mcpAction": "create"
|
|
136
|
+
},
|
|
137
|
+
"pp:BarMark": {
|
|
138
|
+
"description": "Rectangular extent mark (bar, column, histogram bin) Length from a common baseline is the most accurately-read encoding there is, which is why bars beat pie for comparison. The baseline must be zero or the lengths lie.",
|
|
139
|
+
"parentType": "pp:MarkType"
|
|
140
|
+
},
|
|
141
|
+
"pp:Bone": {
|
|
142
|
+
"anchor": null,
|
|
143
|
+
"description": "One segment of a skeleton: a joint position, a length and an angle, with children starting at its tip. Rotating a bone rotates everything below it — which is forward kinematics, and why a rig is authored root-first.",
|
|
144
|
+
"parentType": "pp:CanvasElement",
|
|
145
|
+
"mcpTool": "pinepaper_rigging",
|
|
146
|
+
"mcpAction": "add_bone"
|
|
147
|
+
},
|
|
148
|
+
"pp:BoneCollider": {
|
|
149
|
+
"anchor": null,
|
|
150
|
+
"description": "Collision shape that bone-physics particles bump against. Lives on a skeleton; multiple colliders per skeleton are allowed. Concrete subtypes select the shape primitive.",
|
|
151
|
+
"parentType": "pp:Concept"
|
|
152
|
+
},
|
|
153
|
+
"pp:BoneJiggle": {
|
|
154
|
+
"anchor": null,
|
|
155
|
+
"description": "Secondary-motion config attached to a bone — overshoots and oscillates around the animated angle with stiffness/damping. Use for jiggly accessories (ponytail, antenna, scarf) without authoring per-frame keyframes.",
|
|
156
|
+
"parentType": "pp:Concept"
|
|
157
|
+
},
|
|
158
|
+
"pp:BonePhysics": {
|
|
159
|
+
"anchor": null,
|
|
160
|
+
"description": "Verlet integration layer over a skeleton — each bone has a particle at its tip, distance constraints preserve bone lengths, spring motors pull toward animated angles. Enabled per skeleton; blendWeight per bone mixes animated vs simulated. Use for hit reactions, hair/tail secondary motion, ragdoll.",
|
|
161
|
+
"parentType": "pp:Concept"
|
|
162
|
+
},
|
|
163
|
+
"pp:BreakdownPose": {
|
|
164
|
+
"anchor": null,
|
|
165
|
+
"description": "A pose keyframe that shapes the ARC and SPACING of the transition between key poses rather than being a storytelling extreme. Carries `favor` (−1..1, biases spacing toward the previous/next key) and a `breakdown` flag; interpolation naturally arcs in bone-angle space. Breakdowns are what turn robotic pose-to-pose into believable motion (traditional keys → breakdowns → in-betweens).",
|
|
166
|
+
"parentType": "pp:Pose",
|
|
167
|
+
"mcpTool": "pinepaper_rigging",
|
|
168
|
+
"mcpAction": "add_pose_keyframe"
|
|
169
|
+
},
|
|
170
|
+
"pp:BubbleChart": {
|
|
171
|
+
"description": "Bubble chart — scatter plot with size-encoded third variable",
|
|
172
|
+
"parentType": "pp:ScatterPlot",
|
|
173
|
+
"mcpTool": "pinepaper_create_chart",
|
|
174
|
+
"mcpAction": "create"
|
|
175
|
+
},
|
|
176
|
+
"pp:CameraTreatment": {
|
|
177
|
+
"anchor": null,
|
|
178
|
+
"description": "A named shot-list recipe (sheet-reveal, hero-then-details, slow-pan, push-through) compiled into a camera_animates track. Held separately from the pattern so one composition can be filmed several ways.",
|
|
179
|
+
"parentType": "pp:CompositionPattern",
|
|
180
|
+
"mcpTool": "pinepaper_compose",
|
|
181
|
+
"mcpAction": "set_treatment"
|
|
182
|
+
},
|
|
183
|
+
"pp:CanvasContainer": {
|
|
184
|
+
"anchor": null,
|
|
185
|
+
"description": "Abstract: elements that hold other elements and transform them as a unit. Containment comes from the scene tree, so a child inherits the parent's transform, opacity and blend unit.",
|
|
186
|
+
"parentType": "pp:CanvasElement"
|
|
187
|
+
},
|
|
188
|
+
"pp:CanvasElement": {
|
|
189
|
+
"anchor": "schema:CreativeWork",
|
|
190
|
+
"description": "Abstract root of everything drawn on the canvas. Every element has a position, a transform and an identity in the registry, which is what lets a relation address it and an export find it."
|
|
191
|
+
},
|
|
192
|
+
"pp:CanvasShape": {
|
|
193
|
+
"anchor": null,
|
|
194
|
+
"description": "Abstract: elements defined by vector geometry — paths, closed forms, strokes. They can be filled, stroked, trimmed, morphed and deformed at the vertex level, none of which a raster or a text run supports.",
|
|
195
|
+
"parentType": "pp:CanvasElement"
|
|
196
|
+
},
|
|
197
|
+
"pp:CanvasText": {
|
|
198
|
+
"anchor": null,
|
|
199
|
+
"description": "Abstract: elements whose content is language. They carry the scene's meaning, are what a screen reader announces, and re-measure when the content changes — so anything depending on their bounds must run after.",
|
|
200
|
+
"parentType": "pp:CanvasElement"
|
|
201
|
+
},
|
|
202
|
+
"pp:CartesianCoordinates": {
|
|
203
|
+
"anchor": "wd:Q62912",
|
|
204
|
+
"description": "Cartesian X/Y axes — the most common coordinate system for charts",
|
|
205
|
+
"parentType": "pp:CoordinateSystem"
|
|
206
|
+
},
|
|
207
|
+
"pp:CausticsField": {
|
|
208
|
+
"anchor": "wd:Q9185267",
|
|
209
|
+
"description": "Refracted light patterns on a submerged surface. The anchor is the COMPUTER-GRAPHICS technique rather than the optics concept, because that is what this is — a rendering of caustics, not a measurement of them.",
|
|
210
|
+
"parentType": "pp:ProceduralField"
|
|
211
|
+
},
|
|
212
|
+
"pp:CellMark": {
|
|
213
|
+
"description": "Grid cell mark (heatmap, matrix, waffle) For dense matrices where the PATTERN matters more than any single value; colour carries the value, so the scale choice decides what a reader sees.",
|
|
214
|
+
"parentType": "pp:MarkType"
|
|
215
|
+
},
|
|
216
|
+
"pp:CellularNode": {
|
|
217
|
+
"anchor": null,
|
|
218
|
+
"description": "Distance to the nearest of a set of scattered feature points. Its INVERSE is what reads as caustics or as the walls of a foam pattern — a structure value noise cannot produce at any octave count, which is exactly why it is a separate node and not a parameter.",
|
|
219
|
+
"parentType": "pp:ShaderNode"
|
|
220
|
+
},
|
|
221
|
+
"pp:Character": {
|
|
222
|
+
"anchor": "wd:Q95074",
|
|
223
|
+
"description": "A figure that is ONE THING made of many drawn parts — addressed, placed, recoloured and directed as a unit. The graph could not say this before 2026-09-11: it could name a rigged character, a 3D world body and a drawn eye, and had no word for the ordinary case of a figure assembled from parts. Three realisations exist and they are not interchangeable: pp:RiggedCharacter is skeleton-driven (bones, IK, poses); pp:WorldCharacter is a body in a pp:World3D; and a figure composed from the design graph is a set of sibling parts bound by pp:partOfFigure, each carrying its own keyframe track. Abstract on purpose — there is no create(\"character\") and inventing one would be the phantom this file exists to prevent. The parts are made with create(\"path\") and bound by pp:partOfFigure — NOT by addParts, which writes pp:partOf and would cascade the root's position onto parts that already carry that motion in their own tracks. NO engineMethod is claimed here on purpose: there is no one call that makes a character, and naming the nearest one would send a model to the wrong door — which is the phantom in miniature. The composing door is the MCP pinepaper_character tool, which expands a concept and its beats into create + keyframe + pp:partOfFigure calls.",
|
|
224
|
+
"parentType": "pp:Concept"
|
|
225
|
+
},
|
|
226
|
+
"pp:CharacterAction": {
|
|
227
|
+
"anchor": "wd:Q1156828",
|
|
228
|
+
"description": "A dynamic storytelling pose, gait, motion brick, or facial expression executed on a target pp:Character.",
|
|
229
|
+
"parentType": "pp:Concept"
|
|
230
|
+
},
|
|
231
|
+
"pp:CharacterAsset": {
|
|
232
|
+
"anchor": "schema:CreativeWork",
|
|
233
|
+
"description": "Abstract: a generated character part — eyes, a skin, a rigged body. Produced by an asset generator from parameters, so it is modifiable and re-generatable rather than a fixed file.",
|
|
234
|
+
"parentType": "pp:CanvasElement"
|
|
235
|
+
},
|
|
236
|
+
"pp:CharacterEye": {
|
|
237
|
+
"anchor": null,
|
|
238
|
+
"description": "A parametric eye: an outer silhouette, an optional pupil and a highlight, emitted under the eye_/pupil_ roles the expression system drives so it blinks and looks without further wiring. Not the anatomical organ — a drawn component of a character.",
|
|
239
|
+
"parentType": "pp:CharacterAsset"
|
|
240
|
+
},
|
|
241
|
+
"pp:CharacterPart": {
|
|
242
|
+
"anchor": null,
|
|
243
|
+
"description": "One semantic role-bearing raster or shape component of a pp:Character bound via pp:partOf relation.",
|
|
244
|
+
"parentType": "pp:CanvasElement"
|
|
245
|
+
},
|
|
246
|
+
"pp:CharacterSkin": {
|
|
247
|
+
"anchor": null,
|
|
248
|
+
"description": "A named appearance for a character body — palette plus proportions. A starting point that accepts overrides, not a fixed costume.",
|
|
249
|
+
"parentType": "pp:CharacterAsset"
|
|
250
|
+
},
|
|
251
|
+
"pp:Chord": {
|
|
252
|
+
"anchor": null,
|
|
253
|
+
"description": "A renowned, instrument-agnostic frequency-ratio pattern (major, minor, dom7, maj7, min7, sus2/4, dim, aug, power) named over a root note; expands deterministically to N pp:Tone partials. \"Name it, the engine computes the frequencies\" — a weak model supplies root+kind, not Hz.",
|
|
254
|
+
"parentType": "pp:Sound"
|
|
255
|
+
},
|
|
256
|
+
"pp:Circle": {
|
|
257
|
+
"anchor": "wd:Q17278",
|
|
258
|
+
"description": "The CURVE — every point at `radius` from the centre, drawn as a stroke with no interior. A circle has no width/height (passing them sizes it by the SMALLER of the two) and stays round under any scaling, where an ellipse with equal axes drifts the moment either is animated. Distinct from pp:Disk, the region this curve bounds: an item with the `circle` shape id is typed by what it PAINTS — `create('circle', { fillColor: null, strokeColor })` is a pp:Circle; `create('circle')` with any fill (the default) is a pp:Disk. Wikidata Q17278 is the curve, so this token is the outline, never the dot. Make one with the `circle-outline` shape id, whose default paint IS the curve; `regionType` points at the pp:Disk this curve bounds.",
|
|
259
|
+
"parentType": "pp:CanvasShape",
|
|
260
|
+
"mcpTool": "pinepaper_create_item"
|
|
261
|
+
},
|
|
262
|
+
"pp:CircleCollider": {
|
|
263
|
+
"anchor": null,
|
|
264
|
+
"description": "Circular obstacle. Bones pushed out radially when they enter the disc. Use for balls, posts, round platforms.",
|
|
265
|
+
"parentType": "pp:BoneCollider"
|
|
266
|
+
},
|
|
267
|
+
"pp:ClosedPath": {
|
|
268
|
+
"anchor": null,
|
|
269
|
+
"description": "Closed path (region/boundary) — encloses area, no start/end distinction. Functionally equivalent to a shape defined by its boundary equation.",
|
|
270
|
+
"parentType": "pp:Path",
|
|
271
|
+
"mcpTool": "pinepaper_create_item"
|
|
272
|
+
},
|
|
273
|
+
"pp:CloudField": {
|
|
274
|
+
"anchor": "wd:Q8074",
|
|
275
|
+
"description": "Drifting volumetric cloud cover over a sky gradient. Distinct from pp:CloudShape, which is a DIAGRAM symbol: one is weather, the other is a box you put text in, and a graph that conflated them would compose nonsense.",
|
|
276
|
+
"parentType": "pp:ProceduralField"
|
|
277
|
+
},
|
|
278
|
+
"pp:CloudShape": {
|
|
279
|
+
"anchor": null,
|
|
280
|
+
"description": "A cloud outline: a network or service whose internals are deliberately out of scope — the internet, a third party, anything you do not control.",
|
|
281
|
+
"parentType": "pp:NetworkShape",
|
|
282
|
+
"mcpTool": "pinepaper_create_diagram_shape"
|
|
283
|
+
},
|
|
284
|
+
"pp:CollagePattern": {
|
|
285
|
+
"anchor": null,
|
|
286
|
+
"description": "A named arrangement of N sibling items (grid-2x2, hero-plus-strip, editorial-split, stacked-depth). Instantiating one positions a single root and wires beside/below/on_top_of edges for the rest.",
|
|
287
|
+
"parentType": "pp:CompositionPattern",
|
|
288
|
+
"mcpTool": "pinepaper_compose",
|
|
289
|
+
"mcpAction": "apply"
|
|
290
|
+
},
|
|
291
|
+
"pp:ColorEncoding": {
|
|
292
|
+
"description": "Fill, stroke, or opacity — encodes category or intensity Use a sequential ramp for magnitude and distinct hues for categories — and keep categories under about seven, past which they stop being distinguishable.",
|
|
293
|
+
"parentType": "pp:EncodingChannel"
|
|
294
|
+
},
|
|
295
|
+
"pp:ComparisonTask": {
|
|
296
|
+
"description": "Compare magnitudes across categories (which is bigger?) Favours position and length: bars and dot plots. This is the most common task and the one most often served by the wrong chart.",
|
|
297
|
+
"parentType": "pp:AnalyticalTask"
|
|
298
|
+
},
|
|
299
|
+
"pp:CompositionMode": {
|
|
300
|
+
"description": "Abstract composition mode — how multiple data series are visually arranged"
|
|
301
|
+
},
|
|
302
|
+
"pp:CompositionPattern": {
|
|
303
|
+
"anchor": "skos:Concept",
|
|
304
|
+
"description": "Abstract named composition — an arrangement recipe expressed as structural relations rather than coordinates.",
|
|
305
|
+
"parentType": "pp:Concept"
|
|
306
|
+
},
|
|
307
|
+
"pp:CompositionTask": {
|
|
308
|
+
"description": "Show parts of a whole (what proportion?) Favours stacked bars or a treemap; reach for a pie only with very few parts, since angle is read poorly.",
|
|
309
|
+
"parentType": "pp:AnalyticalTask"
|
|
310
|
+
},
|
|
311
|
+
"pp:CompoundPath": {
|
|
312
|
+
"anchor": null,
|
|
313
|
+
"description": "Multiple sub-paths as single item (SVG imports, boolean ops)",
|
|
314
|
+
"parentType": "pp:CanvasShape"
|
|
315
|
+
},
|
|
316
|
+
"pp:Concept": {
|
|
317
|
+
"anchor": "skos:Concept",
|
|
318
|
+
"description": "Abstract conceptual resource — addressable independently of canvas items."
|
|
319
|
+
},
|
|
320
|
+
"pp:Connector": {
|
|
321
|
+
"anchor": null,
|
|
322
|
+
"description": "An edge between two diagram shapes that re-routes as they move, with configurable `routing` (direct, orthogonal, curved), head and tail arrowheads and an optional label. It binds to PORTS, not coordinates — which is why it survives layout changes and why a plain pp:Line, which does not, is the wrong tool for joining nodes.",
|
|
323
|
+
"parentType": "pp:Diagram",
|
|
324
|
+
"mcpTool": "pinepaper_connect"
|
|
325
|
+
},
|
|
326
|
+
"pp:ConstructionSequence": {
|
|
327
|
+
"anchor": null,
|
|
328
|
+
"description": "Ordered set of pp:ConstructionStep, played on the timeline to reveal a geometric construction one step at a time (replayable, scrubbable). Persisted as timed pp:constructionReveal relations, not a script.",
|
|
329
|
+
"parentType": "pp:Concept"
|
|
330
|
+
},
|
|
331
|
+
"pp:ConstructionStep": {
|
|
332
|
+
"anchor": null,
|
|
333
|
+
"description": "One step of a pp:ConstructionSequence: the item(s) introduced at a given stepOrder, mapped to a timeline reveal time (stepOrder × stepDuration).",
|
|
334
|
+
"parentType": "pp:Concept"
|
|
335
|
+
},
|
|
336
|
+
"pp:CoordinateSystem": {
|
|
337
|
+
"description": "Abstract coordinate system for spatial data mapping (its three concrete members carry Wikidata anchors; the rest of the visualization taxonomy — marks, encoding channels, analytical tasks, composition modes — deliberately does NOT, because Vega-Lite and the Grammar of Graphics are specifications rather than published RDF vocabularies, and Wikidata has chart TYPES where we have mark PRIMITIVES. A bar mark is not a bar chart, and asserting it is would publish a claim we do not mean) The choice decides which comparisons are easy: Cartesian favours magnitude, polar favours cycles, geographic favours location."
|
|
338
|
+
},
|
|
339
|
+
"pp:CustomShaderEffect": {
|
|
340
|
+
"anchor": null,
|
|
341
|
+
"description": "A fragment shader supplied by the author and rendered over an item's silhouette. Registered at runtime through registerShaderEffect, which COMPILES AND LINKS it first and refuses it with the driver log — a shader that fails otherwise renders nothing while appearing to apply, because the error goes to a console production strips.",
|
|
342
|
+
"parentType": "pp:Concept"
|
|
343
|
+
},
|
|
344
|
+
"pp:DataConnector": {
|
|
345
|
+
"anchor": null,
|
|
346
|
+
"description": "A connector carrying DATA rather than control — what is passed, not what happens next. Drawn distinctly so the two can be told apart at a glance.",
|
|
347
|
+
"parentType": "pp:Connector",
|
|
348
|
+
"mcpTool": "pinepaper_connect"
|
|
349
|
+
},
|
|
350
|
+
"pp:DataShape": {
|
|
351
|
+
"anchor": null,
|
|
352
|
+
"description": "A parallelogram: input or output crossing the process boundary. Distinct from pp:DatabaseShape, which is where data RESTS rather than where it moves.",
|
|
353
|
+
"parentType": "pp:FlowchartShape",
|
|
354
|
+
"mcpTool": "pinepaper_create_diagram_shape"
|
|
355
|
+
},
|
|
356
|
+
"pp:DataVisualization": {
|
|
357
|
+
"anchor": "schema:CreativeWork",
|
|
358
|
+
"description": "Abstract data visualization — classified along 5 orthogonal dimensions: mark primitive, coordinate system, encoding channel, analytical task, and composition mode",
|
|
359
|
+
"parentType": "pp:CanvasElement"
|
|
360
|
+
},
|
|
361
|
+
"pp:DatabaseShape": {
|
|
362
|
+
"anchor": null,
|
|
363
|
+
"description": "A cylinder: a persistent data store. Signals that state SURVIVES the process, which is the distinction a reader most wants from a diagram.",
|
|
364
|
+
"parentType": "pp:FlowchartShape",
|
|
365
|
+
"mcpTool": "pinepaper_create_diagram_shape"
|
|
366
|
+
},
|
|
367
|
+
"pp:DecisionShape": {
|
|
368
|
+
"anchor": null,
|
|
369
|
+
"description": "A diamond: a branch point with two or more labelled outgoing edges. The labels are load-bearing — an unlabelled decision tells a reader that a choice happens but not what decides it.",
|
|
370
|
+
"parentType": "pp:FlowchartShape",
|
|
371
|
+
"mcpTool": "pinepaper_create_diagram_shape"
|
|
372
|
+
},
|
|
373
|
+
"pp:DependencyConnector": {
|
|
374
|
+
"anchor": null,
|
|
375
|
+
"description": "A connector meaning \"a change there may force a change here\". Conventionally dashed, because the coupling is weaker than containment but stronger than an association.",
|
|
376
|
+
"parentType": "pp:Connector",
|
|
377
|
+
"mcpTool": "pinepaper_connect"
|
|
378
|
+
},
|
|
379
|
+
"pp:Diagram": {
|
|
380
|
+
"anchor": null,
|
|
381
|
+
"description": "Abstract diagram domain — flowcharts, UML, network topologies. Parent of pp:DiagramShape, pp:Connector, and the flow-relation hierarchy.",
|
|
382
|
+
"parentType": "pp:CanvasElement"
|
|
383
|
+
},
|
|
384
|
+
"pp:DiagramShape": {
|
|
385
|
+
"anchor": null,
|
|
386
|
+
"description": "A flowchart, UML or network node — a shape that carries PORTS, so connectors attach to it and keep tracking it when it moves. That attachment is the whole difference from the plain shape of the same outline: choose this whenever anything will be connected to it, and a plain pp:Rectangle or pp:Ellipse when nothing will.",
|
|
387
|
+
"parentType": "pp:Diagram",
|
|
388
|
+
"mcpTool": "pinepaper_create_diagram_shape"
|
|
389
|
+
},
|
|
390
|
+
"pp:Disk": {
|
|
391
|
+
"anchor": "wd:Q238231",
|
|
392
|
+
"description": "The plane REGION bounded by a circle — the filled dot, orb or ball, defined by `radius` alone. What almost every round shape on a canvas is, and what `create('circle')` produces by default (the id has always drawn filled); `create('disk')` says so explicitly. Its boundary is a pp:Circle; the two are typed apart because a ring and a dot are different things to a screen reader, a training corpus and a boolean operation. Wikidata Q238231, the disk (mathematics), not Q17278 the curve. `boundaryType` points back at that curve; a filled circle is a disk because filling a circle is exactly what makes the region.",
|
|
393
|
+
"parentType": "pp:CanvasShape",
|
|
394
|
+
"mcpTool": "pinepaper_create_item"
|
|
395
|
+
},
|
|
396
|
+
"pp:DistanceJoint": {
|
|
397
|
+
"anchor": null,
|
|
398
|
+
"description": "Fixed-length tether between two bodies — like a rigid rope. Use for tethers, pendulums and ropes; unlike a weld it permits rotation at both ends.",
|
|
399
|
+
"parentType": "pp:PhysicsJoint",
|
|
400
|
+
"mcpTool": "pinepaper_physics",
|
|
401
|
+
"mcpAction": "create_joint"
|
|
402
|
+
},
|
|
403
|
+
"pp:DistributionTask": {
|
|
404
|
+
"description": "Show spread or frequency of values (how is it distributed?) Favours histograms and box plots. Bin width IS the analysis — the same data tells different stories at different widths.",
|
|
405
|
+
"parentType": "pp:AnalyticalTask"
|
|
406
|
+
},
|
|
407
|
+
"pp:DitherNode": {
|
|
408
|
+
"anchor": null,
|
|
409
|
+
"description": "A sub-pixel offset added before quantisation, to trade banding for noise. An 8-bit target shows visible steps across any smooth falloff; a dither node breaks the step edges so the eye integrates them away.",
|
|
410
|
+
"parentType": "pp:ShaderNode"
|
|
411
|
+
},
|
|
412
|
+
"pp:DocumentShape": {
|
|
413
|
+
"anchor": null,
|
|
414
|
+
"description": "A rectangle with a wavy lower edge: a printed or reported artefact produced by the process — something a person receives, rather than data a system stores.",
|
|
415
|
+
"parentType": "pp:FlowchartShape",
|
|
416
|
+
"mcpTool": "pinepaper_create_diagram_shape"
|
|
417
|
+
},
|
|
418
|
+
"pp:DynamicBody": {
|
|
419
|
+
"anchor": null,
|
|
420
|
+
"description": "Fully simulated rigid body — gravity, forces, impulses, collisions all act on it.",
|
|
421
|
+
"parentType": "pp:PhysicsBody",
|
|
422
|
+
"mcpTool": "pinepaper_physics",
|
|
423
|
+
"mcpAction": "add_body"
|
|
424
|
+
},
|
|
425
|
+
"pp:Ellipse": {
|
|
426
|
+
"anchor": null,
|
|
427
|
+
"description": "A closed oval defined by independent `width` and `height`. Choose pp:Circle when the shape must remain round; use an ellipse precisely when the two axes should differ or animate apart.",
|
|
428
|
+
"parentType": "pp:CanvasShape",
|
|
429
|
+
"mcpTool": "pinepaper_create_item"
|
|
430
|
+
},
|
|
431
|
+
"pp:EncodingChannel": {
|
|
432
|
+
"description": "Abstract visual encoding channel — maps data values to perceptual properties"
|
|
433
|
+
},
|
|
434
|
+
"pp:Event": {
|
|
435
|
+
"anchor": null,
|
|
436
|
+
"description": "Named event channel — pulsed by interaction relations (on_click_fire, etc.) and listened to by reaction relations (on_event_set_property, etc.). Carries optional payload (Numeric/String/Boolean/Pulse). Frame-coherent dispatch.",
|
|
437
|
+
"parentType": "pp:CanvasElement",
|
|
438
|
+
"mcpTool": "pinepaper_event",
|
|
439
|
+
"mcpAction": "create"
|
|
440
|
+
},
|
|
441
|
+
"pp:FacetedSeries": {
|
|
442
|
+
"description": "Small multiples — separate panels per series Small multiples: each panel is simple and all share a scale, so comparison is across panels rather than within one. The scale must be shared or the panels lie.",
|
|
443
|
+
"parentType": "pp:CompositionMode"
|
|
444
|
+
},
|
|
445
|
+
"pp:FlowchartShape": {
|
|
446
|
+
"anchor": null,
|
|
447
|
+
"description": "Abstract: shapes in flowchart notation, where the OUTLINE carries the meaning. A reader infers the role from the silhouette before reading a word, so using the wrong shape actively misinforms.",
|
|
448
|
+
"parentType": "pp:DiagramShape"
|
|
449
|
+
},
|
|
450
|
+
"pp:FractalNode": {
|
|
451
|
+
"anchor": null,
|
|
452
|
+
"description": "A sum of octaves — the same noise sampled at doubling frequency and halving amplitude. This is what turns one smooth field into something with detail at every scale, which is why natural-looking terrain, cloud and fire all go through one.",
|
|
453
|
+
"parentType": "pp:ShaderNode"
|
|
454
|
+
},
|
|
455
|
+
"pp:GeoFeature": {
|
|
456
|
+
"anchor": null,
|
|
457
|
+
"description": "Abstract geographic feature — regions, markers, administrative areas. Parent of pp:MapRegion and pp:Marker. Matches the GeoJSON \"feature\" concept.",
|
|
458
|
+
"parentType": "pp:CanvasElement"
|
|
459
|
+
},
|
|
460
|
+
"pp:GeographicCoordinates": {
|
|
461
|
+
"anchor": "wd:Q22664",
|
|
462
|
+
"description": "Geographic lat/lon projection (choropleth, bubble map) The projection is a real decision — every one distorts something, and the usual default exaggerates area toward the poles.",
|
|
463
|
+
"parentType": "pp:CoordinateSystem"
|
|
464
|
+
},
|
|
465
|
+
"pp:Glyph": {
|
|
466
|
+
"anchor": null,
|
|
467
|
+
"description": "A single character rendered as an editable vector outline (CompoundPath) — distinct from pp:Text (system-font text). Use to animate, morph, scale, or boolean a letter/digit as geometry. Emitted as custom Paper.js code (a CompoundPath per glyph).",
|
|
468
|
+
"parentType": "pp:CanvasShape",
|
|
469
|
+
"mcpTool": "pinepaper_execute_custom_code"
|
|
470
|
+
},
|
|
471
|
+
"pp:GroundCollider": {
|
|
472
|
+
"anchor": null,
|
|
473
|
+
"description": "Horizontal ground plane at a fixed y. Bones above this y stay above it — used for floors and standing surfaces.",
|
|
474
|
+
"parentType": "pp:BoneCollider"
|
|
475
|
+
},
|
|
476
|
+
"pp:Group": {
|
|
477
|
+
"anchor": null,
|
|
478
|
+
"description": "A container whose children transform, animate and export as one unit: moving, scaling or rotating the group applies to everything inside it. Selection resolves to the group, so click-through requires ⌥/Alt. Choose pp:Precomp instead when the contents need their OWN timeline — a group shares the scene's clock and cannot loop independently.",
|
|
479
|
+
"parentType": "pp:CanvasContainer"
|
|
480
|
+
},
|
|
481
|
+
"pp:GroupedSeries": {
|
|
482
|
+
"description": "Series placed side by side for comparison Keeps every series on a common baseline so all are comparable, at the cost of width — it degrades quickly past a handful of groups.",
|
|
483
|
+
"parentType": "pp:CompositionMode"
|
|
484
|
+
},
|
|
485
|
+
"pp:HandDrawnAnimation": {
|
|
486
|
+
"anchor": "schema:VisualArtwork",
|
|
487
|
+
"description": "Procedural hand-drawn canvas animation, sketchy stroke jitter, and stop-motion line reveals.",
|
|
488
|
+
"parentType": "pp:Concept"
|
|
489
|
+
},
|
|
490
|
+
"pp:HashNode": {
|
|
491
|
+
"anchor": null,
|
|
492
|
+
"description": "A deterministic pseudo-random value from a coordinate — the seed of every procedural pattern here. Not random: the same input always gives the same output, which is what makes a shader reproducible frame to frame and across machines. Dave Hoskins' family, chosen over the naive sin-based hash because that one shows axis-aligned artefacts at low frequency, and an aura is often only 200px across.",
|
|
493
|
+
"parentType": "pp:ShaderNode"
|
|
494
|
+
},
|
|
495
|
+
"pp:Heatmap": {
|
|
496
|
+
"description": "Heatmap — cell marks with color encoding for matrix data For dense matrices where the pattern matters more than any single cell; the colour scale decides what a reader sees.",
|
|
497
|
+
"parentType": "pp:DataVisualization",
|
|
498
|
+
"mcpTool": "pinepaper_create_chart",
|
|
499
|
+
"mcpAction": "create"
|
|
500
|
+
},
|
|
501
|
+
"pp:HierarchyTask": {
|
|
502
|
+
"description": "Show nested structure (how is it organized?) Favours treemaps, sunbursts and node-link trees. Treemaps show magnitude well and structure poorly; node-link trees do the reverse.",
|
|
503
|
+
"parentType": "pp:AnalyticalTask"
|
|
504
|
+
},
|
|
505
|
+
"pp:Histogram": {
|
|
506
|
+
"description": "Histogram — binned bar chart showing value distribution Bin width is the analysis, not a display detail — the same data tells different stories at different widths.",
|
|
507
|
+
"parentType": "pp:DataVisualization",
|
|
508
|
+
"mcpTool": "pinepaper_create_chart",
|
|
509
|
+
"mcpAction": "create"
|
|
510
|
+
},
|
|
511
|
+
"pp:IKChain": {
|
|
512
|
+
"anchor": null,
|
|
513
|
+
"description": "Inverse-kinematics chain on a skeleton — ordered bones + solver (fabrik / two_bone / ccd), optional pole vector, optional driving target item.",
|
|
514
|
+
"parentType": "pp:Concept",
|
|
515
|
+
"mcpTool": "pinepaper_rigging",
|
|
516
|
+
"mcpAction": "create_ik_chain"
|
|
517
|
+
},
|
|
518
|
+
"pp:IKTargetPath": {
|
|
519
|
+
"anchor": null,
|
|
520
|
+
"description": "A spatial motion PATH (Lottie ti/to-style waypoints with bezier tangents) that an IK chain's effector follows, so it travels an ARC instead of a straight line to a static target. Temporal ease (pp:TimingCurve) is orthogonal to this spatial curvature.",
|
|
521
|
+
"parentType": "pp:Concept",
|
|
522
|
+
"mcpTool": "pinepaper_rigging",
|
|
523
|
+
"mcpAction": "set_target_path"
|
|
524
|
+
},
|
|
525
|
+
"pp:Image": {
|
|
526
|
+
"anchor": "schema:ImageObject",
|
|
527
|
+
"description": "A raster bitmap placed from `src` — pixels, not vectors, so it does not scale infinitely and cannot be morphed or path-animated. `crossOrigin` defaults to 'anonymous' so a CORS-friendly host keeps exports untainted; a non-CORS host fails VISIBLY as an empty slot rather than silently tainting every export of the scene.",
|
|
528
|
+
"parentType": "pp:CanvasElement"
|
|
529
|
+
},
|
|
530
|
+
"pp:IndexedStore": {
|
|
531
|
+
"anchor": null,
|
|
532
|
+
"description": "Asynchronous structured storage, large enough for scene-sized state. Resolves LATER than the frame that asked, so it suits loading and saving rather than per-frame reads — that asynchrony is the whole reason it is a separate type from pp:LocalStore.",
|
|
533
|
+
"parentType": "pp:Store"
|
|
534
|
+
},
|
|
535
|
+
"pp:IntroScene": {
|
|
536
|
+
"anchor": "schema:VisualArtwork",
|
|
537
|
+
"description": "Motion scene configured for title reveals, openers, and intro presentation hooks.",
|
|
538
|
+
"parentType": "pp:MotionScene"
|
|
539
|
+
},
|
|
540
|
+
"pp:KinematicBody": {
|
|
541
|
+
"anchor": null,
|
|
542
|
+
"description": "Animation-driven rigid body — ignores forces but pushes dynamic bodies. Used for animated platforms, controlled characters.",
|
|
543
|
+
"parentType": "pp:PhysicsBody",
|
|
544
|
+
"mcpTool": "pinepaper_physics",
|
|
545
|
+
"mcpAction": "add_body"
|
|
546
|
+
},
|
|
547
|
+
"pp:LayeredSeries": {
|
|
548
|
+
"description": "Series overlaid with transparency Preserves each series' own baseline, but overlapping fills obscure one another; best with two or three.",
|
|
549
|
+
"parentType": "pp:CompositionMode"
|
|
550
|
+
},
|
|
551
|
+
"pp:LetterCollage": {
|
|
552
|
+
"anchor": null,
|
|
553
|
+
"description": "Text rebuilt as per-letter artwork so each character can be styled independently — tiles, magazine cut-out, gradient fills. It REPLACES the text item, so apply it once the wording is settled; the letters are hit-tested by their ink, not by a bounding box.",
|
|
554
|
+
"parentType": "pp:CanvasText",
|
|
555
|
+
"mcpTool": "pinepaper_create_item"
|
|
556
|
+
},
|
|
557
|
+
"pp:Line": {
|
|
558
|
+
"anchor": null,
|
|
559
|
+
"description": "An open two-point path from `from` to `to`, drawn with `strokeColor`/`strokeWidth` and NOT filled — a fill on an open path renders as the region between its endpoints, which is rarely what is wanted. Choose pp:Connector when the line joins two diagram nodes and should follow them; a plain line is fixed in place and will not.",
|
|
560
|
+
"parentType": "pp:CanvasShape",
|
|
561
|
+
"mcpTool": "pinepaper_create_item"
|
|
562
|
+
},
|
|
563
|
+
"pp:LineChart": {
|
|
564
|
+
"description": "Line chart — connected marks showing trends over a continuous axis",
|
|
565
|
+
"parentType": "pp:DataVisualization",
|
|
566
|
+
"mcpTool": "pinepaper_create_chart",
|
|
567
|
+
"mcpAction": "create"
|
|
568
|
+
},
|
|
569
|
+
"pp:LineMark": {
|
|
570
|
+
"description": "Connected trajectory mark (line, step, spline) Connecting points asserts CONTINUITY between them, so it is wrong for unordered categories no matter how good it looks.",
|
|
571
|
+
"parentType": "pp:MarkType"
|
|
572
|
+
},
|
|
573
|
+
"pp:LocalStore": {
|
|
574
|
+
"anchor": null,
|
|
575
|
+
"description": "Synchronous key/value storage of strings, around 5 MB. Readable and writable during a frame, which is why a counter can increment on click and be read in the same tick. Shares the HOST PAGE's origin, so keys are namespaced and nothing private belongs here.",
|
|
576
|
+
"parentType": "pp:Store"
|
|
577
|
+
},
|
|
578
|
+
"pp:MapRegion": {
|
|
579
|
+
"anchor": null,
|
|
580
|
+
"description": "A rendered region shape on a map, filled and selectable. Unanchored for the same reason as pp:Marker: the drawn polygon DEPICTS an administrative area, it is not one, and rdfs:subClassOf would say it is.",
|
|
581
|
+
"parentType": "pp:GeoFeature",
|
|
582
|
+
"mcpTool": "pinepaper_map",
|
|
583
|
+
"mcpAction": "load"
|
|
584
|
+
},
|
|
585
|
+
"pp:MarkType": {
|
|
586
|
+
"description": "Abstract mark primitive — the visual element used to represent data points"
|
|
587
|
+
},
|
|
588
|
+
"pp:Marker": {
|
|
589
|
+
"anchor": null,
|
|
590
|
+
"description": "A pin drawn on a map at a geographic coordinate. Deliberately UNANCHORED: `anchor` compiles to rdfs:subClassOf, and a marker is a graphical annotation that POINTS AT a place — it is not one. Asserting schema:Place would publish that every marker has an address and real-world coordinates, when what it has is a fill colour and a canvas position.",
|
|
591
|
+
"parentType": "pp:GeoFeature",
|
|
592
|
+
"mcpTool": "pinepaper_map_regions",
|
|
593
|
+
"mcpAction": "add_marker"
|
|
594
|
+
},
|
|
595
|
+
"pp:MaskedItem": {
|
|
596
|
+
"anchor": null,
|
|
597
|
+
"description": "An item clipped to a mask shape, existing as a composite of the two. The registry identity follows the COMPOSITE rather than the original, which is why relations pointing at the item keep working after a mask is applied.",
|
|
598
|
+
"parentType": "pp:CanvasElement",
|
|
599
|
+
"mcpTool": "pinepaper_apply_custom_mask"
|
|
600
|
+
},
|
|
601
|
+
"pp:MediaRef": {
|
|
602
|
+
"anchor": null,
|
|
603
|
+
"description": "Shared media handle for a video / audio source. Multiple clips can reference the same source — two timeline copies of one uploaded video share one MediaRef. Use this to deduplicate media across a scene and across exports.",
|
|
604
|
+
"parentType": "pp:Concept"
|
|
605
|
+
},
|
|
606
|
+
"pp:MotionScene": {
|
|
607
|
+
"anchor": "schema:VisualArtwork",
|
|
608
|
+
"description": "Dynamic 2.5D vector motion canvas scene containing animation, procedural backgrounds, shaders, and audio synthesis.",
|
|
609
|
+
"parentType": "pp:CanvasElement"
|
|
610
|
+
},
|
|
611
|
+
"pp:MovingHold": {
|
|
612
|
+
"anchor": null,
|
|
613
|
+
"description": "A pose hold that slowly DRIFTS toward the next key (by a small holdDrift) instead of dead-stopping — keeps a held pose alive and anticipating the next action.",
|
|
614
|
+
"parentType": "pp:Concept",
|
|
615
|
+
"mcpTool": "pinepaper_rigging",
|
|
616
|
+
"mcpAction": "add_pose_keyframe"
|
|
617
|
+
},
|
|
618
|
+
"pp:NetworkShape": {
|
|
619
|
+
"anchor": null,
|
|
620
|
+
"description": "Abstract: shapes in network-topology notation, where the subject is what CONNECTS to what rather than what happens first.",
|
|
621
|
+
"parentType": "pp:DiagramShape"
|
|
622
|
+
},
|
|
623
|
+
"pp:NoiseNode": {
|
|
624
|
+
"anchor": null,
|
|
625
|
+
"description": "Band-limited continuous noise: smooth between lattice points, random at them. The difference from a hash is interpolation — a hash is discontinuous everywhere, so it reads as static; a noise node reads as cloud, smoke or flow.",
|
|
626
|
+
"parentType": "pp:ShaderNode"
|
|
627
|
+
},
|
|
628
|
+
"pp:OceanField": {
|
|
629
|
+
"anchor": "wd:Q9430",
|
|
630
|
+
"description": "Animated water surface with depth-graded colour and a sun glint. Anchored to the ocean as a thing, so a walk can compose over it — a boat ON an ocean is a relation between two nodes, which it cannot be if the water is only a property of the canvas.",
|
|
631
|
+
"parentType": "pp:ProceduralField"
|
|
632
|
+
},
|
|
633
|
+
"pp:OpenPath": {
|
|
634
|
+
"anchor": null,
|
|
635
|
+
"description": "Open path (trajectory/stroke) — has start and end points, does not enclose area. Defined by curveType: the mathematical function governing its segments.",
|
|
636
|
+
"parentType": "pp:Path",
|
|
637
|
+
"mcpTool": "pinepaper_create_item"
|
|
638
|
+
},
|
|
639
|
+
"pp:OutroScene": {
|
|
640
|
+
"anchor": "schema:VisualArtwork",
|
|
641
|
+
"description": "Motion scene configured for call-to-action, summaries, and closing presentation frames.",
|
|
642
|
+
"parentType": "pp:MotionScene"
|
|
643
|
+
},
|
|
644
|
+
"pp:ParallelCoordinates": {
|
|
645
|
+
"description": "Parallel axes for multivariate comparison For multivariate data where relationships BETWEEN axes matter; axis ORDER changes which relationships are visible, so it is part of the analysis.",
|
|
646
|
+
"parentType": "pp:CoordinateSystem"
|
|
647
|
+
},
|
|
648
|
+
"pp:Path": {
|
|
649
|
+
"anchor": null,
|
|
650
|
+
"description": "Vector path — semantically incomplete without open/closed distinction. Defined by its curveType (mathematical function family). Refined to OpenPath or ClosedPath during graph extraction.",
|
|
651
|
+
"parentType": "pp:CanvasShape",
|
|
652
|
+
"mcpTool": "pinepaper_create_item"
|
|
653
|
+
},
|
|
654
|
+
"pp:PathSkinning": {
|
|
655
|
+
"anchor": null,
|
|
656
|
+
"description": "Per-vertex bone-weight binding of a Path or CompoundPath to a skeleton — linear blend skinning in 2D. Each path segment carries a list of (boneId, weight) influences, computed once at skin time from vertex-to-bone distances. Use for cloth, capes, and any deformable surface that should flex with the underlying rig.",
|
|
657
|
+
"parentType": "pp:Concept"
|
|
658
|
+
},
|
|
659
|
+
"pp:Pattern": {
|
|
660
|
+
"anchor": null,
|
|
661
|
+
"description": "Repeating decorative field (scanlines, stripes, grid, dots) materialized as ONE item — a single CompoundPath tiling an area. The scale-safe form of what would otherwise be hundreds of individual primitives.",
|
|
662
|
+
"parentType": "pp:CanvasShape",
|
|
663
|
+
"mcpTool": "pinepaper_create_item"
|
|
664
|
+
},
|
|
665
|
+
"pp:PhysicsBody": {
|
|
666
|
+
"anchor": null,
|
|
667
|
+
"description": "Box2D rigid body attached to a canvas item. Subtype determines simulation behavior: static (immobile), dynamic (full sim), kinematic (animation-driven, can push dynamics).",
|
|
668
|
+
"parentType": "pp:Concept",
|
|
669
|
+
"mcpTool": "pinepaper_physics",
|
|
670
|
+
"mcpAction": "add_body"
|
|
671
|
+
},
|
|
672
|
+
"pp:PhysicsGround": {
|
|
673
|
+
"anchor": null,
|
|
674
|
+
"description": "Convenience static body at the bottom of the canvas — provides a floor for dynamic bodies to land on.",
|
|
675
|
+
"parentType": "pp:StaticBody",
|
|
676
|
+
"mcpTool": "pinepaper_physics",
|
|
677
|
+
"mcpAction": "create_ground"
|
|
678
|
+
},
|
|
679
|
+
"pp:PhysicsJoint": {
|
|
680
|
+
"anchor": null,
|
|
681
|
+
"description": "Constraint between two physics bodies. Subtype determines the degrees of freedom allowed.",
|
|
682
|
+
"parentType": "pp:Concept",
|
|
683
|
+
"mcpTool": "pinepaper_physics",
|
|
684
|
+
"mcpAction": "create_joint"
|
|
685
|
+
},
|
|
686
|
+
"pp:PieChart": {
|
|
687
|
+
"description": "Pie chart — arc marks in polar coordinates showing part-to-whole",
|
|
688
|
+
"parentType": "pp:DataVisualization",
|
|
689
|
+
"mcpTool": "pinepaper_create_chart",
|
|
690
|
+
"mcpAction": "create"
|
|
691
|
+
},
|
|
692
|
+
"pp:PlasmaField": {
|
|
693
|
+
"anchor": "wd:Q661134",
|
|
694
|
+
"description": "Domain-warped fractal noise through a cosine palette — the demoscene plasma, which is what the anchor names: a DEMO EFFECT, not the physical state of matter (that is a different Wikidata concept and anchoring to it would be a category error a model would then repeat).",
|
|
695
|
+
"parentType": "pp:ProceduralField"
|
|
696
|
+
},
|
|
697
|
+
"pp:PointMark": {
|
|
698
|
+
"description": "Discrete position mark (scatter, bubble, dot) Position is read accurately, so scatter is the right mark for correlation; it degrades fastest under overplotting.",
|
|
699
|
+
"parentType": "pp:MarkType"
|
|
700
|
+
},
|
|
701
|
+
"pp:PolarCoordinates": {
|
|
702
|
+
"anchor": "wd:Q62494",
|
|
703
|
+
"description": "Polar angle/radius coordinates (pie, radar, rose charts) Makes cyclical structure obvious and magnitudes hard, since radius encodes area rather than length.",
|
|
704
|
+
"parentType": "pp:CoordinateSystem"
|
|
705
|
+
},
|
|
706
|
+
"pp:Polygon": {
|
|
707
|
+
"anchor": null,
|
|
708
|
+
"description": "A regular N-sided shape defined by `sides` (3 or more) and `radius` — every side and interior angle equal. Choose pp:Path when the outline is irregular; a polygon cannot express one, and forcing it produces a shape that silently ignores the vertices you meant.",
|
|
709
|
+
"parentType": "pp:CanvasShape",
|
|
710
|
+
"mcpTool": "pinepaper_create_item"
|
|
711
|
+
},
|
|
712
|
+
"pp:Pose": {
|
|
713
|
+
"anchor": null,
|
|
714
|
+
"description": "Named bone-angle map saved on a skeleton, addressable by id. Multiple poses per skeleton form a pose library.",
|
|
715
|
+
"parentType": "pp:Concept",
|
|
716
|
+
"mcpTool": "pinepaper_rigging",
|
|
717
|
+
"mcpAction": "save_pose"
|
|
718
|
+
},
|
|
719
|
+
"pp:PoseOverlap": {
|
|
720
|
+
"anchor": null,
|
|
721
|
+
"description": "Per-bone timing offsets on a pose keyframe { boneId: lag∈[0,0.95) } — lagged bones trail during the transition so the tip drags the root: overlapping action / follow-through / drag (e.g. a \"delay foot\" on a kick).",
|
|
722
|
+
"parentType": "pp:Concept",
|
|
723
|
+
"mcpTool": "pinepaper_rigging",
|
|
724
|
+
"mcpAction": "add_pose_keyframe"
|
|
725
|
+
},
|
|
726
|
+
"pp:PositionEncoding": {
|
|
727
|
+
"description": "Position on x/y axes — highest-bandwidth encoding Use it for the most important variable — nothing else is read as precisely.",
|
|
728
|
+
"parentType": "pp:EncodingChannel"
|
|
729
|
+
},
|
|
730
|
+
"pp:Precomp": {
|
|
731
|
+
"anchor": null,
|
|
732
|
+
"description": "A nested composition with its OWN timeline, so its contents can loop independently of the scene clock. That local clock is the whole difference from pp:Group, which shares the scene's time and cannot.",
|
|
733
|
+
"parentType": "pp:CanvasContainer",
|
|
734
|
+
"mcpTool": "pinepaper_precomp",
|
|
735
|
+
"mcpAction": "create"
|
|
736
|
+
},
|
|
737
|
+
"pp:PreparationShape": {
|
|
738
|
+
"anchor": null,
|
|
739
|
+
"description": "A hexagon: initialisation or setup performed before the main flow — declaring a variable, opening a connection. Separating it keeps the main path readable.",
|
|
740
|
+
"parentType": "pp:FlowchartShape",
|
|
741
|
+
"mcpTool": "pinepaper_create_diagram_shape"
|
|
742
|
+
},
|
|
743
|
+
"pp:ProceduralField": {
|
|
744
|
+
"anchor": "wd:Q3519388",
|
|
745
|
+
"description": "A full-canvas surface whose pixels are COMPUTED rather than drawn — a generator's output, materialized as one raster the registry holds under its own id. It is a PLACE, not a decoration, and that distinction is the reason it is a node at all: a tunnel is a thing you can put something inside, so a rigged figure can run through one and a boat can sit on an ocean. A pp:ShaderEffectRelation, by contrast, is applied TO an item and dies with it. NOISE PROVENANCE: these programs call the SHARED pp:ShaderNode primitives from js/gpu/AuraNoiseGLSL.js, so a walk can descend from a field to the maths that draws it. Each used to inline its own hash and value noise — a third family beside the original auras' inline set and the shared one — which meant no usesShaderNode edge could be declared for any of them; that was corrected 2026-09-11 by porting them onto the shared module. pp:OceanField and pp:TunnelField declare no edge and that is not an omission: one is a sum of sine waves and the other a rotation, and neither hashes anything.",
|
|
746
|
+
"parentType": "pp:CanvasElement"
|
|
747
|
+
},
|
|
748
|
+
"pp:ProcessShape": {
|
|
749
|
+
"anchor": null,
|
|
750
|
+
"description": "A rectangle: an action or step that DOES something. The default flowchart node — reach for another shape only when the step is not a plain action.",
|
|
751
|
+
"parentType": "pp:FlowchartShape",
|
|
752
|
+
"mcpTool": "pinepaper_create_diagram_shape"
|
|
753
|
+
},
|
|
754
|
+
"pp:RectCollider": {
|
|
755
|
+
"anchor": null,
|
|
756
|
+
"description": "Axis-aligned rectangular obstacle. Bones pushed out to the nearest edge. Use for boxes, walls, platforms.",
|
|
757
|
+
"parentType": "pp:BoneCollider"
|
|
758
|
+
},
|
|
759
|
+
"pp:Rectangle": {
|
|
760
|
+
"anchor": null,
|
|
761
|
+
"description": "A closed four-sided shape defined by `width` and `height`, with optional `cornerRadius` for rounded corners. The default container for panels, cards, bars and backdrops. Choose pp:DiagramShape instead when the rectangle is a NODE that connectors should attach to — a plain rectangle has no ports, so a connector aimed at it will not track it.",
|
|
762
|
+
"parentType": "pp:CanvasShape",
|
|
763
|
+
"mcpTool": "pinepaper_create_item"
|
|
764
|
+
},
|
|
765
|
+
"pp:RelationshipTask": {
|
|
766
|
+
"description": "Show correlation between variables (how do they relate?) Favours scatter plots. Beware of implying causation from a visible correlation — the chart cannot distinguish them.",
|
|
767
|
+
"parentType": "pp:AnalyticalTask"
|
|
768
|
+
},
|
|
769
|
+
"pp:RevoluteJoint": {
|
|
770
|
+
"anchor": null,
|
|
771
|
+
"description": "Hinge joint — bodies pivot around a shared anchor point with optional motor and angle limits.",
|
|
772
|
+
"parentType": "pp:PhysicsJoint",
|
|
773
|
+
"mcpTool": "pinepaper_physics",
|
|
774
|
+
"mcpAction": "create_joint"
|
|
775
|
+
},
|
|
776
|
+
"pp:RiggedCharacter": {
|
|
777
|
+
"anchor": "wd:Q1813564",
|
|
778
|
+
"description": "A character whose parts are bound to a skeleton, so a pose or a walk cycle drives the artwork. Anchored on skeletal animation — the technique that defines it.",
|
|
779
|
+
"parentType": "pp:CharacterAsset"
|
|
780
|
+
},
|
|
781
|
+
"pp:ScatterPlot": {
|
|
782
|
+
"description": "Scatter plot — point marks encoding two quantitative variables as position",
|
|
783
|
+
"parentType": "pp:DataVisualization",
|
|
784
|
+
"mcpTool": "pinepaper_create_chart",
|
|
785
|
+
"mcpAction": "create"
|
|
786
|
+
},
|
|
787
|
+
"pp:ScatteringNode": {
|
|
788
|
+
"anchor": null,
|
|
789
|
+
"description": "A light-response term: how much light leaves a surface or a volume in the view direction. These are the nodes that make a shaded thing read as a MATERIAL rather than as a coloured blur.",
|
|
790
|
+
"parentType": "pp:ShaderNode"
|
|
791
|
+
},
|
|
792
|
+
"pp:SceneAction": {
|
|
793
|
+
"anchor": null,
|
|
794
|
+
"description": "Single scheduled action inside a pp:SceneScript. Concrete subtypes are the composable character verbs (move/jump/crouch/idle/custom). All actions accept a duration (seconds) at the SceneScript level controlling how long they remain active.",
|
|
795
|
+
"parentType": "pp:Concept"
|
|
796
|
+
},
|
|
797
|
+
"pp:SceneScript": {
|
|
798
|
+
"anchor": null,
|
|
799
|
+
"description": "Time-orchestrated container of character actions on a timeline. Loops, plays at variable speed, seekable.",
|
|
800
|
+
"parentType": "pp:Concept",
|
|
801
|
+
"mcpTool": "pinepaper_create_scene"
|
|
802
|
+
},
|
|
803
|
+
"pp:SequenceConnector": {
|
|
804
|
+
"anchor": null,
|
|
805
|
+
"description": "A connector carrying CONTROL flow — what happens next. The default flowchart edge; a solid arrow means the process continues along it.",
|
|
806
|
+
"parentType": "pp:Connector",
|
|
807
|
+
"mcpTool": "pinepaper_connect"
|
|
808
|
+
},
|
|
809
|
+
"pp:ServerShape": {
|
|
810
|
+
"anchor": null,
|
|
811
|
+
"description": "A host that runs something. The concrete counterpart to pp:CloudShape: this is infrastructure you own and can reason about.",
|
|
812
|
+
"parentType": "pp:NetworkShape",
|
|
813
|
+
"mcpTool": "pinepaper_create_diagram_shape"
|
|
814
|
+
},
|
|
815
|
+
"pp:ShaderMesh": {
|
|
816
|
+
"anchor": "wd:Q1154597",
|
|
817
|
+
"description": "Geometry in a 3D world drawn by an author-supplied vertex and fragment program. Unlike pp:WorldObject, which is a box with a colour, its SHAPE and its SHADING are both the author's: vertices and triangles supplied as data, transformed by a vertex program that may displace them per frame. A registry citizen under its own id, so relations can target it — anchor a label to a procedural surface, or drive its uniforms from an event.",
|
|
818
|
+
"parentType": "pp:WorldObject"
|
|
819
|
+
},
|
|
820
|
+
"pp:ShaderNode": {
|
|
821
|
+
"anchor": null,
|
|
822
|
+
"description": "A named, reusable GPU shading function — the level BELOW an effect. An effect (pp:effectCaustics) is a whole program with a look; a shader node is one term inside it, with a signature and a formula, that several programs share. Naming this level is what lets the graph answer “what is caustics MADE of” rather than only “this item has caustics”, and what lets a walk recombine terms into a program nobody wrote. Abstract: every instance is one of the role subtypes below.",
|
|
823
|
+
"parentType": "pp:Concept"
|
|
824
|
+
},
|
|
825
|
+
"pp:ShapeEncoding": {
|
|
826
|
+
"description": "Point shape or dash pattern — encodes category Robust in print and greyscale where colour is not, but slow to read; best for a small number of categories.",
|
|
827
|
+
"parentType": "pp:EncodingChannel"
|
|
828
|
+
},
|
|
829
|
+
"pp:ShapeKey": {
|
|
830
|
+
"anchor": null,
|
|
831
|
+
"description": "Per-item visual delta (segments, opacity, color, size) saved on a skeleton with a rest baseline. Weighted blends drive facial-style animation.",
|
|
832
|
+
"parentType": "pp:Concept",
|
|
833
|
+
"mcpTool": "pinepaper_rigging",
|
|
834
|
+
"mcpAction": "save_shape_key"
|
|
835
|
+
},
|
|
836
|
+
"pp:SingleSeries": {
|
|
837
|
+
"description": "One data series displayed alone The clearest option; add a second series only when the comparison is the point.",
|
|
838
|
+
"parentType": "pp:CompositionMode"
|
|
839
|
+
},
|
|
840
|
+
"pp:SizeEncoding": {
|
|
841
|
+
"description": "Width, height, or radius — encodes magnitude Area is systematically UNDER-estimated by readers, so size exaggerates differences unless the scale corrects for it.",
|
|
842
|
+
"parentType": "pp:EncodingChannel"
|
|
843
|
+
},
|
|
844
|
+
"pp:Skeleton": {
|
|
845
|
+
"anchor": null,
|
|
846
|
+
"description": "A hierarchy of bones that drives artwork bound to it. Poses, walk cycles and expression presets are all defined against a skeleton's bone NAMES, so the naming is what makes stock animation work without per-character wiring.",
|
|
847
|
+
"parentType": "pp:CanvasContainer",
|
|
848
|
+
"mcpTool": "pinepaper_rigging",
|
|
849
|
+
"mcpAction": "create_skeleton"
|
|
850
|
+
},
|
|
851
|
+
"pp:Sound": {
|
|
852
|
+
"anchor": "schema:AudioObject",
|
|
853
|
+
"description": "A synthesized audio source in the graph — a named voice whose value is a continuous waveform signal (ExpressionIR) over a [t0,t1] window, rendered by the Web Audio renderer. The synthesis counterpart to the sample-based pp:AudioClip; can hold a single tone, a chord, or an arbitrary partial set.",
|
|
854
|
+
"parentType": "pp:CanvasElement"
|
|
855
|
+
},
|
|
856
|
+
"pp:SpatialTask": {
|
|
857
|
+
"description": "Show geographic distribution (where?) Favours a map, but only when LOCATION is the variable; when it is merely an attribute, a bar chart usually reads better than a map.",
|
|
858
|
+
"parentType": "pp:AnalyticalTask"
|
|
859
|
+
},
|
|
860
|
+
"pp:SpriteAnimation": {
|
|
861
|
+
"anchor": null,
|
|
862
|
+
"description": "Named playback cycle in a pp:SpriteSheet — ordered list of frame names, playback FPS, loop flag, and direction (forward / reverse / pingpong). Game engines and PinePaper's built-in player consume this for character animation.",
|
|
863
|
+
"parentType": "pp:Concept"
|
|
864
|
+
},
|
|
865
|
+
"pp:SpriteFrame": {
|
|
866
|
+
"anchor": null,
|
|
867
|
+
"description": "Single frame inside a pp:SpriteSheet — a captured raster of the rigged character at one pose. Has a name, source rect in the atlas, trim metadata, and the original capture bounds.",
|
|
868
|
+
"parentType": "pp:Concept"
|
|
869
|
+
},
|
|
870
|
+
"pp:SpritePlayer": {
|
|
871
|
+
"anchor": null,
|
|
872
|
+
"description": "Runtime playback session for a pp:SpriteAnimation on the canvas. Owns the per-frame delta-time accumulator, the current frame index, and the Raster item displaying the active frame. Use to play a generated atlas back on the canvas without re-rigging.",
|
|
873
|
+
"parentType": "pp:Concept",
|
|
874
|
+
"mcpTool": "pinepaper_sprite_sheet",
|
|
875
|
+
"mcpAction": "play"
|
|
876
|
+
},
|
|
877
|
+
"pp:SpriteSheet": {
|
|
878
|
+
"anchor": "schema:ImageObject",
|
|
879
|
+
"description": "Atlas+metadata package generated by rendering a rigged character across multiple poses or an animation timeline. Contains the packed image (TexturePacker JSON Hash format), per-frame uv data, and named animation cycles (e.g., walk / run / idle). Use to ship character animation as a single image for game engines or pre-rendered playback.",
|
|
880
|
+
"parentType": "pp:CanvasElement",
|
|
881
|
+
"mcpTool": "pinepaper_sprite_sheet",
|
|
882
|
+
"mcpAction": "generate"
|
|
883
|
+
},
|
|
884
|
+
"pp:StackedBarChart": {
|
|
885
|
+
"description": "Stacked bar chart — bars subdivided by category showing composition",
|
|
886
|
+
"parentType": "pp:BarChart",
|
|
887
|
+
"mcpTool": "pinepaper_create_chart",
|
|
888
|
+
"mcpAction": "create"
|
|
889
|
+
},
|
|
890
|
+
"pp:StackedSeries": {
|
|
891
|
+
"description": "Series stacked vertically (cumulative) Makes the TOTAL easy to read and every series except the bottom one hard, because only the first shares a baseline.",
|
|
892
|
+
"parentType": "pp:CompositionMode"
|
|
893
|
+
},
|
|
894
|
+
"pp:Star": {
|
|
895
|
+
"anchor": null,
|
|
896
|
+
"description": "Star shape (geometrically: concave polygon with alternating radii)",
|
|
897
|
+
"parentType": "pp:CanvasShape",
|
|
898
|
+
"mcpTool": "pinepaper_create_item"
|
|
899
|
+
},
|
|
900
|
+
"pp:StarfieldField": {
|
|
901
|
+
"anchor": null,
|
|
902
|
+
"description": "Multi-layer parallax starfield with hash-distributed, twinkling stars. Anchored to NOTHING on purpose: 'star field' as a rendered motif has no clean Wikidata concept — the searches return albums and video games — and a plausible-looking wrong anchor is worse than none, because the graph is training data and a wrong anchor is believed.",
|
|
903
|
+
"parentType": "pp:ProceduralField"
|
|
904
|
+
},
|
|
905
|
+
"pp:StaticBody": {
|
|
906
|
+
"anchor": null,
|
|
907
|
+
"description": "Immobile rigid body — collides with dynamics but never moves under force. Used for walls and obstacles.",
|
|
908
|
+
"parentType": "pp:PhysicsBody",
|
|
909
|
+
"mcpTool": "pinepaper_physics",
|
|
910
|
+
"mcpAction": "add_body"
|
|
911
|
+
},
|
|
912
|
+
"pp:Stitchcraft": {
|
|
913
|
+
"anchor": "schema:VisualArtwork",
|
|
914
|
+
"description": "Procedural embroidery, thread painting, seam lines, satin fills, and cross-stitch artwork applied onto canvas vector items.",
|
|
915
|
+
"parentType": "pp:CanvasElement"
|
|
916
|
+
},
|
|
917
|
+
"pp:Store": {
|
|
918
|
+
"anchor": null,
|
|
919
|
+
"description": "Abstract: persistent state a scene can read and write, surviving a page reload. Addressable and non-visual — it exists so a relation has somewhere to put a value, which is what keeps saving a score an assertion rather than a script.",
|
|
920
|
+
"parentType": "pp:CanvasElement"
|
|
921
|
+
},
|
|
922
|
+
"pp:Template": {
|
|
923
|
+
"anchor": "schema:VisualArtwork",
|
|
924
|
+
"description": "A complete authored scene, loadable as a starting point and parameterisable. Templates are the engine's worked examples — they exercise the same public API a caller has, so anything a template does is reproducible."
|
|
925
|
+
},
|
|
926
|
+
"pp:TerminalShape": {
|
|
927
|
+
"anchor": null,
|
|
928
|
+
"description": "A stadium/rounded form: where a process STARTS or ENDS. Conventionally exactly one start; multiple ends are normal and often clearer than funnelling every path together.",
|
|
929
|
+
"parentType": "pp:FlowchartShape",
|
|
930
|
+
"mcpTool": "pinepaper_create_diagram_shape"
|
|
931
|
+
},
|
|
932
|
+
"pp:Text": {
|
|
933
|
+
"anchor": "schema:CreativeWork",
|
|
934
|
+
"description": "A run of characters rendered as vector glyphs, sized by `fontSize` and set in `fontFamily`. The only type whose content is language, so it carries the scene's meaning and is what a screen reader announces. `contentType` makes it LIVE — clock, timer, countdown, stopwatch — updating itself without any animation attached. Becomes pp:LetterCollage when a Text Style is applied and pp:TextEffect when split per character; both REPLACE the text item, so reach for them last.",
|
|
935
|
+
"parentType": "pp:CanvasText",
|
|
936
|
+
"mcpTool": "pinepaper_create_item"
|
|
937
|
+
},
|
|
938
|
+
"pp:TextEffect": {
|
|
939
|
+
"anchor": "wd:Q638636",
|
|
940
|
+
"description": "A character-level text animation: one text item decomposed into per-character glyphs that arrive under a named effect (scattered, matrix, decrypt…). The composition is addressed through its ROOT glyph, which carries the content, font and origin it was built from — so the effect can be changed without retyping the text.",
|
|
941
|
+
"parentType": "pp:CanvasText"
|
|
942
|
+
},
|
|
943
|
+
"pp:TextEffectGlyph": {
|
|
944
|
+
"anchor": null,
|
|
945
|
+
"description": "One character of a pp:TextEffect. An ordinary text item with its own keyframes; it points back at the composition root through pp:glyphOf, which is what lets the whole effect be re-targeted or removed as a unit.",
|
|
946
|
+
"parentType": "pp:CanvasText"
|
|
947
|
+
},
|
|
948
|
+
"pp:TextEncoding": {
|
|
949
|
+
"description": "Label content — encodes identity or value States a value exactly instead of encoding it, so it does not scale: a label per datum stops being readable long before the chart does.",
|
|
950
|
+
"parentType": "pp:EncodingChannel"
|
|
951
|
+
},
|
|
952
|
+
"pp:TextMark": {
|
|
953
|
+
"description": "Data-positioned text mark (word cloud, label) The only mark that states its value exactly rather than encoding it — use it where precision beats comparison, and sparingly, because text does not scan.",
|
|
954
|
+
"parentType": "pp:MarkType"
|
|
955
|
+
},
|
|
956
|
+
"pp:TimingCurve": {
|
|
957
|
+
"anchor": null,
|
|
958
|
+
"description": "A per-segment cubic-bezier ease { o:{x,y}, i:{x,y} } from [0,0]→[1,1] with y UNCLAMPED, so overshoot/anticipation are representable — a Disney timing/spacing chart as data. Schema-aligned with the LLM timing-deformation-graph spec (Lottie o/i tangents). Overrides the named ease on a pose keyframe.",
|
|
959
|
+
"parentType": "pp:Concept",
|
|
960
|
+
"mcpTool": "pinepaper_rigging",
|
|
961
|
+
"mcpAction": "add_pose_keyframe"
|
|
962
|
+
},
|
|
963
|
+
"pp:Tone": {
|
|
964
|
+
"anchor": null,
|
|
965
|
+
"description": "A single synthesized voice: a pitch (note or base frequency), a timbre (waveform → additive harmonic partials), an ADSR envelope, gain, and pan. The atomic building block of a pp:Sound.",
|
|
966
|
+
"parentType": "pp:Sound"
|
|
967
|
+
},
|
|
968
|
+
"pp:TransitionScene": {
|
|
969
|
+
"anchor": "schema:VisualArtwork",
|
|
970
|
+
"description": "Motion scene configured as a dynamic transition layer or section break.",
|
|
971
|
+
"parentType": "pp:MotionScene"
|
|
972
|
+
},
|
|
973
|
+
"pp:TrendTask": {
|
|
974
|
+
"description": "Show change over time (how does it evolve?) Favours a continuous horizontal axis with lines; the aspect ratio materially changes how steep a trend appears, so it is a real choice.",
|
|
975
|
+
"parentType": "pp:AnalyticalTask"
|
|
976
|
+
},
|
|
977
|
+
"pp:Triangle": {
|
|
978
|
+
"anchor": null,
|
|
979
|
+
"description": "A closed three-sided shape. Beyond `width`/`height` it accepts `kind` — right, equilateral, isosceles, obtuse, acute, scalene — or an explicit `angles` array, so the shape can be specified by its geometry rather than by computing vertices. Angles that nearly sum to 180 are normalised rather than refused.",
|
|
980
|
+
"parentType": "pp:CanvasShape",
|
|
981
|
+
"mcpTool": "pinepaper_create_item"
|
|
982
|
+
},
|
|
983
|
+
"pp:TunnelField": {
|
|
984
|
+
"anchor": "wd:Q44377",
|
|
985
|
+
"description": "An infinite perspective tunnel. The clearest case for fields being nodes: 'a figure running inside the tunnel' is a relation between a rigged skeleton and this, and there is no way to say it if the tunnel is a property rather than a thing.",
|
|
986
|
+
"parentType": "pp:ProceduralField"
|
|
987
|
+
},
|
|
988
|
+
"pp:UMLActorShape": {
|
|
989
|
+
"anchor": null,
|
|
990
|
+
"description": "A stick figure: a role OUTSIDE the system that interacts with it — a person, or another system. It marks the boundary of what is being designed.",
|
|
991
|
+
"parentType": "pp:UMLShape",
|
|
992
|
+
"mcpTool": "pinepaper_create_diagram_shape"
|
|
993
|
+
},
|
|
994
|
+
"pp:UMLClassShape": {
|
|
995
|
+
"anchor": null,
|
|
996
|
+
"description": "A three-compartment box — name, attributes, operations. The compartments are the notation: collapsing them loses the distinction between what a class HAS and what it DOES.",
|
|
997
|
+
"parentType": "pp:UMLShape",
|
|
998
|
+
"mcpTool": "pinepaper_create_diagram_shape"
|
|
999
|
+
},
|
|
1000
|
+
"pp:UMLShape": {
|
|
1001
|
+
"anchor": null,
|
|
1002
|
+
"description": "Abstract: shapes in UML notation, where both the shape AND the connector style are formally defined. Unlike a flowchart, UML meanings are standardised, so a wrong arrowhead states something specific and false.",
|
|
1003
|
+
"parentType": "pp:DiagramShape"
|
|
1004
|
+
},
|
|
1005
|
+
"pp:UMLUseCaseShape": {
|
|
1006
|
+
"anchor": null,
|
|
1007
|
+
"description": "An ellipse: a goal the system fulfils for an actor, named as a verb phrase from the actor's point of view. It describes an outcome, not an implementation step.",
|
|
1008
|
+
"parentType": "pp:UMLShape",
|
|
1009
|
+
"mcpTool": "pinepaper_create_diagram_shape"
|
|
1010
|
+
},
|
|
1011
|
+
"pp:Unclassified": {
|
|
1012
|
+
"anchor": null,
|
|
1013
|
+
"description": "Item type not expressible in current vocabulary. Enables vocabulary gap discovery — count and inspect unclassified items to identify missing types.",
|
|
1014
|
+
"parentType": "pp:CanvasElement"
|
|
1015
|
+
},
|
|
1016
|
+
"pp:VideoClip": {
|
|
1017
|
+
"anchor": "schema:VideoObject",
|
|
1018
|
+
"description": "Video media item — frame-sampled raster source with playhead, in/out trim, and optional per-frame GPU filters. Referenced by pp:MediaRef handle.",
|
|
1019
|
+
"parentType": "pp:CanvasElement",
|
|
1020
|
+
"mcpTool": "pinepaper_media",
|
|
1021
|
+
"mcpAction": "upload_video"
|
|
1022
|
+
},
|
|
1023
|
+
"pp:VoronoiField": {
|
|
1024
|
+
"anchor": "wd:Q757267",
|
|
1025
|
+
"description": "Cellular partition of the plane by nearest feature point. The anchor is the Voronoi diagram itself, the mathematics the image IS rather than a lookalike.",
|
|
1026
|
+
"parentType": "pp:ProceduralField"
|
|
1027
|
+
},
|
|
1028
|
+
"pp:WeldJoint": {
|
|
1029
|
+
"anchor": null,
|
|
1030
|
+
"description": "Rigidly fuses two bodies — eliminates relative motion. Used for compound objects.",
|
|
1031
|
+
"parentType": "pp:PhysicsJoint",
|
|
1032
|
+
"mcpTool": "pinepaper_physics",
|
|
1033
|
+
"mcpAction": "create_joint"
|
|
1034
|
+
},
|
|
1035
|
+
"pp:World3D": {
|
|
1036
|
+
"anchor": "wd:Q107307154",
|
|
1037
|
+
"description": "A BOUNDED procedural volume rendered under the canvas: a square heightfield of `terrain.size` across with sky above it — a cuboid extent, not an open or shared world. Seeded terrain, scattered props and lighting, addressed as a parameter set rather than as geometry. Anchored on virtual place (any digitally created environment); NOT wd:Q444835 virtual world, whose sense is a multi-user simulated environment and which this is not.",
|
|
1038
|
+
"parentType": "pp:CanvasContainer",
|
|
1039
|
+
"mcpTool": "pinepaper_world3d",
|
|
1040
|
+
"mcpAction": "create"
|
|
1041
|
+
},
|
|
1042
|
+
"pp:WorldCharacter": {
|
|
1043
|
+
"anchor": "wd:Q1062345",
|
|
1044
|
+
"description": "A controllable body in a 3D world — walks, jumps and collides with the terrain. Drivable by keyboard, timeline, relations or an agent.",
|
|
1045
|
+
"parentType": "pp:CanvasElement",
|
|
1046
|
+
"mcpTool": "pinepaper_world3d",
|
|
1047
|
+
"mcpAction": "add_actor"
|
|
1048
|
+
},
|
|
1049
|
+
"pp:WorldLight": {
|
|
1050
|
+
"anchor": "wd:Q1146001",
|
|
1051
|
+
"description": "A point light placed in a 3D world: a position, a colour, an intensity and a RANGE at which its contribution reaches exactly zero. A light as an OBJECT rather than a constant — addressable, so a relation can move it and a lamp that follows a character is an edge rather than a special case in the renderer. Casts no shadow: each shadow-casting light doubles the geometry passes, and the sun remains the single directional caster.",
|
|
1052
|
+
"parentType": "pp:CanvasElement"
|
|
1053
|
+
},
|
|
1054
|
+
"pp:WorldMaterial": {
|
|
1055
|
+
"anchor": null,
|
|
1056
|
+
"description": "A named, SHARED surface description referenced by many world objects: one node, many users, so a single edit restyles all of them. That sharing is the whole point — a per-object colour already existed, and a material that styled one thing would be a rename rather than a capability. Carries colour and emissive, and — since js/world3d/PBR.js landed a real Cook-Torrance GGX BRDF — metalness and roughness, in Three.js's names and with Three.js's defaults, so a material authored against Three, Blender or Substance means the same thing here. WHERE THEY ACTUALLY RENDER is the part an agent must not guess: metalness and roughness reach the shader ONLY on the mesh path (addWorldMesh, and imported OBJ/glTF, which ride them through the uniforms bag into DEFAULT_MESH_FRAG). A plain pp:WorldObject — a box or a scattered prop — is drawn by PART_FRAG/PROP_FRAG, which shade with the older lambert term and declare no such uniform, so a material's metalness on a box is stored, listed and ignored. emissiveIntensity IS read: World3D scales the material's emissive by it before the frame is built, so it reaches every path that draws emissive. aoMapIntensity, normalScale and envMapIntensity have been REMOVED — each one scales a MAP, and there is no aoMap, no normalMap and no envMap; a knob that scales nothing is the claim-about-nothing defect wearing a Three.js name, and being Three's spelling does not make it real. They come back with the maps they scale, together, and not before. (This sentence previously said all four were accepted-but-inert. That was true when written and false from the moment emissiveIntensity was wired and the other three deleted; it is corrected here rather than quietly dropped, because a drifted claim is worse than a missing one.) clearcoat, clearcoatRoughness, sheenColor and sheenRoughness are REAL on the mesh path and carry Three's names and Three's defaults, which are inert: clearcoat 0 and a black sheenColor mean a material authored before they existed lights identically. Clearcoat is a second, always-DIELECTRIC specular lobe with its own roughness — a clearcoated metal shows a white highlight over a coloured one, which is what separates a coat from extra gloss — and it ATTENUATES the base beneath it, because light the coat reflects never reaches the base. Sheen is the Charlie retroreflective lobe that peaks at GRAZING angles, where GGX cannot reach at any roughness; it is what makes cloth read as cloth. Both are additive over the same Cook-Torrance evaluation and, like metalness and roughness, reach the shader ONLY on the mesh path. transmission, ior, thickness and opacity are ABSENT, and for one shared reason rather than as an oversight: each needs depth-sorted transparency, which this renderer does not have. They are named here so an agent learns the GATE rather than guessing the knob was forgotten. setMaterial patches colour, emissive, metalness, roughness, emissiveIntensity, clearcoat, clearcoatRoughness, sheenColor and sheenRoughness. Anchored to nothing: a plausible-looking Wikidata concept would be worse than none.",
|
|
1057
|
+
"parentType": "pp:CanvasElement"
|
|
1058
|
+
},
|
|
1059
|
+
"pp:WorldObject": {
|
|
1060
|
+
"anchor": null,
|
|
1061
|
+
"description": "An object placed at chosen coordinates in a 3D world, as opposed to procedurally scattered.",
|
|
1062
|
+
"parentType": "pp:CanvasElement",
|
|
1063
|
+
"mcpTool": "pinepaper_world3d",
|
|
1064
|
+
"mcpAction": "add_object"
|
|
1065
|
+
},
|
|
1066
|
+
"pp:WorldTerrain": {
|
|
1067
|
+
"anchor": "wd:Q271669",
|
|
1068
|
+
"description": "The heightfield a world is built on — seed, size, amplitude and relief. One height function serves both the mesh and collision.",
|
|
1069
|
+
"parentType": "pp:CanvasElement"
|
|
1070
|
+
},
|
|
1071
|
+
"pp:actionCrouch": {
|
|
1072
|
+
"anchor": null,
|
|
1073
|
+
"description": "Crouched pose hold for the action duration. No parameters — the pose is fixed; duration is set on the SceneAction wrapper.",
|
|
1074
|
+
"parentType": "pp:SceneAction"
|
|
1075
|
+
},
|
|
1076
|
+
"pp:actionIdle": {
|
|
1077
|
+
"anchor": null,
|
|
1078
|
+
"description": "Idle / rest pose hold for the action duration. No parameters — clears velocity and returns to the idle pose.",
|
|
1079
|
+
"parentType": "pp:SceneAction"
|
|
1080
|
+
},
|
|
1081
|
+
"pp:actionJump": {
|
|
1082
|
+
"anchor": null,
|
|
1083
|
+
"description": "Parabolic-arc jump with anticipation and landing squash. Height/duration parametrize the arc; gravity is derived to make the character return to ground after `duration` seconds.",
|
|
1084
|
+
"parentType": "pp:SceneAction"
|
|
1085
|
+
},
|
|
1086
|
+
"pp:actionMoveLeft": {
|
|
1087
|
+
"anchor": null,
|
|
1088
|
+
"description": "Walk-cycle action toward negative-X. Per-tick displacement = speed*delta. Defaults: speed=120 px/s, so 2 px/frame at 60 Hz.",
|
|
1089
|
+
"parentType": "pp:SceneAction"
|
|
1090
|
+
},
|
|
1091
|
+
"pp:actionMoveRight": {
|
|
1092
|
+
"anchor": null,
|
|
1093
|
+
"description": "Walk-cycle action toward positive-X. Per-tick displacement = speed*delta. Defaults: speed=120 px/s, so 2 px/frame at 60 Hz.",
|
|
1094
|
+
"parentType": "pp:SceneAction"
|
|
1095
|
+
},
|
|
1096
|
+
"pp:ppFbm2": {
|
|
1097
|
+
"anchor": "wd:Q1143293",
|
|
1098
|
+
"description": "Fractional Brownian motion over value noise — the standard octave sum. The loop is bounded at 8 with an early break rather than running to `octaves`, because a GLSL loop bound must be a constant.",
|
|
1099
|
+
"parentType": "pp:FractalNode"
|
|
1100
|
+
},
|
|
1101
|
+
"pp:ppHash11": {
|
|
1102
|
+
"anchor": null,
|
|
1103
|
+
"description": "One float in, one pseudo-random float in [0,1) out. The cheapest seed in the set — used per-column or per-step to vary a value that must stay fixed for that column across every frame.",
|
|
1104
|
+
"parentType": "pp:HashNode"
|
|
1105
|
+
},
|
|
1106
|
+
"pp:ppHash12": {
|
|
1107
|
+
"anchor": null,
|
|
1108
|
+
"description": "A 2D coordinate to one pseudo-random float. The lattice seed value noise interpolates between.",
|
|
1109
|
+
"parentType": "pp:HashNode"
|
|
1110
|
+
},
|
|
1111
|
+
"pp:ppHash13": {
|
|
1112
|
+
"anchor": null,
|
|
1113
|
+
"description": "A 3D coordinate to one pseudo-random float — the 2D hash with time or depth as the third axis.",
|
|
1114
|
+
"parentType": "pp:HashNode"
|
|
1115
|
+
},
|
|
1116
|
+
"pp:ppHash22": {
|
|
1117
|
+
"anchor": null,
|
|
1118
|
+
"description": "A 2D coordinate to a pseudo-random 2D POINT. Vector-valued because a cellular pattern needs a scattered position inside each cell, not a scalar.",
|
|
1119
|
+
"parentType": "pp:HashNode"
|
|
1120
|
+
},
|
|
1121
|
+
"pp:ppHash33": {
|
|
1122
|
+
"anchor": null,
|
|
1123
|
+
"description": "A 3D coordinate to a pseudo-random 3D vector — the raw material for a Perlin gradient.",
|
|
1124
|
+
"parentType": "pp:HashNode"
|
|
1125
|
+
},
|
|
1126
|
+
"pp:ppHenyeyGreenstein": {
|
|
1127
|
+
"anchor": null,
|
|
1128
|
+
"description": "The Henyey-Greenstein phase function: how much light a participating medium scatters toward the viewer at angle theta. g in (-1,1) — positive is forward-scattering. This is the term that makes a lit volume read as a VOLUME rather than as a flat tint, and it is why the vortex aura has depth. Anchored to nothing: Wikidata has no item for the phase function (verified live), and the astronomers it is named for are not it.",
|
|
1129
|
+
"parentType": "pp:ScatteringNode"
|
|
1130
|
+
},
|
|
1131
|
+
"pp:ppIgn": {
|
|
1132
|
+
"anchor": null,
|
|
1133
|
+
"description": "Interleaved gradient noise (Jimenez 2014): one dot, two fracts, no texture and no lookup table. Breaks the 8-bit banding a smooth radial falloff shows. Anchored to nothing — Wikidata has no item for this technique, and buying an anchor with a loose subClassOf is the mistake pp:Marker stands as the lesson against.",
|
|
1134
|
+
"parentType": "pp:DitherNode"
|
|
1135
|
+
},
|
|
1136
|
+
"pp:ppPerlin3Tiled": {
|
|
1137
|
+
"anchor": "wd:Q1404167",
|
|
1138
|
+
"description": "Tileable 3D Perlin noise. Perlin, not value: the value at a lattice point is zero and the RANDOMNESS is in the gradient, which is why it has no blocky bias. The quintic fade has zero first AND second derivative at the ends, so octaves stack without visible creases.",
|
|
1139
|
+
"parentType": "pp:NoiseNode"
|
|
1140
|
+
},
|
|
1141
|
+
"pp:ppPerlinFbm3": {
|
|
1142
|
+
"anchor": "wd:Q1143293",
|
|
1143
|
+
"description": "fBm over tileable Perlin. The period DOUBLES with the frequency, which is what keeps every octave seamless — an fBm that doubles frequency and holds the period fixed tiles only in its first octave.",
|
|
1144
|
+
"parentType": "pp:FractalNode"
|
|
1145
|
+
},
|
|
1146
|
+
"pp:ppSchlick": {
|
|
1147
|
+
"anchor": "wd:Q7431712",
|
|
1148
|
+
"description": "Schlick's approximation to the Fresnel term: reflectance rises toward 1 at grazing incidence. The rim brightening this produces is what stops a water or glass effect looking like a coloured blur. The same approximation the Cook-Torrance BRDF in js/world3d/PBR.js uses, so the two agree by construction.",
|
|
1149
|
+
"parentType": "pp:ScatteringNode"
|
|
1150
|
+
},
|
|
1151
|
+
"pp:ppTileHash33": {
|
|
1152
|
+
"anchor": null,
|
|
1153
|
+
"description": "A unit gradient vector hashed from the WRAPPED lattice cell. The mod is the whole trick: wrapping the cell index before hashing is what makes the field seamless at `period`, so a scrolling aura shows no seam when it repeats.",
|
|
1154
|
+
"parentType": "pp:HashNode"
|
|
1155
|
+
},
|
|
1156
|
+
"pp:ppVNoise2": {
|
|
1157
|
+
"anchor": null,
|
|
1158
|
+
"description": "Value noise in 2D: hash the four surrounding lattice points and interpolate with a smoothstep. Cheaper than Perlin and blockier — correct when the result is blurred or thresholded anyway.",
|
|
1159
|
+
"parentType": "pp:NoiseNode"
|
|
1160
|
+
},
|
|
1161
|
+
"pp:ppWorley2": {
|
|
1162
|
+
"anchor": "wd:Q2593908",
|
|
1163
|
+
"description": "Worley (cellular) noise: distance to the nearest scattered feature point. The 3x3 neighbourhood is required, not an optimisation — the nearest point to a pixel near a cell edge lives in the adjacent cell. The cell index is wrapped by `cells`, so the pattern tiles.",
|
|
1164
|
+
"parentType": "pp:CellularNode"
|
|
1165
|
+
},
|
|
1166
|
+
"pp:ppWorleyFbm2": {
|
|
1167
|
+
"anchor": "wd:Q1143293",
|
|
1168
|
+
"description": "Three octaves of Worley at fixed weights. Unrolled rather than looped because the weights are not a clean halving series — they sum to 1 so the result stays in [0,1] without a rescale.",
|
|
1169
|
+
"parentType": "pp:FractalNode"
|
|
1170
|
+
}
|
|
1171
|
+
});
|
|
1172
|
+
//# sourceMappingURL=upstream-vocabulary.js.map
|