pelican-engine 0.0.0-stage → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +147 -0
- package/LICENSE +22 -0
- package/README.md +129 -2
- package/distribution.json +197 -0
- package/docs/AI-WORKFLOW.md +517 -0
- package/docs/ARCHITECTURE.md +268 -0
- package/docs/CAPABILITIES.md +264 -0
- package/docs/DECISIONS.md +107 -0
- package/docs/M3-USAGE.md +192 -0
- package/docs/PELICAN-MIGRATION.md +38 -0
- package/docs/RENDER-BACKENDS.md +50 -0
- package/docs/ROADMAP.md +239 -0
- package/docs/THIRD-PARTY-NOTICES.md +151 -0
- package/docs/api/REFERENCE.md +1435 -0
- package/docs/api/index.json +1139 -0
- package/docs/npm/DISTRIBUTION.md +130 -0
- package/docs/npm/GAME-AUTHOR.md +147 -0
- package/engine.manifest.json +15 -0
- package/lib/assets/audio.js +67 -0
- package/lib/assets/errors.js +36 -0
- package/lib/assets/glb.js +277 -0
- package/lib/assets/index.js +53 -0
- package/lib/assets/jpeg.js +199 -0
- package/lib/assets/model.js +558 -0
- package/lib/assets/optimize.js +95 -0
- package/lib/assets/texture.js +187 -0
- package/lib/compiler/distribution.js +17 -0
- package/lib/compiler/extract.js +425 -0
- package/lib/compiler/graph.js +366 -0
- package/lib/compiler/index.js +574 -0
- package/lib/compiler/normalize.js +1194 -0
- package/lib/compiler/source-map.js +25 -0
- package/lib/compiler/types.js +2 -0
- package/lib/compiler/version.js +93 -0
- package/lib/experiments/simulation/index.js +2 -0
- package/lib/experiments/simulation/math.js +41 -0
- package/lib/experiments/simulation/probe.js +215 -0
- package/lib/experiments/simulation/scenes.js +192 -0
- package/lib/experiments/simulation/solver.js +346 -0
- package/lib/experiments/simulation/types.js +1 -0
- package/lib/experiments/world/adapters.js +30 -0
- package/lib/experiments/world/geometry.js +180 -0
- package/lib/experiments/world/index.js +2 -0
- package/lib/experiments/world/probe.js +288 -0
- package/lib/experiments/world/types.js +1 -0
- package/lib/experiments/world/world.js +599 -0
- package/lib/navigation/index.js +157 -0
- package/lib/physics/index.js +909 -0
- package/lib/protocol/index.js +92 -0
- package/lib/renderer/acceleration.js +609 -0
- package/lib/renderer/browser.js +2015 -0
- package/lib/renderer/bsdf.js +260 -0
- package/lib/renderer/checkpoint.js +88 -0
- package/lib/renderer/compute-executor.js +1034 -0
- package/lib/renderer/compute-texture-assets.js +49 -0
- package/lib/renderer/compute-view-contract.js +1 -0
- package/lib/renderer/denoiser.js +361 -0
- package/lib/renderer/dielectric.js +360 -0
- package/lib/renderer/embedded-image-pixels.js +368 -0
- package/lib/renderer/emissive-lights.js +67 -0
- package/lib/renderer/environment-importance.js +55 -0
- package/lib/renderer/environment.js +346 -0
- package/lib/renderer/gameplay.js +464 -0
- package/lib/renderer/geometry.js +103 -0
- package/lib/renderer/graph-expressions.js +485 -0
- package/lib/renderer/graph-tsl.js +141 -0
- package/lib/renderer/graph.js +214 -0
- package/lib/renderer/managed-texture-sampling.js +29 -0
- package/lib/renderer/material-graphs.js +297 -0
- package/lib/renderer/medium.js +348 -0
- package/lib/renderer/models.js +1053 -0
- package/lib/renderer/motion-shader.js +40 -0
- package/lib/renderer/path-shader.js +196 -0
- package/lib/renderer/pathtrace.js +324 -0
- package/lib/renderer/postprocess-contract.js +1 -0
- package/lib/renderer/postprocess.js +494 -0
- package/lib/renderer/render-buffers.js +132 -0
- package/lib/renderer/render-textures.js +155 -0
- package/lib/renderer/startup.js +50 -0
- package/lib/renderer/surface-capture.js +199 -0
- package/lib/renderer/surface-gpu.js +270 -0
- package/lib/renderer/surface-motion.js +84 -0
- package/lib/renderer/surface-ray-shader.js +91 -0
- package/lib/renderer/surface-shader.js +88 -0
- package/lib/renderer/surface-tracer.js +1720 -0
- package/lib/renderer/surface.js +1425 -0
- package/lib/renderer/temporal-filter.js +512 -0
- package/lib/renderer/texture-pixels.js +207 -0
- package/lib/renderer/traversal-nodes.js +54 -0
- package/lib/renderer/ui.js +446 -0
- package/lib/renderer/vertex-bounds.js +127 -0
- package/lib/renderer/vertex-contract.js +1 -0
- package/lib/renderer/vertex-graphs.js +197 -0
- package/lib/renderer/volume-shader.js +50 -0
- package/lib/runtime/compute-contract.js +1 -0
- package/lib/runtime/compute-service.js +674 -0
- package/lib/runtime/contracts.js +1 -0
- package/lib/runtime/error.js +37 -0
- package/lib/runtime/events.js +189 -0
- package/lib/runtime/game-services.js +772 -0
- package/lib/runtime/host.js +839 -0
- package/lib/runtime/material-parameters.js +145 -0
- package/lib/runtime/plugins.js +1 -0
- package/lib/runtime/postprocess-contract.js +1 -0
- package/lib/runtime/postprocess.js +189 -0
- package/lib/runtime/prefabs.js +13 -0
- package/lib/runtime/random.js +88 -0
- package/lib/runtime/render-buffer-contract.js +1 -0
- package/lib/runtime/render-buffers.js +243 -0
- package/lib/runtime/render-capabilities.js +17 -0
- package/lib/runtime/render-settings.js +249 -0
- package/lib/runtime/render-texture-contract.js +1 -0
- package/lib/runtime/render-textures.js +271 -0
- package/lib/runtime/resources.js +648 -0
- package/lib/runtime/scheduler.js +765 -0
- package/lib/runtime/storage.js +169 -0
- package/lib/runtime/world.js +594 -0
- package/lib/schema/index.js +24 -0
- package/lib/sdk/graph-values.js +16 -0
- package/lib/sdk/index.d.ts +800 -0
- package/lib/sdk/index.js +82 -0
- package/lib/tools/api-index.js +113 -0
- package/lib/tools/browser-session.js +89 -0
- package/lib/tools/cli.js +513 -0
- package/lib/tools/compress-dist.js +59 -0
- package/lib/tools/control-client.js +153 -0
- package/lib/tools/control-server.js +633 -0
- package/lib/tools/diagnostic-code.js +3 -0
- package/lib/tools/doctor.js +496 -0
- package/lib/tools/npm/browser-cli.js +6 -0
- package/lib/tools/npm/entry.js +40 -0
- package/lib/tools/npm/layout.js +195 -0
- package/lib/tools/setup.js +153 -0
- package/licenses/@dimforge/rapier2d-compat/LICENSE +201 -0
- package/licenses/@dimforge/rapier3d-compat/LICENSE +201 -0
- package/licenses/@gltf-transform/core/LICENSE.md +21 -0
- package/licenses/@gltf-transform/extensions/LICENSE.md +21 -0
- package/licenses/@gltf-transform/functions/LICENSE.md +21 -0
- package/licenses/@img/colour/LICENSE.md +82 -0
- package/licenses/@img/sharp-win32-x64/LICENSE +191 -0
- package/licenses/@oxc-project/types/LICENSE +22 -0
- package/licenses/@rolldown/pluginutils/LICENSE +21 -0
- package/licenses/@tweenjs/tween.js/LICENSE +23 -0
- package/licenses/@types/ndarray/LICENSE +21 -0
- package/licenses/@types/node/LICENSE +21 -0
- package/licenses/@types/stats.js/LICENSE +21 -0
- package/licenses/@types/three/@dimforge/rapier3d-compat/LICENSE +201 -0
- package/licenses/@types/three/LICENSE +21 -0
- package/licenses/@types/webxr/LICENSE +21 -0
- package/licenses/@webgpu/types/LICENSE +26 -0
- package/licenses/THIRD-PARTY-NOTICES.md +139 -0
- package/licenses/cwise-compiler/LICENSE +22 -0
- package/licenses/detect-libc/LICENSE +201 -0
- package/licenses/esbuild/LICENSE.md +21 -0
- package/licenses/fast-png/LICENSE +21 -0
- package/licenses/fdir/LICENSE +7 -0
- package/licenses/fflate/LICENSE +21 -0
- package/licenses/iobuffer/LICENSE +22 -0
- package/licenses/iota-array/LICENSE +22 -0
- package/licenses/is-buffer/LICENSE +21 -0
- package/licenses/ktx-parse/LICENSE +21 -0
- package/licenses/lightningcss/LICENSE +373 -0
- package/licenses/lightningcss-win32-x64-msvc/LICENSE +373 -0
- package/licenses/meshoptimizer/LICENSE.md +21 -0
- package/licenses/nanoid/LICENSE +20 -0
- package/licenses/ndarray/LICENSE +22 -0
- package/licenses/ndarray-lanczos/LICENSE +21 -0
- package/licenses/ndarray-ops/LICENSE +22 -0
- package/licenses/ndarray-pixels/LICENSE +21 -0
- package/licenses/ngraph.path/LICENSE +21 -0
- package/licenses/picocolors/LICENSE +15 -0
- package/licenses/picomatch/LICENSE +21 -0
- package/licenses/playwright/LICENSE +202 -0
- package/licenses/playwright/NOTICE +5 -0
- package/licenses/playwright-core/LICENSE +202 -0
- package/licenses/playwright-core/NOTICE +5 -0
- package/licenses/postcss/LICENSE +20 -0
- package/licenses/prettier/LICENSE +7 -0
- package/licenses/property-graph/LICENSE +21 -0
- package/licenses/rolldown/LICENSE +25 -0
- package/licenses/semver/LICENSE +15 -0
- package/licenses/sharp/LICENSE +191 -0
- package/licenses/source-map-js/LICENSE +28 -0
- package/licenses/three/LICENSE +21 -0
- package/licenses/tinyglobby/LICENSE +21 -0
- package/licenses/tsx/LICENSE +21 -0
- package/licenses/typescript/LICENSE.txt +55 -0
- package/licenses/undici-types/LICENSE +21 -0
- package/licenses/uniq/LICENSE +22 -0
- package/licenses/vite/LICENSE.md +2084 -0
- package/package.json +49 -4
- package/web/index.html +34 -0
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import * as THREE from "three";
|
|
2
|
+
import { embeddedImagePixels } from "./embedded-image-pixels.js";
|
|
3
|
+
/** Private, synchronous reader. It borrows images and owns only its canvas/cache. */
|
|
4
|
+
export function createTexturePixelProvider() {
|
|
5
|
+
const sources = new Map();
|
|
6
|
+
const textures = new Map();
|
|
7
|
+
const diagnostics = new Map();
|
|
8
|
+
let canvas;
|
|
9
|
+
let context;
|
|
10
|
+
let disposed = false, requests = 0, reads = 0, hits = 0, delegated = 0;
|
|
11
|
+
const report = (texture, code, message) => {
|
|
12
|
+
diagnostics.set(texture.uuid, { code, textureUuid: texture.uuid, message });
|
|
13
|
+
return undefined;
|
|
14
|
+
};
|
|
15
|
+
const clear = () => {
|
|
16
|
+
sources.clear();
|
|
17
|
+
textures.clear();
|
|
18
|
+
diagnostics.clear();
|
|
19
|
+
if (canvas) {
|
|
20
|
+
canvas.width = 0;
|
|
21
|
+
canvas.height = 0;
|
|
22
|
+
}
|
|
23
|
+
context = undefined;
|
|
24
|
+
canvas = undefined;
|
|
25
|
+
requests = reads = hits = delegated = 0;
|
|
26
|
+
};
|
|
27
|
+
return {
|
|
28
|
+
decode(texture) {
|
|
29
|
+
requests++;
|
|
30
|
+
if (disposed)
|
|
31
|
+
return report(texture, "TC_TEXTURE_PROVIDER_DISPOSED", "Create a new pixel provider after dispose().");
|
|
32
|
+
// Surface handles native DataTexture data, including float32, without DOM.
|
|
33
|
+
if (texture.isDataTexture) {
|
|
34
|
+
delegated++;
|
|
35
|
+
diagnostics.delete(texture.uuid);
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
const flags = texture;
|
|
39
|
+
if (texture.type !== THREE.UnsignedByteType ||
|
|
40
|
+
texture.format !== THREE.RGBAFormat ||
|
|
41
|
+
texture.premultiplyAlpha ||
|
|
42
|
+
texture.mipmaps.length ||
|
|
43
|
+
texture.isRenderTargetTexture ||
|
|
44
|
+
flags.isCompressedTexture ||
|
|
45
|
+
flags.isDataArrayTexture ||
|
|
46
|
+
flags.isData3DTexture ||
|
|
47
|
+
flags.isVideoTexture ||
|
|
48
|
+
flags.isFramebufferTexture)
|
|
49
|
+
return report(texture, "TC_TEXTURE_TYPE_UNSUPPORTED", "Use an unsigned-byte RGBA image without custom mips, premultiplication, or dynamic/compressed/array/render-target storage.");
|
|
50
|
+
try {
|
|
51
|
+
const embedded = embeddedImagePixels(texture);
|
|
52
|
+
if (embedded) {
|
|
53
|
+
diagnostics.delete(texture.uuid);
|
|
54
|
+
return Object.freeze({ ...embedded, data: embedded.data.slice() });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
59
|
+
report(texture, message.split(":")[0], message);
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
if (typeof OffscreenCanvas === "undefined" &&
|
|
63
|
+
typeof document === "undefined")
|
|
64
|
+
return report(texture, "TC_TEXTURE_DOM_UNAVAILABLE", "Decode browser images in a realm with Canvas2D; native DataTexture needs no DOM.");
|
|
65
|
+
const image = texture.image;
|
|
66
|
+
const bitmap = typeof ImageBitmap !== "undefined" && image instanceof ImageBitmap;
|
|
67
|
+
const html = typeof HTMLImageElement !== "undefined" &&
|
|
68
|
+
image instanceof HTMLImageElement;
|
|
69
|
+
if (!bitmap && !html)
|
|
70
|
+
return report(texture, "TC_TEXTURE_IMAGE_UNSUPPORTED", "Supply an ImageBitmap or a decoded HTMLImageElement from this realm.");
|
|
71
|
+
const input = image;
|
|
72
|
+
const width = html
|
|
73
|
+
? input.naturalWidth
|
|
74
|
+
: input.width;
|
|
75
|
+
const height = html
|
|
76
|
+
? input.naturalHeight
|
|
77
|
+
: input.height;
|
|
78
|
+
if (bitmap && (!width || !height))
|
|
79
|
+
return report(texture, "TC_TEXTURE_BITMAP_CLOSED", "The borrowed ImageBitmap is closed; retain it until extraction completes.");
|
|
80
|
+
if (html && (!input.complete || !width || !height))
|
|
81
|
+
return report(texture, "TC_TEXTURE_IMAGE_NOT_DECODED", "Await image.decode() before synchronous extraction.");
|
|
82
|
+
const url = html
|
|
83
|
+
? input.currentSrc ||
|
|
84
|
+
input.src
|
|
85
|
+
: "";
|
|
86
|
+
const previous = textures.get(texture);
|
|
87
|
+
const source = texture.source;
|
|
88
|
+
// A texture-only revision also invalidates shared pixels, even if a caller
|
|
89
|
+
// changed version without incrementing source.version.
|
|
90
|
+
if (previous &&
|
|
91
|
+
previous.source === source &&
|
|
92
|
+
previous.version !== texture.version)
|
|
93
|
+
sources.delete(source);
|
|
94
|
+
textures.set(texture, {
|
|
95
|
+
version: texture.version,
|
|
96
|
+
source,
|
|
97
|
+
sourceVersion: source.version,
|
|
98
|
+
image,
|
|
99
|
+
});
|
|
100
|
+
let cached = sources.get(source);
|
|
101
|
+
if (cached &&
|
|
102
|
+
cached.image === input &&
|
|
103
|
+
cached.version === source.version &&
|
|
104
|
+
cached.width === width &&
|
|
105
|
+
cached.height === height &&
|
|
106
|
+
cached.url === url) {
|
|
107
|
+
hits++;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
sources.delete(source);
|
|
111
|
+
try {
|
|
112
|
+
if (!Number.isSafeInteger(width * height * 4) ||
|
|
113
|
+
width <= 0 ||
|
|
114
|
+
height <= 0)
|
|
115
|
+
return report(texture, "TC_TEXTURE_CAPACITY", "Image dimensions exceed addressable RGBA8 storage.");
|
|
116
|
+
if (!canvas) {
|
|
117
|
+
canvas =
|
|
118
|
+
typeof OffscreenCanvas !== "undefined"
|
|
119
|
+
? new OffscreenCanvas(width, height)
|
|
120
|
+
: document.createElement("canvas");
|
|
121
|
+
}
|
|
122
|
+
canvas.width = width;
|
|
123
|
+
canvas.height = height;
|
|
124
|
+
// Resizing resets origin cleanliness, transforms and compositing.
|
|
125
|
+
context = canvas.getContext("2d", {
|
|
126
|
+
willReadFrequently: true,
|
|
127
|
+
colorSpace: "srgb",
|
|
128
|
+
});
|
|
129
|
+
if (!context)
|
|
130
|
+
return report(texture, "TC_TEXTURE_CANVAS_UNAVAILABLE", "Canvas2D is unavailable in this realm.");
|
|
131
|
+
context.drawImage(input, 0, 0, width, height);
|
|
132
|
+
const pixels = context.getImageData(0, 0, width, height, {
|
|
133
|
+
colorSpace: "srgb",
|
|
134
|
+
});
|
|
135
|
+
if (pixels.data.length !== width * height * 4)
|
|
136
|
+
return report(texture, "TC_TEXTURE_CAPACITY", "Canvas2D could not allocate the requested RGBA8 image.");
|
|
137
|
+
reads++;
|
|
138
|
+
cached = {
|
|
139
|
+
image: input,
|
|
140
|
+
version: source.version,
|
|
141
|
+
width,
|
|
142
|
+
height,
|
|
143
|
+
url,
|
|
144
|
+
data: pixels.data,
|
|
145
|
+
};
|
|
146
|
+
sources.set(source, cached);
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
const name = error instanceof Error ? error.name : "";
|
|
150
|
+
// A failed read never leaves a tainted or partially initialized canvas.
|
|
151
|
+
if (canvas) {
|
|
152
|
+
canvas.width = 0;
|
|
153
|
+
canvas.height = 0;
|
|
154
|
+
}
|
|
155
|
+
canvas = undefined;
|
|
156
|
+
context = undefined;
|
|
157
|
+
return report(texture, name === "SecurityError"
|
|
158
|
+
? "TC_TEXTURE_CROSS_ORIGIN"
|
|
159
|
+
: name === "RangeError" || name === "IndexSizeError"
|
|
160
|
+
? "TC_TEXTURE_CAPACITY"
|
|
161
|
+
: "TC_TEXTURE_READ_FAILED", name === "SecurityError"
|
|
162
|
+
? "Serve the image with CORS permission and set crossOrigin before src."
|
|
163
|
+
: "Canvas2D could not read this image; check decoding, image lifetime and host memory/canvas capacity.");
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
diagnostics.delete(texture.uuid);
|
|
167
|
+
// Typed arrays cannot be frozen. Never expose the cached buffer to callers.
|
|
168
|
+
try {
|
|
169
|
+
return Object.freeze({
|
|
170
|
+
width,
|
|
171
|
+
height,
|
|
172
|
+
data: cached.data.slice(),
|
|
173
|
+
channels: 4,
|
|
174
|
+
encoding: "unorm8",
|
|
175
|
+
origin: "image",
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
return report(texture, "TC_TEXTURE_CAPACITY", "The host could not allocate an independent RGBA8 result.");
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
inspect() {
|
|
183
|
+
return {
|
|
184
|
+
disposed,
|
|
185
|
+
requests,
|
|
186
|
+
canvasReads: reads,
|
|
187
|
+
cacheHits: hits,
|
|
188
|
+
nativeDelegations: delegated,
|
|
189
|
+
textures: textures.size,
|
|
190
|
+
sources: sources.size,
|
|
191
|
+
capacity: {
|
|
192
|
+
policy: "host",
|
|
193
|
+
maxBytes: null,
|
|
194
|
+
retainedBytes: Array.from(sources.values()).reduce((n, p) => n + p.data.byteLength, 0),
|
|
195
|
+
canvasBytes: canvas ? canvas.width * canvas.height * 4 : 0,
|
|
196
|
+
unknownResources: diagnostics.size,
|
|
197
|
+
},
|
|
198
|
+
diagnostics: Array.from(diagnostics.values(), (d) => ({ ...d })),
|
|
199
|
+
};
|
|
200
|
+
},
|
|
201
|
+
clear,
|
|
202
|
+
dispose() {
|
|
203
|
+
clear();
|
|
204
|
+
disposed = true;
|
|
205
|
+
},
|
|
206
|
+
};
|
|
207
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/** GPU-only depth-first escape layout; CPU acceleration ABI stays unchanged. */
|
|
2
|
+
export function packTraversalNodes(nodes) {
|
|
3
|
+
if (nodes.length % 8)
|
|
4
|
+
throw new Error("TC_TRACE_NODE_LAYOUT: Expected eight-float nodes.");
|
|
5
|
+
const output = nodes.slice(), visited = new Set();
|
|
6
|
+
const count = nodes.length / 8;
|
|
7
|
+
const visit = (index) => {
|
|
8
|
+
if (!Number.isSafeInteger(index) ||
|
|
9
|
+
index < 0 ||
|
|
10
|
+
index >= count ||
|
|
11
|
+
visited.has(index))
|
|
12
|
+
throw new Error("TC_TRACE_NODE_LAYOUT: Invalid or cyclic node pointer.");
|
|
13
|
+
visited.add(index);
|
|
14
|
+
const offset = index * 8;
|
|
15
|
+
if (nodes[offset + 7] > 0) {
|
|
16
|
+
return index + 1;
|
|
17
|
+
}
|
|
18
|
+
const left = nodes[offset + 3], right = -nodes[offset + 7];
|
|
19
|
+
if (left !== index + 1)
|
|
20
|
+
throw new Error("TC_TRACE_NODE_LAYOUT: Threading requires the validated depth-first node order.");
|
|
21
|
+
const endLeft = visit(left);
|
|
22
|
+
if (endLeft !== right)
|
|
23
|
+
throw new Error("TC_TRACE_NODE_LAYOUT: Sibling ranges overlap.");
|
|
24
|
+
const end = visit(right);
|
|
25
|
+
output[offset + 3] = end;
|
|
26
|
+
output[offset + 7] = 0;
|
|
27
|
+
return end;
|
|
28
|
+
};
|
|
29
|
+
if (count) {
|
|
30
|
+
const end = visit(0);
|
|
31
|
+
if (end !== count || visited.size !== count)
|
|
32
|
+
throw new Error("TC_TRACE_NODE_LAYOUT: Unreachable acceleration nodes.");
|
|
33
|
+
}
|
|
34
|
+
return output;
|
|
35
|
+
}
|
|
36
|
+
/** Positions/material/orientation occupy compact cache lines beside the node tree. */
|
|
37
|
+
export function packTraversalData(nodes, geometry) {
|
|
38
|
+
if (geometry.length % 72)
|
|
39
|
+
throw new Error("TC_TRACE_TRIANGLE_LAYOUT: Expected surface ABI triangles.");
|
|
40
|
+
const count = geometry.length / 72, output = new Float32Array(nodes.length + count * 12);
|
|
41
|
+
output.set(packTraversalNodes(nodes));
|
|
42
|
+
for (let index = 0; index < count; index++) {
|
|
43
|
+
const source = index * 72, target = nodes.length + index * 12;
|
|
44
|
+
output.set(geometry.subarray(source, source + 4), target);
|
|
45
|
+
output.set([
|
|
46
|
+
geometry[source + 4],
|
|
47
|
+
geometry[source + 5],
|
|
48
|
+
geometry[source + 6],
|
|
49
|
+
geometry[source + 63],
|
|
50
|
+
], target + 4);
|
|
51
|
+
output.set([geometry[source + 8], geometry[source + 9], geometry[source + 10], 0], target + 8);
|
|
52
|
+
}
|
|
53
|
+
return output;
|
|
54
|
+
}
|