@sliiu/present-three-bake 0.0.0-stage → 0.1.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.
Files changed (42) hide show
  1. package/COPYRIGHT +5 -0
  2. package/LICENSE +661 -0
  3. package/THIRD-PARTY-NOTICES.md +221 -0
  4. package/dist/cjs/bake-sp3d.js +176 -0
  5. package/dist/cjs/camera.js +94 -0
  6. package/dist/cjs/index.js +47 -0
  7. package/dist/cjs/light-rig.js +162 -0
  8. package/dist/cjs/material.js +136 -0
  9. package/dist/cjs/package.json +1 -0
  10. package/dist/cjs/path-to-shape.js +331 -0
  11. package/dist/cjs/presets.js +112 -0
  12. package/dist/cjs/resolve.js +98 -0
  13. package/dist/cjs/runtime.js +146 -0
  14. package/dist/cjs/scene-builder.js +329 -0
  15. package/dist/cjs/shape-path.js +71 -0
  16. package/dist/cjs/types.js +2 -0
  17. package/dist/esm/bake-sp3d.js +140 -0
  18. package/dist/esm/camera.js +58 -0
  19. package/dist/esm/index.js +9 -0
  20. package/dist/esm/light-rig.js +126 -0
  21. package/dist/esm/material.js +98 -0
  22. package/dist/esm/path-to-shape.js +295 -0
  23. package/dist/esm/presets.js +109 -0
  24. package/dist/esm/resolve.js +91 -0
  25. package/dist/esm/runtime.js +141 -0
  26. package/dist/esm/scene-builder.js +290 -0
  27. package/dist/esm/shape-path.js +64 -0
  28. package/dist/esm/types.js +1 -0
  29. package/dist/types/bake-sp3d.d.ts +2 -0
  30. package/dist/types/camera.d.ts +7 -0
  31. package/dist/types/index.d.ts +8 -0
  32. package/dist/types/light-rig.d.ts +10 -0
  33. package/dist/types/material.d.ts +17 -0
  34. package/dist/types/path-to-shape.d.ts +11 -0
  35. package/dist/types/presets.d.ts +23 -0
  36. package/dist/types/resolve.d.ts +67 -0
  37. package/dist/types/runtime.d.ts +22 -0
  38. package/dist/types/scene-builder.d.ts +35 -0
  39. package/dist/types/shape-path.d.ts +15 -0
  40. package/dist/types/types.d.ts +1 -0
  41. package/package.json +30 -4
  42. package/README.md +0 -3
