@plasius/gpu-shared 0.1.15 → 0.1.17
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/CHANGELOG.md +9 -0
- package/README.md +3 -0
- package/dist/{chunk-6SOHFUOE.js → chunk-BXTHIQOO.js} +41 -3
- package/dist/chunk-BXTHIQOO.js.map +1 -0
- package/dist/chunk-UKCJ2AWJ.js +793 -0
- package/dist/chunk-UKCJ2AWJ.js.map +1 -0
- package/dist/{gltf-loader-B6VOWGBV.js → gltf-loader-FMRC3OEV.js} +2 -2
- package/dist/index.cjs +401 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5 -5
- package/dist/{product-studio-runtime-BYVBUWIN.js → product-studio-runtime-CTXA45RJ.js} +3 -3
- package/dist/{showcase-runtime-M6TEUYOG.js → showcase-runtime-OH3H6ZW2.js} +2 -2
- package/package.json +2 -2
- package/src/gltf-loader.js +447 -15
- package/src/index.d.ts +83 -0
- package/src/product-studio-runtime.js +53 -0
- package/dist/chunk-6SOHFUOE.js.map +0 -1
- package/dist/chunk-QVNRTWHB.js +0 -445
- package/dist/chunk-QVNRTWHB.js.map +0 -1
- /package/dist/{gltf-loader-B6VOWGBV.js.map → gltf-loader-FMRC3OEV.js.map} +0 -0
- /package/dist/{product-studio-runtime-BYVBUWIN.js.map → product-studio-runtime-CTXA45RJ.js.map} +0 -0
- /package/dist/{showcase-runtime-M6TEUYOG.js.map → showcase-runtime-OH3H6ZW2.js.map} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -16,6 +16,9 @@ All notable changes to this project will be documented in this file.
|
|
|
16
16
|
delegation to the `@plasius/gpu-renderer` WebGPU wavefront renderer.
|
|
17
17
|
|
|
18
18
|
- **Changed**
|
|
19
|
+
- Updated the optional `@plasius/gpu-renderer` peer range to the 0.2 line so
|
|
20
|
+
Product Studio and demo consumers can use the released realtime wavefront
|
|
21
|
+
camera update API without npm peer conflicts.
|
|
19
22
|
- Documented that project-wide display-quality path tracing requires renderer
|
|
20
23
|
mesh BVH intersections and triangle normals; bounded model proxies are now
|
|
21
24
|
disabled rather than exposed as a debug bridge.
|
|
@@ -49,6 +52,12 @@ All notable changes to this project will be documented in this file.
|
|
|
49
52
|
- Restored the package CD workflow so protected `main` releases are prepared by PR and published without direct branch pushes.
|
|
50
53
|
- GLTF model aggregation now appends large primitive arrays iteratively so
|
|
51
54
|
real-world Product Studio meshes do not overflow the JavaScript call stack.
|
|
55
|
+
- Product Studio GLTF loading now preserves UVs, decoded material textures,
|
|
56
|
+
and stride-safe accessor reads so wood, leather, and other textured mesh
|
|
57
|
+
surfaces reach the renderer intact instead of falling back to flat factors.
|
|
58
|
+
- Product Studio GLTF texture-transform baking now resamples with bilinear
|
|
59
|
+
filtering instead of nearest-neighbor lookups, reducing blocky localized
|
|
60
|
+
distortion on transformed leather and wood texture regions.
|
|
52
61
|
- Product Studio showcase routing now honors the rollout feature flag before
|
|
53
62
|
loading the renderer or replacing the host DOM.
|
|
54
63
|
- The shared showcase now propagates the realistic-model feature flag into
|
package/README.md
CHANGED
|
@@ -35,6 +35,9 @@ npm install @plasius/gpu-shared
|
|
|
35
35
|
- Converts Product Studio GLTF primitives into triangle mesh inputs for the
|
|
36
36
|
renderer-owned mesh-BVH wavefront path instead of customer-visible analytic
|
|
37
37
|
scene objects.
|
|
38
|
+
- Preserves Product Studio UVs, decoded glTF material textures, and core
|
|
39
|
+
`KHR_materials_*` factors so renderer-owned leather, wood, chrome, and
|
|
40
|
+
transmissive surface response can be driven from the source asset.
|
|
38
41
|
|
|
39
42
|
## Usage
|
|
40
43
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
loadGltfModel
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-UKCJ2AWJ.js";
|
|
4
4
|
|
|
5
5
|
// src/product-studio-runtime.js
|
|
6
6
|
var STYLE_ID = "plasius-product-studio-wavefront-style";
|
|
@@ -198,18 +198,56 @@ function createProductStudioMeshFromPrimitive(primitive, primitiveIndex, transfo
|
|
|
198
198
|
const indices = Array.isArray(primitive.indices) && primitive.indices.length >= 3 ? [...primitive.indices] : Array.from({ length: positions.length / 3 }, (_, index) => index);
|
|
199
199
|
const material = primitive.material ?? {};
|
|
200
200
|
const color = readMaterialColor(material);
|
|
201
|
+
const uvs = Array.isArray(primitive.uvs) ? [...primitive.uvs] : null;
|
|
201
202
|
return Object.freeze({
|
|
202
203
|
id: 1e3 + primitiveIndex,
|
|
203
204
|
positions: Object.freeze(positions),
|
|
204
205
|
indices: Object.freeze(indices),
|
|
205
206
|
normals: Array.isArray(primitive.normals) ? Object.freeze([...primitive.normals]) : null,
|
|
207
|
+
uvs: uvs ? Object.freeze(uvs) : null,
|
|
208
|
+
material: Object.freeze({ ...material }),
|
|
206
209
|
color: Object.freeze(color),
|
|
207
210
|
emission: Object.freeze(readEmission(material)),
|
|
208
211
|
materialKind: readMaterialKind(material),
|
|
209
212
|
materialRefId: 1e3 + primitiveIndex,
|
|
210
213
|
roughness: Number.isFinite(material.roughness) ? material.roughness : 0.72,
|
|
211
214
|
metallic: Number.isFinite(material.metallic) ? material.metallic : 0,
|
|
212
|
-
opacity: color[3]
|
|
215
|
+
opacity: color[3],
|
|
216
|
+
baseColorTexture: material.baseColorTexture ?? null,
|
|
217
|
+
metallicRoughnessTexture: material.metallicRoughnessTexture ?? null,
|
|
218
|
+
normalTexture: material.normalTexture ?? null,
|
|
219
|
+
occlusionTexture: material.occlusionTexture ?? null,
|
|
220
|
+
emissiveTexture: material.emissiveTexture ?? null,
|
|
221
|
+
specular: Number.isFinite(material.specular) ? material.specular : 1,
|
|
222
|
+
specularColor: Array.isArray(material.specularColor) ? Object.freeze([...material.specularColor]) : void 0,
|
|
223
|
+
specularTexture: material.specularTexture ?? null,
|
|
224
|
+
specularColorTexture: material.specularColorTexture ?? null,
|
|
225
|
+
transmission: Number.isFinite(material.transmission) ? material.transmission : 0,
|
|
226
|
+
transmissionTexture: material.transmissionTexture ?? null,
|
|
227
|
+
ior: Number.isFinite(material.ior) ? material.ior : void 0,
|
|
228
|
+
thickness: Number.isFinite(material.thickness) ? material.thickness : void 0,
|
|
229
|
+
thicknessTexture: material.thicknessTexture ?? null,
|
|
230
|
+
attenuationDistance: Number.isFinite(material.attenuationDistance) ? material.attenuationDistance : null,
|
|
231
|
+
attenuationColor: Array.isArray(material.attenuationColor) ? Object.freeze([...material.attenuationColor]) : void 0,
|
|
232
|
+
clearcoat: Number.isFinite(material.clearcoat) ? material.clearcoat : void 0,
|
|
233
|
+
clearcoatTexture: material.clearcoatTexture ?? null,
|
|
234
|
+
clearcoatRoughness: Number.isFinite(material.clearcoatRoughness) ? material.clearcoatRoughness : void 0,
|
|
235
|
+
clearcoatRoughnessTexture: material.clearcoatRoughnessTexture ?? null,
|
|
236
|
+
clearcoatNormalTexture: material.clearcoatNormalTexture ?? null,
|
|
237
|
+
sheenColor: Array.isArray(material.sheenColor) ? Object.freeze([...material.sheenColor]) : void 0,
|
|
238
|
+
sheenColorTexture: material.sheenColorTexture ?? null,
|
|
239
|
+
sheenRoughness: Number.isFinite(material.sheenRoughness) ? material.sheenRoughness : void 0,
|
|
240
|
+
sheenRoughnessTexture: material.sheenRoughnessTexture ?? null,
|
|
241
|
+
iridescence: Number.isFinite(material.iridescence) ? material.iridescence : void 0,
|
|
242
|
+
iridescenceTexture: material.iridescenceTexture ?? null,
|
|
243
|
+
iridescenceIor: Number.isFinite(material.iridescenceIor) ? material.iridescenceIor : void 0,
|
|
244
|
+
iridescenceThicknessMinimum: Number.isFinite(material.iridescenceThicknessMinimum) ? material.iridescenceThicknessMinimum : void 0,
|
|
245
|
+
iridescenceThicknessMaximum: Number.isFinite(material.iridescenceThicknessMaximum) ? material.iridescenceThicknessMaximum : void 0,
|
|
246
|
+
iridescenceThicknessTexture: material.iridescenceThicknessTexture ?? null,
|
|
247
|
+
anisotropy: Number.isFinite(material.anisotropy) ? material.anisotropy : void 0,
|
|
248
|
+
anisotropyRotation: Number.isFinite(material.anisotropyRotation) ? material.anisotropyRotation : void 0,
|
|
249
|
+
anisotropyTexture: material.anisotropyTexture ?? null,
|
|
250
|
+
dispersion: Number.isFinite(material.dispersion) ? material.dispersion : void 0
|
|
213
251
|
});
|
|
214
252
|
}
|
|
215
253
|
function createProductStudioMeshes(model, options = {}) {
|
|
@@ -400,4 +438,4 @@ export {
|
|
|
400
438
|
createProductStudioMeshes,
|
|
401
439
|
mountGpuProductStudio
|
|
402
440
|
};
|
|
403
|
-
//# sourceMappingURL=chunk-
|
|
441
|
+
//# sourceMappingURL=chunk-BXTHIQOO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/product-studio-runtime.js"],"sourcesContent":["import { loadGltfModel } from \"./gltf-loader.js\";\n\nconst STYLE_ID = \"plasius-product-studio-wavefront-style\";\nconst DEFAULT_PRODUCT_ASSET_URL =\n \"/data/models/eames-lounge-chair-ottoman/Eames_Lounge_Chair_Ottoman.gltf\";\nconst DEFAULT_TARGET_CENTER = Object.freeze([0, 0.74, 0]);\nconst DEFAULT_TARGET_SIZE = 2.25;\n\nfunction clamp(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction isFiniteVector(value) {\n return (\n Array.isArray(value) &&\n value.length >= 3 &&\n Number.isFinite(value[0]) &&\n Number.isFinite(value[1]) &&\n Number.isFinite(value[2])\n );\n}\n\nfunction createEmptyBounds() {\n return {\n min: [Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY],\n max: [Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY],\n };\n}\n\nfunction expandBounds(bounds, point) {\n bounds.min[0] = Math.min(bounds.min[0], point[0]);\n bounds.min[1] = Math.min(bounds.min[1], point[1]);\n bounds.min[2] = Math.min(bounds.min[2], point[2]);\n bounds.max[0] = Math.max(bounds.max[0], point[0]);\n bounds.max[1] = Math.max(bounds.max[1], point[1]);\n bounds.max[2] = Math.max(bounds.max[2], point[2]);\n}\n\nfunction getBoundsSize(bounds) {\n return [\n bounds.max[0] - bounds.min[0],\n bounds.max[1] - bounds.min[1],\n bounds.max[2] - bounds.min[2],\n ];\n}\n\nfunction getBoundsCenter(bounds) {\n return [\n (bounds.min[0] + bounds.max[0]) * 0.5,\n (bounds.min[1] + bounds.max[1]) * 0.5,\n (bounds.min[2] + bounds.max[2]) * 0.5,\n ];\n}\n\nfunction getModelBounds(model) {\n if (isFiniteVector(model?.bounds?.min) && isFiniteVector(model?.bounds?.max)) {\n return {\n min: [...model.bounds.min],\n max: [...model.bounds.max],\n };\n }\n\n const bounds = createEmptyBounds();\n for (const primitive of model?.primitives ?? []) {\n for (let index = 0; index < primitive.positions.length; index += 3) {\n expandBounds(bounds, [\n primitive.positions[index],\n primitive.positions[index + 1],\n primitive.positions[index + 2],\n ]);\n }\n }\n return bounds;\n}\n\nfunction transformPoint(point, modelCenter, scale, targetCenter) {\n return [\n (point[0] - modelCenter[0]) * scale + targetCenter[0],\n (point[1] - modelCenter[1]) * scale + targetCenter[1],\n (point[2] - modelCenter[2]) * scale + targetCenter[2],\n ];\n}\n\nfunction readMaterialColor(material) {\n const color = material?.color ?? {};\n return [\n Number.isFinite(color.r) ? color.r : 0.62,\n Number.isFinite(color.g) ? color.g : 0.56,\n Number.isFinite(color.b) ? color.b : 0.48,\n Number.isFinite(color.a) ? color.a : 1,\n ];\n}\n\nfunction readMaterialKind(material) {\n const emissive = material?.emissive ?? {};\n if ((emissive.r ?? 0) + (emissive.g ?? 0) + (emissive.b ?? 0) > 0.001) {\n return \"emissive\";\n }\n if ((material?.metallic ?? 0) >= 0.5) {\n return \"metal\";\n }\n const alpha = readMaterialColor(material)[3];\n if (alpha < 0.9) {\n return \"transparent\";\n }\n return \"diffuse\";\n}\n\nfunction readEmission(material) {\n const emissive = material?.emissive ?? {};\n return [\n Number.isFinite(emissive.r) ? emissive.r : 0,\n Number.isFinite(emissive.g) ? emissive.g : 0,\n Number.isFinite(emissive.b) ? emissive.b : 0,\n 1,\n ];\n}\n\nfunction createQuadMesh({\n id,\n corners,\n color,\n emission = [0, 0, 0, 1],\n materialKind = \"diffuse\",\n roughness = 0.72,\n metallic = 0,\n opacity = color[3] ?? 1,\n}) {\n const [a, b, c] = corners;\n const edge1 = [b[0] - a[0], b[1] - a[1], b[2] - a[2]];\n const edge2 = [c[0] - a[0], c[1] - a[1], c[2] - a[2]];\n const normal = [\n edge1[1] * edge2[2] - edge1[2] * edge2[1],\n edge1[2] * edge2[0] - edge1[0] * edge2[2],\n edge1[0] * edge2[1] - edge1[1] * edge2[0],\n ];\n const length = Math.hypot(normal[0], normal[1], normal[2]) || 1;\n const unitNormal = normal.map((value) => value / length);\n\n return Object.freeze({\n id,\n positions: Object.freeze(corners.flat()),\n indices: Object.freeze([0, 1, 2, 0, 2, 3]),\n normals: Object.freeze([unitNormal, unitNormal, unitNormal, unitNormal].flat()),\n color: Object.freeze([...color]),\n emission: Object.freeze([...emission]),\n materialKind,\n roughness,\n metallic,\n opacity,\n });\n}\n\nfunction createProductStudioEnvironmentMeshes() {\n return [\n createQuadMesh({\n id: 1,\n corners: [\n [-3.2, -0.08, 2.4],\n [3.2, -0.08, 2.4],\n [3.2, -0.08, -3.1],\n [-3.2, -0.08, -3.1],\n ],\n color: [0.48, 0.55, 0.55, 1],\n roughness: 0.82,\n }),\n createQuadMesh({\n id: 2,\n corners: [\n [-3.2, -0.08, -2.45],\n [3.2, -0.08, -2.45],\n [3.2, 2.65, -2.45],\n [-3.2, 2.65, -2.45],\n ],\n color: [0.43, 0.42, 0.38, 1],\n roughness: 0.86,\n }),\n createQuadMesh({\n id: 3,\n corners: [\n [-2.85, -0.08, -2.45],\n [-2.85, 2.55, -2.45],\n [-2.85, 2.55, 2.15],\n [-2.85, -0.08, 2.15],\n ],\n color: [0.36, 0.42, 0.45, 1],\n roughness: 0.8,\n }),\n createQuadMesh({\n id: 4,\n corners: [\n [0.78, 2.55, -0.82],\n [-0.78, 2.55, -0.82],\n [-0.78, 2.55, -1.78],\n [0.78, 2.55, -1.78],\n ],\n color: [1, 0.94, 0.78, 1],\n emission: [8.5, 7.2, 4.8, 1],\n materialKind: \"emissive\",\n roughness: 0,\n }),\n ];\n}\n\nfunction createProductStudioMeshFromPrimitive(primitive, primitiveIndex, transform) {\n if (!Array.isArray(primitive?.positions) || primitive.positions.length < 9) {\n return null;\n }\n\n const positions = [];\n for (let index = 0; index < primitive.positions.length; index += 3) {\n const point = transform([\n primitive.positions[index],\n primitive.positions[index + 1],\n primitive.positions[index + 2],\n ]);\n positions.push(point[0], point[1], point[2]);\n }\n\n const indices =\n Array.isArray(primitive.indices) && primitive.indices.length >= 3\n ? [...primitive.indices]\n : Array.from({ length: positions.length / 3 }, (_, index) => index);\n const material = primitive.material ?? {};\n const color = readMaterialColor(material);\n const uvs = Array.isArray(primitive.uvs) ? [...primitive.uvs] : null;\n\n return Object.freeze({\n id: 1000 + primitiveIndex,\n positions: Object.freeze(positions),\n indices: Object.freeze(indices),\n normals: Array.isArray(primitive.normals) ? Object.freeze([...primitive.normals]) : null,\n uvs: uvs ? Object.freeze(uvs) : null,\n material: Object.freeze({ ...material }),\n color: Object.freeze(color),\n emission: Object.freeze(readEmission(material)),\n materialKind: readMaterialKind(material),\n materialRefId: 1000 + primitiveIndex,\n roughness: Number.isFinite(material.roughness) ? material.roughness : 0.72,\n metallic: Number.isFinite(material.metallic) ? material.metallic : 0,\n opacity: color[3],\n baseColorTexture: material.baseColorTexture ?? null,\n metallicRoughnessTexture: material.metallicRoughnessTexture ?? null,\n normalTexture: material.normalTexture ?? null,\n occlusionTexture: material.occlusionTexture ?? null,\n emissiveTexture: material.emissiveTexture ?? null,\n specular: Number.isFinite(material.specular) ? material.specular : 1,\n specularColor: Array.isArray(material.specularColor)\n ? Object.freeze([...material.specularColor])\n : undefined,\n specularTexture: material.specularTexture ?? null,\n specularColorTexture: material.specularColorTexture ?? null,\n transmission: Number.isFinite(material.transmission) ? material.transmission : 0,\n transmissionTexture: material.transmissionTexture ?? null,\n ior: Number.isFinite(material.ior) ? material.ior : undefined,\n thickness: Number.isFinite(material.thickness) ? material.thickness : undefined,\n thicknessTexture: material.thicknessTexture ?? null,\n attenuationDistance:\n Number.isFinite(material.attenuationDistance) ? material.attenuationDistance : null,\n attenuationColor: Array.isArray(material.attenuationColor)\n ? Object.freeze([...material.attenuationColor])\n : undefined,\n clearcoat: Number.isFinite(material.clearcoat) ? material.clearcoat : undefined,\n clearcoatTexture: material.clearcoatTexture ?? null,\n clearcoatRoughness: Number.isFinite(material.clearcoatRoughness)\n ? material.clearcoatRoughness\n : undefined,\n clearcoatRoughnessTexture: material.clearcoatRoughnessTexture ?? null,\n clearcoatNormalTexture: material.clearcoatNormalTexture ?? null,\n sheenColor: Array.isArray(material.sheenColor)\n ? Object.freeze([...material.sheenColor])\n : undefined,\n sheenColorTexture: material.sheenColorTexture ?? null,\n sheenRoughness: Number.isFinite(material.sheenRoughness) ? material.sheenRoughness : undefined,\n sheenRoughnessTexture: material.sheenRoughnessTexture ?? null,\n iridescence: Number.isFinite(material.iridescence) ? material.iridescence : undefined,\n iridescenceTexture: material.iridescenceTexture ?? null,\n iridescenceIor: Number.isFinite(material.iridescenceIor) ? material.iridescenceIor : undefined,\n iridescenceThicknessMinimum: Number.isFinite(material.iridescenceThicknessMinimum)\n ? material.iridescenceThicknessMinimum\n : undefined,\n iridescenceThicknessMaximum: Number.isFinite(material.iridescenceThicknessMaximum)\n ? material.iridescenceThicknessMaximum\n : undefined,\n iridescenceThicknessTexture: material.iridescenceThicknessTexture ?? null,\n anisotropy: Number.isFinite(material.anisotropy) ? material.anisotropy : undefined,\n anisotropyRotation: Number.isFinite(material.anisotropyRotation)\n ? material.anisotropyRotation\n : undefined,\n anisotropyTexture: material.anisotropyTexture ?? null,\n dispersion: Number.isFinite(material.dispersion) ? material.dispersion : undefined,\n });\n}\n\nexport function createProductStudioMeshes(model, options = {}) {\n const primitives = Array.isArray(model?.primitives) ? model.primitives : [];\n if (primitives.length === 0) {\n throw new Error(\"Product Studio model must contain at least one renderable primitive.\");\n }\n\n const targetCenter = isFiniteVector(options.targetCenter)\n ? [...options.targetCenter]\n : [...DEFAULT_TARGET_CENTER];\n const targetSize = Number.isFinite(options.targetSize)\n ? Math.max(options.targetSize, 0.25)\n : DEFAULT_TARGET_SIZE;\n const modelBounds = getModelBounds(model);\n const modelSize = getBoundsSize(modelBounds);\n const modelCenter = getBoundsCenter(modelBounds);\n const scale = targetSize / Math.max(modelSize[0], modelSize[1], modelSize[2], 0.000001);\n const transform = (point) => transformPoint(point, modelCenter, scale, targetCenter);\n const modelMeshes = primitives\n .map((primitive, index) => createProductStudioMeshFromPrimitive(primitive, index, transform))\n .filter(Boolean);\n\n return Object.freeze([...createProductStudioEnvironmentMeshes(), ...modelMeshes]);\n}\n\nfunction ensureStyles(documentRef) {\n if (documentRef.getElementById?.(STYLE_ID)) {\n return;\n }\n const style = documentRef.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = `\n .plasius-product-studio-wavefront {\n position: relative;\n width: 100%;\n min-height: 420px;\n overflow: hidden;\n background: #0f1418;\n display: grid;\n place-items: center;\n }\n\n .plasius-product-studio-wavefront canvas {\n display: block;\n width: 100%;\n height: auto;\n max-height: 100%;\n aspect-ratio: 16 / 9;\n min-height: 420px;\n object-fit: contain;\n }\n `;\n documentRef.head?.appendChild?.(style);\n}\n\nfunction resolveRoot(options) {\n const documentRef = options.document ?? globalThis.document;\n if (options.root) {\n return options.root;\n }\n const root =\n documentRef?.querySelector?.(\"[data-plasius-gpu-product-studio]\") ?? documentRef?.body;\n if (!root) {\n throw new Error(\"Product Studio requires a DOM root.\");\n }\n return root;\n}\n\nfunction resolveRenderSize(root, options) {\n const rect = root.getBoundingClientRect?.() ?? { width: 1280, height: 720 };\n const devicePixelRatio =\n Number.isFinite(options.devicePixelRatio)\n ? options.devicePixelRatio\n : Number.isFinite(globalThis.window?.devicePixelRatio)\n ? globalThis.window.devicePixelRatio\n : 1;\n const cssWidth = Number.isFinite(rect.width) && rect.width > 0 ? rect.width : 1280;\n const cssHeight =\n Number.isFinite(rect.height) && rect.height > 0 ? rect.height : cssWidth * (9 / 16);\n const width = Number.isFinite(options.width)\n ? Math.trunc(options.width)\n : clamp(Math.round(cssWidth * devicePixelRatio), 640, 1920);\n const height = Number.isFinite(options.height)\n ? Math.trunc(options.height)\n : clamp(Math.round(cssHeight * devicePixelRatio), 360, 1080);\n\n return {\n width,\n height,\n };\n}\n\nfunction installSnapshotHook(state) {\n if (typeof globalThis.window === \"undefined\") {\n return () => {};\n }\n const previous = globalThis.window.render_game_to_text;\n globalThis.window.render_game_to_text = () =>\n JSON.stringify({\n surface: \"gpu-product-studio-wavefront\",\n model: state.modelName,\n sourceTriangles: state.sourceTriangleCount,\n meshCount: state.meshCount,\n geometryMode: state.geometryMode,\n requiresTriangleMeshRenderer: state.requiresTriangleMeshRenderer,\n displayQuality: state.displayQuality,\n requiresMeshBvhForDisplayQuality: state.requiresMeshBvhForDisplayQuality,\n renderer: state.rendererStats,\n });\n return () => {\n if (previous === undefined) {\n delete globalThis.window.render_game_to_text;\n } else {\n globalThis.window.render_game_to_text = previous;\n }\n };\n}\n\nfunction countSourceTriangles(model) {\n return (model.primitives ?? []).reduce(\n (total, primitive) => total + Math.floor((primitive.indices?.length ?? 0) / 3),\n 0\n );\n}\n\nasync function resolveWavefrontLightingOptions(options) {\n const fallback = {\n environmentColor: [0.35, 0.43, 0.49, 1],\n ambientColor: [0.02, 0.024, 0.028, 1],\n };\n const lightingLoader =\n typeof options.__lightingLoader === \"function\"\n ? options.__lightingLoader\n : () => import(\"@plasius/gpu-lighting\").catch(() => null);\n const lightingModule = await lightingLoader();\n\n if (\n typeof lightingModule?.createWavefrontEnvironmentLightingOptions !== \"function\"\n ) {\n return fallback;\n }\n\n return lightingModule.createWavefrontEnvironmentLightingOptions({\n preset: options.lightingPreset ?? \"product-studio\",\n intensity: options.lightingIntensity,\n });\n}\n\nexport async function mountGpuProductStudio(options = {}, featureFlags = null) {\n const root = resolveRoot(options);\n const documentRef = options.document ?? root.ownerDocument ?? globalThis.document;\n ensureStyles(documentRef);\n const previousMarkup = root.innerHTML;\n root.innerHTML = \"\";\n root.classList?.add?.(\"plasius-product-studio-wavefront\");\n\n const canvas = documentRef.createElement(\"canvas\");\n canvas.dataset.plasiusGpuProductStudio = \"wavefront\";\n root.appendChild(canvas);\n\n const modelLoader =\n typeof options.__modelLoader === \"function\" ? options.__modelLoader : loadGltfModel;\n const rendererLoader =\n typeof options.__rendererLoader === \"function\"\n ? options.__rendererLoader\n : () => import(\"@plasius/gpu-renderer\");\n const assetUrl = options.productAssetUrl ?? options.assetUrl ?? DEFAULT_PRODUCT_ASSET_URL;\n const model = await modelLoader(assetUrl);\n const meshes = createProductStudioMeshes(model, {\n targetCenter: options.targetCenter,\n targetSize: options.targetSize,\n });\n const rendererModule = await rendererLoader();\n if (typeof rendererModule.createWavefrontPathTracingComputeRenderer !== \"function\") {\n throw new Error(\"Product Studio renderer loader must provide createWavefrontPathTracingComputeRenderer.\");\n }\n\n const size = resolveRenderSize(root, options);\n const lightingOptions = await resolveWavefrontLightingOptions(options);\n const renderer = await rendererModule.createWavefrontPathTracingComputeRenderer({\n canvas,\n width: size.width,\n height: size.height,\n maxDepth: Number.isFinite(options.maxDepth) ? options.maxDepth : 6,\n tileSize: Number.isFinite(options.tileSize) ? options.tileSize : 128,\n samplesPerPixel: Number.isFinite(options.samplesPerPixel) ? options.samplesPerPixel : 8,\n denoise: options.denoise !== false,\n displayQuality: true,\n meshes,\n camera: {\n position: [0, 1.12, 5.05],\n target: [0, 0.72, 0],\n up: [0, 1, 0],\n fovYDegrees: 43,\n },\n ...lightingOptions,\n });\n const rendererStats = renderer.renderOnce();\n const state = Object.freeze({\n featureFlags,\n modelName: model.name,\n sourceTriangleCount: countSourceTriangles(model),\n meshCount: meshes.length,\n geometryMode: \"mesh-bvh-display-quality\",\n requiresTriangleMeshRenderer: true,\n displayQuality: true,\n requiresMeshBvhForDisplayQuality: true,\n rendererStats,\n });\n const restoreSnapshotHook = installSnapshotHook(state);\n\n return Object.freeze({\n state,\n model,\n productModel: model,\n canvas,\n renderer,\n meshes,\n destroy() {\n restoreSnapshotHook();\n renderer.destroy();\n root.classList?.remove?.(\"plasius-product-studio-wavefront\");\n root.innerHTML = previousMarkup;\n },\n });\n}\n"],"mappings":"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","names":[]}
|