postext-folio 0.72.0 → 0.73.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 (56) hide show
  1. package/dist/environments.d.ts.map +1 -1
  2. package/dist/environments.js +9 -2
  3. package/dist/environments.js.map +1 -1
  4. package/dist/pageFlip/finish.d.ts +118 -0
  5. package/dist/pageFlip/finish.d.ts.map +1 -0
  6. package/dist/pageFlip/finish.js +225 -0
  7. package/dist/pageFlip/finish.js.map +1 -0
  8. package/dist/pageFlip/leaf.d.ts.map +1 -1
  9. package/dist/pageFlip/leaf.js +3 -0
  10. package/dist/pageFlip/leaf.js.map +1 -1
  11. package/dist/pageFlip/materials.d.ts +4 -2
  12. package/dist/pageFlip/materials.d.ts.map +1 -1
  13. package/dist/pageFlip/materials.js +32 -6
  14. package/dist/pageFlip/materials.js.map +1 -1
  15. package/dist/pageFlip/mirror.d.ts +15 -0
  16. package/dist/pageFlip/mirror.d.ts.map +1 -0
  17. package/dist/pageFlip/mirror.js +54 -0
  18. package/dist/pageFlip/mirror.js.map +1 -0
  19. package/dist/pageFlip/occlusion.d.ts +11 -1
  20. package/dist/pageFlip/occlusion.d.ts.map +1 -1
  21. package/dist/pageFlip/occlusion.js +9 -4
  22. package/dist/pageFlip/occlusion.js.map +1 -1
  23. package/dist/pageFlip/through.d.ts +140 -0
  24. package/dist/pageFlip/through.d.ts.map +1 -0
  25. package/dist/pageFlip/through.js +235 -0
  26. package/dist/pageFlip/through.js.map +1 -0
  27. package/dist/pageFlip.d.ts +9 -0
  28. package/dist/pageFlip.d.ts.map +1 -1
  29. package/dist/pageFlip.js +33 -51
  30. package/dist/pageFlip.js.map +1 -1
  31. package/dist/postext/painting.d.ts +2 -0
  32. package/dist/postext/painting.d.ts.map +1 -1
  33. package/dist/postext/painting.js +28 -10
  34. package/dist/postext/painting.js.map +1 -1
  35. package/dist/postext/state.d.ts +4 -1
  36. package/dist/postext/state.d.ts.map +1 -1
  37. package/dist/postext/through.d.ts +37 -0
  38. package/dist/postext/through.d.ts.map +1 -0
  39. package/dist/postext/through.js +178 -0
  40. package/dist/postext/through.js.map +1 -0
  41. package/dist/postext.d.ts.map +1 -1
  42. package/dist/postext.js +17 -2
  43. package/dist/postext.js.map +1 -1
  44. package/dist/viewer/constants.d.ts +4 -0
  45. package/dist/viewer/constants.d.ts.map +1 -1
  46. package/dist/viewer/constants.js +13 -0
  47. package/dist/viewer/constants.js.map +1 -1
  48. package/dist/viewer/turning.d.ts.map +1 -1
  49. package/dist/viewer/turning.js +2 -1
  50. package/dist/viewer/turning.js.map +1 -1
  51. package/dist/viewer/types.d.ts +2 -0
  52. package/dist/viewer/types.d.ts.map +1 -1
  53. package/dist/viewer.d.ts.map +1 -1
  54. package/dist/viewer.js +4 -2
  55. package/dist/viewer.js.map +1 -1
  56. package/package.json +3 -3
@@ -4,6 +4,8 @@
4
4
  import { Vector2, Color, Vector4, Vector3, MeshPhysicalMaterial, DoubleSide, MeshStandardMaterial, SRGBColorSpace } from 'three';
5
5
  import { MAX_PAGE_VIDEOS } from '../videoAtlas.js';
6
6
  import { occlusionUniforms, BOOK_POS_PARS, BOOK_POS, keyShadowed, OCCLUSION, keySpecular } from './occlusion.js';
