@felbrasil/dreamy 0.1.0 → 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.
@@ -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-VZMBE5MV.js";
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