@drawcall/lod 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 (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +83 -2
  3. package/dist/baked/codec.d.ts +10 -0
  4. package/dist/baked/codec.js +291 -0
  5. package/dist/baked/codec.js.map +1 -0
  6. package/dist/baked/index.d.ts +51 -0
  7. package/dist/baked/index.js +183 -0
  8. package/dist/baked/index.js.map +1 -0
  9. package/dist/baked/interior/faces.d.ts +26 -0
  10. package/dist/baked/interior/faces.js +105 -0
  11. package/dist/baked/interior/faces.js.map +1 -0
  12. package/dist/baked/interior/material.d.ts +31 -0
  13. package/dist/baked/interior/material.js +157 -0
  14. package/dist/baked/interior/material.js.map +1 -0
  15. package/dist/baked/interior/rooms.d.ts +22 -0
  16. package/dist/baked/interior/rooms.js +78 -0
  17. package/dist/baked/interior/rooms.js.map +1 -0
  18. package/dist/baked/low.d.ts +20 -0
  19. package/dist/baked/low.js +75 -0
  20. package/dist/baked/low.js.map +1 -0
  21. package/dist/baked/raster.d.ts +20 -0
  22. package/dist/baked/raster.js +71 -0
  23. package/dist/baked/raster.js.map +1 -0
  24. package/dist/baked/transfer.d.ts +36 -0
  25. package/dist/baked/transfer.js +243 -0
  26. package/dist/baked/transfer.js.map +1 -0
  27. package/dist/baked/unwrap.d.ts +9 -0
  28. package/dist/baked/unwrap.js +167 -0
  29. package/dist/baked/unwrap.js.map +1 -0
  30. package/dist/baked/xatlas.d.ts +2 -0
  31. package/dist/baked/xatlas.js +31 -0
  32. package/dist/baked/xatlas.js.map +1 -0
  33. package/dist/bounds.d.ts +33 -0
  34. package/dist/bounds.js +127 -0
  35. package/dist/bounds.js.map +1 -0
  36. package/dist/dispose.d.ts +5 -0
  37. package/dist/dispose.js +28 -0
  38. package/dist/dispose.js.map +1 -0
  39. package/dist/fade.d.ts +44 -0
  40. package/dist/fade.js +78 -0
  41. package/dist/fade.js.map +1 -0
  42. package/dist/impostor/bake/atlas.d.ts +51 -0
  43. package/dist/impostor/bake/atlas.js +190 -0
  44. package/dist/impostor/bake/atlas.js.map +1 -0
  45. package/dist/impostor/bake/index.d.ts +50 -0
  46. package/dist/impostor/bake/index.js +221 -0
  47. package/dist/impostor/bake/index.js.map +1 -0
  48. package/dist/impostor/bake/materials.d.ts +29 -0
  49. package/dist/impostor/bake/materials.js +156 -0
  50. package/dist/impostor/bake/materials.js.map +1 -0
  51. package/dist/impostor/bake/source.d.ts +3 -0
  52. package/dist/impostor/bake/source.js +23 -0
  53. package/dist/impostor/bake/source.js.map +1 -0
  54. package/dist/impostor/cache.d.ts +15 -0
  55. package/dist/impostor/cache.js +44 -0
  56. package/dist/impostor/cache.js.map +1 -0
  57. package/dist/impostor/codec.d.ts +14 -0
  58. package/dist/impostor/codec.js +137 -0
  59. package/dist/impostor/codec.js.map +1 -0
  60. package/dist/impostor/impostor.d.ts +67 -0
  61. package/dist/impostor/impostor.js +79 -0
  62. package/dist/impostor/impostor.js.map +1 -0
  63. package/dist/impostor/mesh/card.d.ts +38 -0
  64. package/dist/impostor/mesh/card.js +79 -0
  65. package/dist/impostor/mesh/card.js.map +1 -0
  66. package/dist/impostor/mesh/index.d.ts +66 -0
  67. package/dist/impostor/mesh/index.js +174 -0
  68. package/dist/impostor/mesh/index.js.map +1 -0
  69. package/dist/impostor/mesh/material.d.ts +63 -0
  70. package/dist/impostor/mesh/material.js +199 -0
  71. package/dist/impostor/mesh/material.js.map +1 -0
  72. package/dist/impostor/mesh/surface.d.ts +63 -0
  73. package/dist/impostor/mesh/surface.js +162 -0
  74. package/dist/impostor/mesh/surface.js.map +1 -0
  75. package/dist/impostor/mesh/textures.d.ts +4 -0
  76. package/dist/impostor/mesh/textures.js +37 -0
  77. package/dist/impostor/mesh/textures.js.map +1 -0
  78. package/dist/impostor/octahedral.d.ts +29 -0
  79. package/dist/impostor/octahedral.js +83 -0
  80. package/dist/impostor/octahedral.js.map +1 -0
  81. package/dist/index.d.ts +15 -0
  82. package/dist/index.js +16 -0
  83. package/dist/index.js.map +1 -0
  84. package/dist/instanced/args.d.ts +20 -0
  85. package/dist/instanced/args.js +77 -0
  86. package/dist/instanced/args.js.map +1 -0
  87. package/dist/instanced/bounds.d.ts +50 -0
  88. package/dist/instanced/bounds.js +271 -0
  89. package/dist/instanced/bounds.js.map +1 -0
  90. package/dist/instanced/dirty.d.ts +12 -0
  91. package/dist/instanced/dirty.js +61 -0
  92. package/dist/instanced/dirty.js.map +1 -0
  93. package/dist/instanced/index.d.ts +116 -0
  94. package/dist/instanced/index.js +573 -0
  95. package/dist/instanced/index.js.map +1 -0
  96. package/dist/instanced/meshes.d.ts +14 -0
  97. package/dist/instanced/meshes.js +54 -0
  98. package/dist/instanced/meshes.js.map +1 -0
  99. package/dist/instanced/select.d.ts +84 -0
  100. package/dist/instanced/select.js +264 -0
  101. package/dist/instanced/select.js.map +1 -0
  102. package/dist/lazy.d.ts +64 -0
  103. package/dist/lazy.js +187 -0
  104. package/dist/lazy.js.map +1 -0
  105. package/dist/levels.d.ts +72 -0
  106. package/dist/levels.js +146 -0
  107. package/dist/levels.js.map +1 -0
  108. package/dist/loader/cache.d.ts +15 -0
  109. package/dist/loader/cache.js +37 -0
  110. package/dist/loader/cache.js.map +1 -0
  111. package/dist/loader/dispose.d.ts +3 -0
  112. package/dist/loader/dispose.js +25 -0
  113. package/dist/loader/dispose.js.map +1 -0
  114. package/dist/loader.d.ts +99 -0
  115. package/dist/loader.js +234 -0
  116. package/dist/loader.js.map +1 -0
  117. package/dist/lod.d.ts +78 -0
  118. package/dist/lod.js +211 -0
  119. package/dist/lod.js.map +1 -0
  120. package/dist/material.d.ts +12 -0
  121. package/dist/material.js +52 -0
  122. package/dist/material.js.map +1 -0
  123. package/dist/pause.d.ts +6 -0
  124. package/dist/pause.js +20 -0
  125. package/dist/pause.js.map +1 -0
  126. package/dist/renderer.d.ts +21 -0
  127. package/dist/renderer.js +83 -0
  128. package/dist/renderer.js.map +1 -0
  129. package/dist/simplify.d.ts +24 -0
  130. package/dist/simplify.js +148 -0
  131. package/dist/simplify.js.map +1 -0
  132. package/dist/source/error.d.ts +14 -0
  133. package/dist/source/error.js +94 -0
  134. package/dist/source/error.js.map +1 -0
  135. package/dist/source/frame.d.ts +11 -0
  136. package/dist/source/frame.js +25 -0
  137. package/dist/source/frame.js.map +1 -0
  138. package/dist/source/shading.d.ts +96 -0
  139. package/dist/source/shading.js +224 -0
  140. package/dist/source/shading.js.map +1 -0
  141. package/dist/source/source.d.ts +23 -0
  142. package/dist/source/source.js +50 -0
  143. package/dist/source/source.js.map +1 -0
  144. package/dist/source/surface.d.ts +31 -0
  145. package/dist/source/surface.js +110 -0
  146. package/dist/source/surface.js.map +1 -0
  147. package/dist/source/texels.d.ts +45 -0
  148. package/dist/source/texels.js +191 -0
  149. package/dist/source/texels.js.map +1 -0
  150. package/dist/source/trace.d.ts +42 -0
  151. package/dist/source/trace.js +153 -0
  152. package/dist/source/trace.js.map +1 -0
  153. package/dist/three.d.ts +55 -0
  154. package/dist/three.js +103 -0
  155. package/dist/three.js.map +1 -0
  156. package/dist/tsl.d.ts +45 -0
  157. package/dist/tsl.js +99 -0
  158. package/dist/tsl.js.map +1 -0
  159. package/dist/view.d.ts +30 -0
  160. package/dist/view.js +75 -0
  161. package/dist/view.js.map +1 -0
  162. package/dist/wind/bounds.d.ts +3 -0
  163. package/dist/wind/bounds.js +47 -0
  164. package/dist/wind/bounds.js.map +1 -0
  165. package/dist/wind/hooks.d.ts +5 -0
  166. package/dist/wind/hooks.js +3 -0
  167. package/dist/wind/hooks.js.map +1 -0
  168. package/dist/wind/index.d.ts +57 -0
  169. package/dist/wind/index.js +196 -0
  170. package/dist/wind/index.js.map +1 -0
  171. package/dist/wind/sway.d.ts +29 -0
  172. package/dist/wind/sway.js +71 -0
  173. package/dist/wind/sway.js.map +1 -0
  174. package/package.json +69 -3
  175. package/skills/lod/SKILL.md +137 -0
@@ -0,0 +1,224 @@
1
+ import { Color, DoubleSide, ObjectSpaceNormalMap, Vector2, Vector3 } from "three/webgpu";
2
+ import { isColor, isStandard, isTexture } from "../three.js";
3
+ import { tangentFrame } from "./frame.js";
4
+ import { Texels, readable } from "./texels.js";
5
+ /** `material` as the CPU reads it, to `bake` or to `measure` (see `readSource`). */
6
+ export function readMaterial(material, cache, purpose) {
7
+ const read = (texture) => {
8
+ if (!isTexture(texture))
9
+ return null;
10
+ let texels = cache.get(texture);
11
+ if (!texels)
12
+ cache.set(texture, (texels = new Texels(texture)));
13
+ return texels;
14
+ };
15
+ const standard = isStandard(material) ? material : null;
16
+ const alphas = ["map" in material ? material.map : null, "alphaMap" in material ? material.alphaMap : null].filter(isTexture);
17
+ const opaque = purpose === "measure" && !alphas.every(readable);
18
+ const cutout = !opaque && (material.alphaTest > 0 || (material.alphaToCoverage && !material.transparent));
19
+ return {
20
+ color: "color" in material && isColor(material.color) ? material.color.clone() : new Color(1, 1, 1),
21
+ map: "map" in material ? read(material.map) : null,
22
+ alphaMap: "alphaMap" in material ? read(material.alphaMap) : null,
23
+ opacity: material.opacity,
24
+ cutout,
25
+ alphaTest: material.alphaTest > 0 ? material.alphaTest : 0.5,
26
+ vertexColors: material.vertexColors,
27
+ roughness: standard?.roughness ?? 1,
28
+ roughnessMap: read(standard?.roughnessMap),
29
+ metalness: standard?.metalness ?? 0,
30
+ metalnessMap: read(standard?.metalnessMap),
31
+ normalMap: standard && standard.normalMapType !== ObjectSpaceNormalMap ? read(standard.normalMap) : null,
32
+ normalScale: standard?.normalScale.clone() ?? new Vector2(1, 1),
33
+ aoMap: read(standard?.aoMap),
34
+ aoMapIntensity: standard?.aoMapIntensity ?? 1,
35
+ doubleSided: material.side === DoubleSide,
36
+ transmittance: 1 -
37
+ (material.transparent ? material.opacity : 1) *
38
+ (1 - ("transmission" in material && typeof material.transmission === "number" ? material.transmission : 0)),
39
+ };
40
+ }
41
+ /** The source's material values at surface points: `test` where a ray meets one, `shade` the one it keeps. */
42
+ export class Shading {
43
+ source;
44
+ texelSize;
45
+ /** linear base colour */
46
+ r = 0;
47
+ g = 0;
48
+ b = 0;
49
+ ao = 1;
50
+ roughness = 1;
51
+ metalness = 0;
52
+ /** shading normal in the source's space */
53
+ normal = new Vector3();
54
+ /** per source triangle: unit face normal */
55
+ faces;
56
+ /** per source triangle: UV area per unit of surface area */
57
+ density;
58
+ e1 = new Vector3();
59
+ e2 = new Vector3();
60
+ tangent = new Vector3();
61
+ bitangent = new Vector3();
62
+ texel = new Float32Array(4);
63
+ triangle = 0;
64
+ w0 = 0;
65
+ w1 = 0;
66
+ w2 = 0;
67
+ constructor(source,
68
+ /** size of one baked texel in the source's units: mip levels are picked to match it */
69
+ texelSize) {
70
+ this.source = source;
71
+ this.texelSize = texelSize;
72
+ const { uvs, index } = source;
73
+ const count = index.length / 3;
74
+ this.faces = new Float32Array(count * 3);
75
+ this.density = new Float32Array(count);
76
+ for (let t = 0; t < count; t++) {
77
+ this.corners(t);
78
+ const face = this.tangent.crossVectors(this.e1, this.e2);
79
+ const area = face.length();
80
+ face.normalize().toArray(this.faces, t * 3);
81
+ const a = this.corner(t, 0);
82
+ const b = this.corner(t, 1);
83
+ const c = this.corner(t, 2);
84
+ const det = ((uvs[b * 2] ?? 0) - (uvs[a * 2] ?? 0)) * ((uvs[c * 2 + 1] ?? 0) - (uvs[a * 2 + 1] ?? 0)) -
85
+ ((uvs[c * 2] ?? 0) - (uvs[a * 2] ?? 0)) * ((uvs[b * 2 + 1] ?? 0) - (uvs[a * 2 + 1] ?? 0));
86
+ this.density[t] = area > 0 ? Math.abs(det) / area : 0;
87
+ }
88
+ }
89
+ /**
90
+ * What a ray along -`facing` meets at weights (`w1`, `w2`) of triangle `triangle`;
91
+ * with `facing` null, either side of a surface counts as its front.
92
+ */
93
+ test(triangle, w1, w2, facing) {
94
+ const material = this.material(triangle);
95
+ if (facing && !material.doubleSided && this.facesAway(triangle, facing))
96
+ return "back";
97
+ if (!material.cutout)
98
+ return "opaque";
99
+ this.at(triangle, w1, w2);
100
+ return this.alpha(material) < material.alphaTest ? "cutout" : "opaque";
101
+ }
102
+ /** Whether triangle `triangle` faces away from a viewer looking along -`facing`. */
103
+ facesAway(triangle, facing) {
104
+ const { faces } = this;
105
+ return (faces[triangle * 3] ?? 0) * facing.x + (faces[triangle * 3 + 1] ?? 0) * facing.y + (faces[triangle * 3 + 2] ?? 0) * facing.z < 0;
106
+ }
107
+ /** Evaluate the material at weights (`w1`, `w2`) of triangle `triangle`, seen from its back if `back`. */
108
+ shade(triangle, w1, w2, back) {
109
+ const material = this.material(triangle);
110
+ this.at(triangle, w1, w2);
111
+ const { colors, normals } = this.source;
112
+ this.r = material.color.r;
113
+ this.g = material.color.g;
114
+ this.b = material.color.b;
115
+ const texel = this.texel;
116
+ if (material.map) {
117
+ this.sample(material.map);
118
+ this.r *= texel[0] ?? 0;
119
+ this.g *= texel[1] ?? 0;
120
+ this.b *= texel[2] ?? 0;
121
+ }
122
+ if (material.vertexColors) {
123
+ this.r *= this.lerp(colors, 3, 0);
124
+ this.g *= this.lerp(colors, 3, 1);
125
+ this.b *= this.lerp(colors, 3, 2);
126
+ }
127
+ this.roughness = material.roughness * (material.roughnessMap ? (this.sample(material.roughnessMap)[1] ?? 1) : 1);
128
+ this.metalness = material.metalness * (material.metalnessMap ? (this.sample(material.metalnessMap)[2] ?? 1) : 1);
129
+ this.ao = material.aoMap ? 1 + ((this.sample(material.aoMap)[0] ?? 1) - 1) * material.aoMapIntensity : 1;
130
+ // On a back face three negates the whole frame; computing it from the flipped normal does.
131
+ const n = this.normal.set(this.lerp(normals, 3, 0), this.lerp(normals, 3, 1), this.lerp(normals, 3, 2)).normalize();
132
+ if (back)
133
+ n.negate();
134
+ if (!material.normalMap)
135
+ return;
136
+ const a = this.corner(triangle, 0);
137
+ const b = this.corner(triangle, 1);
138
+ const c = this.corner(triangle, 2);
139
+ const { uvs } = this.source;
140
+ // three takes the UV gradients after the map's transform.
141
+ const m = material.normalMap.matrix;
142
+ const st = (corner, axis) => (m[axis] ?? 0) * (uvs[corner * 2] ?? 0) + (m[3 + axis] ?? 0) * (uvs[corner * 2 + 1] ?? 0);
143
+ this.corners(triangle);
144
+ const t = this.tangent;
145
+ const bt = this.bitangent;
146
+ tangentFrame(this.e1, this.e2, st(b, 0) - st(a, 0), st(b, 1) - st(a, 1), st(c, 0) - st(a, 0), st(c, 1) - st(a, 1), n, t, bt);
147
+ this.sample(material.normalMap);
148
+ const x = ((texel[0] ?? 0.5) * 2 - 1) * material.normalScale.x;
149
+ const y = ((texel[1] ?? 0.5) * 2 - 1) * material.normalScale.y;
150
+ const z = (texel[2] ?? 1) * 2 - 1;
151
+ n.multiplyScalar(z).addScaledVector(t, x).addScaledVector(bt, y).normalize();
152
+ }
153
+ /** Barycentric weights (into `out`, x = w1, y = w2) of `point` on triangle `triangle`. */
154
+ weights(triangle, point, out) {
155
+ this.corners(triangle);
156
+ const a = this.corner(triangle, 0);
157
+ const { e1, e2 } = this;
158
+ const { positions } = this.source;
159
+ const vx = point.x - (positions[a * 3] ?? 0);
160
+ const vy = point.y - (positions[a * 3 + 1] ?? 0);
161
+ const vz = point.z - (positions[a * 3 + 2] ?? 0);
162
+ const d00 = e1.dot(e1);
163
+ const d01 = e1.dot(e2);
164
+ const d11 = e2.dot(e2);
165
+ const d20 = vx * e1.x + vy * e1.y + vz * e1.z;
166
+ const d21 = vx * e2.x + vy * e2.y + vz * e2.z;
167
+ const denominator = d00 * d11 - d01 * d01;
168
+ if (denominator === 0)
169
+ return out.set(0, 0, 0);
170
+ return out.set((d11 * d20 - d01 * d21) / denominator, (d00 * d21 - d01 * d20) / denominator, 0);
171
+ }
172
+ material(triangle) {
173
+ const slot = this.source.slots[triangle];
174
+ const material = slot === undefined ? undefined : this.source.inputs[slot];
175
+ if (!material)
176
+ throw new Error(`@drawcall/lod: triangle ${triangle} has no material`);
177
+ return material;
178
+ }
179
+ /** Vertex `k` of triangle `triangle`. */
180
+ corner(triangle, k) {
181
+ return this.source.index[triangle * 3 + k] ?? 0;
182
+ }
183
+ /** Edges e1, e2 of triangle `triangle` from its first corner. */
184
+ corners(triangle) {
185
+ const { positions } = this.source;
186
+ const a = this.corner(triangle, 0);
187
+ const b = this.corner(triangle, 1);
188
+ const c = this.corner(triangle, 2);
189
+ for (let k = 0; k < 3; k++) {
190
+ const origin = positions[a * 3 + k] ?? 0;
191
+ this.e1.setComponent(k, (positions[b * 3 + k] ?? 0) - origin);
192
+ this.e2.setComponent(k, (positions[c * 3 + k] ?? 0) - origin);
193
+ }
194
+ }
195
+ at(triangle, w1, w2) {
196
+ this.triangle = triangle;
197
+ this.w0 = 1 - w1 - w2;
198
+ this.w1 = w1;
199
+ this.w2 = w2;
200
+ }
201
+ lerp(array, size, c) {
202
+ const { index } = this.source;
203
+ const t = this.triangle * 3;
204
+ return ((array[(index[t] ?? 0) * size + c] ?? 0) * this.w0 +
205
+ (array[(index[t + 1] ?? 0) * size + c] ?? 0) * this.w1 +
206
+ (array[(index[t + 2] ?? 0) * size + c] ?? 0) * this.w2);
207
+ }
208
+ alpha(material) {
209
+ let alpha = material.opacity;
210
+ if (material.map)
211
+ alpha *= this.sample(material.map)[3] ?? 1;
212
+ if (material.alphaMap)
213
+ alpha *= this.sample(material.alphaMap)[1] ?? 1;
214
+ return alpha;
215
+ }
216
+ /** `texels` at the current point, at the mip level where one of its texels covers one baked texel. */
217
+ sample(texels) {
218
+ const { uvs } = this.source;
219
+ const footprint = (this.density[this.triangle] ?? 0) * texels.uvScale * texels.width * texels.height * this.texelSize * this.texelSize;
220
+ texels.sample(this.lerp(uvs, 2, 0), this.lerp(uvs, 2, 1), 0.5 * Math.log2(Math.max(footprint, 1e-12)), this.texel);
221
+ return this.texel;
222
+ }
223
+ }
224
+ //# sourceMappingURL=shading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shading.js","sourceRoot":"","sources":["../../src/source/shading.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type Object3D } from "three/webgpu";
2
+ import { MeshBVH } from "three-mesh-bvh";
3
+ import { type MaterialInputs } from "./shading.js";
4
+ import { type Merged } from "./surface.js";
5
+ /** A source object as the CPU reads it: its merged surface, a BVH over it and its materials as inputs. */
6
+ export interface Source extends Merged {
7
+ /** per entry of `materials` */
8
+ inputs: MaterialInputs[];
9
+ /** whether any material cuts out */
10
+ cutout: boolean;
11
+ bvh: MeshBVH;
12
+ /** per triangle in BVH order: its triangle in `index` */
13
+ order: Uint32Array;
14
+ /** per triangle in BVH order: first corner, then the two edges from it (9 floats) */
15
+ corners: Float32Array;
16
+ }
17
+ /**
18
+ * `object` read for `who` (named in errors), to `bake` or only to `measure` the error of
19
+ * a level against it. A measure needs only where the surface is cut out: a cut-out whose
20
+ * textures the CPU cannot read (compressed ones) counts as opaque there, where a bake
21
+ * fails on it.
22
+ */
23
+ export declare function readSource(object: Object3D, who: string, purpose: "bake" | "measure"): Source;
@@ -0,0 +1,50 @@
1
+ import { BufferAttribute, BufferGeometry } from "three/webgpu";
2
+ import { MeshBVH } from "three-mesh-bvh";
3
+ import { readMaterial } from "./shading.js";
4
+ import { merge } from "./surface.js";
5
+ /**
6
+ * `object` read for `who` (named in errors), to `bake` or only to `measure` the error of
7
+ * a level against it. A measure needs only where the surface is cut out: a cut-out whose
8
+ * textures the CPU cannot read (compressed ones) counts as opaque there, where a bake
9
+ * fails on it.
10
+ */
11
+ export function readSource(object, who, purpose) {
12
+ const merged = merge(object, who);
13
+ const cache = new Map();
14
+ const inputs = merged.materials.map((material) => readMaterial(material, cache, purpose));
15
+ const { positions, index } = merged;
16
+ const count = index.length / 3;
17
+ // Three vertices of its own per triangle: the BVH reorders triangles, and vertex 3t of
18
+ // the reordered index still names triangle t. No indirection on every lookup.
19
+ const own = new Float32Array(count * 9);
20
+ for (let i = 0; i < index.length; i++)
21
+ own.set(positions.subarray((index[i] ?? 0) * 3, (index[i] ?? 0) * 3 + 3), i * 3);
22
+ const geometry = new BufferGeometry();
23
+ geometry.setAttribute("position", new BufferAttribute(own, 3));
24
+ geometry.setIndex(new BufferAttribute(Uint32Array.from({ length: count * 3 }, (_, i) => i), 1));
25
+ const bvh = new MeshBVH(geometry);
26
+ const reordered = geometry.index?.array;
27
+ if (!reordered)
28
+ throw new Error(`${who}: the BVH dropped its index`);
29
+ const order = new Uint32Array(count);
30
+ const corners = new Float32Array(count * 9);
31
+ for (let j = 0; j < count; j++) {
32
+ const t = (reordered[j * 3] ?? 0) / 3;
33
+ order[j] = t;
34
+ for (let c = 0; c < 3; c++) {
35
+ const a = own[t * 9 + c] ?? 0;
36
+ corners[j * 9 + c] = a;
37
+ corners[j * 9 + 3 + c] = (own[t * 9 + 3 + c] ?? 0) - a;
38
+ corners[j * 9 + 6 + c] = (own[t * 9 + 6 + c] ?? 0) - a;
39
+ }
40
+ }
41
+ return {
42
+ ...merged,
43
+ inputs,
44
+ cutout: inputs.some((input) => input.cutout),
45
+ bvh,
46
+ order,
47
+ corners,
48
+ };
49
+ }
50
+ //# sourceMappingURL=source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/source/source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { type Material, type Object3D } from "three/webgpu";
2
+ /** Indexed triangles as flat arrays, in one space. */
3
+ export interface Surface {
4
+ positions: Float32Array;
5
+ normals: Float32Array;
6
+ index: Uint32Array;
7
+ }
8
+ /** A surface merged from meshes, with what each triangle is drawn with. */
9
+ export interface Merged extends Surface {
10
+ /** uv per vertex, 0 where a mesh has none */
11
+ uvs: Float32Array;
12
+ /** whether every mesh has UVs: only then are they a layout of the whole surface */
13
+ hasUvs: boolean;
14
+ /** rgb per vertex, 1 where a mesh has no colours */
15
+ colors: Float32Array;
16
+ materials: Material[];
17
+ /** per triangle, its index into `materials` */
18
+ slots: Uint16Array;
19
+ }
20
+ /**
21
+ * Every triangle drawn at full detail under `root` (see `forEachMesh`: nested LODs at
22
+ * level 0, every instance) in `root`'s own space (its own transform not applied), merged
23
+ * into one surface; errors name `who` asked. Triangles of a hidden material, or outside
24
+ * every group of a multi-material mesh, are left out, as three draws neither; so is an
25
+ * ImpostorMesh, which has no triangles of its own.
26
+ */
27
+ export declare function merge(root: Object3D, who: string): Merged;
28
+ /** Total area of `surface`'s triangles. */
29
+ export declare function area({ positions, index }: Surface): number;
30
+ /** Area of triangle `i` (its first index) of points with `size` components (2 or 3). */
31
+ export declare function triangleArea(points: Float32Array, size: 2 | 3, index: Uint32Array, i: number): number;
@@ -0,0 +1,110 @@
1
+ import { Matrix3, Vector3 } from "three/webgpu";
2
+ import { forEachMesh } from "../bounds.js";
3
+ import { isImpostorMesh, rejectSkinned } from "../three.js";
4
+ /**
5
+ * Every triangle drawn at full detail under `root` (see `forEachMesh`: nested LODs at
6
+ * level 0, every instance) in `root`'s own space (its own transform not applied), merged
7
+ * into one surface; errors name `who` asked. Triangles of a hidden material, or outside
8
+ * every group of a multi-material mesh, are left out, as three draws neither; so is an
9
+ * ImpostorMesh, which has no triangles of its own.
10
+ */
11
+ export function merge(root, who) {
12
+ rejectSkinned(root, who);
13
+ const meshes = [];
14
+ forEachMesh(root, (mesh, placement) => {
15
+ if (!isImpostorMesh(mesh))
16
+ meshes.push({ mesh, matrix: placement.clone() });
17
+ });
18
+ let vertexCount = 0;
19
+ let indexCount = 0;
20
+ for (const { mesh } of meshes) {
21
+ const count = mesh.geometry.getAttribute("position").count;
22
+ vertexCount += count;
23
+ indexCount += mesh.geometry.index?.count ?? count;
24
+ }
25
+ const positions = new Float32Array(vertexCount * 3);
26
+ const normals = new Float32Array(vertexCount * 3);
27
+ const uvs = new Float32Array(vertexCount * 2);
28
+ const colors = new Float32Array(vertexCount * 3).fill(1);
29
+ const index = new Uint32Array(indexCount);
30
+ const slots = new Uint16Array(indexCount / 3);
31
+ const materials = [];
32
+ let hasUvs = true;
33
+ const normalMatrix = new Matrix3();
34
+ const v = new Vector3();
35
+ // Geometries without normals get them once, however many instances share them.
36
+ const withNormals = new Map();
37
+ let base = 0;
38
+ let written = 0;
39
+ for (const { mesh, matrix } of meshes) {
40
+ let geometry = withNormals.get(mesh.geometry) ?? mesh.geometry;
41
+ if (!geometry.getAttribute("normal")) {
42
+ withNormals.set(mesh.geometry, (geometry = geometry.clone()));
43
+ geometry.computeVertexNormals();
44
+ }
45
+ normalMatrix.getNormalMatrix(matrix);
46
+ const position = geometry.getAttribute("position");
47
+ const normal = geometry.getAttribute("normal");
48
+ const uv = geometry.getAttribute("uv");
49
+ const color = geometry.getAttribute("color");
50
+ hasUvs &&= uv !== undefined;
51
+ for (let i = 0; i < position.count; i++) {
52
+ v.fromBufferAttribute(position, i)
53
+ .applyMatrix4(matrix)
54
+ .toArray(positions, (base + i) * 3);
55
+ v.fromBufferAttribute(normal, i)
56
+ .applyMatrix3(normalMatrix)
57
+ .normalize()
58
+ .toArray(normals, (base + i) * 3);
59
+ if (uv)
60
+ ((uvs[(base + i) * 2] = uv.getX(i)), (uvs[(base + i) * 2 + 1] = uv.getY(i)));
61
+ if (color)
62
+ for (let c = 0; c < 3; c++)
63
+ colors[(base + i) * 3 + c] = color.getComponent(i, c);
64
+ }
65
+ const count = geometry.index?.count ?? position.count;
66
+ const at = (i) => geometry.index?.getX(i) ?? i;
67
+ // A mirroring transform turns the triangles inside out: swap two corners.
68
+ const flip = matrix.determinant() < 0;
69
+ const list = [mesh.material].flat();
70
+ const groups = geometry.groups.length > 0 && Array.isArray(mesh.material) ? geometry.groups : [{ start: 0, count, materialIndex: 0 }];
71
+ for (const group of groups) {
72
+ const material = list[group.materialIndex ?? 0];
73
+ if (!material?.visible)
74
+ continue;
75
+ let slot = materials.indexOf(material);
76
+ if (slot < 0)
77
+ slot = materials.push(material) - 1;
78
+ const end = Math.min(group.start + group.count, count);
79
+ for (let i = group.start; i + 2 < end; i += 3) {
80
+ index[written] = base + at(i);
81
+ index[written + 1] = base + at(flip ? i + 2 : i + 1);
82
+ index[written + 2] = base + at(flip ? i + 1 : i + 2);
83
+ slots[written / 3] = slot;
84
+ written += 3;
85
+ }
86
+ }
87
+ base += position.count;
88
+ }
89
+ if (written === 0)
90
+ throw new Error(`${who}: no visible triangles`);
91
+ return { positions, normals, uvs, hasUvs, colors, index: index.slice(0, written), materials, slots: slots.slice(0, written / 3) };
92
+ }
93
+ /** Total area of `surface`'s triangles. */
94
+ export function area({ positions, index }) {
95
+ let sum = 0;
96
+ for (let i = 0; i < index.length; i += 3)
97
+ sum += triangleArea(positions, 3, index, i);
98
+ return sum;
99
+ }
100
+ /** Area of triangle `i` (its first index) of points with `size` components (2 or 3). */
101
+ export function triangleArea(points, size, index, i) {
102
+ const a = (index[i] ?? 0) * size;
103
+ const b = (index[i + 1] ?? 0) * size;
104
+ const c = (index[i + 2] ?? 0) * size;
105
+ const at = (k) => points[k] ?? 0;
106
+ const [ux, uy, uz] = [at(b) - at(a), at(b + 1) - at(a + 1), size === 3 ? at(b + 2) - at(a + 2) : 0];
107
+ const [vx, vy, vz] = [at(c) - at(a), at(c + 1) - at(a + 1), size === 3 ? at(c + 2) - at(a + 2) : 0];
108
+ return Math.hypot(uy * vz - uz * vy, uz * vx - ux * vz, ux * vy - uy * vx) / 2;
109
+ }
110
+ //# sourceMappingURL=surface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface.js","sourceRoot":"","sources":["../../src/source/surface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { type Texture } from "three/webgpu";
2
+ /** One mip of an RGBA8 image, row 0 first. */
3
+ export interface Mip {
4
+ data: Uint8ClampedArray;
5
+ width: number;
6
+ height: number;
7
+ }
8
+ /**
9
+ * A texture's texels on the CPU, with a box-filtered mip chain like the GPU's, sampled
10
+ * trilinearly in its UV space (its matrix, wrapping and flipY applied). An sRGB texture is
11
+ * filtered and returned in linear values, as the GPU decodes before filtering. Every
12
+ * texture is read through the `uv` attribute: `texture.channel` is ignored. The pixels
13
+ * are read at the first sample: a texture nothing samples is never read.
14
+ */
15
+ export declare class Texels {
16
+ private readonly texture;
17
+ /** |det| of the texture matrix: how much it scales UV area */
18
+ readonly uvScale: number;
19
+ /** 8-bit value to 0..1, per channel: colour channels decode sRGB if the texture is sRGB */
20
+ private readonly decode;
21
+ /** the texture's UV transform (Matrix3 elements, column-major) */
22
+ readonly matrix: number[];
23
+ private readonly wrapS;
24
+ private readonly wrapT;
25
+ private readonly lower;
26
+ private readonly upper;
27
+ private read;
28
+ constructor(texture: Texture);
29
+ get width(): number;
30
+ get height(): number;
31
+ private base;
32
+ private pixels;
33
+ /** The texel at (u, v) from mip `mip` (fractional: trilinear) into `out`, channels 0..1. */
34
+ sample(u: number, v: number, mip: number, out: Float32Array): void;
35
+ private bilinear;
36
+ }
37
+ export declare const srgbToLinear: (c: number) => number;
38
+ export declare const linearToSrgb: (c: number) => number;
39
+ /** Whether `pixels` can read `texture` on the CPU. */
40
+ export declare function readable(texture: Texture): boolean;
41
+ /**
42
+ * `base` and its box-filtered halvings down to 1×1, as generateMipmap makes them: an sRGB
43
+ * image is averaged in linear values.
44
+ */
45
+ export declare function mipmaps(base: Mip, srgb: boolean): Mip[];