@@ -0,0 +1,23 @@
1
+ export interface CameraPreset {
2
+ /** 纬度(俯仰),度。负值=相机在物体上方俯视("Above" 类语义)。 */
3
+ lat: number;
4
+ /** 经度(偏航),度。 */
5
+ lon: number;
6
+ /** 自转,度。 */
7
+ rev: number;
8
+ /** 视场角,度。<1 视为正交投影。 */
9
+ fov: number;
10
+ }
11
+ export declare const CAMERA_PRESETS: Record<string, CameraPreset>;
12
+ export declare const FOV_LOCKED_PRESETS: Set<string>;
13
+ /**
14
+ * ECMA-376 §20.1.5.4:`<a:bevelT/>` / `<a:bevelB/>` 缺省 w/h = 76200 EMU。
15
+ * 76200 ÷ 9525 EMU/px = 8 px。parser 把缺省留 undefined,这里补默认。
16
+ */
17
+ export declare const DEFAULT_BEVEL_PX = 8;
18
+ /** ECMA-376 §20.1.5.12 sp3d/@prstMaterial 默认 = warmMatte。 */
19
+ export declare const DEFAULT_MATERIAL = "warmMatte";
20
+ /** ECMA-376 §20.1.5.9 lightRig 缺省(无 scene3d 时)我们用 threePt 兜底。 */
21
+ export declare const DEFAULT_LIGHT_RIG = "threePt";
22
+ /** PerspectiveCamera 缺省 fov(无 preset 也无显式 fov 时)。 */
23
+ export declare const DEFAULT_FOV = 35;
@@ -0,0 +1,67 @@
1
+ import type { Backdrop3D, Camera3D, LightRig3D, Sp3DInfo, Sp3DParams } from "@sliiu/present-core";
2
+ export interface ResolvedCamera {
3
+ lat: number;
4
+ lon: number;
5
+ rev: number;
6
+ /** 度;<1 视为正交。 */
7
+ fov: number;
8
+ isOrtho: boolean;
9
+ /** 倍率(1 = 100%),undefined = 不缩放。 */
10
+ zoom?: number;
11
+ }
12
+ export interface ResolvedBevel {
13
+ /** px,已补默认。 */
14
+ w: number;
15
+ h: number;
16
+ }
17
+ export interface ResolvedSp3D {
18
+ /** px,原始 extrusionH(缺省 0)。 */
19
+ extrusionH: number;
20
+ contourW?: number;
21
+ contourClr?: string;
22
+ extrusionClr?: string;
23
+ /** 已补默认(warmMatte)。 */
24
+ prstMaterial: string;
25
+ /** 仅当 XML 写了 `<a:bevelT>` 才有;w/h 已补默认。 */
26
+ bevelT?: ResolvedBevel;
27
+ bevelB?: ResolvedBevel;
28
+ /** bevelT/bevelB 任一存在(即声明了倒角)。 */
29
+ hasBevel: boolean;
30
+ }
31
+ export interface ResolvedLightRig {
32
+ /** 已补默认(threePt)。 */
33
+ rig: string;
34
+ dir?: string;
35
+ }
36
+ export interface ResolvedScene3D {
37
+ camera: ResolvedCamera;
38
+ sp3d: ResolvedSp3D;
39
+ lightRig: ResolvedLightRig;
40
+ /** undefined = OOXML 未写或 identity(+Z / +Y),相机保持 preset 朝向。 */
41
+ backdrop?: ResolvedBackdrop;
42
+ }
43
+ export interface ResolvedBackdrop {
44
+ target: {
45
+ x: number;
46
+ y: number;
47
+ z: number;
48
+ };
49
+ /** 单位法向;identity (+Z) 时省略。 */
50
+ forward?: {
51
+ x: number;
52
+ y: number;
53
+ z: number;
54
+ };
55
+ /** 单位 up;identity (+Y) / 零向量时省略。 */
56
+ up?: {
57
+ x: number;
58
+ y: number;
59
+ z: number;
60
+ };
61
+ }
62
+ export declare function resolveCamera(cam: Camera3D | undefined): ResolvedCamera;
63
+ export declare function resolveSp3D(sp3d: Sp3DParams | undefined): ResolvedSp3D;
64
+ export declare function resolveLightRig(lr: LightRig3D | undefined): ResolvedLightRig;
65
+ /** identity / 全 0 → undefined,setupCamera 保持 preset 朝向。 */
66
+ export declare function resolveBackdrop(bd: Backdrop3D | undefined): ResolvedBackdrop | undefined;
67
+ export declare function resolveScene3D(info: Sp3DInfo): ResolvedScene3D;
@@ -0,0 +1,22 @@
1
+ import type { Shape, Slide, Sp3DInfo } from "@sliiu/present-core";
2
+ import type { Shape3DResult } from "./types.js";
3
+ /**
4
+ * 该 3D 信息是否需要 3D 渲染(实时 or 烘焙)。parser 现在对 `<a:bevelT/>` 留空 w/h,
5
+ * 所以用「是否声明了 bevel 元素」判断,而非 h>0。
6
+ */
7
+ export declare function needs3DRender(meta: Sp3DInfo | undefined): boolean;
8
+ export declare function needs3DBake(s: Shape): boolean;
9
+ export interface Bake3DRuntime {
10
+ /**
11
+ * 扫描 slide,找出需要烘焙的 3D shape 异步烘焙。同一 shape.id 不会重复。
12
+ * `applyBaked` 在烘焙完成时被调用,由调用方负责把结果写入副通道并按需触发 redraw。
13
+ */
14
+ kick(slide: Slide, applyBaked: (s: Shape, result: Shape3DResult) => void, opts?: {
15
+ frontImageSrc?: (s: Shape) => string | undefined;
16
+ }): void;
17
+ /** 等待所有 pending 烘焙完成(截图前调)。 */
18
+ waitForAll(): Promise<void>;
19
+ /** 标记 shape.id 已处理过(跨重建避免重复)。 */
20
+ markBaked(id: string): void;
21
+ }
22
+ export declare function createBake3DRuntime(): Bake3DRuntime;
@@ -0,0 +1,35 @@
1
+ import * as THREE from "three";
2
+ import type { Paint, Stroke } from "@sliiu/present-core";
3
+ import type { ResolvedBackdrop, ResolvedCamera, ResolvedScene3D } from "./resolve.js";
4
+ export interface BuildSceneInputs {
5
+ /** 几何基准尺寸(px)= shape bbox。 */
6
+ baseW: number;
7
+ baseH: number;
8
+ pathD?: string;
9
+ fill?: Paint;
10
+ stroke?: Stroke;
11
+ resolved: ResolvedScene3D;
12
+ /** image shape 的正面贴图(已加载 + 已按 cropRect 裁 UV)。 */
13
+ texture?: THREE.Texture | null;
14
+ /** 是否 image shape(决定 slab 几何 + 贴图保色路径)。 */
15
+ isImage: boolean;
16
+ }
17
+ export interface BuiltScene {
18
+ scene: THREE.Scene;
19
+ /** 几何在世界坐标的宽/高(用于相机 fit)。 */
20
+ geoW: number;
21
+ geoH: number;
22
+ dispose(): void;
23
+ }
24
+ export declare function buildThreeScene(inputs: BuildSceneInputs): BuiltScene;
25
+ /**
26
+ * 把相机摆到「物体在 viewW×viewH 视口里接近 1:1(含 pad 余量)」的距离并构建 THREE 相机。
27
+ * offscreen 与 live 共用:offscreen 传 padded canvas 尺寸;live 传显示像素尺寸。
28
+ */
29
+ export declare function createSceneCamera(cam: ResolvedCamera, geoW: number, geoH: number, viewW: number, viewH: number, pad: number, backdrop?: ResolvedBackdrop): THREE.Camera;
30
+ /**
31
+ * 若 src 对应图片此前已被 loadImageTexture 解码过,则同步返回一个新 Texture;否则
32
+ * 返回 null(调用方需走异步 loadImageTexture)。用于热路径(拖动重建)下零延迟首渲。
33
+ */
34
+ export declare function getCachedImageTexture(src: string): THREE.Texture | null;
35
+ export declare function loadImageTexture(src: string): Promise<THREE.Texture | null>;
@@ -0,0 +1,15 @@
1
+ import type { Shape, Sp3DInfo } from "@sliiu/present-core";
2
+ /** 与 bake-sp3d 的 image pad 一致:贴图几何收在 bbox 内。 */
3
+ export declare const IMAGE_3D_PAD = 0.05;
4
+ /** 与 bake-sp3d 的非 image pad 一致:倒角会对称外扩。 */
5
+ export declare const SHAPE_3D_PAD = 0.15;
6
+ export declare function shapeSupports3D(s: Shape): boolean;
7
+ export declare function shape3DPad(kind: Shape["kind"]): number;
8
+ /** 形状上真正参加 3D 的那份参数。文字只看 bodyPr,避免和形状自己的 spPr 3D 各挤出一次。 */
9
+ export declare function shape3DInfo(s: Shape): Sp3DInfo | undefined;
10
+ /**
11
+ * 非 image 形状的挤出轮廓,坐标系是形状本地的 0..bbox。
12
+ * image 不需要轮廓(正面是贴图 slab)。rect 也不返回:scene-builder 在没有 pathD
13
+ * 时已经按 bbox 挤出一个矩形。path 的 `d` 原样传入,由场景构建器按路径自身包围盒居中。
14
+ */
15
+ export declare function shape3DPathD(s: Shape): string | undefined;
@@ -0,0 +1 @@
1
+ export type { Bevel3D, Sphere3D, Sp3DParams, Camera3D, LightRig3D, Backdrop3D, Scene3DParams, Sp3DInfo, Shape3DRequest, Shape3DResult, Baker, } from "@sliiu/present-core";
package/package.json CHANGED
@@ -1,6 +1,32 @@
1
1
  {
2
2
  "name": "@sliiu/present-three-bake",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "license": "AGPL-3.0-or-later",
5
+ "type": "module",
6
+ "main": "./dist/cjs/index.js",
7
+ "types": "./dist/types/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/types/index.d.ts",
11
+ "import": "./dist/esm/index.js",
12
+ "require": "./dist/cjs/index.js"
13
+ }
14
+ },
15
+ "scripts": {
16
+ "typecheck": "tsc --noEmit"
17
+ },
18
+ "dependencies": {
19
+ "three": "^0.186.0",
20
+ "@sliiu/present-core": "0.1.0"
21
+ },
22
+ "devDependencies": {
23
+ "@types/three": "^0.186.0"
24
+ },
25
+ "module": "./dist/esm/index.js",
26
+ "files": [
27
+ "dist",
28
+ "LICENSE",
29
+ "COPYRIGHT",
30
+ "THIRD-PARTY-NOTICES.md"
31
+ ]
32
+ }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.