rtistree 0.5.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/CHANGELOG.md +15 -0
- package/LICENSE +21 -0
- package/README.md +99 -0
- package/THIRD_PARTY_NOTICES.md +25 -0
- package/dist/art-direction.d.ts +77 -0
- package/dist/art-direction.js +186 -0
- package/dist/art-direction.js.map +1 -0
- package/dist/artifacts.d.ts +24 -0
- package/dist/artifacts.js +49 -0
- package/dist/artifacts.js.map +1 -0
- package/dist/assets.d.ts +16 -0
- package/dist/assets.js +96 -0
- package/dist/assets.js.map +1 -0
- package/dist/benchmark.d.ts +76 -0
- package/dist/benchmark.js +118 -0
- package/dist/benchmark.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +300 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands.d.ts +5315 -0
- package/dist/commands.js +591 -0
- package/dist/commands.js.map +1 -0
- package/dist/components.d.ts +20 -0
- package/dist/components.js +98 -0
- package/dist/components.js.map +1 -0
- package/dist/construction.d.ts +53 -0
- package/dist/construction.js +80 -0
- package/dist/construction.js.map +1 -0
- package/dist/critique.d.ts +44 -0
- package/dist/critique.js +45 -0
- package/dist/critique.js.map +1 -0
- package/dist/detail.d.ts +5 -0
- package/dist/detail.js +52 -0
- package/dist/detail.js.map +1 -0
- package/dist/document.d.ts +64 -0
- package/dist/document.js +56 -0
- package/dist/document.js.map +1 -0
- package/dist/export.d.ts +405 -0
- package/dist/export.js +344 -0
- package/dist/export.js.map +1 -0
- package/dist/font-inspection.d.ts +8 -0
- package/dist/font-inspection.js +34 -0
- package/dist/font-inspection.js.map +1 -0
- package/dist/graphics.d.ts +9 -0
- package/dist/graphics.js +72 -0
- package/dist/graphics.js.map +1 -0
- package/dist/history-storage.d.ts +10 -0
- package/dist/history-storage.js +59 -0
- package/dist/history-storage.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/layout.d.ts +18 -0
- package/dist/layout.js +155 -0
- package/dist/layout.js.map +1 -0
- package/dist/loader.d.ts +9 -0
- package/dist/loader.js +108 -0
- package/dist/loader.js.map +1 -0
- package/dist/mcp.d.ts +4 -0
- package/dist/mcp.js +223 -0
- package/dist/mcp.js.map +1 -0
- package/dist/merge.d.ts +6 -0
- package/dist/merge.js +49 -0
- package/dist/merge.js.map +1 -0
- package/dist/native.d.ts +3 -0
- package/dist/native.js +6 -0
- package/dist/native.js.map +1 -0
- package/dist/paint.d.ts +9 -0
- package/dist/paint.js +331 -0
- package/dist/paint.js.map +1 -0
- package/dist/path-edit.d.ts +20 -0
- package/dist/path-edit.js +30 -0
- package/dist/path-edit.js.map +1 -0
- package/dist/pdf-output.d.ts +21 -0
- package/dist/pdf-output.js +297 -0
- package/dist/pdf-output.js.map +1 -0
- package/dist/pipeline.d.ts +39 -0
- package/dist/pipeline.js +227 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/print-scene.d.ts +490 -0
- package/dist/print-scene.js +55 -0
- package/dist/print-scene.js.map +1 -0
- package/dist/production-workflow.d.ts +251 -0
- package/dist/production-workflow.js +335 -0
- package/dist/production-workflow.js.map +1 -0
- package/dist/program-worker.d.ts +1 -0
- package/dist/program-worker.js +31 -0
- package/dist/program-worker.js.map +1 -0
- package/dist/program.d.ts +85 -0
- package/dist/program.js +246 -0
- package/dist/program.js.map +1 -0
- package/dist/project-config.d.ts +91 -0
- package/dist/project-config.js +187 -0
- package/dist/project-config.js.map +1 -0
- package/dist/project.d.ts +897 -0
- package/dist/project.js +347 -0
- package/dist/project.js.map +1 -0
- package/dist/raster-edit.d.ts +61 -0
- package/dist/raster-edit.js +91 -0
- package/dist/raster-edit.js.map +1 -0
- package/dist/raster-studio.d.ts +84 -0
- package/dist/raster-studio.js +236 -0
- package/dist/raster-studio.js.map +1 -0
- package/dist/render.d.ts +79 -0
- package/dist/render.js +437 -0
- package/dist/render.js.map +1 -0
- package/dist/rich-text.d.ts +10 -0
- package/dist/rich-text.js +56 -0
- package/dist/rich-text.js.map +1 -0
- package/dist/schema.d.ts +1912 -0
- package/dist/schema.js +571 -0
- package/dist/schema.js.map +1 -0
- package/dist/spatial.d.ts +10 -0
- package/dist/spatial.js +29 -0
- package/dist/spatial.js.map +1 -0
- package/dist/studio-reference.d.ts +153 -0
- package/dist/studio-reference.js +39 -0
- package/dist/studio-reference.js.map +1 -0
- package/dist/svg.d.ts +5 -0
- package/dist/svg.js +315 -0
- package/dist/svg.js.map +1 -0
- package/dist/techniques.d.ts +74 -0
- package/dist/techniques.js +164 -0
- package/dist/techniques.js.map +1 -0
- package/dist/verify.d.ts +36 -0
- package/dist/verify.js +277 -0
- package/dist/verify.js.map +1 -0
- package/dist/viewport.d.ts +3 -0
- package/dist/viewport.js +71 -0
- package/dist/viewport.js.map +1 -0
- package/dist/workflow.d.ts +53 -0
- package/dist/workflow.js +66 -0
- package/dist/workflow.js.map +1 -0
- package/docs/agent-art-workflow.md +201 -0
- package/docs/agent-setup.md +83 -0
- package/docs/atelier.md +117 -0
- package/docs/cli-reference.md +61 -0
- package/docs/decisions/001-runtime-and-renderer.md +35 -0
- package/docs/decisions/002-composable-scenes-and-history.md +28 -0
- package/docs/decisions/003-editing-refinement-and-agent-validation.md +45 -0
- package/docs/decisions/004-print-production-and-projects.md +19 -0
- package/docs/decisions/005-programmable-digital-art.md +15 -0
- package/docs/decisions/006-staged-2d-art-production.md +13 -0
- package/docs/decisions/007-foundation-first-art-direction.md +13 -0
- package/docs/decisions/008-agent-onboarding-and-trial-lessons.md +48 -0
- package/docs/engine-overview.md +174 -0
- package/docs/evolution.md +179 -0
- package/docs/getting-started.md +107 -0
- package/docs/next-milestone.md +61 -0
- package/docs/previews/a3-production.json +36 -0
- package/docs/previews/benchmark.json +42 -0
- package/docs/previews/landscape.png +0 -0
- package/docs/previews/performance.json +24 -0
- package/docs/previews/poster.png +0 -0
- package/docs/production.md +107 -0
- package/docs/releasing.md +60 -0
- package/docs/scene-format.md +126 -0
- package/docs/studio.md +108 -0
- package/examples/hello/README.md +14 -0
- package/examples/hello/refine.json +10 -0
- package/examples/hello/render.mjs +9 -0
- package/examples/hello/scene.json +19 -0
- package/licenses/DM-Serif-Display-OFL.txt +93 -0
- package/licenses/Inter-OFL.txt +93 -0
- package/package.json +84 -0
- package/schemas/authoring.schema.json +2177 -0
- package/schemas/brief.schema.json +57 -0
- package/schemas/command.schema.json +3154 -0
- package/schemas/construction.schema.json +159 -0
- package/schemas/critique.schema.json +101 -0
- package/schemas/document.schema.json +41 -0
- package/schemas/export.schema.json +89 -0
- package/schemas/fragment.schema.json +1861 -0
- package/schemas/patch.schema.json +3177 -0
- package/schemas/pipeline.schema.json +205 -0
- package/schemas/production.schema.json +452 -0
- package/schemas/program.schema.json +152 -0
- package/schemas/project.schema.json +115 -0
- package/schemas/raster-read.schema.json +42 -0
- package/schemas/raster-write.schema.json +75 -0
- package/schemas/scene.schema.json +2014 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spatial.js","sourceRoot":"","sources":["../src/spatial.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,iBAAiB,GAGlB,MAAM,aAAa,CAAC;AAMrB,MAAM,UAAU,gBAAgB,CAAC,KAAkB,EAAE,IAAmB;IACtE,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO;QAAE,OAAO,QAAQ,CAAC;IAC7C,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACrF,CAAC;AACD,MAAM,UAAU,OAAO,CAAC,CAAS;IAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACrE,OAAO;QACL,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACR,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACT,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACT,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACR,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC/B,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;KAChC,CAAC;AACJ,CAAC;AACD,MAAM,UAAU,KAAK,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IACnD,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AACD,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,CAAS;IAClD,MAAM,CAAC,GAAG,iBAAiB,CACzB,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAC/C,MAAM,CAAC,CAAC,CAAC,EACT,MAAM,CAAC,CAAC,CAAC,CACV,CAAC;IACF,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACxB,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/** Also available to remote agents which cannot read local documentation files. */
|
|
2
|
+
export declare const studioReference: {
|
|
3
|
+
version: string;
|
|
4
|
+
techniques: {
|
|
5
|
+
version: string;
|
|
6
|
+
presets: {
|
|
7
|
+
oil: {
|
|
8
|
+
bristles: number;
|
|
9
|
+
dryness: number;
|
|
10
|
+
variation: number;
|
|
11
|
+
opacity: number;
|
|
12
|
+
taper: number;
|
|
13
|
+
};
|
|
14
|
+
filbert: {
|
|
15
|
+
bristles: number;
|
|
16
|
+
dryness: number;
|
|
17
|
+
variation: number;
|
|
18
|
+
opacity: number;
|
|
19
|
+
taper: number;
|
|
20
|
+
};
|
|
21
|
+
scumble: {
|
|
22
|
+
bristles: number;
|
|
23
|
+
dryness: number;
|
|
24
|
+
variation: number;
|
|
25
|
+
opacity: number;
|
|
26
|
+
taper: number;
|
|
27
|
+
};
|
|
28
|
+
ink: {
|
|
29
|
+
bristles: number;
|
|
30
|
+
dryness: number;
|
|
31
|
+
variation: number;
|
|
32
|
+
opacity: number;
|
|
33
|
+
taper: number;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
palettes: {
|
|
37
|
+
storm: string[];
|
|
38
|
+
earth: string[];
|
|
39
|
+
ember: string[];
|
|
40
|
+
};
|
|
41
|
+
methods: {
|
|
42
|
+
stroke: string;
|
|
43
|
+
glaze: string;
|
|
44
|
+
mix: string;
|
|
45
|
+
atmosphere: string;
|
|
46
|
+
weave: string;
|
|
47
|
+
};
|
|
48
|
+
guidance: string;
|
|
49
|
+
};
|
|
50
|
+
art_direction: {
|
|
51
|
+
version: string;
|
|
52
|
+
agent_instructions: string;
|
|
53
|
+
purpose: string;
|
|
54
|
+
sequence: {
|
|
55
|
+
step: string;
|
|
56
|
+
deliverable: string;
|
|
57
|
+
stop: string;
|
|
58
|
+
}[];
|
|
59
|
+
subject_checks: {
|
|
60
|
+
articulated_figures: {
|
|
61
|
+
construction: string;
|
|
62
|
+
inspect: string;
|
|
63
|
+
blocking_examples: string[];
|
|
64
|
+
};
|
|
65
|
+
constructed_props: {
|
|
66
|
+
construction: string;
|
|
67
|
+
inspect: string;
|
|
68
|
+
blocking_examples: string[];
|
|
69
|
+
};
|
|
70
|
+
locomotion: {
|
|
71
|
+
construction: string;
|
|
72
|
+
inspect: string;
|
|
73
|
+
functional_checks: string[];
|
|
74
|
+
limitation: string;
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
acceptance: {
|
|
78
|
+
technical: string;
|
|
79
|
+
functional: string;
|
|
80
|
+
visual: string;
|
|
81
|
+
reporting: string;
|
|
82
|
+
partial_feedback: string;
|
|
83
|
+
unavailable_observation: string;
|
|
84
|
+
};
|
|
85
|
+
trial_lessons: {
|
|
86
|
+
case: string;
|
|
87
|
+
missed: string;
|
|
88
|
+
correction: string;
|
|
89
|
+
remaining: string;
|
|
90
|
+
}[];
|
|
91
|
+
starter_plan: {
|
|
92
|
+
id: string;
|
|
93
|
+
brief: string;
|
|
94
|
+
stages: ({
|
|
95
|
+
id: string;
|
|
96
|
+
goal: string;
|
|
97
|
+
minimum_alternatives: number;
|
|
98
|
+
require_references: boolean;
|
|
99
|
+
criteria: {
|
|
100
|
+
id: string;
|
|
101
|
+
description: string;
|
|
102
|
+
}[];
|
|
103
|
+
} | {
|
|
104
|
+
minimum_alternatives?: undefined;
|
|
105
|
+
require_references?: undefined;
|
|
106
|
+
id: string;
|
|
107
|
+
goal: string;
|
|
108
|
+
criteria: {
|
|
109
|
+
id: string;
|
|
110
|
+
description: string;
|
|
111
|
+
}[];
|
|
112
|
+
})[];
|
|
113
|
+
};
|
|
114
|
+
review_order: string[];
|
|
115
|
+
calibration: {
|
|
116
|
+
fail: string;
|
|
117
|
+
revise: string;
|
|
118
|
+
ready: string;
|
|
119
|
+
};
|
|
120
|
+
protocol: string;
|
|
121
|
+
instructions: string;
|
|
122
|
+
};
|
|
123
|
+
production: string;
|
|
124
|
+
contract: string;
|
|
125
|
+
execution: string;
|
|
126
|
+
limits: {
|
|
127
|
+
output_megapixels: number;
|
|
128
|
+
inputs: number;
|
|
129
|
+
helper_cumulative_megapixels: number;
|
|
130
|
+
edge: number;
|
|
131
|
+
source_kib: number;
|
|
132
|
+
parameters_kib: number;
|
|
133
|
+
timeout_ms: number[];
|
|
134
|
+
v8_heap_mib: number;
|
|
135
|
+
};
|
|
136
|
+
api: {
|
|
137
|
+
guides: string;
|
|
138
|
+
canvas: string;
|
|
139
|
+
raster: string;
|
|
140
|
+
pixels: string;
|
|
141
|
+
input: string;
|
|
142
|
+
brush: string;
|
|
143
|
+
noise: string;
|
|
144
|
+
coordinates: string;
|
|
145
|
+
sample: string;
|
|
146
|
+
warp: string;
|
|
147
|
+
displace: string;
|
|
148
|
+
blur: string;
|
|
149
|
+
lighting: string;
|
|
150
|
+
};
|
|
151
|
+
example: string;
|
|
152
|
+
edits: string;
|
|
153
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { artDirectionGuide } from './art-direction.js';
|
|
2
|
+
import { techniqueCatalog } from './techniques.js';
|
|
3
|
+
/** Also available to remote agents which cannot read local documentation files. */
|
|
4
|
+
export const studioReference = {
|
|
5
|
+
version: 'rtistree-studio/1',
|
|
6
|
+
techniques: techniqueCatalog,
|
|
7
|
+
art_direction: artDirectionGuide,
|
|
8
|
+
production: 'Use buildPipeline for explicit dependency-aware atomic builds. Node inputs reference nodes or registered assets; bindings subscribe to shared parameters. Graphs are pinned in scene metadata. Use production plan/capture/review/compare/select/advance for stage gates, immutable candidates and undoable selection. Ratings must come from viewing images. Native Canvas and raw pixels remain available.',
|
|
9
|
+
contract: 'Synchronous JavaScript body receives art and parameters and returns one Canvas of the declared width/height. Use runProgram with exactly one of code or project-local source. Baked PNGs and recipes are immutable; editing code requires explicit execution. Source/parameters/seed and frozen sRGB PNG inputs are recorded. No image-generation model is involved.',
|
|
10
|
+
execution: 'Only execute trusted code. Worker/VM isolation is not a security sandbox. API does not offer filesystem/network imports. Math.random uses the seeded RNG; Date/performance are absent. Canvas native allocations are not covered by the V8 heap limit.',
|
|
11
|
+
limits: {
|
|
12
|
+
output_megapixels: 16,
|
|
13
|
+
inputs: 16,
|
|
14
|
+
helper_cumulative_megapixels: 32,
|
|
15
|
+
edge: 8192,
|
|
16
|
+
source_kib: 256,
|
|
17
|
+
parameters_kib: 64,
|
|
18
|
+
timeout_ms: [50, 30000],
|
|
19
|
+
v8_heap_mib: 256,
|
|
20
|
+
},
|
|
21
|
+
api: {
|
|
22
|
+
guides: 'art.guides({points:{name:[x,y] | "otherName" | {anchor:"otherName",offset:[dx,dy]}},paths:{name:[{op:"M"|"L",to:pointRef}|{op:"Q",control:pointRef,to:pointRef}|{op:"C",control1:pointRef,control2:pointRef,to:pointRef}|{op:"Z"}]}}) returns {points,paths}. Paths are SVG path strings for art.path. References resolve recursively; cycles and missing points fail. Use joint landmarks and shared handles to edit construction coherently.',
|
|
23
|
+
canvas: 'art.canvas(width=art.width,height=art.height) → Canvas; use canvas.getContext("2d") for paths, transforms, gradients, compositing and text. art.path(svgPathData) returns a native Path2D for fill/stroke/clip. Bundled fonts: Rtistree-inter, Rtistree-inter-bold, Rtistree-display.',
|
|
24
|
+
raster: 'art.raster((x,y)=>[r,g,b,a], width?, height?) → Canvas; integer pixel-centre coordinates, four finite 0–255 channels, straight 8-bit sRGB RGBA.',
|
|
25
|
+
pixels: 'art.pixels(canvas) → {width,height,data:Uint8ClampedArray}. art.put(canvas,pixels) replaces its complete buffer. Semi-transparent samples pass through native premultiplied storage.',
|
|
26
|
+
input: 'art.input(name) → mutable Canvas copy of a frozen input asset named in the request inputs mapping.',
|
|
27
|
+
brush: 'art.brush(canvas,[{x,y,pressure?},...],{radius,colour:"#RRGGBB[AA]",hardness?,opacity?,spacing?,scatter?}) → canvas. Pressure affects radius/alpha; opacity is per dab; spacing is a fraction of radius. Uses current context transform.',
|
|
28
|
+
noise: 'art.noise(x,y,salt=0) → seeded interpolated value noise in 0–1. art.fbm(x,y,octaves=5,salt=0) → normalised octave sum. art.random() → deterministic sequential RNG.',
|
|
29
|
+
coordinates: 'art.polar(x,y,cx=0,cy=0) → {radius,angle}; art.repeat(value,period); art.clamp(value,min=0,max=1); art.mix(a,b,t); art.smoothstep(a,b,value).',
|
|
30
|
+
sample: 'art.sample(pixelSurface,x,y,edge="transparent") → RGBA. Bilinear premultiplied interpolation; edge is transparent, clamp or repeat.',
|
|
31
|
+
warp: 'art.warp(canvas,(x,y)=>[sourceX,sourceY],edge="transparent",width?,height?) → new Canvas. Inverse coordinate mapping supports arbitrary 2D warps and repetition.',
|
|
32
|
+
displace: 'art.displace(canvas,(x,y)=>[dx,dy],amount=1,edge="transparent") → new Canvas, samples source at x+dx*amount,y+dy*amount.',
|
|
33
|
+
blur: 'art.blur(canvas,radius) → new Canvas; radius 0–128, transparent boundary.',
|
|
34
|
+
lighting: 'art.normal(heightFn,x,y,strength=1,step=1) → surface normal from central differences. art.light(normal,[r,g,b,a],{light:[x,y,z]?,ambient?,diffuse?,specular?,shininess?}) → RGBA using Lambert diffuse and Blinn–Phong specular, viewer along +Z. Artistic 2.5D shading, not ray tracing.',
|
|
35
|
+
},
|
|
36
|
+
example: 'return art.raster((x,y) => { const n=art.fbm(x/35,y/35); return [35+n*40,40+n*35,45+n*30,255]; });',
|
|
37
|
+
edits: 'readRasterRegion reads exact canvas-space PNG pixels and a scene hash. writeRasterRegion consumes an exact-size project-local PNG and that expected_hash, with replace/over semantics and canvas/layer coordinates. Layer-space patches capture reference dimensions and follow transforms. Layer effects/masks can change patch appearance; locality guards reject outward leakage.',
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=studio-reference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"studio-reference.js","sourceRoot":"","sources":["../src/studio-reference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,mFAAmF;AACnF,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,OAAO,EAAE,mBAAmB;IAC5B,UAAU,EAAE,gBAAgB;IAC5B,aAAa,EAAE,iBAAiB;IAChC,UAAU,EACR,8YAA8Y;IAChZ,QAAQ,EACN,sWAAsW;IACxW,SAAS,EACP,wPAAwP;IAC1P,MAAM,EAAE;QACN,iBAAiB,EAAE,EAAE;QACrB,MAAM,EAAE,EAAE;QACV,4BAA4B,EAAE,EAAE;QAChC,IAAI,EAAE,IAAI;QACV,UAAU,EAAE,GAAG;QACf,cAAc,EAAE,EAAE;QAClB,UAAU,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC;QACvB,WAAW,EAAE,GAAG;KACjB;IACD,GAAG,EAAE;QACH,MAAM,EACJ,gbAAgb;QAClb,MAAM,EACJ,uRAAuR;QACzR,MAAM,EACJ,iJAAiJ;QACnJ,MAAM,EACJ,sLAAsL;QACxL,KAAK,EACH,oGAAoG;QACtG,KAAK,EACH,0OAA0O;QAC5O,KAAK,EACH,qKAAqK;QACvK,WAAW,EACT,+IAA+I;QACjJ,MAAM,EACJ,qIAAqI;QACvI,IAAI,EAAE,kKAAkK;QACxK,QAAQ,EACN,0HAA0H;QAC5H,IAAI,EAAE,2EAA2E;QACjF,QAAQ,EACN,2RAA2R;KAC9R;IACD,OAAO,EACL,oGAAoG;IACtG,KAAK,EACH,sXAAsX;CACzX,CAAC"}
|
package/dist/svg.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type Scene } from './schema.js';
|
|
2
|
+
import { type Renderer } from './render.js';
|
|
3
|
+
/** Deliberately closed static geometry subset: reject unsupported features rather than dropping them. */
|
|
4
|
+
export declare function importSvg(xml: string, prefix?: string): Scene;
|
|
5
|
+
export declare function exportSvg(scene: Scene, root: string, renderer: Renderer): Promise<Buffer<ArrayBuffer>>;
|
package/dist/svg.js
ADDED
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import { XMLParser, XMLValidator } from 'fast-xml-parser';
|
|
2
|
+
import { Path2D, createCanvas, SvgExportFlag } from './native.js';
|
|
3
|
+
import { multiply, identity, exportLayers, resolveLayout } from './layout.js';
|
|
4
|
+
import { parseScene } from './schema.js';
|
|
5
|
+
import { shapePath } from './graphics.js';
|
|
6
|
+
import { layoutText, fontStyle } from './render.js';
|
|
7
|
+
import { registerFonts, registerProjectFonts } from './assets.js';
|
|
8
|
+
const escape = (text) => text
|
|
9
|
+
.replaceAll('&', '&')
|
|
10
|
+
.replaceAll('<', '<')
|
|
11
|
+
.replaceAll('>', '>')
|
|
12
|
+
.replaceAll('"', '"');
|
|
13
|
+
function transformation(value) {
|
|
14
|
+
if (!value)
|
|
15
|
+
return [...identity];
|
|
16
|
+
let matrix = [...identity], remaining = value;
|
|
17
|
+
for (const m of value.matchAll(/(matrix|translate|scale|rotate)\s*\(([^)]*)\)/g)) {
|
|
18
|
+
remaining = remaining.replace(m[0], '');
|
|
19
|
+
const v = m[2]
|
|
20
|
+
.trim()
|
|
21
|
+
.split(/[\s,]+/)
|
|
22
|
+
.map(Number);
|
|
23
|
+
if (v.some((n) => !Number.isFinite(n)))
|
|
24
|
+
throw new Error('Invalid SVG transform');
|
|
25
|
+
let next;
|
|
26
|
+
if (m[1] === 'matrix' && v.length === 6)
|
|
27
|
+
next = v;
|
|
28
|
+
else if (m[1] === 'translate' && v.length <= 2)
|
|
29
|
+
next = [1, 0, 0, 1, v[0], v[1] ?? 0];
|
|
30
|
+
else if (m[1] === 'scale' && v.length <= 2)
|
|
31
|
+
next = [v[0], 0, 0, v[1] ?? v[0], 0, 0];
|
|
32
|
+
else if (m[1] === 'rotate' && (v.length === 1 || v.length === 3)) {
|
|
33
|
+
const r = (v[0] * Math.PI) / 180, x = v[1] ?? 0, y = v[2] ?? 0;
|
|
34
|
+
next = multiply(multiply([1, 0, 0, 1, x, y], [Math.cos(r), Math.sin(r), -Math.sin(r), Math.cos(r), 0, 0]), [1, 0, 0, 1, -x, -y]);
|
|
35
|
+
}
|
|
36
|
+
else
|
|
37
|
+
throw new Error('Unsupported SVG transform');
|
|
38
|
+
matrix = multiply(matrix, next);
|
|
39
|
+
}
|
|
40
|
+
if (remaining.trim())
|
|
41
|
+
throw new Error('Unsupported SVG transform');
|
|
42
|
+
return matrix;
|
|
43
|
+
}
|
|
44
|
+
/** Deliberately closed static geometry subset: reject unsupported features rather than dropping them. */
|
|
45
|
+
export function importSvg(xml, prefix = 'svg') {
|
|
46
|
+
if (xml.length > 8 * 1024 * 1024 || /<!DOCTYPE|<!ENTITY|<script|<foreignObject/i.test(xml))
|
|
47
|
+
throw new Error('Unsupported or unsafe SVG input');
|
|
48
|
+
if (XMLValidator.validate(xml) !== true)
|
|
49
|
+
throw new Error('Invalid SVG XML');
|
|
50
|
+
const tree = new XMLParser({
|
|
51
|
+
ignoreAttributes: false,
|
|
52
|
+
preserveOrder: true,
|
|
53
|
+
parseTagValue: false,
|
|
54
|
+
processEntities: false,
|
|
55
|
+
}).parse(xml);
|
|
56
|
+
const root = tree.find((n) => n.svg);
|
|
57
|
+
if (!root)
|
|
58
|
+
throw new Error('SVG root required');
|
|
59
|
+
const attrs = (node) => Object.fromEntries(Object.entries(node[':@'] ?? {}).map(([k, v]) => [k.slice(2), String(v)]));
|
|
60
|
+
const a = attrs(root), vb = (a.viewBox ?? '').split(/[ ,]+/).map(Number);
|
|
61
|
+
const number = (value, fallback = 0) => {
|
|
62
|
+
if (value === undefined)
|
|
63
|
+
return fallback;
|
|
64
|
+
if (!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?(?:px)?$/i.test(value))
|
|
65
|
+
throw new Error('SVG subset requires numeric or px lengths');
|
|
66
|
+
return parseFloat(value);
|
|
67
|
+
};
|
|
68
|
+
const width = number(a.width, vb[2]), height = number(a.height, vb[3]);
|
|
69
|
+
if (!width || !height)
|
|
70
|
+
throw new Error('SVG needs width/height or viewBox');
|
|
71
|
+
let count = 0;
|
|
72
|
+
const colour = (v, fallback = '#000000') => {
|
|
73
|
+
if (v === undefined)
|
|
74
|
+
return fallback;
|
|
75
|
+
if (v === 'none')
|
|
76
|
+
return '#00000000';
|
|
77
|
+
if (/^#[0-9a-f]{6}(?:[0-9a-f]{2})?$/i.test(v))
|
|
78
|
+
return v;
|
|
79
|
+
if (/^#[0-9a-f]{3}$/i.test(v))
|
|
80
|
+
return '#' + [...v.slice(1)].map((c) => c + c).join('');
|
|
81
|
+
const names = {
|
|
82
|
+
black: '#000000',
|
|
83
|
+
white: '#ffffff',
|
|
84
|
+
red: '#ff0000',
|
|
85
|
+
green: '#008000',
|
|
86
|
+
blue: '#0000ff',
|
|
87
|
+
transparent: '#00000000',
|
|
88
|
+
};
|
|
89
|
+
if (names[v])
|
|
90
|
+
return names[v];
|
|
91
|
+
throw new Error(`Unsupported SVG colour ${v}`);
|
|
92
|
+
};
|
|
93
|
+
function walk(nodes, inherited = {}) {
|
|
94
|
+
const result = [];
|
|
95
|
+
for (const node of nodes) {
|
|
96
|
+
const tag = Object.keys(node).find((k) => k !== ':@');
|
|
97
|
+
if (tag === '#text' || tag === '#comment' || tag.startsWith('?'))
|
|
98
|
+
continue;
|
|
99
|
+
if (tag === 'title' || tag === 'desc')
|
|
100
|
+
continue;
|
|
101
|
+
const own = attrs(node), at = { ...inherited, ...own };
|
|
102
|
+
if (own.style)
|
|
103
|
+
for (const declaration of own.style.split(';').filter(Boolean)) {
|
|
104
|
+
const [k, v] = declaration.split(':');
|
|
105
|
+
at[k.trim()] = v.trim();
|
|
106
|
+
}
|
|
107
|
+
const allowed = new Set([
|
|
108
|
+
'id',
|
|
109
|
+
'fill',
|
|
110
|
+
'stroke',
|
|
111
|
+
'stroke-width',
|
|
112
|
+
'stroke-linecap',
|
|
113
|
+
'stroke-linejoin',
|
|
114
|
+
'stroke-dasharray',
|
|
115
|
+
'stroke-dashoffset',
|
|
116
|
+
'opacity',
|
|
117
|
+
'fill-opacity',
|
|
118
|
+
'stroke-opacity',
|
|
119
|
+
'transform',
|
|
120
|
+
'style',
|
|
121
|
+
'x',
|
|
122
|
+
'y',
|
|
123
|
+
'width',
|
|
124
|
+
'height',
|
|
125
|
+
'rx',
|
|
126
|
+
'ry',
|
|
127
|
+
'cx',
|
|
128
|
+
'cy',
|
|
129
|
+
'r',
|
|
130
|
+
'd',
|
|
131
|
+
'points',
|
|
132
|
+
'x1',
|
|
133
|
+
'x2',
|
|
134
|
+
'y1',
|
|
135
|
+
'y2',
|
|
136
|
+
]);
|
|
137
|
+
for (const key of Object.keys(at))
|
|
138
|
+
if (!allowed.has(key))
|
|
139
|
+
throw new Error(`Unsupported SVG attribute ${key}`);
|
|
140
|
+
const id = `${prefix}${++count}`, opacity = number(own.opacity, 1), affine = transformation(own.transform);
|
|
141
|
+
const styleKeys = [
|
|
142
|
+
'fill',
|
|
143
|
+
'stroke',
|
|
144
|
+
'stroke-width',
|
|
145
|
+
'stroke-linecap',
|
|
146
|
+
'stroke-linejoin',
|
|
147
|
+
'stroke-dasharray',
|
|
148
|
+
'stroke-dashoffset',
|
|
149
|
+
'fill-opacity',
|
|
150
|
+
'stroke-opacity',
|
|
151
|
+
];
|
|
152
|
+
const next = Object.fromEntries(styleKeys.filter((k) => at[k] !== undefined).map((k) => [k, at[k]]));
|
|
153
|
+
if (tag === 'g') {
|
|
154
|
+
result.push({
|
|
155
|
+
id,
|
|
156
|
+
type: 'group',
|
|
157
|
+
bounds: [0, 0, width, height],
|
|
158
|
+
opacity,
|
|
159
|
+
affine,
|
|
160
|
+
children: walk(node[tag], next),
|
|
161
|
+
});
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
const p = new Path2D(tag === 'path' ? at.d : undefined);
|
|
165
|
+
if (tag === 'rect') {
|
|
166
|
+
const x = number(at.x), y = number(at.y), w = number(at.width), h = number(at.height);
|
|
167
|
+
p.roundRect(x, y, w, h, Math.min(number(at.rx), w / 2, h / 2));
|
|
168
|
+
}
|
|
169
|
+
else if (tag === 'circle' || tag === 'ellipse') {
|
|
170
|
+
const rx = number(at.r ?? at.rx), ry = number(at.r ?? at.ry);
|
|
171
|
+
p.ellipse(number(at.cx), number(at.cy), rx, ry, 0, 0, Math.PI * 2);
|
|
172
|
+
}
|
|
173
|
+
else if (tag === 'line') {
|
|
174
|
+
p.moveTo(number(at.x1), number(at.y1));
|
|
175
|
+
p.lineTo(number(at.x2), number(at.y2));
|
|
176
|
+
}
|
|
177
|
+
else if (tag === 'polygon' || tag === 'polyline') {
|
|
178
|
+
const points = (at.points ?? '').trim().split(/[ ,]+/).map(Number);
|
|
179
|
+
if (points.length < 4 || points.length % 2 || points.some((v) => !Number.isFinite(v)))
|
|
180
|
+
throw new Error('Invalid SVG points');
|
|
181
|
+
for (let i = 0; i < points.length; i += 2)
|
|
182
|
+
i ? p.lineTo(points[i], points[i + 1]) : p.moveTo(points[i], points[i + 1]);
|
|
183
|
+
if (tag === 'polygon')
|
|
184
|
+
p.closePath();
|
|
185
|
+
}
|
|
186
|
+
else if (tag !== 'path')
|
|
187
|
+
throw new Error(`Unsupported SVG element ${tag}; import static paths or flatten externally`);
|
|
188
|
+
if (at['fill-opacity'] || at['stroke-opacity'])
|
|
189
|
+
throw new Error('Separate SVG fill/stroke opacity is not supported; use group opacity');
|
|
190
|
+
result.push({
|
|
191
|
+
id,
|
|
192
|
+
type: 'vector',
|
|
193
|
+
bounds: [0, 0, width, height],
|
|
194
|
+
opacity,
|
|
195
|
+
affine,
|
|
196
|
+
shape: {
|
|
197
|
+
type: 'path',
|
|
198
|
+
d: p.toSVGString(),
|
|
199
|
+
fill: colour(at.fill),
|
|
200
|
+
stroke: at.stroke ? colour(at.stroke) : undefined,
|
|
201
|
+
stroke_width: number(at['stroke-width'], 1),
|
|
202
|
+
line_cap: at['stroke-linecap'],
|
|
203
|
+
line_join: at['stroke-linejoin'],
|
|
204
|
+
dash: at['stroke-dasharray'] && at['stroke-dasharray'] !== 'none'
|
|
205
|
+
? at['stroke-dasharray'].split(/[ ,]+/).map(Number)
|
|
206
|
+
: undefined,
|
|
207
|
+
dash_offset: number(at['stroke-dashoffset']),
|
|
208
|
+
},
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
return result;
|
|
212
|
+
}
|
|
213
|
+
const layers = walk(root.svg);
|
|
214
|
+
const scene = {
|
|
215
|
+
version: 1,
|
|
216
|
+
canvas: { width: Math.round(width), height: Math.round(height) },
|
|
217
|
+
layers: vb.length === 4
|
|
218
|
+
? [
|
|
219
|
+
{
|
|
220
|
+
id: `${prefix}Root`,
|
|
221
|
+
type: 'group',
|
|
222
|
+
bounds: [0, 0, width, height],
|
|
223
|
+
affine: [
|
|
224
|
+
width / vb[2],
|
|
225
|
+
0,
|
|
226
|
+
0,
|
|
227
|
+
height / vb[3],
|
|
228
|
+
(-vb[0] * width) / vb[2],
|
|
229
|
+
(-vb[1] * height) / vb[3],
|
|
230
|
+
],
|
|
231
|
+
children: layers,
|
|
232
|
+
},
|
|
233
|
+
]
|
|
234
|
+
: layers,
|
|
235
|
+
};
|
|
236
|
+
return parseScene(scene);
|
|
237
|
+
}
|
|
238
|
+
export async function exportSvg(scene, root, renderer) {
|
|
239
|
+
await registerFonts();
|
|
240
|
+
const aliases = (await registerProjectFonts(scene, root)).aliases;
|
|
241
|
+
const { width, height } = scene.canvas, parts = [
|
|
242
|
+
`<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}">`,
|
|
243
|
+
];
|
|
244
|
+
parts.push(`<rect width="100%" height="100%" fill="${scene.canvas.background.slice(0, 7)}" opacity="${scene.canvas.background.length === 9 ? parseInt(scene.canvas.background.slice(7), 16) / 255 : 1}"/>`);
|
|
245
|
+
// Text becomes exact vector outlines via the native SVG canvas; other complex content is embedded losslessly.
|
|
246
|
+
const requiresComposite = scene.layers.some((l) => l.type === 'adjustment' || l.blend_mode !== 'normal');
|
|
247
|
+
const raster = async (id) => {
|
|
248
|
+
const r = await renderer.render(scene, root, { cache: false, layer: id });
|
|
249
|
+
parts.push(`<image width="${width}" height="${height}" href="data:image/png;base64,${r.png.toString('base64')}"/>`);
|
|
250
|
+
};
|
|
251
|
+
if (requiresComposite)
|
|
252
|
+
await raster();
|
|
253
|
+
else
|
|
254
|
+
for (const n of exportLayers(resolveLayout(scene))) {
|
|
255
|
+
const l = n.layer;
|
|
256
|
+
if (!l.visible)
|
|
257
|
+
continue;
|
|
258
|
+
if (l.type === 'text' &&
|
|
259
|
+
!l.mask &&
|
|
260
|
+
!l.effects.length &&
|
|
261
|
+
!l.operations.length &&
|
|
262
|
+
!l.tiles.length &&
|
|
263
|
+
!l.regions?.length) {
|
|
264
|
+
const canvas = createCanvas(width, height, SvgExportFlag.ConvertTextToPaths), ctx = canvas.getContext('2d');
|
|
265
|
+
ctx.setTransform(...n.matrix);
|
|
266
|
+
ctx.globalAlpha = l.opacity;
|
|
267
|
+
const diagnostic = layoutText(ctx, l, n.bounds[2], n.bounds[3], aliases), s = l.style;
|
|
268
|
+
ctx.beginPath();
|
|
269
|
+
ctx.rect(0, 0, n.bounds[2], n.bounds[3]);
|
|
270
|
+
ctx.clip();
|
|
271
|
+
ctx.textBaseline = 'top';
|
|
272
|
+
ctx.textAlign = 'left';
|
|
273
|
+
if (diagnostic.spans)
|
|
274
|
+
diagnostic.spans.forEach((line, i) => line.forEach((span) => {
|
|
275
|
+
ctx.font = fontStyle({ ...l, style: { ...s, weight: span.weight } }, aliases);
|
|
276
|
+
ctx.fillStyle = span.colour;
|
|
277
|
+
ctx.fillText(span.text, span.x, i * s.size * s.line_height);
|
|
278
|
+
}));
|
|
279
|
+
else {
|
|
280
|
+
ctx.font = fontStyle(l, aliases);
|
|
281
|
+
ctx.fillStyle = s.colour;
|
|
282
|
+
diagnostic.lines.forEach((line, i) => {
|
|
283
|
+
const measure = ctx.measureText(line).width, x = s.align === 'center'
|
|
284
|
+
? (n.bounds[2] - measure) / 2
|
|
285
|
+
: s.align === 'right'
|
|
286
|
+
? n.bounds[2] - measure
|
|
287
|
+
: 0;
|
|
288
|
+
ctx.fillText(line, x, i * s.size * s.line_height);
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
let svg = canvas.getContent().toString();
|
|
292
|
+
svg = svg
|
|
293
|
+
.replace(/<\?xml[^>]*>/g, '')
|
|
294
|
+
.replaceAll('id="', `id="${l.id}-`)
|
|
295
|
+
.replaceAll('url(#', `url(#${l.id}-`)
|
|
296
|
+
.replaceAll('href="#', `href="#${l.id}-`);
|
|
297
|
+
parts.push(svg);
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
if (l.type !== 'vector' ||
|
|
301
|
+
l.effects.length ||
|
|
302
|
+
l.mask ||
|
|
303
|
+
l.operations.length ||
|
|
304
|
+
l.tiles.length ||
|
|
305
|
+
l.regions?.length) {
|
|
306
|
+
await raster(l.id);
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
const s = l.shape, attr = (name, value) => value === undefined ? '' : ` ${name}="${escape(String(value))}"`;
|
|
310
|
+
parts.push(`<path d="${escape(shapePath(l, n.bounds[2], n.bounds[3]).toSVGString())}" transform="matrix(${n.matrix.join(' ')})" opacity="${l.opacity}" fill="${s.fill.slice(0, 7)}" fill-opacity="${s.fill.length === 9 ? parseInt(s.fill.slice(7), 16) / 255 : 1}"${attr('stroke', s.stroke?.slice(0, 7))}${attr('stroke-opacity', s.stroke?.length === 9 ? parseInt(s.stroke.slice(7), 16) / 255 : undefined)}${attr('stroke-width', s.stroke_width)}${attr('stroke-linecap', s.line_cap)}${attr('stroke-linejoin', s.line_join)}${attr('stroke-dasharray', s.dash?.join(' '))}${attr('stroke-dashoffset', s.dash_offset)}/>`);
|
|
311
|
+
}
|
|
312
|
+
parts.push('</svg>');
|
|
313
|
+
return Buffer.from(parts.join('\n'));
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=svg.js.map
|
package/dist/svg.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg.js","sourceRoot":"","sources":["../src/svg.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { Canvas } from './native.js';
|
|
2
|
+
import type { BrushPoint } from './raster-studio.js';
|
|
3
|
+
export declare const TECHNIQUE_VERSION = "rtistree-techniques/1";
|
|
4
|
+
export declare const techniqueCatalog: {
|
|
5
|
+
version: string;
|
|
6
|
+
presets: {
|
|
7
|
+
oil: {
|
|
8
|
+
bristles: number;
|
|
9
|
+
dryness: number;
|
|
10
|
+
variation: number;
|
|
11
|
+
opacity: number;
|
|
12
|
+
taper: number;
|
|
13
|
+
};
|
|
14
|
+
filbert: {
|
|
15
|
+
bristles: number;
|
|
16
|
+
dryness: number;
|
|
17
|
+
variation: number;
|
|
18
|
+
opacity: number;
|
|
19
|
+
taper: number;
|
|
20
|
+
};
|
|
21
|
+
scumble: {
|
|
22
|
+
bristles: number;
|
|
23
|
+
dryness: number;
|
|
24
|
+
variation: number;
|
|
25
|
+
opacity: number;
|
|
26
|
+
taper: number;
|
|
27
|
+
};
|
|
28
|
+
ink: {
|
|
29
|
+
bristles: number;
|
|
30
|
+
dryness: number;
|
|
31
|
+
variation: number;
|
|
32
|
+
opacity: number;
|
|
33
|
+
taper: number;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
palettes: {
|
|
37
|
+
storm: string[];
|
|
38
|
+
earth: string[];
|
|
39
|
+
ember: string[];
|
|
40
|
+
};
|
|
41
|
+
methods: {
|
|
42
|
+
stroke: string;
|
|
43
|
+
glaze: string;
|
|
44
|
+
mix: string;
|
|
45
|
+
atmosphere: string;
|
|
46
|
+
weave: string;
|
|
47
|
+
};
|
|
48
|
+
guidance: string;
|
|
49
|
+
};
|
|
50
|
+
type Preset = keyof typeof techniqueCatalog.presets;
|
|
51
|
+
export interface PaintOptions {
|
|
52
|
+
preset?: Preset;
|
|
53
|
+
size: number;
|
|
54
|
+
colour: string;
|
|
55
|
+
opacity?: number;
|
|
56
|
+
dryness?: number;
|
|
57
|
+
variation?: number;
|
|
58
|
+
bristles?: number;
|
|
59
|
+
taper?: number;
|
|
60
|
+
smoothing?: number;
|
|
61
|
+
}
|
|
62
|
+
declare const mix: (a: string, b: string, t: number) => string;
|
|
63
|
+
export declare function createTechniques(random: () => number): {
|
|
64
|
+
mix: typeof mix;
|
|
65
|
+
atmosphere: typeof mix;
|
|
66
|
+
stroke(canvas: Canvas, points: BrushPoint[], options: PaintOptions): Canvas;
|
|
67
|
+
glaze(canvas: Canvas, colour: string, opacity?: number): Canvas;
|
|
68
|
+
weave(canvas: Canvas, options?: {
|
|
69
|
+
spacing?: number;
|
|
70
|
+
opacity?: number;
|
|
71
|
+
colour?: string;
|
|
72
|
+
}): Canvas;
|
|
73
|
+
};
|
|
74
|
+
export {};
|