presenter 0.9.3 → 0.10.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/dist/3d/index.d.ts +17 -0
- package/dist/3d/objects/ThreeBox.d.ts +9 -0
- package/dist/3d/objects/ThreeCameraType.d.ts +5 -0
- package/dist/3d/objects/ThreeMesh.d.ts +30 -0
- package/dist/3d/objects/ThreeModel.d.ts +18 -0
- package/dist/3d/objects/ThreeModelMaterial.d.ts +11 -0
- package/dist/3d/objects/ThreeModelNode.d.ts +24 -0
- package/dist/3d/objects/ThreeModelTarget.d.ts +9 -0
- package/dist/3d/objects/ThreeObjectType.d.ts +10 -0
- package/dist/3d/objects/ThreePresenterGroup.d.ts +13 -0
- package/dist/3d/objects/ThreeScene.d.ts +39 -0
- package/dist/3d/objects/ThreeSphere.d.ts +9 -0
- package/dist/3d/renderers/getThreeObjectRenderers.d.ts +6 -0
- package/dist/3d/renderers/renderThreeSceneFallback.d.ts +3 -0
- package/dist/3d/renderers/renderThreeScenePowerPointFallback.d.ts +3 -0
- package/dist/3d/renderers/threeFallbackRenderers.d.ts +5 -0
- package/dist/3d/types/ThreeModules.d.ts +10 -0
- package/dist/3d/utils/colorToThreeHex.d.ts +2 -0
- package/dist/3d/utils/inspectThreeModel.d.ts +4 -0
- package/dist/3d/utils/installThreeSceneCaptureApi.d.ts +21 -0
- package/dist/3d/utils/loadThreeModules.d.ts +2 -0
- package/dist/3d/utils/modelCache.d.ts +6 -0
- package/dist/3d/utils/modelInspection.d.ts +23 -0
- package/dist/3d/utils/modelInspection.test.d.ts +1 -0
- package/dist/3d/utils/modelPaths.d.ts +14 -0
- package/dist/3d/utils/modelPaths.test.d.ts +1 -0
- package/dist/3d.js +2 -0
- package/dist/3d.js.map +1 -0
- package/dist/3d.mjs +1055 -0
- package/dist/3d.mjs.map +1 -0
- package/dist/export/browser-image-renderer/BrowserImageRenderer.d.ts +7 -0
- package/dist/export/browser-image-renderer/types/BrowserImageRendererProps.d.ts +36 -0
- package/dist/export/browser.d.ts +2 -0
- package/dist/export/image-renderer/ImageRenderer.d.ts +1 -1
- package/dist/export/index.d.ts +2 -0
- package/dist/export/utils/getImageExportFrames.d.ts +14 -0
- package/dist/export/utils/getImageExportFrames.test.d.ts +1 -0
- package/dist/export-browser.js +6 -0
- package/dist/export-browser.js.map +1 -0
- package/dist/export-browser.mjs +2231 -0
- package/dist/export-browser.mjs.map +1 -0
- package/dist/export.js +74 -72
- package/dist/export.js.map +1 -1
- package/dist/export.mjs +5443 -4333
- package/dist/export.mjs.map +1 -1
- package/dist/objects/Image.d.ts +2 -1
- package/dist/presenter.js +5 -5
- package/dist/presenter.js.map +1 -1
- package/dist/presenter.mjs +1820 -1794
- package/dist/presenter.mjs.map +1 -1
- package/dist/renderer/browser-canvas/types/BrowserCanvasObjectRenderer.d.ts +8 -1
- package/dist/renderer/browser-canvas/utils/text/getTextLayout.d.ts +4 -11
- package/dist/renderer/browser-canvas/utils/text/getTextUnitMeasurements.d.ts +9 -0
- package/dist/utils/presentation/getImagePathUrlById.d.ts +2 -0
- package/dist/utils/presentation/getObjectChildren.d.ts +1 -1
- package/package.json +23 -3
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export { ThreeBox, type ThreeBox as ThreeBoxObject } from './objects/ThreeBox';
|
|
2
|
+
export { ThreeCameraType } from './objects/ThreeCameraType';
|
|
3
|
+
export { type ThreeMesh } from './objects/ThreeMesh';
|
|
4
|
+
export { ThreeModel, type ThreeModel as ThreeModelObject } from './objects/ThreeModel';
|
|
5
|
+
export { ThreeModelMaterial, type ThreeModelMaterial as ThreeModelMaterialObject, } from './objects/ThreeModelMaterial';
|
|
6
|
+
export { ThreeModelNode, type ThreeModelNode as ThreeModelNodeObject, } from './objects/ThreeModelNode';
|
|
7
|
+
export { type ThreeModelPath, type ThreeModelTarget } from './objects/ThreeModelTarget';
|
|
8
|
+
export { ThreeObjectType } from './objects/ThreeObjectType';
|
|
9
|
+
export { ThreePresenterGroup, type ThreePresenterGroup as ThreePresenterGroupObject, } from './objects/ThreePresenterGroup';
|
|
10
|
+
export { ThreeScene, type ThreeScene as ThreeSceneObject } from './objects/ThreeScene';
|
|
11
|
+
export { ThreeSphere, type ThreeSphere as ThreeSphereObject } from './objects/ThreeSphere';
|
|
12
|
+
export { getRenderedThreeSceneCanvas, getThreeObjectRenderers, } from './renderers/getThreeObjectRenderers';
|
|
13
|
+
export { renderThreeSceneFallback } from './renderers/renderThreeSceneFallback';
|
|
14
|
+
export { renderThreeScenePowerPointFallback } from './renderers/renderThreeScenePowerPointFallback';
|
|
15
|
+
export { THREE_FALLBACK_OBJECT_RENDERERS, THREE_POWERPOINT_FALLBACK_OBJECT_RENDERERS, } from './renderers/threeFallbackRenderers';
|
|
16
|
+
export { inspectThreeModel, logThreeModelParts, type ThreeModelInspection, type ThreeModelMaterialInfo, type ThreeModelNodeInfo, } from './utils/inspectThreeModel';
|
|
17
|
+
export { installThreeSceneCaptureApi, type InstallThreeSceneCaptureApiOptions, type ThreeSceneCaptureOptions, } from './utils/installThreeSceneCaptureApi';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ThreeMesh } from './ThreeMesh';
|
|
2
|
+
import { ThreeObjectType } from './ThreeObjectType';
|
|
3
|
+
export interface ThreeBox extends ThreeMesh {
|
|
4
|
+
readonly objectType: typeof ThreeObjectType.BOX;
|
|
5
|
+
readonly width: number;
|
|
6
|
+
readonly height: number;
|
|
7
|
+
readonly depth: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function ThreeBox(props?: Partial<ThreeBox> | null): ThreeBox;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Color } from '../../types/Color';
|
|
2
|
+
import { SlideObject } from '../../types/SlideObject';
|
|
3
|
+
export interface ThreeMesh extends SlideObject {
|
|
4
|
+
readonly x: number;
|
|
5
|
+
readonly y: number;
|
|
6
|
+
readonly z: number;
|
|
7
|
+
readonly rotationX: number;
|
|
8
|
+
readonly rotationY: number;
|
|
9
|
+
readonly rotationZ: number;
|
|
10
|
+
readonly scale: number;
|
|
11
|
+
readonly scaleX: number;
|
|
12
|
+
readonly scaleY: number;
|
|
13
|
+
readonly scaleZ: number;
|
|
14
|
+
readonly color: Color;
|
|
15
|
+
readonly wireframe: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare const THREE_MESH_DEFAULTS: {
|
|
18
|
+
readonly x: 0;
|
|
19
|
+
readonly y: 0;
|
|
20
|
+
readonly z: 0;
|
|
21
|
+
readonly rotationX: 0;
|
|
22
|
+
readonly rotationY: 0;
|
|
23
|
+
readonly rotationZ: 0;
|
|
24
|
+
readonly scale: 1;
|
|
25
|
+
readonly scaleX: 1;
|
|
26
|
+
readonly scaleY: 1;
|
|
27
|
+
readonly scaleZ: 1;
|
|
28
|
+
readonly color: Color;
|
|
29
|
+
readonly wireframe: false;
|
|
30
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Color } from '../../types/Color';
|
|
2
|
+
import { ThreeMesh } from './ThreeMesh';
|
|
3
|
+
import { ThreeModelMaterial } from './ThreeModelMaterial';
|
|
4
|
+
import { ThreeModelNode } from './ThreeModelNode';
|
|
5
|
+
import { ThreeObjectType } from './ThreeObjectType';
|
|
6
|
+
export interface ThreeModel extends ThreeMesh {
|
|
7
|
+
readonly objectType: typeof ThreeObjectType.MODEL;
|
|
8
|
+
readonly src: string;
|
|
9
|
+
/** Overrides every material in the imported model. */
|
|
10
|
+
readonly materialColor: Color | null;
|
|
11
|
+
/** Animatable controls for named nodes inside the imported model. */
|
|
12
|
+
readonly nodes: ThreeModelNode[];
|
|
13
|
+
/** Animatable controls for named materials inside the imported model. */
|
|
14
|
+
readonly materials: ThreeModelMaterial[];
|
|
15
|
+
/** Logs available node and material names to the console once the model is loaded. */
|
|
16
|
+
readonly debugNames: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function ThreeModel(props?: Partial<ThreeModel> | null): ThreeModel;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Color } from '../../types/Color';
|
|
2
|
+
import { SlideObject } from '../../types/SlideObject';
|
|
3
|
+
import { ThreeModelTarget } from './ThreeModelTarget';
|
|
4
|
+
import { ThreeObjectType } from './ThreeObjectType';
|
|
5
|
+
export interface ThreeModelMaterial extends SlideObject, Omit<ThreeModelTarget, "path"> {
|
|
6
|
+
readonly objectType: typeof ThreeObjectType.MODEL_MATERIAL;
|
|
7
|
+
/** Overrides each matching material's color while preserving other material properties. */
|
|
8
|
+
readonly materialColor: Color | null;
|
|
9
|
+
readonly wireframe: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function ThreeModelMaterial(props?: Partial<ThreeModelMaterial> | null): ThreeModelMaterial;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Color } from '../../types/Color';
|
|
2
|
+
import { SlideObject } from '../../types/SlideObject';
|
|
3
|
+
import { ThreeModelTarget } from './ThreeModelTarget';
|
|
4
|
+
import { ThreeObjectType } from './ThreeObjectType';
|
|
5
|
+
export interface ThreeModelNode extends SlideObject, ThreeModelTarget {
|
|
6
|
+
readonly objectType: typeof ThreeObjectType.MODEL_NODE;
|
|
7
|
+
/** Position offsets added to the matched node's exported local transform. */
|
|
8
|
+
readonly x: number;
|
|
9
|
+
readonly y: number;
|
|
10
|
+
readonly z: number;
|
|
11
|
+
/** Rotation offsets, in degrees, added to the matched node's exported local rotation. */
|
|
12
|
+
readonly rotationX: number;
|
|
13
|
+
readonly rotationY: number;
|
|
14
|
+
readonly rotationZ: number;
|
|
15
|
+
/** Scale multipliers applied to the matched node's exported local scale. */
|
|
16
|
+
readonly scale: number;
|
|
17
|
+
readonly scaleX: number;
|
|
18
|
+
readonly scaleY: number;
|
|
19
|
+
readonly scaleZ: number;
|
|
20
|
+
/** Overrides descendant mesh materials under the matched node. */
|
|
21
|
+
readonly materialColor: Color | null;
|
|
22
|
+
readonly wireframe: boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare function ThreeModelNode(props?: Partial<ThreeModelNode> | null): ThreeModelNode;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type ThreeModelPath = string | readonly string[];
|
|
2
|
+
export interface ThreeModelTarget {
|
|
3
|
+
/** Match a Blender/glTF node or material by exported name. */
|
|
4
|
+
readonly name: string | null;
|
|
5
|
+
/** Match a node by a slash-delimited or array suffix through the model hierarchy. */
|
|
6
|
+
readonly path: ThreeModelPath | null;
|
|
7
|
+
/** Match a node or material by a custom Blender property exported to glTF extras. */
|
|
8
|
+
readonly presenterId: string | null;
|
|
9
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const ThreeObjectType: {
|
|
2
|
+
readonly BOX: "ThreeBox";
|
|
3
|
+
readonly MODEL: "ThreeModel";
|
|
4
|
+
readonly MODEL_MATERIAL: "ThreeModelMaterial";
|
|
5
|
+
readonly MODEL_NODE: "ThreeModelNode";
|
|
6
|
+
readonly PRESENTER_GROUP: "ThreePresenterGroup";
|
|
7
|
+
readonly SCENE: "ThreeScene";
|
|
8
|
+
readonly SPHERE: "ThreeSphere";
|
|
9
|
+
};
|
|
10
|
+
export type ThreeObjectType = (typeof ThreeObjectType)[keyof typeof ThreeObjectType];
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SlideObject } from '../../types/SlideObject';
|
|
2
|
+
import { ThreeMesh } from './ThreeMesh';
|
|
3
|
+
import { ThreeObjectType } from './ThreeObjectType';
|
|
4
|
+
export interface ThreePresenterGroup extends ThreeMesh {
|
|
5
|
+
readonly objectType: typeof ThreeObjectType.PRESENTER_GROUP;
|
|
6
|
+
readonly objects: SlideObject[];
|
|
7
|
+
readonly width: number;
|
|
8
|
+
readonly height: number;
|
|
9
|
+
readonly textureWidth: number | null;
|
|
10
|
+
readonly textureHeight: number | null;
|
|
11
|
+
readonly doubleSided: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function ThreePresenterGroup(objects: SlideObject[], props?: Partial<Omit<ThreePresenterGroup, "objects">> | null): ThreePresenterGroup;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Anchor } from '../../types/Anchor';
|
|
2
|
+
import { Color } from '../../types/Color';
|
|
3
|
+
import { SlideObject } from '../../types/SlideObject';
|
|
4
|
+
import { ThreeCameraType } from './ThreeCameraType';
|
|
5
|
+
import { ThreeMesh } from './ThreeMesh';
|
|
6
|
+
import { ThreeObjectType } from './ThreeObjectType';
|
|
7
|
+
export interface ThreeScene extends SlideObject {
|
|
8
|
+
readonly objectType: typeof ThreeObjectType.SCENE;
|
|
9
|
+
readonly anchor: Anchor;
|
|
10
|
+
readonly x: number;
|
|
11
|
+
readonly y: number;
|
|
12
|
+
readonly width: number;
|
|
13
|
+
readonly height: number;
|
|
14
|
+
readonly meshes: ThreeMesh[];
|
|
15
|
+
readonly fallbackImageId: string | null;
|
|
16
|
+
readonly fallbackImagePath: string | null;
|
|
17
|
+
readonly fallbackCornerRadius: number;
|
|
18
|
+
readonly fallbackSmooth: boolean;
|
|
19
|
+
readonly cameraType: ThreeCameraType;
|
|
20
|
+
readonly cameraX: number;
|
|
21
|
+
readonly cameraY: number;
|
|
22
|
+
readonly cameraZ: number;
|
|
23
|
+
readonly cameraFov: number;
|
|
24
|
+
readonly cameraOrthographicHeight: number | null;
|
|
25
|
+
readonly cameraNear: number;
|
|
26
|
+
readonly cameraFar: number;
|
|
27
|
+
readonly targetX: number;
|
|
28
|
+
readonly targetY: number;
|
|
29
|
+
readonly targetZ: number;
|
|
30
|
+
readonly backgroundColor: Color | null;
|
|
31
|
+
readonly ambientLightColor: Color;
|
|
32
|
+
readonly ambientLightIntensity: number;
|
|
33
|
+
readonly directionalLightColor: Color;
|
|
34
|
+
readonly directionalLightIntensity: number;
|
|
35
|
+
readonly directionalLightX: number;
|
|
36
|
+
readonly directionalLightY: number;
|
|
37
|
+
readonly directionalLightZ: number;
|
|
38
|
+
}
|
|
39
|
+
export declare function ThreeScene(meshes: ThreeMesh[], props?: Partial<Omit<ThreeScene, "meshes">> | null): ThreeScene;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ThreeMesh } from './ThreeMesh';
|
|
2
|
+
import { ThreeObjectType } from './ThreeObjectType';
|
|
3
|
+
export interface ThreeSphere extends ThreeMesh {
|
|
4
|
+
readonly objectType: typeof ThreeObjectType.SPHERE;
|
|
5
|
+
readonly radius: number;
|
|
6
|
+
readonly widthSegments: number;
|
|
7
|
+
readonly heightSegments: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function ThreeSphere(props?: Partial<ThreeSphere> | null): ThreeSphere;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { BrowserCanvasObjectRenderer } from '../../renderer/browser-canvas/types/BrowserCanvasObjectRenderer';
|
|
2
|
+
import { Presentation } from '../../types/Presentation';
|
|
3
|
+
import { SlideObject } from '../../types/SlideObject';
|
|
4
|
+
import { ThreeScene } from '../objects/ThreeScene';
|
|
5
|
+
export declare function getThreeObjectRenderers(presentation: Presentation): Promise<Record<string, BrowserCanvasObjectRenderer<SlideObject>>>;
|
|
6
|
+
export declare function getRenderedThreeSceneCanvas(scene: ThreeScene): HTMLCanvasElement | null;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { PowerPointObjectRenderer } from '../../export/powerpoint-renderer/types/PowerPointObjectRenderer';
|
|
2
|
+
import { BrowserCanvasObjectRenderer } from '../../renderer/browser-canvas/types/BrowserCanvasObjectRenderer';
|
|
3
|
+
import { SlideObject } from '../../types/SlideObject';
|
|
4
|
+
export declare const THREE_FALLBACK_OBJECT_RENDERERS: Record<string, BrowserCanvasObjectRenderer<SlideObject>>;
|
|
5
|
+
export declare const THREE_POWERPOINT_FALLBACK_OBJECT_RENDERERS: Record<string, PowerPointObjectRenderer<SlideObject>>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type * as Three from "three";
|
|
2
|
+
export interface GLTFLoaderLike {
|
|
3
|
+
load: (url: string, onLoad: (gltf: {
|
|
4
|
+
scene: Three.Object3D;
|
|
5
|
+
}) => void, onProgress?: ((event: ProgressEvent) => void) | undefined, onError?: ((error: unknown) => void) | undefined) => void;
|
|
6
|
+
}
|
|
7
|
+
export interface ThreeModules {
|
|
8
|
+
readonly THREE: typeof Three;
|
|
9
|
+
readonly GLTFLoader: new () => GLTFLoaderLike;
|
|
10
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ThreeModelInspection, ThreeModelMaterialInfo, ThreeModelNodeInfo } from './modelInspection';
|
|
2
|
+
export type { ThreeModelInspection, ThreeModelMaterialInfo, ThreeModelNodeInfo };
|
|
3
|
+
export declare function inspectThreeModel(src: string): Promise<ThreeModelInspection>;
|
|
4
|
+
export declare function logThreeModelParts(src: string): Promise<ThreeModelInspection>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ThreeScene } from '../objects/ThreeScene';
|
|
2
|
+
export interface ThreeSceneCaptureOptions {
|
|
3
|
+
readonly filename?: string;
|
|
4
|
+
readonly imageType?: string;
|
|
5
|
+
readonly quality?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface InstallThreeSceneCaptureApiOptions {
|
|
8
|
+
readonly scenes: Record<string, ThreeScene>;
|
|
9
|
+
}
|
|
10
|
+
declare global {
|
|
11
|
+
interface Window {
|
|
12
|
+
presenterCaptureThreeScene?: (sceneName: string, options?: ThreeSceneCaptureOptions) => string | null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Installs a small console helper for saving fallback images while tuning a live
|
|
17
|
+
* browser presentation. Register stable scene references in your app, view the
|
|
18
|
+
* desired build in the browser, then run `presenterCaptureThreeScene("name")`
|
|
19
|
+
* in DevTools to download the most recently rendered WebGL canvas for that scene.
|
|
20
|
+
*/
|
|
21
|
+
export declare function installThreeSceneCaptureApi({ scenes }: InstallThreeSceneCaptureApiOptions): void;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Object3D } from 'three';
|
|
2
|
+
import { Presentation } from '../../types/Presentation';
|
|
3
|
+
import { GLTFLoaderLike } from '../types/ThreeModules';
|
|
4
|
+
export declare function preloadThreeModels(loader: GLTFLoaderLike, presentation: Presentation): Promise<void>;
|
|
5
|
+
export declare function getLoadedModelScene(src: string): Object3D | null;
|
|
6
|
+
export declare function loadThreeModel(loader: GLTFLoaderLike, src: string): Promise<void>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type * as Three from "three";
|
|
2
|
+
export interface ThreeModelNodeInfo {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly path: readonly string[];
|
|
5
|
+
readonly pathString: string;
|
|
6
|
+
readonly type: string;
|
|
7
|
+
readonly isMesh: boolean;
|
|
8
|
+
readonly isBone: boolean;
|
|
9
|
+
readonly presenterId: string | null;
|
|
10
|
+
readonly materialNames: readonly string[];
|
|
11
|
+
}
|
|
12
|
+
export interface ThreeModelMaterialInfo {
|
|
13
|
+
readonly name: string;
|
|
14
|
+
readonly presenterId: string | null;
|
|
15
|
+
readonly meshPaths: readonly string[];
|
|
16
|
+
}
|
|
17
|
+
export interface ThreeModelInspection {
|
|
18
|
+
readonly src: string;
|
|
19
|
+
readonly nodes: readonly ThreeModelNodeInfo[];
|
|
20
|
+
readonly materials: readonly ThreeModelMaterialInfo[];
|
|
21
|
+
}
|
|
22
|
+
export declare function inspectThreeModelScene(src: string, scene: Three.Object3D): ThreeModelInspection;
|
|
23
|
+
export declare function logThreeModelInspection(inspection: ThreeModelInspection): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ThreeModelPath, ThreeModelTarget } from '../objects/ThreeModelTarget';
|
|
2
|
+
import type * as Three from "three";
|
|
3
|
+
export interface ObjectPath {
|
|
4
|
+
readonly object: Three.Object3D;
|
|
5
|
+
readonly path: readonly string[];
|
|
6
|
+
}
|
|
7
|
+
export declare function collectObjectPaths(root: Three.Object3D): ObjectPath[];
|
|
8
|
+
export declare function normalizeModelPath(path: ThreeModelPath): readonly string[];
|
|
9
|
+
export declare function modelPathToString(path: readonly string[]): string;
|
|
10
|
+
export declare function modelTargetToString(target: ThreeModelTarget | Omit<ThreeModelTarget, "path">): string;
|
|
11
|
+
export declare function objectPathMatches(path: readonly string[], targetPath: ThreeModelPath): boolean;
|
|
12
|
+
export declare function getPresenterId(object: {
|
|
13
|
+
userData?: Record<string, unknown>;
|
|
14
|
+
}): string | null;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/3d.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(function(s,I){typeof exports=="object"&&typeof module<"u"?I(exports):typeof define=="function"&&define.amd?define(["exports"],I):(s=typeof globalThis<"u"?globalThis:s||self,I(s.Presenter3D={}))})(this,(function(s){"use strict";const I={IMAGE:"Image",SLIDE_OBJECT:"SlideObject"};function T(e){return{description:null,objectType:I.SLIDE_OBJECT,opacity:1,...e}}function h(e,t=0,r=0,n=1){if(typeof e=="string"){const a=e.replace("#",""),o=parseInt(a,16);return isNaN(o)?(console.warn("Invalid hex color format:",e),Y):a.length===6?{red:o>>16&255,green:o>>8&255,blue:o&255,alpha:1}:a.length===8?{red:o>>24&255,green:o>>16&255,blue:o>>8&255,alpha:(o&255)/255}:(console.warn("Invalid hex color format:",e),Y)}else if(typeof e=="number")return{red:e,green:t??0,blue:r??0,alpha:n??1};return{red:0,green:0,blue:0,alpha:1,...e}}h.BLACK=h(0,0,0),h.BLUE=h(0,0,255),h.GREEN=h(0,255,0),h.RED=h(255,0,0),h.TRANSPARENT=h(0,0,0,0),h.WHITE=h(255,255,255);const Y={red:0,green:0,blue:0,alpha:1},d={x:0,y:0,z:0,rotationX:0,rotationY:0,rotationZ:0,scale:1,scaleX:1,scaleY:1,scaleZ:1,color:h.WHITE,wireframe:!1},u={BOX:"ThreeBox",MODEL:"ThreeModel",MODEL_MATERIAL:"ThreeModelMaterial",MODEL_NODE:"ThreeModelNode",PRESENTER_GROUP:"ThreePresenterGroup",SCENE:"ThreeScene",SPHERE:"ThreeSphere"};function he(e=null){return T({objectType:u.BOX,...d,width:1,height:1,depth:1,...e})}const E={ORTHOGRAPHIC:"Orthographic",PERSPECTIVE:"Perspective"};function de(e=null){return T({objectType:u.MODEL,...d,src:"",materialColor:null,nodes:[],materials:[],debugNames:!1,...e})}function fe(e=null){return T({objectType:u.MODEL_MATERIAL,name:null,presenterId:null,materialColor:null,wireframe:!1,...e})}function pe(e=null){return T({objectType:u.MODEL_NODE,name:null,path:null,presenterId:null,x:d.x,y:d.y,z:d.z,rotationX:d.rotationX,rotationY:d.rotationY,rotationZ:d.rotationZ,scale:d.scale,scaleX:d.scaleX,scaleY:d.scaleY,scaleZ:d.scaleZ,materialColor:null,wireframe:d.wireframe,...e})}function me(e,t=null){return T({objectType:u.PRESENTER_GROUP,...d,objects:e,width:1,height:1,textureWidth:null,textureHeight:null,doubleSided:!0,...t})}const g={TOP_LEFT:"TopLeft",TOP:"Top",TOP_RIGHT:"TopRight",LEFT:"Left",CENTER:"Center",RIGHT:"Right",BOTTOM_LEFT:"BottomLeft",BOTTOM:"Bottom",BOTTOM_RIGHT:"BottomRight"},Z=g.TOP_LEFT;function ge(e,t=null){return T({objectType:u.SCENE,anchor:Z,x:0,y:0,width:100,height:100,meshes:e,fallbackImageId:null,fallbackImagePath:null,fallbackCornerRadius:0,fallbackSmooth:!0,cameraType:E.PERSPECTIVE,cameraX:0,cameraY:0,cameraZ:5,cameraFov:50,cameraOrthographicHeight:null,cameraNear:.1,cameraFar:2e3,targetX:0,targetY:0,targetZ:0,backgroundColor:null,ambientLightColor:h.WHITE,ambientLightIntensity:1,directionalLightColor:h.WHITE,directionalLightIntensity:2,directionalLightX:3,directionalLightY:4,directionalLightZ:5,...t})}function ye(e=null){return T({objectType:u.SPHERE,...d,radius:1,widthSegments:32,heightSegments:16,...e})}const S={Browser:"browser",Node:"node"};function p(e=null){return{x:0,y:0,...e}}const Te=p();function L(e=null){return{height:0,width:0,...e}}const we=L({width:0,height:0});function C(e,t=null){return e.alpha*(t??1)}function y(e=null){return{origin:Te,size:we,...e}}y();function D(e,t){throw new Error("Unexpected value: "+e)}function k(e,t,r){const{x:n,y:a}=e,{width:o,height:i}=r;switch(t){case g.TOP_LEFT:return y({origin:p({x:n,y:a}),size:r});case g.TOP:return y({origin:p({x:n-o/2,y:a}),size:r});case g.TOP_RIGHT:return y({origin:p({x:n-o,y:a}),size:r});case g.LEFT:return y({origin:p({x:n,y:a-i/2}),size:r});case g.CENTER:return y({origin:p({x:n-o/2,y:a-i/2}),size:r});case g.RIGHT:return y({origin:p({x:n-o,y:a-i/2}),size:r});case g.BOTTOM_LEFT:return y({origin:p({x:n,y:a-i}),size:r});case g.BOTTOM:return y({origin:p({x:n-o/2,y:a-i}),size:r});case g.BOTTOM_RIGHT:return y({origin:p({x:n-o,y:a-i}),size:r});default:D(t)}}function P(e){return(e.red<<16)+(e.green<<8)+e.blue}async function H(){try{const[e,t]=await Promise.all([import("three"),import("three/examples/jsm/loaders/GLTFLoader.js")]);return{THREE:e,GLTFLoader:t.GLTFLoader}}catch(e){throw new Error('Presenter 3D rendering requires the "three" package. Install it with: npm install three',{cause:e})}}function Me(e){const t=[],r=e;for(const n of["objects","meshes","nodes","materials"]){const a=r[n];Array.isArray(a)&&t.push(...Ie(a))}return t}function Ie(e){return e.filter(t=>typeof t=="object"&&t!==null&&"objectType"in t)}function U(e){const t=[];function r(n,a){const o=n===e&&n.name===""?a:[...a,n.name];(n!==e||n.name!=="")&&t.push({object:n,path:o});for(const i of n.children)r(i,o)}return r(e,[]),t}function W(e){return typeof e=="string"?e.split("/").filter(t=>t!==""):e}function F(e){return e.join("/")}function Ee(e){return"path"in e&&e.path!==null?`path "${F(W(e.path))}"`:e.presenterId!==null?`presenterId "${e.presenterId}"`:e.name!==null?`name "${e.name}"`:"empty target"}function Se(e,t){const r=W(t);if(r.length>e.length)return!1;const n=e.length-r.length;return r.every((a,o)=>e[n+o]===a)}function B(e){var r,n;const t=((r=e.userData)==null?void 0:r.presenterId)??((n=e.userData)==null?void 0:n.presenterID);return typeof t=="string"?t:null}function K(e,t){const r=new Map,n=U(t).map(({object:a,path:o})=>{const i=V(a)?Array.isArray(a.material)?a.material:[a.material]:[],c=i.map(l=>l.name);for(const l of i){const f=r.get(l),m=F(o);f===void 0?r.set(l,{name:l.name,presenterId:B(l),meshPaths:[m]}):r.set(l,{...f,meshPaths:[...f.meshPaths,m]})}return{name:a.name,path:o,pathString:F(o),type:a.type,isMesh:V(a),isBone:Pe(a),presenterId:B(a),materialNames:c}});return{src:e,nodes:n,materials:[...r.values()]}}function J(e){var n;const t=`ThreeModel ${e.src}`;(console.groupCollapsed??console.group).call(console,t),console.table(e.nodes.map(a=>({path:a.pathString,name:a.name,type:a.type,presenterId:a.presenterId,materials:a.materialNames.join(", ")}))),console.table(e.materials.map(a=>({name:a.name,presenterId:a.presenterId,meshes:a.meshPaths.join(", ")}))),(n=console.groupEnd)==null||n.call(console)}function V(e){return"isMesh"in e&&e.isMesh===!0}function Pe(e){return"isBone"in e&&e.isBone===!0}const x=new Map,q=new Set;async function Ce(e,t){const r=new Map;for(const n of t.slides)for(const a of n.objects)Q(a,r);await Promise.all([...r.values()].map(async n=>{try{await z(e,n.src),n.debugNames&&xe(n.src)}catch(a){throw new Error(`Failed to load 3D model: ${n.src}`,{cause:a})}}))}function _(e){const t=x.get(e);return(t==null?void 0:t.status)==="loaded"?t.scene:null}function z(e,t){return Le(e,t)}function Q(e,t){if(e.objectType===u.MODEL){const r=e;if(r.src!==""){const n=t.get(r.src);t.set(r.src,{src:r.src,debugNames:r.debugNames||(n==null?void 0:n.debugNames)===!0})}}for(const r of Me(e))Q(r,t)}function xe(e){if(q.has(e))return;const t=_(e);t!==null&&(q.add(e),J(K(e,t)))}function Le(e,t){const r=x.get(t);if((r==null?void 0:r.status)==="loaded")return Promise.resolve();if((r==null?void 0:r.status)==="loading")return r.promise;const n=new Promise((a,o)=>{e.load(t,i=>{x.set(t,{status:"loaded",scene:i.scene}),a()},void 0,i=>{x.delete(t),o(i)})});return x.set(t,{status:"loading",promise:n}),n}const b=new WeakMap,j=new Set;async function Be(e){const t=await H(),r=new t.GLTFLoader;return await Ce(r,e),{[u.SCENE]:Re(t)}}function ee(e){var t;return((t=b.get(e))==null?void 0:t.renderer.domElement)??null}function Re({THREE:e}){return t=>{const{ctx:r,object:n,opacity:a,originalObject:o,getCurrentObject:i}=t;if(r.type!==S.Browser)return;const c=a*n.opacity;if(c===0||n.width<=0||n.height<=0)return;const l=ve(e,n,o);l.renderer.setPixelRatio(window.devicePixelRatio||1),l.renderer.setSize(n.width,n.height,!1),De(l.scene),Ae(e,l,n);const f=o.objectType===u.SCENE?o:n;for(const O of f.meshes){const A=i(O);if(A===void 0||A.opacity===0)continue;const X=ke(e,A,O,t);X!==null&&(Ve(X,A),l.scene.add(X))}Ne(e,l,n),l.camera.position.set(n.cameraX,n.cameraY,n.cameraZ),l.target.set(n.targetX,n.targetY,n.targetZ),l.camera.lookAt(l.target),l.camera.updateProjectionMatrix(),l.renderer.render(l.scene,l.camera);const m=k(p({x:n.x,y:n.y}),n.anchor,L({width:n.width,height:n.height}));r.context.save(),r.context.globalAlpha=c,r.context.drawImage(l.renderer.domElement,m.origin.x,m.origin.y,m.size.width,m.size.height),r.context.restore()}}function ve(e,t,r){const n=r.objectType===u.SCENE?r:t,a=b.get(n);if(a!==void 0)return a;const o=document.createElement("canvas"),c={renderer:new e.WebGLRenderer({alpha:!0,antialias:!0,canvas:o,preserveDrawingBuffer:!0}),scene:new e.Scene,camera:te(e,t),cameraType:t.cameraType,target:new e.Vector3};return b.set(n,c),c}function Ne(e,t,r){switch(t.cameraType!==r.cameraType&&(t.camera=te(e,r),t.cameraType=r.cameraType),r.cameraType){case E.PERSPECTIVE:{const n=t.camera;n.aspect=r.width/r.height,n.fov=r.cameraFov,n.near=r.cameraNear,n.far=r.cameraFar;break}case E.ORTHOGRAPHIC:{const n=t.camera,a=re(r),o=a*(r.width/r.height);n.left=-o/2,n.right=o/2,n.top=a/2,n.bottom=-a/2,n.near=r.cameraNear,n.far=r.cameraFar;break}}}function te(e,t){switch(t.cameraType){case E.PERSPECTIVE:return new e.PerspectiveCamera(t.cameraFov,t.width/t.height,t.cameraNear,t.cameraFar);case E.ORTHOGRAPHIC:return Oe(e,t)}}function Oe(e,t){const r=re(t),n=r*(t.width/t.height);return new e.OrthographicCamera(-n/2,n/2,r/2,-r/2,t.cameraNear,t.cameraFar)}function re(e){if(e.cameraOrthographicHeight!==null&&e.cameraOrthographicHeight>0)return e.cameraOrthographicHeight;const t=Math.hypot(e.cameraX-e.targetX,e.cameraY-e.targetY,e.cameraZ-e.targetZ);return t===0?e.height:2*t*Math.tan(w(e.cameraFov)/2)}function Ae(e,t,r){r.backgroundColor===null?t.renderer.setClearColor(0,0):t.renderer.setClearColor(P(r.backgroundColor),C(r.backgroundColor));const n=new e.AmbientLight(P(r.ambientLightColor),r.ambientLightIntensity);t.scene.add(n);const a=new e.DirectionalLight(P(r.directionalLightColor),r.directionalLightIntensity);a.position.set(r.directionalLightX,r.directionalLightY,r.directionalLightZ),t.scene.add(a)}function De(e){for(;e.children.length>0;){const t=e.children[0];t!==void 0&&(qe(t),e.remove(t))}}function ke(e,t,r,n){switch(t.objectType){case u.BOX:return Fe(e,t);case u.SPHERE:return _e(e,t);case u.MODEL:return Ge(e,t,r,n.getCurrentObject);case u.PRESENTER_GROUP:return be(e,t,n);default:return null}}function Fe(e,t){const r=new e.BoxGeometry(t.width,t.height,t.depth);return M(r),new e.Mesh(r,ne(e,t))}function _e(e,t){const r=new e.SphereGeometry(t.radius,t.widthSegments,t.heightSegments);return M(r),new e.Mesh(r,ne(e,t))}function be(e,t,r){const n=t.textureWidth??r.slideSize.width,a=t.textureHeight??r.slideSize.height;if(t.width<=0||t.height<=0||n<=0||a<=0)return null;const o=document.createElement("canvas");o.width=Math.ceil(n),o.height=Math.ceil(a);const i=o.getContext("2d");if(i===null)return null;i.clearRect(0,0,o.width,o.height);const c={type:S.Browser,context:i};for(const O of t.objects)r.renderObject(O,1,c);const l=new e.CanvasTexture(o);l.colorSpace=e.SRGBColorSpace,M(l);const f=new e.PlaneGeometry(t.width,t.height);M(f);const m=new e.MeshBasicMaterial({color:P(t.color),map:l,opacity:t.opacity*C(t.color),side:t.doubleSided?e.DoubleSide:e.FrontSide,transparent:!0,wireframe:t.wireframe});return M(m),new e.Mesh(f,m)}function Ge(e,t,r,n){if(t.src==="")return null;const a=_(t.src);if(a===null)return console.warn(`3D model was not preloaded: ${t.src}`),null;const o=a.clone(!0);return $e(o,t),Xe(o,t,r,n),Ye(o,t,r,n),o}function ne(e,t){const r=new e.MeshStandardMaterial({color:P(t.color),opacity:t.opacity*C(t.color),transparent:t.opacity<1||C(t.color)<1,wireframe:t.wireframe});return M(r),r}function $e(e,t){$(t)&&e.traverse(r=>{R(r)&&G(r,t,()=>!0)})}function Xe(e,t,r,n){for(const a of r.materials){const o=n(a)??a;if(!$(o))continue;let i=0;e.traverse(c=>{R(c)&&G(c,o,l=>{const f=We(l,o);return f&&i++,f})}),ae(t.src,"material",o,i)}}function Ye(e,t,r,n){const a=U(e);for(const o of r.nodes){const i=n(o)??o,c=a.filter(l=>Ue(l,i));ae(t.src,"node",i,c.length);for(const l of c)Ze(l.object,i),$(i)&&He(l.object,i)}}function Ze(e,t){e.position.set(e.position.x+t.x,e.position.y+t.y,e.position.z+t.z),e.rotation.set(e.rotation.x+w(t.rotationX),e.rotation.y+w(t.rotationY),e.rotation.z+w(t.rotationZ)),e.scale.set(e.scale.x*t.scale*t.scaleX,e.scale.y*t.scale*t.scaleY,e.scale.z*t.scale*t.scaleZ)}function He(e,t){e.traverse(r=>{R(r)&&G(r,t,()=>!0)})}function Ue(e,t){return t.path!==null?Se(e.path,t.path):t.presenterId!==null?B(e.object)===t.presenterId:t.name!==null?e.object.name===t.name:!1}function We(e,t){return t.presenterId!==null?B(e)===t.presenterId:t.name!==null?e.name===t.name:!1}function ae(e,t,r,n){if(n===1||t==="material"&&n>1)return;const a=Ee(r),o=`${e}:${t}:${a}:${n}`;if(j.has(o))return;j.add(o);const i=n===0?`ThreeModel ${e} did not find ${t} target ${a}.`:`ThreeModel ${e} found ${n} ${t} targets for ${a}. Use a path or presenterId to make the target unique.`;console.warn(i)}function G(e,t,r){const n=Array.isArray(e.material)?e.material:[e.material];let a=!1;const o=n.map(i=>{if(!r(i))return i;a=!0;const c=Ke(i);return Je(c,t),c});if(a)if(Array.isArray(e.material))e.material=o;else{const i=o[0];i!==void 0&&(e.material=i)}}function Ke(e){if(v(e))return e;const t=e.clone();return M(t),t}function Je(e,t){t.materialColor!==null&&e.color!==void 0&&e.color.setHex(P(t.materialColor));const r=e.opacity*t.opacity*(t.materialColor!==null?C(t.materialColor):1);r!==e.opacity&&(e.opacity=r,e.transparent=!0),t.wireframe&&(e.wireframe=!0)}function $(e){return e.materialColor!==null||e.opacity!==1||e.wireframe}function Ve(e,t){e.position.set(t.x,t.y,t.z),e.rotation.set(w(t.rotationX),w(t.rotationY),w(t.rotationZ)),e.scale.set(t.scale*t.scaleX,t.scale*t.scaleY,t.scale*t.scaleZ)}function w(e){return e*Math.PI/180}function qe(e){e.traverse(t=>{if(!R(t))return;v(t.geometry)&&t.geometry.dispose();const r=Array.isArray(t.material)?t.material:[t.material];for(const n of r)ze(n),v(n)&&n.dispose()})}function R(e){return"isMesh"in e&&e.isMesh===!0}function ze(e){const t=e;t.map!==void 0&&t.map!==null&&v(t.map)&&t.map.dispose()}function M(e){e.userData.presenterRendererOwned=!0}function v(e){var t;return((t=e.userData)==null?void 0:t.presenterRendererOwned)===!0}function oe(e=null){return T({objectType:I.IMAGE,anchor:Z,cornerRadius:0,height:100,imageId:null,imagePath:null,smooth:!0,width:100,x:0,y:0,...e})}function Qe(e,t,r,n,a=0){const o=n();o.path.moveTo(e.x+r,e.y),o.path.lineTo(e.x+t.width-r,e.y),o.path.arcTo(e.x+t.width,e.y,e.x+t.width,e.y+r,r),o.path.lineTo(e.x+t.width,e.y+t.height-r),o.path.arcTo(e.x+t.width,e.y+t.height,e.x+t.width-r,e.y+t.height,r),o.path.lineTo(e.x+r,e.y+t.height),o.path.arcTo(e.x,e.y+t.height,e.x,e.y+t.height-r,r),o.path.lineTo(e.x,e.y+r),o.path.arcTo(e.x,e.y,e.x+r,e.y,r),a>0&&o.path.lineTo(e.x+r+a,e.y);const i=2*(t.width+t.height-4*r)+2*Math.PI*r+a;return{path:o,length:i}}const ie={Browser:"browser",Node:"node"},le={Browser:"browser",Node:"node"},je=({ctx:e,imageById:t,object:r,opacity:n,createPath2D:a})=>{const o=k(p({x:r.x,y:r.y}),r.anchor,L({width:r.width,height:r.height})),i=r.imageId!=null&&r.imageId.length>0?r.imageId:r.imagePath;if(i==null)return;const c=t[i];if(c!==void 0){if(e.context.save(),r.cornerRadius>0){const l=Qe(o.origin,o.size,r.cornerRadius,a);switch(e.type){case S.Browser:l.path.type===le.Browser?e.context.clip(l.path.path):console.warn("Attempted to use Node Path2D in Browser Canvas context");break;case S.Node:l.path.type===le.Node?e.context.clip(l.path.path):console.warn("Attempted to use Browser Path2D in Node Canvas context");break;default:D(e)}}switch(e.context.globalAlpha=n*r.opacity,e.context.imageSmoothingEnabled=r.smooth,e.type){case S.Browser:c.type===ie.Browser?e.context.drawImage(c.image,o.origin.x,o.origin.y,o.size.width,o.size.height):console.warn("Attempted to use Node Image in Browser Canvas context");break;case S.Node:c.type===ie.Node?e.context.drawImage(c.image,o.origin.x,o.origin.y,o.size.width,o.size.height):console.warn("Attempted to use Browser Image in Node Canvas context");break;default:D(e)}e.context.restore()}},ce=e=>{const{object:t}=e;t.fallbackImageId==null&&t.fallbackImagePath==null||je({...e,object:oe({anchor:t.anchor,cornerRadius:t.fallbackCornerRadius,description:t.description,height:t.height,imageId:t.fallbackImageId,imagePath:t.fallbackImagePath,opacity:t.opacity,smooth:t.fallbackSmooth,width:t.width,x:t.x,y:t.y})})};function et(e,t,r,n){return k({x:e.x*n.scale+n.translateX,y:e.y*n.scale+n.translateY},t,{width:r.width*n.scale,height:r.height*n.scale})}function N(e,t){return e/t}const tt=({imagePathById:e,slide:t,object:r,opacity:n,pixelsPerInch:a,transform:o})=>{const i=r.opacity*n;if(i===0)return;const c=r.imageId!=null&&r.imageId.length>0?r.imageId:r.imagePath;if(c==null)return;const l=e[c];if(l===void 0)return;const{origin:f,size:m}=et(p({x:r.x,y:r.y}),r.anchor,L({width:r.width,height:r.height}),o);t.addImage({path:l,x:N(f.x,a),y:N(f.y,a),w:N(m.width,a),h:N(m.height,a),transparency:(1-i)*100})},se=e=>{const{object:t}=e;t.fallbackImageId==null&&t.fallbackImagePath==null||tt({...e,object:oe({anchor:t.anchor,cornerRadius:t.fallbackCornerRadius,description:t.description,height:t.height,imageId:t.fallbackImageId,imagePath:t.fallbackImagePath,opacity:t.opacity,smooth:t.fallbackSmooth,width:t.width,x:t.x,y:t.y})})},rt={[u.SCENE]:ce},nt={[u.SCENE]:se};async function ue(e){const t=await H(),r=new t.GLTFLoader;await z(r,e);const n=_(e);if(n===null)throw new Error(`3D model was not loaded: ${e}`);return K(e,n)}async function at(e){const t=await ue(e);return J(t),t}function ot({scenes:e}){typeof window>"u"||(window.presenterCaptureThreeScene=(t,r={})=>{const n=e[t];if(n===void 0)return console.warn(`No Presenter 3D scene registered with name "${t}".`),null;const a=ee(n);if(a===null)return console.warn(`Presenter 3D scene "${t}" has not been rendered yet.`),null;const o=r.imageType??"image/png",i=a.toDataURL(o,r.quality),c=document.createElement("a");return c.href=i,c.download=r.filename??`${t}.${it(o)}`,c.click(),null})}function it(e){switch(e){case"image/jpeg":return"jpg";case"image/webp":return"webp";default:return"png"}}s.THREE_FALLBACK_OBJECT_RENDERERS=rt,s.THREE_POWERPOINT_FALLBACK_OBJECT_RENDERERS=nt,s.ThreeBox=he,s.ThreeCameraType=E,s.ThreeModel=de,s.ThreeModelMaterial=fe,s.ThreeModelNode=pe,s.ThreeObjectType=u,s.ThreePresenterGroup=me,s.ThreeScene=ge,s.ThreeSphere=ye,s.getRenderedThreeSceneCanvas=ee,s.getThreeObjectRenderers=Be,s.inspectThreeModel=ue,s.installThreeSceneCaptureApi=ot,s.logThreeModelParts=at,s.renderThreeSceneFallback=ce,s.renderThreeScenePowerPointFallback=se,Object.defineProperty(s,Symbol.toStringTag,{value:"Module"})}));
|
|
2
|
+
//# sourceMappingURL=3d.js.map
|