7
+ import { cutUniforms, CUT_OFF, CUT_PARS, CUT_FRAGMENT } from './through.js';
8
+ import { finishUniforms, FINISH_PARS, FINISH_READ, FINISH_DIFFUSE, FINISH_ROUGHNESS, FINISH_METALNESS, FINISH_EMISSIVE, FINISH_COAT, FINISH_NORMAL } from './finish.js';
7
9
  /** What lies behind the leaves in the air (#484): the scene drawn without
8
10
  * the translucent leaves (colour, mipmapped, and depth), shared by every
9
11
  * page. `uBehindSize`: the screen in device px; `uBehindClip`: the
@@ -28,7 +30,7 @@ export const behindUniforms = {
28
30
  * gutter's occlusion (a vertex attribute, from the book's cross-section)
29
31
  * and by lifted leaves nearby.
30
32
  */
31
- export function pageMaterial(mirror, sign) {
33
+ export function pageMaterial(mirror, sign, cutMode = CUT_OFF) {
32
34
  const m = new MeshPhysicalMaterial({ side: DoubleSide, roughness: 0.85 });
33
35
  const uniforms = {
34
36
  uFront: { value: null },
@@ -54,6 +56,8 @@ export function pageMaterial(mirror, sign) {
54
56
  uReflectionOn: { value: 0 },
55
57
  uReflectionSize: { value: new Vector2(1, 1) },
56
58
  uReflectionNormal: { value: new Vector3(0, 0, 1) },
59
+ ...finishUniforms(),
60
+ ...cutUniforms(cutMode),
57
61
  };
58
62
  m.userData.uniforms = uniforms;
59
63
  m.onBeforeCompile = (shader) => {
@@ -106,6 +110,8 @@ export function pageMaterial(mirror, sign) {
106
110
  varying float vAo;
107
111
  varying vec2 vPageUv;
108
112
  varying vec3 vBookPos;
113
+ ${FINISH_PARS}
114
+ ${CUT_PARS}
109
115
  ${OCCLUSION}`)
110
116
  .replace("#include <map_fragment>", `{
111
117
  // 0 no page, 1 its image, 2 blank paper; uv.x runs from the spine.
@@ -115,7 +121,17 @@ export function pageMaterial(mirror, sign) {
115
121
  vec2 uvF = vec2(u, vPageUv.y);
116
122
  vec2 uvB = vec2(1.0 - u, vPageUv.y);
117
123
  vec3 ink = uPaper;
118
- if (has > 0.5 && has < 1.5) ink = front ? texture2D(uFront, uvF).rgb : texture2D(uBack, uvB).rgb;
124
+ // A cut face's painting is transparent in its holes and past its
125
+ // outline: its alpha is the cut (#1569).
126
+ float cutA = 1.0;
127
+ if (has > 0.5 && has < 1.5) {
128
+ vec4 page = front ? texture2D(uFront, uvF) : texture2D(uBack, uvB);
129
+ ink = page.rgb;
130
+ if ((front ? uHasFrontCut : uHasBackCut) > 0.5) {
131
+ cutA = page.a;
132
+ if (cutA > 0.0 && cutA < 1.0) ink = min(ink / cutA, vec3(1.0));
133
+ }
134
+ }
119
135
  // The videos playing on this face, printed over their posters:
120
136
  // the point of the page (from its top left corner) in each
121
137
  // picture's own frame, which may lie turned on the page, then in
@@ -135,11 +151,13 @@ export function pageMaterial(mirror, sign) {
135
151
  ink = texture2D(uVideo, vec2(v.x, 1.0 - v.y)).rgb;
136
152
  }
137
153
  }
154
+ ${CUT_FRAGMENT}
155
+ ${FINISH_READ}
138
156
  // The other side's print, seen through the sheet (the same point
139
157
  // of paper, so mirrored as it should be).
140
158
  float other = front ? uHasBack : uHasFront;
141
159
  vec3 through = vec3(1.0);
142
- if ((uShowThrough > 0.0 || uTransmit > 0.0) && other > 0.5 && other < 1.5) {
160
+ if ((uShowThrough > 0.0 || uTransmit > 0.0) && other > 0.5 && other < 1.5 && cutA > 0.999) {
143
161
  through = front ? texture2D(uBack, uvB).rgb : texture2D(uFront, uvF).rgb;
144
162
  }
145
163
  transInk = ink * through;
@@ -148,19 +166,27 @@ export function pageMaterial(mirror, sign) {
148
166
  // whole sheet (the fibres spread it by a fraction of a millimetre,
149
167
  // finer than the page's own texels: a softer sample would blur
150
168
  // a page seen small to grey).
151
- if (uHasUnder > 0.5 && uUnderK > 0.0) {
169
+ if (uHasUnder > 0.5 && uUnderK > 0.0 && cutA > 0.999) {
152
170
  vec3 under = texture2D(uUnder, front ? uvF : uvB).rgb;
153
171
  ink *= mix(vec3(1.0), under, uUnderK);
154
172
  }
155
173
  diffuseColor.rgb *= ink;
174
+ ${FINISH_DIFFUSE}
156
175
  }`)
176
+ .replace("#include <roughnessmap_fragment>", `#include <roughnessmap_fragment>\n${FINISH_ROUGHNESS}`)
177
+ .replace("#include <metalnessmap_fragment>", `#include <metalnessmap_fragment>\n${FINISH_METALNESS}`)
178
+ .replace("#include <normal_fragment_maps>", `#include <normal_fragment_maps>\n${FINISH_NORMAL}`)
179
+ .replace("#include <emissivemap_fragment>", `#include <emissivemap_fragment>\n${FINISH_EMISSIVE}`)
180
+ .replace("#include <lights_physical_fragment>", `#include <lights_physical_fragment>\n${FINISH_COAT}`)
157
181
  .replace("#include <aomap_fragment>", `#include <aomap_fragment>
158
182
  {
159
183
  // A leaf's own roll counts among the leaves it is occluded by:
160
184
  // held to what its open side would let in.
161
185
  float occ = vAo * (1.0 - uLeafOcc * bookOcclusion(vBookPos, 1.0));
162
- reflectedLight.indirectDiffuse *= occ;
163
- reflectedLight.indirectSpecular *= mix(1.0, occ, 0.85);
186
+ reflectedLight.indirectDiffuse *= occ * throughAo;
187
+ reflectedLight.indirectSpecular *= mix(1.0, occ, 0.85) * throughAo;
188
+ reflectedLight.directDiffuse *= throughLit;
189
+ reflectedLight.directSpecular *= throughLit;
164
190
  }
165
191
  // The reflection's ray, in book coordinates.
166
192
  vec3 reflected = (vec4(reflect(-geometryViewDir, normal), 0.0) * viewMatrix).xyz;
@@ -1 +1 @@
1
- {"version":3,"file":"materials.js","sourceRoot":"","sources":["../../src/pageFlip/materials.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"materials.js","sourceRoot":"","sources":["../../src/pageFlip/materials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { Plane, type Object3D, type PerspectiveCamera, type Scene, type WebGLRenderer, type WebGLRenderTarget } from 'three';
2
+ /** What the mirror is drawn with: the renderer, the scene and its camera,
3
+ * the camera kept for the mirror, the stage and what of it stays in the
4
+ * mirror's picture (the leaves in the air and the light on them). */
5
+ export interface MirrorScene {
6
+ renderer: WebGLRenderer;
7
+ scene: Scene;
8
+ camera: PerspectiveCamera;
9
+ mirror: PerspectiveCamera;
10
+ stage: Object3D;
11
+ keep: ReadonlySet<Object3D>;
12
+ }
13
+ /** Draws the leaves in the air as `plane` (an open page's) mirrors them. */
14
+ export declare function drawMirror({ renderer, scene, camera, mirror: cam, stage, keep }: MirrorScene, target: WebGLRenderTarget, plane: Plane): void;
15
+ //# sourceMappingURL=mirror.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mirror.d.ts","sourceRoot":"","sources":["../../src/pageFlip/mirror.ts"],"names":[],"mappings":"AAEA,OAAO,EAAW,KAAK,EAAW,KAAK,QAAQ,EAAE,KAAK,iBAAiB,EAAE,KAAK,KAAK,EAAE,KAAK,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAG/I;;sEAEsE;AACtE,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,KAAK,EAAE,QAAQ,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;CAC7B;AAED,4EAA4E;AAC5E,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,QAkDrI"}
@@ -0,0 +1,54 @@
1
+ // A gloss open page's mirror of the leaves in the air (#483), split out of
2
+ // pageFlip.ts to keep that file within its size budget.
3
+ import { Matrix4, Plane, Vector4 } from 'three';
4
+ import { behindUniforms } from './materials.js';
5
+ /** Draws the leaves in the air as `plane` (an open page's) mirrors them. */
6
+ export function drawMirror({ renderer, scene, camera, mirror: cam, stage, keep }, target, plane) {
7
+ // The eye mirrored in the plane, turned round its up axis so it is
8
+ // still a camera (no mirror in it): its picture is the reflection
9
+ // turned left for right, and its frustum the main one turned so too.
10
+ const { x, y, z } = plane.normal;
11
+ const d = -plane.constant;
12
+ const reflect = new Matrix4().set(1 - 2 * x * x, -2 * x * y, -2 * x * z, 2 * d * x, -2 * y * x, 1 - 2 * y * y, -2 * y * z, 2 * d * y, -2 * z * x, -2 * z * y, 1 - 2 * z * z, 2 * d * z, 0, 0, 0, 1);
13
+ cam.matrix.copy(reflect).multiply(camera.matrixWorld).multiply(new Matrix4().makeScale(-1, 1, 1));
14
+ cam.updateMatrixWorld(true);
15
+ const p = cam.projectionMatrix.copy(camera.projectionMatrix);
16
+ p.elements[8] *= -1;
17
+ // Its near plane laid along the page (an oblique frustum): nothing
18
+ // under the page shows in its mirror.
19
+ const near = new Plane(plane.normal.clone(), plane.constant + 0.2).applyMatrix4(cam.matrixWorldInverse);
20
+ const clip = new Vector4(near.normal.x, near.normal.y, near.normal.z, near.constant);
21
+ const e = p.elements;
22
+ const q = new Vector4((Math.sign(clip.x) + e[8]) / e[0], (Math.sign(clip.y) + e[9]) / e[5], -1, (1 + e[10]) / e[14]);
23
+ clip.multiplyScalar(2 / clip.dot(q));
24
+ e[2] = clip.x;
25
+ e[6] = clip.y;
26
+ e[10] = clip.z + 1;
27
+ e[14] = clip.w;
28
+ cam.projectionMatrixInverse.copy(p).invert();
29
+ // Only the leaves in the air (and the light on them).
30
+ const hidden = [];
31
+ for (const c of stage.children) {
32
+ if (keep.has(c) || !c.visible)
33
+ continue;
34
+ c.visible = false;
35
+ hidden.push(c);
36
+ }
37
+ // The key's shadow map as the main view drew it last: the leaves'
38
+ // own faces under them are not lit by the key anyway.
39
+ const shadows = renderer.shadowMap.autoUpdate;
40
+ renderer.shadowMap.autoUpdate = false;
41
+ // The picture behind the leaves lies on the main view's screen, not
42
+ // this one's.
43
+ const behind = behindUniforms.uBehindOn.value;
44
+ behindUniforms.uBehindOn.value = 0;
45
+ renderer.setRenderTarget(target);
46
+ renderer.clear();
47
+ renderer.render(scene, cam);
48
+ renderer.setRenderTarget(null);
49
+ renderer.shadowMap.autoUpdate = shadows;
50
+ behindUniforms.uBehindOn.value = behind;
51
+ for (const c of hidden)
52
+ c.visible = true;
53
+ }
54
+ //# sourceMappingURL=mirror.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mirror.js","sourceRoot":"","sources":["../../src/pageFlip/mirror.ts"],"names":[],"mappings":"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"}
@@ -37,7 +37,17 @@ export declare function keyShadowed(fragmentShader: string): string;
37
37
  export declare function casterGeometry(source: BufferGeometry): BufferGeometry;
38
38
  /** Brings a caster's copy to its mesh's shape as laid out this frame. */
39
39
  export declare function syncCaster(caster: Mesh, source: BufferGeometry): void;
40
- export declare function casterMaterial(leaf: boolean): ShaderMaterial;
40
+ /** The caster of a leaf with holes (#1569): the page texture's alpha
41
+ * drops them (`cut`: the discard's declarations and code, and its
42
+ * uniforms). */
43
+ export interface CasterCut {
44
+ pars: string;
45
+ discard: string;
46
+ uniforms: Record<string, {
47
+ value: unknown;
48
+ }>;
49
+ }
50
+ export declare function casterMaterial(leaf: boolean, cut?: CasterCut): ShaderMaterial;
41
51
  /** A standard material (the desk, the covers) with the book's occlusion
42
52
  * on its ambient light. */
43
53
  export declare function occluded<T extends MeshStandardMaterial>(m: T, sign: number): T;
@@ -1 +1 @@
1
- {"version":3,"file":"occlusion.d.ts","sourceRoot":"","sources":["../../src/pageFlip/occlusion.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAe,cAAc,EAAE,IAAI,EAAmB,cAAc,EAAsD,oBAAoB,EAAE,MAAM,OAAO,CAAC;AASvL,eAAO,MAAM,SAAS,+uEAoDrB,CAAC;AAEF;uEACuE;AACvE,eAAO,MAAM,aAAa,iDAAiD,CAAC;AAC5E,eAAO,MAAM,QAAQ,iFAAiF,CAAC;AAoBvG,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB;;eACC,OAAO,GAAG,IAAI;;;;;;;;;;;;;;CAK5C,CAAC;AA4CF;;iEAEiE;AACjE,wBAAgB,WAAW,CAAC,SAAS,SAAQ,UAW5C;AAED,0DAA0D;AAC1D,wBAAgB,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;;;6CAK6C;AAC7C,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAKrE;AAED,yEAAyE;AACzE,wBAAgB,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,QAI9D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,kBAc3C;AAED;4BAC4B;AAC5B,wBAAgB,QAAQ,CAAC,CAAC,SAAS,oBAAoB,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAc9E"}
1
+ {"version":3,"file":"occlusion.d.ts","sourceRoot":"","sources":["../../src/pageFlip/occlusion.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAe,cAAc,EAAE,IAAI,EAAmB,cAAc,EAAsD,oBAAoB,EAAE,MAAM,OAAO,CAAC;AASvL,eAAO,MAAM,SAAS,+uEAoDrB,CAAC;AAEF;uEACuE;AACvE,eAAO,MAAM,aAAa,iDAAiD,CAAC;AAC5E,eAAO,MAAM,QAAQ,iFAAiF,CAAC;AAoBvG,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB;;eACC,OAAO,GAAG,IAAI;;;;;;;;;;;;;;CAK5C,CAAC;AA4CF;;iEAEiE;AACjE,wBAAgB,WAAW,CAAC,SAAS,SAAQ,UAW5C;AAED,0DAA0D;AAC1D,wBAAgB,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;;;6CAK6C;AAC7C,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAOrE;AAED,yEAAyE;AACzE,wBAAgB,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,QAI9D;AAED;;iBAEiB;AACjB,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC9C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,SAAS,kBAgB5D;AAED;4BAC4B;AAC5B,wBAAgB,QAAQ,CAAC,CAAC,SAAS,oBAAoB,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAc9E"}
@@ -160,6 +160,9 @@ export function keyShadowed(fragmentShader) {
160
160
  export function casterGeometry(source) {
161
161
  const g = new BufferGeometry();
162
162
  g.setAttribute("position", source.attributes.position.clone());
163
+ // A cut leaf's caster drops its holes by the page's uv (#1569).
164
+ if (source.attributes.uv)
165
+ g.setAttribute("uv", source.attributes.uv.clone());
163
166
  if (source.index)
164
167
  g.setIndex(source.index.clone());
165
168
  return g;
@@ -170,10 +173,12 @@ export function syncCaster(caster, source) {
170
173
  to.array.set(source.attributes.position.array);
171
174
  to.needsUpdate = true;
172
175
  }
173
- export function casterMaterial(leaf) {
176
+ export function casterMaterial(leaf, cut) {
177
+ const vertexShader = cut ? CASTER_VERTEX.replace("varying float vZ;", "varying float vZ;\nvarying vec2 vCutUv;").replace("vZ = w.z;", "vZ = w.z;\nvCutUv = uv;") : CASTER_VERTEX;
178
+ const fragmentShader = cut ? CASTER_FRAGMENT.replace("varying float vZ;", `varying float vZ;\n${cut.pars}`).replace("void main() {", `void main() {\n${cut.discard}`) : CASTER_FRAGMENT;
174
179
  return new ShaderMaterial({
175
- vertexShader: CASTER_VERTEX,
176
- fragmentShader: CASTER_FRAGMENT,
180
+ vertexShader,
181
+ fragmentShader,
177
182
  side: DoubleSide,
178
183
  blending: CustomBlending,
179
184
  blendEquation: MaxEquation,
@@ -182,7 +187,7 @@ export function casterMaterial(leaf) {
182
187
  blendDst: OneFactor,
183
188
  depthTest: false,
184
189
  depthWrite: false,
185
- uniforms: { uLeaf: { value: leaf ? 1 : 0 } },
190
+ uniforms: { uLeaf: { value: leaf ? 1 : 0 }, ...cut?.uniforms },
186
191
  });
187
192
  }
188
193
  /** A standard material (the desk, the covers) with the book's occlusion
@@ -1 +1 @@
1
- {"version":3,"file":"occlusion.js","sourceRoot":"","sources":["../../src/pageFlip/occlusion.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"occlusion.js","sourceRoot":"","sources":["../../src/pageFlip/occlusion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ import { MeshDepthMaterial, type Texture } from 'three';
2
+ /** A through picture as the document side paints it: RGBA bytes, top row
3
+ * first; RGB the stack seen through the holes, A the depth code (0 off
4
+ * the holes, k the k-th layer beneath). `layers`: how many there are. */
5
+ export interface FaceThroughData {
6
+ width: number;
7
+ height: number;
8
+ data: Uint8ClampedArray;
9
+ layers: number;
10
+ }
11
+ /** A through picture as a texture: its colour sRGB like the pages' (the
12
+ * alpha, the depth codes, stays as it is), filtered; the shader reads
13
+ * the codes texel by texel (`texelFetch`), never blended. */
14
+ export declare function throughTexture(through: FaceThroughData): Texture;
15
+ /** How a page material treats a cut: off (no face is cut), an open page
16
+ * (draws its holes), a leaf in the air (discards them). */
17
+ export declare const CUT_OFF = 0;
18
+ export declare const CUT_OPEN = 1;
19
+ export declare const CUT_AIR = 2;
20
+ /** The uniforms a page material keeps for its faces' cuts. */
21
+ export interface CutUniforms {
22
+ uCutMode: {
23
+ value: number;
24
+ };
25
+ uHasFrontCut: {
26
+ value: number;
27
+ };
28
+ uHasBackCut: {
29
+ value: number;
30
+ };
31
+ uFrontThrough: {
32
+ value: Texture | null;
33
+ };
34
+ uBackThrough: {
35
+ value: Texture | null;
36
+ };
37
+ uHasFrontThrough: {
38
+ value: number;
39
+ };
40
+ uHasBackThrough: {
41
+ value: number;
42
+ };
43
+ /** The layers the faces' through pictures hold (the walk's bound). */
44
+ uThroughLayers: {
45
+ value: number;
46
+ };
47
+ /** A leaf's thickness, book units. */
48
+ uLeafDepth: {
49
+ value: number;
50
+ };
51
+ }
52
+ export declare const cutUniforms: (mode: number) => CutUniforms;
53
+ /** Declarations for the page material's fragment shader. */
54
+ export declare const CUT_PARS = "\n uniform float uCutMode;\n uniform float uHasFrontCut;\n uniform float uHasBackCut;\n uniform sampler2D uFrontThrough;\n uniform sampler2D uBackThrough;\n uniform float uHasFrontThrough;\n uniform float uHasBackThrough;\n uniform float uThroughLayers;\n uniform float uLeafDepth;\n // The direct light a hole's wall keeps from a point deep in it, and the\n // sky its depth leaves it.\n float throughLit = 1.0;\n float throughAo = 1.0;\n vec4 throughAt(bool front, ivec2 t) {\n return front ? texelFetch(uFrontThrough, t, 0) : texelFetch(uBackThrough, t, 0);\n }\n // The depth code at a point of the face (y down), 0 off the holes.\n float throughDepth(bool front, vec2 p, vec2 size) {\n ivec2 t = ivec2(clamp(p, vec2(0.0), vec2(0.999999)) * size);\n return floor(throughAt(front, t).a * 255.0 + 0.5);\n }\n vec3 throughColour(bool front, vec2 p) {\n return front ? texture2D(uFrontThrough, p).rgb : texture2D(uBackThrough, p).rgb;\n }\n";
55
+ /**
56
+ * In `map_fragment`, once the face's page texel `page` (RGBA, alpha the
57
+ * cut) and its print `ink` are known. A leaf in the air drops its holes;
58
+ * an open page draws them: the view ray walked down the stack.
59
+ */
60
+ export declare const CUT_FRAGMENT = "\n if (uCutMode > 0.5 && (front ? uHasFrontCut : uHasBackCut) > 0.5 && cutA < 0.999) {\n if (uCutMode > 1.5) {\n if (cutA < 0.5) discard;\n } else {\n vec2 p0 = vec2(tuv.x, 1.0 - tuv.y);\n bool hasThrough = (front ? uHasFrontThrough : uHasBackThrough) > 0.5;\n vec2 size = hasThrough ? vec2(front ? textureSize(uFrontThrough, 0) : textureSize(uBackThrough, 0)) : vec2(1.0);\n float d0 = hasThrough ? throughDepth(front, p0, size) : 0.0;\n // The picture is coarser than the page: at the hole's rim it may\n // still say paper where the page's alpha says hole.\n if (hasThrough && d0 < 0.5) {\n for (int i = 0; i < 4; i++) {\n vec2 o = vec2(i == 0 ? 1.0 : i == 1 ? -1.0 : 0.0, i == 2 ? 1.0 : i == 3 ? -1.0 : 0.0) / size;\n d0 = max(d0, throughDepth(front, p0 + o, size));\n }\n }\n // Off the holes (past the leaf's outline): nothing of this page.\n if (d0 < 0.5 && cutA < 0.5) discard;\n vec3 hole = uPaper;\n if (hasThrough && d0 > 0.5) {\n // The face's frame on screen: the gradients of its uv, so a step\n // on the page in view space is a step in the picture.\n vec3 pos = -vViewPosition;\n vec3 dp1 = dFdx(pos);\n vec3 dp2 = dFdy(pos);\n vec3 n = normalize(cross(dp1, dp2));\n vec3 eye = normalize(vViewPosition);\n if (dot(n, eye) < 0.0) n = -n;\n vec2 duv1 = dFdx(p0);\n vec2 duv2 = dFdy(p0);\n vec3 dp2perp = cross(dp2, n);\n vec3 dp1perp = cross(n, dp1);\n float det = dot(dp2perp, dp1);\n vec3 gu = (dp2perp * duv1.x + dp1perp * duv2.x) / det;\n vec3 gv = (dp2perp * duv1.y + dp1perp * duv2.y) / det;\n // A leaf down along the view ray, and a leaf up towards the key.\n float h = uLeafDepth;\n vec3 down = -eye * (h / max(dot(eye, n), 0.05)) + n * h;\n vec2 stepDown = vec2(dot(down, gu), dot(down, gv));\n vec2 stepUp = vec2(0.0);\n #if NUM_DIR_LIGHTS > 0\n vec3 l = directionalLights[0].direction;\n vec3 up = l * (h / max(dot(l, n), 0.05)) - n * h;\n stepUp = vec2(dot(up, gu), dot(up, gv));\n #endif\n float k = 1.0;\n float wall = 0.0;\n vec2 hit = p0;\n for (int i = 1; i <= 33; i++) {\n k = float(i);\n if (k > uThroughLayers) break;\n hit = p0 + stepDown * k;\n float d = throughDepth(front, hit, size);\n if (d < k) { wall = 1.0; break; }\n if (d < k + 0.5) break;\n }\n // The key's ray from there back up: paper on its way is a wall's\n // shadow.\n float lit = 1.0;\n float top = wall > 0.5 ? k - 0.5 : k;\n for (int j = 1; j <= 33; j++) {\n float z = top - float(j);\n if (z < 0.0) break;\n if (throughDepth(front, hit + stepUp * float(j), size) <= z) { lit = 0.0; break; }\n }\n throughLit = wall > 0.5 ? 0.45 * lit : lit;\n // Deeper is darker: less of the sky reaches down a narrow shaft.\n throughAo = mix(0.35, 1.0, exp(-0.12 * (k - 1.0))) * (wall > 0.5 ? 0.7 : 1.0);\n hole = wall > 0.5 ? uPaper * 0.8 : throughColour(front, hit);\n }\n ink = mix(hole, ink, cutA);\n }\n }\n";
61
+ /**
62
+ * The key light's depth material for a cut leaf: three.js's, with the
63
+ * page texture's alpha discarding the holes (the leaf's front, or its back
64
+ * read through the paper), so the key's shadow falls through them.
65
+ */
66
+ export declare function cutDepthMaterial(): MeshDepthMaterial & {
67
+ userData: {
68
+ cut: {
69
+ uCut: {
70
+ value: Texture | null;
71
+ };
72
+ uCutBack: {
73
+ value: number;
74
+ };
75
+ uMirror: {
76
+ value: number;
77
+ };
78
+ };
79
+ };
80
+ };
81
+ /** The same discard for the height-map caster of a cut leaf. */
82
+ export declare const CASTER_CUT: {
83
+ pars: string;
84
+ discard: string;
85
+ };
86
+ type CutMesh = {
87
+ material: {
88
+ userData: {
89
+ uniforms: CutUniforms & {
90
+ uFront: {
91
+ value: Texture | null;
92
+ };
93
+ uBack: {
94
+ value: Texture | null;
95
+ };
96
+ uMirror: {
97
+ value: number;
98
+ };
99
+ };
100
+ };
101
+ };
102
+ customDepthMaterial?: unknown;
103
+ userData: Record<string, unknown>;
104
+ };
105
+ /** What a page mesh's two faces carry, from the book's finishes. */
106
+ export interface CutSources {
107
+ cutOf(src: unknown): boolean;
108
+ throughOf(src: unknown): {
109
+ texture: Texture;
110
+ layers: number;
111
+ } | null;
112
+ }
113
+ /**
114
+ * Sets a page mesh's cut uniforms from the pages on its faces: which face
115
+ * is cut, what its holes show (open pages), a leaf's thickness, and for a
116
+ * leaf in the air its key-light depth material and its caster, which
117
+ * discard the holes (the shared caster again once it is not cut).
118
+ */
119
+ export declare function dressCut(mesh: CutMesh, sources: CutSources, leafDepth: number, caster: {
120
+ shared: unknown;
121
+ cut: () => unknown;
122
+ }): void;
123
+ /** The caster discard's uniforms, fresh for each cut leaf. */
124
+ export declare const casterCut: () => {
125
+ uniforms: {
126
+ uCut: {
127
+ value: null;
128
+ };
129
+ uCutBack: {
130
+ value: number;
131
+ };
132
+ uMirror: {
133
+ value: number;
134
+ };
135
+ };
136
+ pars: string;
137
+ discard: string;
138
+ };
139
+ export {};
140
+ //# sourceMappingURL=through.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"through.d.ts","sourceRoot":"","sources":["../../src/pageFlip/through.ts"],"names":[],"mappings":"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"}