@objectifthunes/three-book 0.1.5 → 0.2.1

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,66 @@
1
+ /**
2
+ * A styled text block rendered onto a 2D canvas.
3
+ *
4
+ * Positions and dimensions are in canvas pixels. Word-wrapping is handled
5
+ * manually via `ctx.measureText()` when `width` > 0.
6
+ */
7
+ export interface TextBlockOptions {
8
+ /** Left edge of the text box in canvas pixels. */
9
+ x?: number;
10
+ /** Top edge of the text box in canvas pixels. */
11
+ y?: number;
12
+ /** Maximum width before wrapping. 0 = no wrapping (default 0). */
13
+ width?: number;
14
+ /** Text content. */
15
+ text?: string;
16
+ /** Font family (default 'Georgia'). */
17
+ fontFamily?: string;
18
+ /** Font size in canvas pixels (default 24). */
19
+ fontSize?: number;
20
+ /** Font weight (default 'normal'). */
21
+ fontWeight?: 'normal' | 'bold';
22
+ /** Font style (default 'normal'). */
23
+ fontStyle?: 'normal' | 'italic';
24
+ /** CSS fill colour (default '#222'). */
25
+ color?: string;
26
+ /** Line height multiplier (default 1.4). */
27
+ lineHeight?: number;
28
+ /** Text alignment within the box (default 'left'). */
29
+ textAlign?: 'left' | 'center' | 'right';
30
+ /** Opacity 0–1 (default 1). */
31
+ opacity?: number;
32
+ /** Optional text shadow colour for readability. */
33
+ shadowColor?: string;
34
+ /** Shadow blur radius in pixels (default 0). */
35
+ shadowBlur?: number;
36
+ }
37
+ export declare class TextBlock {
38
+ x: number;
39
+ y: number;
40
+ width: number;
41
+ text: string;
42
+ fontFamily: string;
43
+ fontSize: number;
44
+ fontWeight: 'normal' | 'bold';
45
+ fontStyle: 'normal' | 'italic';
46
+ color: string;
47
+ lineHeight: number;
48
+ textAlign: 'left' | 'center' | 'right';
49
+ opacity: number;
50
+ shadowColor: string;
51
+ shadowBlur: number;
52
+ constructor(options?: TextBlockOptions);
53
+ private _font;
54
+ /**
55
+ * Word-wrap `text` into lines that fit within `width` pixels.
56
+ * Respects explicit newlines.
57
+ */
58
+ wrapLines(ctx: CanvasRenderingContext2D): string[];
59
+ /** Total rendered height in canvas pixels. */
60
+ measureHeight(ctx: CanvasRenderingContext2D): number;
61
+ /** Returns true if the point (px, py) is within the text bounding box. */
62
+ hitTest(ctx: CanvasRenderingContext2D, px: number, py: number): boolean;
63
+ private _maxLineWidth;
64
+ draw(ctx: CanvasRenderingContext2D): void;
65
+ }
66
+ //# sourceMappingURL=TextBlock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextBlock.d.ts","sourceRoot":"","sources":["../src/TextBlock.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,kDAAkD;IAClD,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,iDAAiD;IACjD,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,UAAU,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC/B,qCAAqC;IACrC,SAAS,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAChC,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACxC,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,SAAS;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC9B,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;gBAEP,OAAO,CAAC,EAAE,gBAAgB;IAiBtC,OAAO,CAAC,KAAK;IAIb;;;OAGG;IACH,SAAS,CAAC,GAAG,EAAE,wBAAwB,GAAG,MAAM,EAAE;IAyBlD,8CAA8C;IAC9C,aAAa,CAAC,GAAG,EAAE,wBAAwB,GAAG,MAAM;IAKpD,0EAA0E;IAC1E,OAAO,CAAC,GAAG,EAAE,wBAAwB,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO;IAQvE,OAAO,CAAC,aAAa;IAUrB,IAAI,CAAC,GAAG,EAAE,wBAAwB,GAAG,IAAI;CAgC1C"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * TextOverlayContent — an IPageContent that composites text blocks on top of
3
+ * a source canvas (e.g. a SpriteScene canvas from three-book-theatre).
4
+ *
5
+ * Usage:
6
+ * const overlay = new TextOverlayContent(512, 512);
7
+ * overlay.source = spriteScene.canvas; // set the underlying layer
8
+ * overlay.addText({ text: 'Hello', x: 20, y: 400, width: 472, fontSize: 28 });
9
+ * bookContent.pages.push(overlay);
10
+ *
11
+ * // Per-frame: call update() to re-composite
12
+ * overlay.update();
13
+ *
14
+ * The update flow:
15
+ * 1. Clear own canvas
16
+ * 2. Draw `source` canvas/image onto own canvas (full size)
17
+ * 3. Draw all text blocks on top
18
+ * 4. Set texture.needsUpdate = true
19
+ *
20
+ * For three-book material sync, pass the book root to syncMaterials() —
21
+ * same pattern as SpriteScene.
22
+ */
23
+ import * as THREE from 'three';
24
+ import { TextBlock } from './TextBlock';
25
+ import type { TextBlockOptions } from './TextBlock';
26
+ import type { IPageContent } from './PageContent';
27
+ import type { BookContent } from './BookContent';
28
+ export interface TextOverlayContentOptions {
29
+ /** Canvas width in pixels (default 512). */
30
+ width?: number;
31
+ /** Canvas height in pixels (default 512). */
32
+ height?: number;
33
+ /** Source canvas or image to draw as the base layer. */
34
+ source?: HTMLCanvasElement | HTMLImageElement | null;
35
+ }
36
+ export declare class TextOverlayContent implements IPageContent {
37
+ readonly canvas: HTMLCanvasElement;
38
+ readonly texts: TextBlock[];
39
+ private readonly ctx;
40
+ private readonly _texture;
41
+ private readonly _textureST;
42
+ private _source;
43
+ get texture(): THREE.Texture;
44
+ get textureST(): THREE.Vector4;
45
+ /** The base layer drawn beneath text blocks. */
46
+ get source(): HTMLCanvasElement | HTMLImageElement | null;
47
+ set source(v: HTMLCanvasElement | HTMLImageElement | null);
48
+ constructor(options?: TextOverlayContentOptions);
49
+ addText(options?: TextBlockOptions): TextBlock;
50
+ removeText(text: TextBlock): void;
51
+ /** Update a text block by index. Only provided fields are changed. */
52
+ updateText(index: number, options: Partial<TextBlockOptions>): void;
53
+ /**
54
+ * Re-composite the canvas: source layer + text blocks.
55
+ * Call every frame (or when content changes).
56
+ *
57
+ * @param root Optional THREE.Object3D to traverse for texture sync
58
+ * (same pattern as SpriteScene — needed because three-book
59
+ * clones material textures).
60
+ */
61
+ update(root?: THREE.Object3D): void;
62
+ /**
63
+ * Traverse `root` and set `needsUpdate = true` on every material map whose
64
+ * source image is this overlay's canvas.
65
+ */
66
+ syncMaterials(root: THREE.Object3D): void;
67
+ isPointOverUI(_textureCoord: THREE.Vector2): boolean;
68
+ init(_bookContent: BookContent): void;
69
+ setActive(_active: boolean): void;
70
+ dispose(): void;
71
+ }
72
+ //# sourceMappingURL=TextOverlayContent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextOverlayContent.d.ts","sourceRoot":"","sources":["../src/TextOverlayContent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,WAAW,yBAAyB;IACxC,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,MAAM,CAAC,EAAE,iBAAiB,GAAG,gBAAgB,GAAG,IAAI,CAAC;CACtD;AAOD,qBAAa,kBAAmB,YAAW,YAAY;IACrD,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,CAAM;IAEjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA2B;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAC/C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiC;IAC5D,OAAO,CAAC,OAAO,CAA8C;IAE7D,IAAI,OAAO,IAAI,KAAK,CAAC,OAAO,CAA0B;IACtD,IAAI,SAAS,IAAI,KAAK,CAAC,OAAO,CAA4B;IAE1D,gDAAgD;IAChD,IAAI,MAAM,IAAI,iBAAiB,GAAG,gBAAgB,GAAG,IAAI,CAAyB;IAClF,IAAI,MAAM,CAAC,CAAC,EAAE,iBAAiB,GAAG,gBAAgB,GAAG,IAAI,EAAuB;gBAEpE,OAAO,CAAC,EAAE,yBAAyB;IAmB/C,OAAO,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS;IAM9C,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAKjC,sEAAsE;IACtE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAqBnE;;;;;;;OAOG;IACH,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,QAAQ,GAAG,IAAI;IAiBnC;;;OAGG;IACH,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,GAAG,IAAI;IAezC,aAAa,CAAC,aAAa,EAAE,KAAK,CAAC,OAAO,GAAG,OAAO;IAIpD,IAAI,CAAC,YAAY,EAAE,WAAW,GAAG,IAAI;IAErC,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAEjC,OAAO,IAAI,IAAI;CAGhB"}
package/dist/index.d.ts CHANGED
@@ -20,4 +20,10 @@ export type { Keyframe } from './AutoTurn';
20
20
  export { BookRenderer, RendererFactory, MeshFactory, PaperMeshDataPool } from './Renderer';
21
21
  export type { IPageContent } from './PageContent';
22
22
  export { PageContent, SpritePageContent2 } from './PageContent';
23
+ export { TextBlock } from './TextBlock';
24
+ export type { TextBlockOptions } from './TextBlock';
25
+ export { TextOverlayContent } from './TextOverlayContent';
26
+ export type { TextOverlayContentOptions } from './TextOverlayContent';
27
+ export { drawImageWithFit, createPageTexture, loadImage, PX_PER_UNIT } from './textureUtils';
28
+ export type { ImageFitMode, LoadedImage } from './textureUtils';
23
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AACnD,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAE1E,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,gBAAgB,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEzE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAElF,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,4BAA4B,EAC5B,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE3F,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AACnD,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAE1E,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,gBAAgB,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEzE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAElF,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,4BAA4B,EAC5B,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE3F,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEhE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAGtE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7F,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}