@aura3d/rendering 1.3.2 → 1.4.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/AGENTS.md +46 -0
- package/dist/ForwardPass.d.ts +1 -0
- package/dist/ForwardPass.d.ts.map +1 -1
- package/dist/ForwardPass.js +29 -6
- package/dist/ForwardPass.js.map +1 -1
- package/dist/MorphTarget.d.ts +1 -0
- package/dist/MorphTarget.d.ts.map +1 -1
- package/dist/MorphTarget.js.map +1 -1
- package/dist/Renderer.js +7 -1
- package/dist/Renderer.js.map +1 -1
- package/dist/SkinnedLitMaterial.d.ts +9 -0
- package/dist/SkinnedLitMaterial.d.ts.map +1 -1
- package/dist/SkinnedLitMaterial.js +20 -1
- package/dist/SkinnedLitMaterial.js.map +1 -1
- package/dist/performance/RenderItemSorting.d.ts +2 -1
- package/dist/performance/RenderItemSorting.d.ts.map +1 -1
- package/dist/performance/RenderItemSorting.js +5 -2
- package/dist/performance/RenderItemSorting.js.map +1 -1
- package/package.json +3 -3
- package/src/ForwardPass.ts +30 -6
- package/src/MorphTarget.ts +1 -0
- package/src/Renderer.ts +6 -1
- package/src/SkinnedLitMaterial.ts +32 -1
- package/src/performance/RenderItemSorting.ts +6 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenderItemSorting.d.ts","sourceRoot":"","sources":["../../../../../packages/rendering/src/performance/RenderItemSorting.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,MAAM,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"RenderItemSorting.d.ts","sourceRoot":"","sources":["../../../../../packages/rendering/src/performance/RenderItemSorting.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,cAAc,GAAG,MAAM,GAAG,aAAa,CAAC;AAEnF,MAAM,WAAW,mBAAmB,CAAC,CAAC,GAAG,OAAO;IAC9C,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAC1C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAC1C;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC1C,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAAC;CAClD;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;CAC1C;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,KAAK,EAAE,SAAS,mBAAmB,CAAC,CAAC,CAAC,EAAE,EACxC,OAAO,GAAE,sBAA2B,GACnC,eAAe,CAAC,CAAC,CAAC,CA8CpB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,cAAc,EAAE,iBAAiB,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,kBAAkB,EAAE,GAAG,kBAAkB,EAAE,CAO1F"}
|
|
@@ -54,9 +54,11 @@ export function sortRenderItems(items) {
|
|
|
54
54
|
function bucketRank(bucket) {
|
|
55
55
|
if (bucket === "opaque")
|
|
56
56
|
return 0;
|
|
57
|
-
if (bucket === "
|
|
57
|
+
if (bucket === "transmission")
|
|
58
58
|
return 1;
|
|
59
|
-
|
|
59
|
+
if (bucket === "mask")
|
|
60
|
+
return 2;
|
|
61
|
+
return 3;
|
|
60
62
|
}
|
|
61
63
|
function validateRenderQueueItem(item, index) {
|
|
62
64
|
if (!Number.isFinite(item.depth)) {
|
|
@@ -101,6 +103,7 @@ function buildDiagnostics(items, opaqueFrontToBack, transparentBackToFront) {
|
|
|
101
103
|
largestBatch,
|
|
102
104
|
materialSwitches: pipelineTransitions,
|
|
103
105
|
opaqueCount: items.filter((item) => item.bucket === "opaque").length,
|
|
106
|
+
transmissionCount: items.filter((item) => item.bucket === "transmission").length,
|
|
104
107
|
maskedCount: items.filter((item) => item.bucket === "mask").length,
|
|
105
108
|
transparentCount: items.filter((item) => item.bucket === "transparent").length,
|
|
106
109
|
pipelineTransitions,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenderItemSorting.js","sourceRoot":"","sources":["../../../../../packages/rendering/src/performance/RenderItemSorting.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RenderItemSorting.js","sourceRoot":"","sources":["../../../../../packages/rendering/src/performance/RenderItemSorting.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aura3d/rendering",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
"main": "./dist/index.js",
|
|
12
12
|
"types": "./dist/index.d.ts",
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@aura3d/math": "1.
|
|
15
|
-
"@aura3d/scene": "1.
|
|
14
|
+
"@aura3d/math": "1.4.0",
|
|
15
|
+
"@aura3d/scene": "1.4.0"
|
|
16
16
|
},
|
|
17
17
|
"sideEffects": false
|
|
18
18
|
}
|
package/src/ForwardPass.ts
CHANGED
|
@@ -30,6 +30,7 @@ export interface RenderItem {
|
|
|
30
30
|
readonly instanceTransforms?: Float32Array | readonly number[];
|
|
31
31
|
readonly instanceColors?: Float32Array | readonly number[];
|
|
32
32
|
readonly instanceAttributes?: readonly RenderItemInstanceAttribute[];
|
|
33
|
+
readonly boundingBoxCenter?: readonly [number, number, number];
|
|
33
34
|
}
|
|
34
35
|
|
|
35
36
|
export interface RenderItemDrawRange {
|
|
@@ -541,7 +542,12 @@ function multiplyMat4(left: Mat4, right: Mat4): Mat4 {
|
|
|
541
542
|
}
|
|
542
543
|
|
|
543
544
|
function normalMatrixFromModel(modelMatrix: Mat4): Mat4 {
|
|
544
|
-
|
|
545
|
+
let matrix: Mat4;
|
|
546
|
+
try {
|
|
547
|
+
matrix = transposeMat4(invertMat4(modelMatrix));
|
|
548
|
+
} catch {
|
|
549
|
+
matrix = [...identityMatrix()] as Mat4;
|
|
550
|
+
}
|
|
545
551
|
return [
|
|
546
552
|
matrix[0], matrix[1], matrix[2], 0,
|
|
547
553
|
matrix[4], matrix[5], matrix[6], 0,
|
|
@@ -1225,7 +1231,7 @@ function sortForwardRenderItems(
|
|
|
1225
1231
|
): readonly RenderItem[] {
|
|
1226
1232
|
return sortRenderQueueItems(items.map((item) => ({
|
|
1227
1233
|
item,
|
|
1228
|
-
bucket: isTransparentRenderItem(item) ? "transparent" : "opaque",
|
|
1234
|
+
bucket: isTransparentRenderItem(item) ? "transparent" : isTransmissionRenderItem(item) ? "transmission" : "opaque",
|
|
1229
1235
|
depth: cameraPosition ? distanceSquaredFromCamera(item, cameraPosition) : 0,
|
|
1230
1236
|
pipelineKey: renderItemPipelineKey(item),
|
|
1231
1237
|
batchKey: renderItemPipelineKey(item),
|
|
@@ -1238,11 +1244,29 @@ function isTransparentRenderItem(item: RenderItem): boolean {
|
|
|
1238
1244
|
return getBaseMaterial(material).renderState.blend;
|
|
1239
1245
|
}
|
|
1240
1246
|
|
|
1247
|
+
function materialNumericParameter(material: Material, name: string, fallback: number): number {
|
|
1248
|
+
const value = material.getParameter(name);
|
|
1249
|
+
return typeof value === "number" && Number.isFinite(value) ? value : fallback;
|
|
1250
|
+
}
|
|
1251
|
+
|
|
1252
|
+
function isTransmissionRenderItem(item: RenderItem): boolean {
|
|
1253
|
+
const material = item.material ?? new UnlitMaterial();
|
|
1254
|
+
const baseMaterial = getBaseMaterial(material);
|
|
1255
|
+
if (baseMaterial.renderState.blend) return false;
|
|
1256
|
+
const transmissionFactor = materialNumericParameter(baseMaterial, "u_transmissionFactor", 0);
|
|
1257
|
+
const diffuseTransmissionFactor = materialNumericParameter(baseMaterial, "u_diffuseTransmissionFactor", 0);
|
|
1258
|
+
const volumeThicknessFactor = materialNumericParameter(baseMaterial, "u_volumeThicknessFactor", 0);
|
|
1259
|
+
return transmissionFactor > 0.001 || diffuseTransmissionFactor > 0.001 || volumeThicknessFactor > 0.001;
|
|
1260
|
+
}
|
|
1261
|
+
|
|
1241
1262
|
function distanceSquaredFromCamera(item: RenderItem, cameraPosition: readonly [number, number, number]): number {
|
|
1242
|
-
const
|
|
1243
|
-
const
|
|
1244
|
-
const
|
|
1245
|
-
const
|
|
1263
|
+
const center = item.boundingBoxCenter;
|
|
1264
|
+
const tx = center?.[0] ?? item.modelMatrix?.[12] ?? 0;
|
|
1265
|
+
const ty = center?.[1] ?? item.modelMatrix?.[13] ?? 0;
|
|
1266
|
+
const tz = center?.[2] ?? item.modelMatrix?.[14] ?? 0;
|
|
1267
|
+
const x = tx - cameraPosition[0];
|
|
1268
|
+
const y = ty - cameraPosition[1];
|
|
1269
|
+
const z = tz - cameraPosition[2];
|
|
1246
1270
|
return x * x + y * y + z * z;
|
|
1247
1271
|
}
|
|
1248
1272
|
|
package/src/MorphTarget.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { IndexBuffer } from "./IndexBuffer";
|
|
|
3
3
|
import { VertexBuffer } from "./VertexBuffer";
|
|
4
4
|
|
|
5
5
|
export interface MorphTargetDelta {
|
|
6
|
+
readonly name?: string;
|
|
6
7
|
readonly positions?: readonly (readonly [number, number, number])[];
|
|
7
8
|
readonly normals?: readonly (readonly [number, number, number])[];
|
|
8
9
|
readonly tangents?: readonly (readonly [number, number, number])[];
|
package/src/Renderer.ts
CHANGED
|
@@ -2496,7 +2496,12 @@ function sceneFromSource(source: RenderSource | Iterable<RenderItem> | Scene): S
|
|
|
2496
2496
|
}
|
|
2497
2497
|
|
|
2498
2498
|
function normalMatrixFromModel(modelMatrix: Mat4): Mat4 {
|
|
2499
|
-
|
|
2499
|
+
let matrix: Mat4;
|
|
2500
|
+
try {
|
|
2501
|
+
matrix = transposeMat4(invertMat4(modelMatrix));
|
|
2502
|
+
} catch {
|
|
2503
|
+
matrix = identityMat4();
|
|
2504
|
+
}
|
|
2500
2505
|
return [
|
|
2501
2506
|
matrix[0], matrix[1], matrix[2], 0,
|
|
2502
2507
|
matrix[4], matrix[5], matrix[6], 0,
|
|
@@ -18,6 +18,15 @@ export interface SkinnedLitMaterialOptions {
|
|
|
18
18
|
readonly occlusionTexture?: TextureBinding;
|
|
19
19
|
readonly occlusionStrength?: number;
|
|
20
20
|
readonly emissiveTexture?: TextureBinding;
|
|
21
|
+
readonly clearcoatTexture?: TextureBinding;
|
|
22
|
+
readonly clearcoatNormalTexture?: TextureBinding;
|
|
23
|
+
readonly sheenColorTexture?: TextureBinding;
|
|
24
|
+
readonly sheenRoughnessTexture?: TextureBinding;
|
|
25
|
+
readonly transmissionTexture?: TextureBinding;
|
|
26
|
+
readonly iridescenceTexture?: TextureBinding;
|
|
27
|
+
readonly iridescenceThicknessTexture?: TextureBinding;
|
|
28
|
+
readonly anisotropyTexture?: TextureBinding;
|
|
29
|
+
readonly volumeThicknessTexture?: TextureBinding;
|
|
21
30
|
readonly renderState?: Partial<RenderState>;
|
|
22
31
|
readonly metallic?: number;
|
|
23
32
|
readonly roughness?: number;
|
|
@@ -114,6 +123,13 @@ export class SkinnedLitMaterial extends Material {
|
|
|
114
123
|
if (!Number.isInteger(maxJoints) || maxJoints <= 0 || maxJoints > 96) {
|
|
115
124
|
throw new Error("SkinnedLitMaterial maxJoints must be an integer in [1, 96]");
|
|
116
125
|
}
|
|
126
|
+
|
|
127
|
+
// The skinned-lit shader supports glTF extension scalar factors only
|
|
128
|
+
// (u_clearcoatFactor, u_sheenColorFactor, ...); it declares no extension
|
|
129
|
+
// texture uniforms. Extension texture options (clearcoatTexture,
|
|
130
|
+
// sheenColorTexture, ...) are therefore accepted for glTF compatibility but
|
|
131
|
+
// intentionally NOT declared as uniforms — declaring them would make
|
|
132
|
+
// MaterialBinding fail validation against the shader.
|
|
117
133
|
super({
|
|
118
134
|
name: options.name ?? "skinned-lit",
|
|
119
135
|
shaderKey: DEFAULT_SKINNED_LIT_SHADER_NAME,
|
|
@@ -290,7 +306,22 @@ export class SkinnedLitMaterial extends Material {
|
|
|
290
306
|
}
|
|
291
307
|
|
|
292
308
|
function usesTextureCoordinates(options: SkinnedLitMaterialOptions): boolean {
|
|
293
|
-
return Boolean(
|
|
309
|
+
return Boolean(
|
|
310
|
+
options.baseColorTexture ||
|
|
311
|
+
options.normalTexture ||
|
|
312
|
+
options.metallicRoughnessTexture ||
|
|
313
|
+
options.occlusionTexture ||
|
|
314
|
+
options.emissiveTexture ||
|
|
315
|
+
options.clearcoatTexture ||
|
|
316
|
+
options.clearcoatNormalTexture ||
|
|
317
|
+
options.sheenColorTexture ||
|
|
318
|
+
options.sheenRoughnessTexture ||
|
|
319
|
+
options.transmissionTexture ||
|
|
320
|
+
options.iridescenceTexture ||
|
|
321
|
+
options.iridescenceThicknessTexture ||
|
|
322
|
+
options.anisotropyTexture ||
|
|
323
|
+
options.volumeThicknessTexture
|
|
324
|
+
);
|
|
294
325
|
}
|
|
295
326
|
|
|
296
327
|
function validateColor4(color: readonly [number, number, number, number], label: string): void {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type RenderQueueBucket = "opaque" | "mask" | "transparent";
|
|
1
|
+
export type RenderQueueBucket = "opaque" | "transmission" | "mask" | "transparent";
|
|
2
2
|
|
|
3
3
|
export interface RenderQueueSortItem<T = unknown> {
|
|
4
4
|
readonly item: T;
|
|
@@ -30,6 +30,7 @@ export interface RenderQueueSortDiagnostics {
|
|
|
30
30
|
readonly largestBatch: number;
|
|
31
31
|
readonly materialSwitches: number;
|
|
32
32
|
readonly opaqueCount: number;
|
|
33
|
+
readonly transmissionCount: number;
|
|
33
34
|
readonly maskedCount: number;
|
|
34
35
|
readonly transparentCount: number;
|
|
35
36
|
readonly pipelineTransitions: number;
|
|
@@ -106,8 +107,9 @@ export function sortRenderItems(items: readonly SortableRenderItem[]): SortableR
|
|
|
106
107
|
|
|
107
108
|
function bucketRank(bucket: RenderQueueBucket): number {
|
|
108
109
|
if (bucket === "opaque") return 0;
|
|
109
|
-
if (bucket === "
|
|
110
|
-
return 2;
|
|
110
|
+
if (bucket === "transmission") return 1;
|
|
111
|
+
if (bucket === "mask") return 2;
|
|
112
|
+
return 3;
|
|
111
113
|
}
|
|
112
114
|
|
|
113
115
|
function validateRenderQueueItem(item: RenderQueueSortItem, index: number): void {
|
|
@@ -158,6 +160,7 @@ function buildDiagnostics(
|
|
|
158
160
|
largestBatch,
|
|
159
161
|
materialSwitches: pipelineTransitions,
|
|
160
162
|
opaqueCount: items.filter((item) => item.bucket === "opaque").length,
|
|
163
|
+
transmissionCount: items.filter((item) => item.bucket === "transmission").length,
|
|
161
164
|
maskedCount: items.filter((item) => item.bucket === "mask").length,
|
|
162
165
|
transparentCount: items.filter((item) => item.bucket === "transparent").length,
|
|
163
166
|
pipelineTransitions,
|