Package not found. Please check the package name and try again.
@aura3d/apps 1.0.6
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/dist/index.d.ts +50 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +99 -0
- package/dist/index.js.map +1 -0
- package/package.json +19 -0
- package/src/index.ts +162 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Engine, type DiagnosticsSnapshot } from "@aura3d/core";
|
|
2
|
+
import { type RenderDeviceDiagnostics, type RendererOptions } from "@aura3d/rendering";
|
|
3
|
+
import { type AssetViewerWorkflowOptions, type A3DWorkflowResult, type InteractiveSceneWorkflowOptions, type MaterialStudioWorkflowOptions, type ProductConfiguratorWorkflowOptions, type SceneShowcaseWorkflowOptions } from "@aura3d/workflows";
|
|
4
|
+
export type A3DAppQualityPreset = "draft" | "balanced" | "production";
|
|
5
|
+
export type A3DAppWorkflowPreset = "asset-viewer" | "product-configurator" | "material-studio" | "scene-showcase" | "interactive-scene";
|
|
6
|
+
export interface A3DAppQualitySettings {
|
|
7
|
+
readonly preset: A3DAppQualityPreset;
|
|
8
|
+
readonly width: number;
|
|
9
|
+
readonly height: number;
|
|
10
|
+
readonly antialias: boolean;
|
|
11
|
+
readonly preserveDrawingBuffer: boolean;
|
|
12
|
+
readonly targetFormat: "rgba8" | "rgba16f";
|
|
13
|
+
readonly diagnostics: readonly string[];
|
|
14
|
+
}
|
|
15
|
+
export interface A3DAppOptions {
|
|
16
|
+
readonly canvas?: HTMLCanvasElement | OffscreenCanvas;
|
|
17
|
+
readonly quality?: A3DAppQualityPreset;
|
|
18
|
+
readonly width?: number;
|
|
19
|
+
readonly height?: number;
|
|
20
|
+
readonly rendererFactory?: (options: RendererOptions) => Promise<A3DAppRendererLike>;
|
|
21
|
+
}
|
|
22
|
+
export interface A3DAppRendererLike {
|
|
23
|
+
render(source: A3DWorkflowResult["source"], camera?: A3DWorkflowResult["camera"]): RenderDeviceDiagnostics;
|
|
24
|
+
dispose?(): void;
|
|
25
|
+
}
|
|
26
|
+
export interface A3DAppDiagnostics {
|
|
27
|
+
readonly appState: "ready" | "disposed";
|
|
28
|
+
readonly quality: A3DAppQualitySettings;
|
|
29
|
+
readonly workflowRuns: number;
|
|
30
|
+
readonly lastWorkflow?: A3DAppWorkflowPreset;
|
|
31
|
+
readonly lastRender?: RenderDeviceDiagnostics;
|
|
32
|
+
readonly engine: DiagnosticsSnapshot;
|
|
33
|
+
}
|
|
34
|
+
export interface A3DApp {
|
|
35
|
+
readonly engine: Engine;
|
|
36
|
+
readonly renderer?: A3DAppRendererLike;
|
|
37
|
+
readonly quality: A3DAppQualitySettings;
|
|
38
|
+
renderWorkflow(preset: "asset-viewer", options: AssetViewerWorkflowOptions): Promise<A3DWorkflowResult>;
|
|
39
|
+
renderWorkflow(preset: "product-configurator", options: ProductConfiguratorWorkflowOptions): Promise<A3DWorkflowResult>;
|
|
40
|
+
renderWorkflow(preset: "material-studio", options?: MaterialStudioWorkflowOptions): Promise<A3DWorkflowResult>;
|
|
41
|
+
renderWorkflow(preset: "scene-showcase", options?: SceneShowcaseWorkflowOptions): Promise<A3DWorkflowResult>;
|
|
42
|
+
renderWorkflow(preset: "interactive-scene", options?: InteractiveSceneWorkflowOptions): Promise<A3DWorkflowResult>;
|
|
43
|
+
renderWorkflow(preset: A3DAppWorkflowPreset, options?: unknown): Promise<A3DWorkflowResult>;
|
|
44
|
+
diagnostics(): A3DAppDiagnostics;
|
|
45
|
+
dispose(): Promise<void>;
|
|
46
|
+
}
|
|
47
|
+
export declare const A3D_APP_WORKFLOW_PRESETS: readonly A3DAppWorkflowPreset[];
|
|
48
|
+
export declare function resolveA3DAppQualityPreset(preset?: A3DAppQualityPreset, overrides?: Pick<A3DAppOptions, "width" | "height">): A3DAppQualitySettings;
|
|
49
|
+
export declare function createA3DApp(options?: A3DAppOptions): Promise<A3DApp>;
|
|
50
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/apps/src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { Engine } from "@aura3d/core";
|
|
2
|
+
import { Renderer } from "@aura3d/rendering";
|
|
3
|
+
import { createAssetViewerWorkflow, createInteractiveSceneWorkflow, createMaterialStudioWorkflow, createProductConfiguratorWorkflow, createSceneShowcaseWorkflow } from "@aura3d/workflows";
|
|
4
|
+
export const A3D_APP_WORKFLOW_PRESETS = [
|
|
5
|
+
"asset-viewer",
|
|
6
|
+
"product-configurator",
|
|
7
|
+
"material-studio",
|
|
8
|
+
"scene-showcase",
|
|
9
|
+
"interactive-scene"
|
|
10
|
+
];
|
|
11
|
+
export function resolveA3DAppQualityPreset(preset = "balanced", overrides = {}) {
|
|
12
|
+
const base = preset === "production"
|
|
13
|
+
? { width: 1600, height: 1000, antialias: true, preserveDrawingBuffer: true, targetFormat: "rgba16f" }
|
|
14
|
+
: preset === "draft"
|
|
15
|
+
? { width: 960, height: 540, antialias: false, preserveDrawingBuffer: false, targetFormat: "rgba8" }
|
|
16
|
+
: { width: 1280, height: 720, antialias: true, preserveDrawingBuffer: true, targetFormat: "rgba16f" };
|
|
17
|
+
return {
|
|
18
|
+
preset,
|
|
19
|
+
...base,
|
|
20
|
+
width: overrides.width ?? base.width,
|
|
21
|
+
height: overrides.height ?? base.height,
|
|
22
|
+
diagnostics: [
|
|
23
|
+
"quality-preset",
|
|
24
|
+
"workflow-presets",
|
|
25
|
+
"renderer-diagnostics",
|
|
26
|
+
"engine-diagnostics"
|
|
27
|
+
]
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export async function createA3DApp(options = {}) {
|
|
31
|
+
const quality = resolveA3DAppQualityPreset(options.quality, options);
|
|
32
|
+
const engine = new Engine({ autoStart: false });
|
|
33
|
+
await engine.init();
|
|
34
|
+
const renderer = options.canvas
|
|
35
|
+
? await (options.rendererFactory ?? Renderer.create)({
|
|
36
|
+
backend: "webgl2",
|
|
37
|
+
canvas: options.canvas,
|
|
38
|
+
width: quality.width,
|
|
39
|
+
height: quality.height,
|
|
40
|
+
antialias: quality.antialias,
|
|
41
|
+
preserveDrawingBuffer: quality.preserveDrawingBuffer,
|
|
42
|
+
clearColor: [0.018, 0.02, 0.024, 1]
|
|
43
|
+
})
|
|
44
|
+
: undefined;
|
|
45
|
+
let disposed = false;
|
|
46
|
+
let workflowRuns = 0;
|
|
47
|
+
let lastWorkflow;
|
|
48
|
+
let lastRender;
|
|
49
|
+
return {
|
|
50
|
+
engine,
|
|
51
|
+
renderer,
|
|
52
|
+
quality,
|
|
53
|
+
async renderWorkflow(preset, workflowOptions) {
|
|
54
|
+
if (disposed)
|
|
55
|
+
throw new Error("A3D app has been disposed.");
|
|
56
|
+
const workflow = await createWorkflow(preset, workflowOptions);
|
|
57
|
+
workflowRuns += 1;
|
|
58
|
+
lastWorkflow = preset;
|
|
59
|
+
engine.diagnostics.increment(`workflow.${preset}.runs`);
|
|
60
|
+
if (renderer) {
|
|
61
|
+
lastRender = renderer.render(workflow.source, workflow.camera);
|
|
62
|
+
engine.diagnostics.gauge("renderer.drawCalls", lastRender.drawCalls);
|
|
63
|
+
}
|
|
64
|
+
return workflow;
|
|
65
|
+
},
|
|
66
|
+
diagnostics() {
|
|
67
|
+
return {
|
|
68
|
+
appState: disposed ? "disposed" : "ready",
|
|
69
|
+
quality,
|
|
70
|
+
workflowRuns,
|
|
71
|
+
...(lastWorkflow ? { lastWorkflow } : {}),
|
|
72
|
+
...(lastRender ? { lastRender } : {}),
|
|
73
|
+
engine: engine.diagnostics.snapshot()
|
|
74
|
+
};
|
|
75
|
+
},
|
|
76
|
+
async dispose() {
|
|
77
|
+
if (disposed)
|
|
78
|
+
return;
|
|
79
|
+
disposed = true;
|
|
80
|
+
renderer?.dispose?.();
|
|
81
|
+
await engine.dispose();
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
async function createWorkflow(preset, options) {
|
|
86
|
+
switch (preset) {
|
|
87
|
+
case "asset-viewer":
|
|
88
|
+
return createAssetViewerWorkflow(options);
|
|
89
|
+
case "product-configurator":
|
|
90
|
+
return createProductConfiguratorWorkflow(options);
|
|
91
|
+
case "material-studio":
|
|
92
|
+
return createMaterialStudioWorkflow(options);
|
|
93
|
+
case "scene-showcase":
|
|
94
|
+
return createSceneShowcaseWorkflow(options);
|
|
95
|
+
case "interactive-scene":
|
|
96
|
+
return createInteractiveSceneWorkflow(options);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/apps/src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aura3d/apps",
|
|
3
|
+
"version": "1.0.6",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"exports": {
|
|
6
|
+
".": {
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"import": "./dist/index.js"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"main": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@aura3d/core": "1.0.6",
|
|
15
|
+
"@aura3d/workflows": "1.0.6",
|
|
16
|
+
"@aura3d/rendering": "1.0.6"
|
|
17
|
+
},
|
|
18
|
+
"sideEffects": false
|
|
19
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { Engine, type DiagnosticsSnapshot } from "@aura3d/core";
|
|
2
|
+
import { Renderer, type RenderDeviceDiagnostics, type RendererOptions } from "@aura3d/rendering";
|
|
3
|
+
import {
|
|
4
|
+
createAssetViewerWorkflow,
|
|
5
|
+
createInteractiveSceneWorkflow,
|
|
6
|
+
createMaterialStudioWorkflow,
|
|
7
|
+
createProductConfiguratorWorkflow,
|
|
8
|
+
createSceneShowcaseWorkflow,
|
|
9
|
+
type AssetViewerWorkflowOptions,
|
|
10
|
+
type A3DWorkflowResult,
|
|
11
|
+
type InteractiveSceneWorkflowOptions,
|
|
12
|
+
type MaterialStudioWorkflowOptions,
|
|
13
|
+
type ProductConfiguratorWorkflowOptions,
|
|
14
|
+
type SceneShowcaseWorkflowOptions
|
|
15
|
+
} from "@aura3d/workflows";
|
|
16
|
+
|
|
17
|
+
export type A3DAppQualityPreset = "draft" | "balanced" | "production";
|
|
18
|
+
export type A3DAppWorkflowPreset = "asset-viewer" | "product-configurator" | "material-studio" | "scene-showcase" | "interactive-scene";
|
|
19
|
+
|
|
20
|
+
export interface A3DAppQualitySettings {
|
|
21
|
+
readonly preset: A3DAppQualityPreset;
|
|
22
|
+
readonly width: number;
|
|
23
|
+
readonly height: number;
|
|
24
|
+
readonly antialias: boolean;
|
|
25
|
+
readonly preserveDrawingBuffer: boolean;
|
|
26
|
+
readonly targetFormat: "rgba8" | "rgba16f";
|
|
27
|
+
readonly diagnostics: readonly string[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface A3DAppOptions {
|
|
31
|
+
readonly canvas?: HTMLCanvasElement | OffscreenCanvas;
|
|
32
|
+
readonly quality?: A3DAppQualityPreset;
|
|
33
|
+
readonly width?: number;
|
|
34
|
+
readonly height?: number;
|
|
35
|
+
readonly rendererFactory?: (options: RendererOptions) => Promise<A3DAppRendererLike>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface A3DAppRendererLike {
|
|
39
|
+
render(source: A3DWorkflowResult["source"], camera?: A3DWorkflowResult["camera"]): RenderDeviceDiagnostics;
|
|
40
|
+
dispose?(): void;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface A3DAppDiagnostics {
|
|
44
|
+
readonly appState: "ready" | "disposed";
|
|
45
|
+
readonly quality: A3DAppQualitySettings;
|
|
46
|
+
readonly workflowRuns: number;
|
|
47
|
+
readonly lastWorkflow?: A3DAppWorkflowPreset;
|
|
48
|
+
readonly lastRender?: RenderDeviceDiagnostics;
|
|
49
|
+
readonly engine: DiagnosticsSnapshot;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface A3DApp {
|
|
53
|
+
readonly engine: Engine;
|
|
54
|
+
readonly renderer?: A3DAppRendererLike;
|
|
55
|
+
readonly quality: A3DAppQualitySettings;
|
|
56
|
+
renderWorkflow(preset: "asset-viewer", options: AssetViewerWorkflowOptions): Promise<A3DWorkflowResult>;
|
|
57
|
+
renderWorkflow(preset: "product-configurator", options: ProductConfiguratorWorkflowOptions): Promise<A3DWorkflowResult>;
|
|
58
|
+
renderWorkflow(preset: "material-studio", options?: MaterialStudioWorkflowOptions): Promise<A3DWorkflowResult>;
|
|
59
|
+
renderWorkflow(preset: "scene-showcase", options?: SceneShowcaseWorkflowOptions): Promise<A3DWorkflowResult>;
|
|
60
|
+
renderWorkflow(preset: "interactive-scene", options?: InteractiveSceneWorkflowOptions): Promise<A3DWorkflowResult>;
|
|
61
|
+
renderWorkflow(preset: A3DAppWorkflowPreset, options?: unknown): Promise<A3DWorkflowResult>;
|
|
62
|
+
diagnostics(): A3DAppDiagnostics;
|
|
63
|
+
dispose(): Promise<void>;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export const A3D_APP_WORKFLOW_PRESETS: readonly A3DAppWorkflowPreset[] = [
|
|
67
|
+
"asset-viewer",
|
|
68
|
+
"product-configurator",
|
|
69
|
+
"material-studio",
|
|
70
|
+
"scene-showcase",
|
|
71
|
+
"interactive-scene"
|
|
72
|
+
] as const;
|
|
73
|
+
|
|
74
|
+
export function resolveA3DAppQualityPreset(preset: A3DAppQualityPreset = "balanced", overrides: Pick<A3DAppOptions, "width" | "height"> = {}): A3DAppQualitySettings {
|
|
75
|
+
const base = preset === "production"
|
|
76
|
+
? { width: 1600, height: 1000, antialias: true, preserveDrawingBuffer: true, targetFormat: "rgba16f" as const }
|
|
77
|
+
: preset === "draft"
|
|
78
|
+
? { width: 960, height: 540, antialias: false, preserveDrawingBuffer: false, targetFormat: "rgba8" as const }
|
|
79
|
+
: { width: 1280, height: 720, antialias: true, preserveDrawingBuffer: true, targetFormat: "rgba16f" as const };
|
|
80
|
+
return {
|
|
81
|
+
preset,
|
|
82
|
+
...base,
|
|
83
|
+
width: overrides.width ?? base.width,
|
|
84
|
+
height: overrides.height ?? base.height,
|
|
85
|
+
diagnostics: [
|
|
86
|
+
"quality-preset",
|
|
87
|
+
"workflow-presets",
|
|
88
|
+
"renderer-diagnostics",
|
|
89
|
+
"engine-diagnostics"
|
|
90
|
+
]
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export async function createA3DApp(options: A3DAppOptions = {}): Promise<A3DApp> {
|
|
95
|
+
const quality = resolveA3DAppQualityPreset(options.quality, options);
|
|
96
|
+
const engine = new Engine({ autoStart: false });
|
|
97
|
+
await engine.init();
|
|
98
|
+
const renderer = options.canvas
|
|
99
|
+
? await (options.rendererFactory ?? Renderer.create)({
|
|
100
|
+
backend: "webgl2",
|
|
101
|
+
canvas: options.canvas,
|
|
102
|
+
width: quality.width,
|
|
103
|
+
height: quality.height,
|
|
104
|
+
antialias: quality.antialias,
|
|
105
|
+
preserveDrawingBuffer: quality.preserveDrawingBuffer,
|
|
106
|
+
clearColor: [0.018, 0.02, 0.024, 1]
|
|
107
|
+
})
|
|
108
|
+
: undefined;
|
|
109
|
+
let disposed = false;
|
|
110
|
+
let workflowRuns = 0;
|
|
111
|
+
let lastWorkflow: A3DAppWorkflowPreset | undefined;
|
|
112
|
+
let lastRender: RenderDeviceDiagnostics | undefined;
|
|
113
|
+
|
|
114
|
+
return {
|
|
115
|
+
engine,
|
|
116
|
+
renderer,
|
|
117
|
+
quality,
|
|
118
|
+
async renderWorkflow(preset: A3DAppWorkflowPreset, workflowOptions?: unknown): Promise<A3DWorkflowResult> {
|
|
119
|
+
if (disposed) throw new Error("A3D app has been disposed.");
|
|
120
|
+
const workflow = await createWorkflow(preset, workflowOptions);
|
|
121
|
+
workflowRuns += 1;
|
|
122
|
+
lastWorkflow = preset;
|
|
123
|
+
engine.diagnostics.increment(`workflow.${preset}.runs`);
|
|
124
|
+
if (renderer) {
|
|
125
|
+
lastRender = renderer.render(workflow.source, workflow.camera);
|
|
126
|
+
engine.diagnostics.gauge("renderer.drawCalls", lastRender.drawCalls);
|
|
127
|
+
}
|
|
128
|
+
return workflow;
|
|
129
|
+
},
|
|
130
|
+
diagnostics(): A3DAppDiagnostics {
|
|
131
|
+
return {
|
|
132
|
+
appState: disposed ? "disposed" : "ready",
|
|
133
|
+
quality,
|
|
134
|
+
workflowRuns,
|
|
135
|
+
...(lastWorkflow ? { lastWorkflow } : {}),
|
|
136
|
+
...(lastRender ? { lastRender } : {}),
|
|
137
|
+
engine: engine.diagnostics.snapshot()
|
|
138
|
+
};
|
|
139
|
+
},
|
|
140
|
+
async dispose(): Promise<void> {
|
|
141
|
+
if (disposed) return;
|
|
142
|
+
disposed = true;
|
|
143
|
+
renderer?.dispose?.();
|
|
144
|
+
await engine.dispose();
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
async function createWorkflow(preset: A3DAppWorkflowPreset, options: unknown): Promise<A3DWorkflowResult> {
|
|
150
|
+
switch (preset) {
|
|
151
|
+
case "asset-viewer":
|
|
152
|
+
return createAssetViewerWorkflow(options as AssetViewerWorkflowOptions);
|
|
153
|
+
case "product-configurator":
|
|
154
|
+
return createProductConfiguratorWorkflow(options as ProductConfiguratorWorkflowOptions);
|
|
155
|
+
case "material-studio":
|
|
156
|
+
return createMaterialStudioWorkflow(options as MaterialStudioWorkflowOptions | undefined);
|
|
157
|
+
case "scene-showcase":
|
|
158
|
+
return createSceneShowcaseWorkflow(options as SceneShowcaseWorkflowOptions | undefined);
|
|
159
|
+
case "interactive-scene":
|
|
160
|
+
return createInteractiveSceneWorkflow(options as InteractiveSceneWorkflowOptions | undefined);
|
|
161
|
+
}
|
|
162
|
+
}
|