postext-folio 0.72.1 → 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.
- package/dist/environments.d.ts.map +1 -1
- package/dist/environments.js +9 -2
- package/dist/environments.js.map +1 -1
- package/dist/pageFlip/finish.d.ts +118 -0
- package/dist/pageFlip/finish.d.ts.map +1 -0
- package/dist/pageFlip/finish.js +225 -0
- package/dist/pageFlip/finish.js.map +1 -0
- package/dist/pageFlip/leaf.d.ts.map +1 -1
- package/dist/pageFlip/leaf.js +3 -0
- package/dist/pageFlip/leaf.js.map +1 -1
- package/dist/pageFlip/materials.d.ts +4 -2
- package/dist/pageFlip/materials.d.ts.map +1 -1
- package/dist/pageFlip/materials.js +32 -6
- package/dist/pageFlip/materials.js.map +1 -1
- package/dist/pageFlip/mirror.d.ts +15 -0
- package/dist/pageFlip/mirror.d.ts.map +1 -0
- package/dist/pageFlip/mirror.js +54 -0
- package/dist/pageFlip/mirror.js.map +1 -0
- package/dist/pageFlip/occlusion.d.ts +11 -1
- package/dist/pageFlip/occlusion.d.ts.map +1 -1
- package/dist/pageFlip/occlusion.js +9 -4
- package/dist/pageFlip/occlusion.js.map +1 -1
- package/dist/pageFlip/through.d.ts +140 -0
- package/dist/pageFlip/through.d.ts.map +1 -0
- package/dist/pageFlip/through.js +235 -0
- package/dist/pageFlip/through.js.map +1 -0
- package/dist/pageFlip.d.ts +9 -0
- package/dist/pageFlip.d.ts.map +1 -1
- package/dist/pageFlip.js +33 -51
- package/dist/pageFlip.js.map +1 -1
- package/dist/postext/painting.d.ts +2 -0
- package/dist/postext/painting.d.ts.map +1 -1
- package/dist/postext/painting.js +28 -10
- package/dist/postext/painting.js.map +1 -1
- package/dist/postext/state.d.ts +4 -1
- package/dist/postext/state.d.ts.map +1 -1
- package/dist/postext/through.d.ts +37 -0
- package/dist/postext/through.d.ts.map +1 -0
- package/dist/postext/through.js +178 -0
- package/dist/postext/through.js.map +1 -0
- package/dist/postext.d.ts.map +1 -1
- package/dist/postext.js +17 -2
- package/dist/postext.js.map +1 -1
- package/dist/viewer/constants.d.ts +4 -0
- package/dist/viewer/constants.d.ts.map +1 -1
- package/dist/viewer/constants.js +13 -0
- package/dist/viewer/constants.js.map +1 -1
- package/dist/viewer/turning.d.ts.map +1 -1
- package/dist/viewer/turning.js +2 -1
- package/dist/viewer/turning.js.map +1 -1
- package/dist/viewer/types.d.ts +2 -0
- package/dist/viewer/types.d.ts.map +1 -1
- package/dist/viewer.d.ts.map +1 -1
- package/dist/viewer.js +4 -2
- package/dist/viewer.js.map +1 -1
- 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
|
-
|
|
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":"AAAA,yEAAyE;AACzE,qEAAqE;AACrE,kFAAkF;AAClF,OAAO,EAAW,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAA2C,oBAAoB,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAGnL,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;
|
|
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
|
-
|
|
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,
|
|
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
|
|
176
|
-
fragmentShader
|
|
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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"}
|