@felbrasil/dreamy 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -0
- package/dist/bake.d.ts +1 -0
- package/dist/bake.js +25 -0
- package/dist/bake.js.map +7 -0
- package/dist/chunks/{chunk-VZMBE5MV.js → chunk-5KZP6X65.js} +412 -119
- package/dist/chunks/chunk-5KZP6X65.js.map +7 -0
- package/dist/chunks/chunk-6TE546ZS.js +107 -0
- package/dist/chunks/chunk-6TE546ZS.js.map +7 -0
- package/dist/index.js +7 -37
- package/dist/index.js.map +3 -3
- package/dist/types/api/src/index.d.ts +1 -1
- package/dist/types/api/src/ports/viewport.d.ts +48 -0
- package/dist/types/dreamy/src/bake.d.ts +5 -0
- package/dist/types/studio/src/index.d.ts +2 -0
- package/dist/types/studio/src/sprite-baker.d.ts +26 -0
- package/dist/types/viewport/src/index.d.ts +1 -0
- package/dist/types/viewport/src/math/sprite-roles.d.ts +32 -0
- package/dist/types/viewport/src/scene/frame-camera.d.ts +6 -1
- package/dist/types/viewport/src/scene/render-pipeline.d.ts +11 -0
- package/dist/types/viewport/src/scene/resolve-frag.d.ts +3 -1
- package/dist/viewport.js +17 -3
- package/package.json +5 -1
- package/dist/chunks/chunk-VZMBE5MV.js.map +0 -7
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
createViewport
|
|
4
|
+
} from "./chunk-5KZP6X65.js";
|
|
5
|
+
import {
|
|
6
|
+
createEvaluator
|
|
7
|
+
} from "./chunk-72DMUKP3.js";
|
|
8
|
+
|
|
9
|
+
// ../studio/src/preferences.ts
|
|
10
|
+
var DEFAULT_PREFERENCES = {
|
|
11
|
+
renderMode: "normal",
|
|
12
|
+
renderResolution: "screen",
|
|
13
|
+
renderSelectedOnly: false,
|
|
14
|
+
cameraSun: false,
|
|
15
|
+
voxelResolution: 36,
|
|
16
|
+
hints: true,
|
|
17
|
+
stats: false,
|
|
18
|
+
decalBoost: 15
|
|
19
|
+
};
|
|
20
|
+
var KEY = "dreamy-studio:view-preferences";
|
|
21
|
+
function createPreferencesStore(storage) {
|
|
22
|
+
return {
|
|
23
|
+
load() {
|
|
24
|
+
try {
|
|
25
|
+
const raw = storage?.getItem(KEY);
|
|
26
|
+
if (!raw) return DEFAULT_PREFERENCES;
|
|
27
|
+
return sanitize({ ...DEFAULT_PREFERENCES, ...JSON.parse(raw) });
|
|
28
|
+
} catch {
|
|
29
|
+
return DEFAULT_PREFERENCES;
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
save(prefs) {
|
|
33
|
+
try {
|
|
34
|
+
storage?.setItem(KEY, JSON.stringify(sanitize(prefs)));
|
|
35
|
+
} catch {
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function sanitize(p) {
|
|
41
|
+
const voxel = Number.isFinite(p.voxelResolution) ? p.voxelResolution : DEFAULT_PREFERENCES.voxelResolution;
|
|
42
|
+
return { ...p, voxelResolution: Math.min(64, Math.max(16, Math.round(voxel))) };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ../studio/src/sprite-baker.ts
|
|
46
|
+
var SESSION = {
|
|
47
|
+
mode: "assembly",
|
|
48
|
+
selection: { objectIds: [], stampIds: [] },
|
|
49
|
+
tool: "select",
|
|
50
|
+
space: "world",
|
|
51
|
+
brush: { shape: "cube", mode: "add", size: 1.8, color: "secondary", smear: false, blend: 0.3, symmetry: { count: 1, axes: [] } },
|
|
52
|
+
decalBrush: { size: 1, roll: 0, flip: false, tint: "black", eraser: false, depth: 1 },
|
|
53
|
+
boneTool: "select",
|
|
54
|
+
pivotGizmo: "translate",
|
|
55
|
+
hiddenBones: [],
|
|
56
|
+
showBones: false,
|
|
57
|
+
touchArea: false,
|
|
58
|
+
touchAdd: false,
|
|
59
|
+
prefs: { ...DEFAULT_PREFERENCES, hints: false, stats: false },
|
|
60
|
+
play: false,
|
|
61
|
+
stressTest: false
|
|
62
|
+
};
|
|
63
|
+
function createSpriteBaker(options = {}) {
|
|
64
|
+
const ownHost = !options.host;
|
|
65
|
+
const host = options.host ?? Object.assign(document.createElement("div"), { ariaHidden: "true" });
|
|
66
|
+
if (ownHost) {
|
|
67
|
+
Object.assign(host.style, { position: "fixed", left: "-10000px", top: "0", width: "256px", height: "256px", pointerEvents: "none" });
|
|
68
|
+
document.body.appendChild(host);
|
|
69
|
+
}
|
|
70
|
+
const evaluator = options.evaluator ?? createEvaluator();
|
|
71
|
+
const viewport = createViewport({ evaluator });
|
|
72
|
+
viewport.mount(host, {
|
|
73
|
+
command: () => ({ ok: false, reason: "A sprite baker does not edit." }),
|
|
74
|
+
select: () => void 0,
|
|
75
|
+
focus: () => void 0,
|
|
76
|
+
scopeOut: () => void 0,
|
|
77
|
+
toast: () => void 0,
|
|
78
|
+
stats: () => void 0
|
|
79
|
+
});
|
|
80
|
+
let queue = Promise.resolve();
|
|
81
|
+
return {
|
|
82
|
+
bake(creation, shots, objectIds) {
|
|
83
|
+
const run = async () => {
|
|
84
|
+
viewport.update(creation, SESSION);
|
|
85
|
+
const ids = objectIds ?? creation.objects.map((o) => o.id);
|
|
86
|
+
const out = [];
|
|
87
|
+
for (const shot of shots) out.push(await viewport.bakeSprite({ objectIds: ids, ...shot }));
|
|
88
|
+
return out;
|
|
89
|
+
};
|
|
90
|
+
const next = queue.then(run, run);
|
|
91
|
+
queue = next.catch(() => void 0);
|
|
92
|
+
return next;
|
|
93
|
+
},
|
|
94
|
+
dispose() {
|
|
95
|
+
viewport.dispose();
|
|
96
|
+
if (!options.evaluator) evaluator.dispose();
|
|
97
|
+
if (ownHost) host.remove();
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export {
|
|
103
|
+
DEFAULT_PREFERENCES,
|
|
104
|
+
createPreferencesStore,
|
|
105
|
+
createSpriteBaker
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=chunk-6TE546ZS.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../studio/src/preferences.ts", "../../../studio/src/sprite-baker.ts"],
|
|
4
|
+
"sourcesContent": ["import type { PreferencesStore, ViewPreferences } from \"@dreamy/api\";\n\nexport const DEFAULT_PREFERENCES: ViewPreferences = {\n renderMode: \"normal\",\n renderResolution: \"screen\",\n renderSelectedOnly: false,\n cameraSun: false,\n voxelResolution: 36,\n hints: true,\n stats: false,\n decalBoost: 15,\n};\n\nconst KEY = \"dreamy-studio:view-preferences\";\n\nexport type KeyValueStorage = {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem?(key: string): void;\n};\n\n/** View settings per browser. A missing, broken or blocked store falls back to the defaults. */\nexport function createPreferencesStore(storage: KeyValueStorage | undefined): PreferencesStore {\n return {\n load() {\n try {\n const raw = storage?.getItem(KEY);\n if (!raw) return DEFAULT_PREFERENCES;\n return sanitize({ ...DEFAULT_PREFERENCES, ...(JSON.parse(raw) as Partial<ViewPreferences>) });\n } catch {\n return DEFAULT_PREFERENCES;\n }\n },\n save(prefs) {\n try {\n storage?.setItem(KEY, JSON.stringify(sanitize(prefs)));\n } catch {\n /* storage blocked: preferences last for this page only */\n }\n },\n };\n}\n\nfunction sanitize(p: ViewPreferences): ViewPreferences {\n const voxel = Number.isFinite(p.voxelResolution) ? p.voxelResolution : DEFAULT_PREFERENCES.voxelResolution;\n return { ...p, voxelResolution: Math.min(64, Math.max(16, Math.round(voxel))) };\n}\n", "import type { CameraView, Creation, Evaluator, Id, SpriteBake, ViewSession } from \"@dreamy/api\";\nimport { createEvaluator } from \"@dreamy/evaluator\";\nimport { createViewport } from \"@dreamy/viewport\";\nimport { DEFAULT_PREFERENCES } from \"./preferences.js\";\n\n/** One picture of a bake: its angle around the creature's front and its size (see `SpriteBakeOptions`). */\nexport type SpriteShot = {\n readonly view: CameraView;\n readonly size: number;\n readonly padding?: number;\n readonly fov?: number;\n};\n\n/** Bakes sprites of creations, one at a time, with no studio UI. */\nexport type SpriteBaker = {\n /** The shots of objects in a creation (default: every object), in order. */\n bake(creation: Creation, shots: readonly SpriteShot[], objectIds?: readonly Id[]): Promise<SpriteBake[]>;\n /** Releases the canvas, the GPU resources and (when the baker made it) the mesher. */\n dispose(): void;\n};\n\nexport type SpriteBakerOptions = {\n /** The element the canvas goes into (default: one made off-screen, removed on dispose). */\n readonly host?: HTMLElement;\n /** The mesher (default: a new one, disposed with the baker). */\n readonly evaluator?: Evaluator;\n};\n\nconst SESSION: ViewSession = {\n mode: \"assembly\",\n selection: { objectIds: [], stampIds: [] },\n tool: \"select\",\n space: \"world\",\n brush: { shape: \"cube\", mode: \"add\", size: 1.8, color: \"secondary\", smear: false, blend: 0.3, symmetry: { count: 1, axes: [] } },\n decalBrush: { size: 1, roll: 0, flip: false, tint: \"black\", eraser: false, depth: 1 },\n boneTool: \"select\",\n pivotGizmo: \"translate\",\n hiddenBones: [],\n showBones: false,\n touchArea: false,\n touchAdd: false,\n prefs: { ...DEFAULT_PREFERENCES, hints: false, stats: false },\n play: false,\n stressTest: false,\n};\n\n/**\n * A headless sprite baker: the WASM mesher and the viewport on a canvas nobody sees. A page (or a headless browser\n * on a server) builds creations with `@dreamy/core` and bakes their pictures here. Bakes run one after another.\n */\nexport function createSpriteBaker(options: SpriteBakerOptions = {}): SpriteBaker {\n const ownHost = !options.host;\n const host = options.host ?? Object.assign(document.createElement(\"div\"), { ariaHidden: \"true\" });\n if (ownHost) {\n Object.assign(host.style, { position: \"fixed\", left: \"-10000px\", top: \"0\", width: \"256px\", height: \"256px\", pointerEvents: \"none\" });\n document.body.appendChild(host);\n }\n const evaluator = options.evaluator ?? createEvaluator();\n const viewport = createViewport({ evaluator });\n viewport.mount(host, {\n command: () => ({ ok: false, reason: \"A sprite baker does not edit.\" }),\n select: () => undefined,\n focus: () => undefined,\n scopeOut: () => undefined,\n toast: () => undefined,\n stats: () => undefined,\n });\n let queue: Promise<unknown> = Promise.resolve();\n\n return {\n bake(creation, shots, objectIds) {\n const run = async () => {\n viewport.update(creation, SESSION);\n const ids = objectIds ?? creation.objects.map((o) => o.id);\n const out: SpriteBake[] = [];\n for (const shot of shots) out.push(await viewport.bakeSprite({ objectIds: ids, ...shot }));\n return out;\n };\n const next = queue.then(run, run);\n queue = next.catch(() => undefined);\n return next;\n },\n dispose() {\n viewport.dispose();\n if (!options.evaluator) evaluator.dispose();\n if (ownHost) host.remove();\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/index.js
CHANGED
|
@@ -2,9 +2,14 @@
|
|
|
2
2
|
import {
|
|
3
3
|
createCreationApi
|
|
4
4
|
} from "./chunks/chunk-ZU72KKME.js";
|
|
5
|
+
import {
|
|
6
|
+
DEFAULT_PREFERENCES,
|
|
7
|
+
createPreferencesStore,
|
|
8
|
+
createSpriteBaker
|
|
9
|
+
} from "./chunks/chunk-6TE546ZS.js";
|
|
5
10
|
import {
|
|
6
11
|
createViewport
|
|
7
|
-
} from "./chunks/chunk-
|
|
12
|
+
} from "./chunks/chunk-5KZP6X65.js";
|
|
8
13
|
import {
|
|
9
14
|
createEvaluator
|
|
10
15
|
} from "./chunks/chunk-72DMUKP3.js";
|
|
@@ -7065,42 +7070,6 @@ function createLibraryPersistence({ database, files, newId, now }) {
|
|
|
7065
7070
|
};
|
|
7066
7071
|
}
|
|
7067
7072
|
|
|
7068
|
-
// ../studio/src/preferences.ts
|
|
7069
|
-
var DEFAULT_PREFERENCES = {
|
|
7070
|
-
renderMode: "normal",
|
|
7071
|
-
renderResolution: "screen",
|
|
7072
|
-
renderSelectedOnly: false,
|
|
7073
|
-
cameraSun: false,
|
|
7074
|
-
voxelResolution: 36,
|
|
7075
|
-
hints: true,
|
|
7076
|
-
stats: false,
|
|
7077
|
-
decalBoost: 15
|
|
7078
|
-
};
|
|
7079
|
-
var KEY = "dreamy-studio:view-preferences";
|
|
7080
|
-
function createPreferencesStore(storage) {
|
|
7081
|
-
return {
|
|
7082
|
-
load() {
|
|
7083
|
-
try {
|
|
7084
|
-
const raw = storage?.getItem(KEY);
|
|
7085
|
-
if (!raw) return DEFAULT_PREFERENCES;
|
|
7086
|
-
return sanitize({ ...DEFAULT_PREFERENCES, ...JSON.parse(raw) });
|
|
7087
|
-
} catch {
|
|
7088
|
-
return DEFAULT_PREFERENCES;
|
|
7089
|
-
}
|
|
7090
|
-
},
|
|
7091
|
-
save(prefs) {
|
|
7092
|
-
try {
|
|
7093
|
-
storage?.setItem(KEY, JSON.stringify(sanitize(prefs)));
|
|
7094
|
-
} catch {
|
|
7095
|
-
}
|
|
7096
|
-
}
|
|
7097
|
-
};
|
|
7098
|
-
}
|
|
7099
|
-
function sanitize(p) {
|
|
7100
|
-
const voxel = Number.isFinite(p.voxelResolution) ? p.voxelResolution : DEFAULT_PREFERENCES.voxelResolution;
|
|
7101
|
-
return { ...p, voxelResolution: Math.min(64, Math.max(16, Math.round(voxel))) };
|
|
7102
|
-
}
|
|
7103
|
-
|
|
7104
7073
|
// ../studio/src/seed.ts
|
|
7105
7074
|
function seedFirstSculpt(api) {
|
|
7106
7075
|
api.dispatch({
|
|
@@ -7273,6 +7242,7 @@ export {
|
|
|
7273
7242
|
createIndexedDbLibrary,
|
|
7274
7243
|
createLibraryPersistence,
|
|
7275
7244
|
createPreferencesStore,
|
|
7245
|
+
createSpriteBaker,
|
|
7276
7246
|
parseCreationLog,
|
|
7277
7247
|
serializeCreationLog,
|
|
7278
7248
|
withSyncSchedule
|