@onerjs/core 8.56.1 → 8.56.3

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 (90) hide show
  1. package/Cameras/arcRotateCamera.pure.js +24 -0
  2. package/Cameras/arcRotateCamera.pure.js.map +1 -1
  3. package/Cameras/camera.pure.js +7 -7
  4. package/Cameras/camera.pure.js.map +1 -1
  5. package/Engines/abstractEngine.pure.js +2 -2
  6. package/Engines/abstractEngine.pure.js.map +1 -1
  7. package/Engines/constants.d.ts +5 -0
  8. package/Engines/constants.js +5 -0
  9. package/Engines/constants.js.map +1 -1
  10. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.d.ts +4 -0
  11. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.js +12 -0
  12. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.js.map +1 -1
  13. package/FrameGraph/Node/Blocks/inputBlock.pure.js +2 -1
  14. package/FrameGraph/Node/Blocks/inputBlock.pure.js.map +1 -1
  15. package/FrameGraph/Node/Types/nodeRenderGraphTypes.d.ts +2 -0
  16. package/FrameGraph/Node/Types/nodeRenderGraphTypes.js +2 -0
  17. package/FrameGraph/Node/Types/nodeRenderGraphTypes.js.map +1 -1
  18. package/FrameGraph/Tasks/Rendering/geometryRendererTask.d.ts +21 -0
  19. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js +45 -0
  20. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js.map +1 -1
  21. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.d.ts +1 -0
  22. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.js +18 -3
  23. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.js.map +1 -1
  24. package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js +5 -21
  25. package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js.map +1 -1
  26. package/Materials/Node/nodeMaterial.pure.d.ts +10 -0
  27. package/Materials/Node/nodeMaterial.pure.js +11 -0
  28. package/Materials/Node/nodeMaterial.pure.js.map +1 -1
  29. package/Materials/Node/nodeMaterialBuildState.d.ts +1 -0
  30. package/Materials/Node/nodeMaterialBuildState.js +7 -1
  31. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  32. package/Materials/PBR/openpbrMaterial.pure.d.ts +3 -0
  33. package/Materials/PBR/pbrBaseMaterial.pure.d.ts +3 -0
  34. package/Materials/Textures/textureProcessor.d.ts +29 -6
  35. package/Materials/Textures/textureProcessor.js +22 -16
  36. package/Materials/Textures/textureProcessor.js.map +1 -1
  37. package/Materials/materialHelper.geometryrendering.d.ts +19 -0
  38. package/Materials/materialHelper.geometryrendering.js +29 -1
  39. package/Materials/materialHelper.geometryrendering.js.map +1 -1
  40. package/Materials/prepass.defines.d.ts +3 -0
  41. package/Materials/prepass.defines.js +3 -0
  42. package/Materials/prepass.defines.js.map +1 -1
  43. package/Materials/standardMaterial.pure.d.ts +3 -0
  44. package/Maths/math.vector.pure.d.ts +1 -5
  45. package/Maths/math.vector.pure.js.map +1 -1
  46. package/Misc/filesInput.d.ts +15 -0
  47. package/Misc/filesInput.js +156 -74
  48. package/Misc/filesInput.js.map +1 -1
  49. package/Misc/tools.pure.js +1 -1
  50. package/Misc/tools.pure.js.map +1 -1
  51. package/Rendering/geometryBufferRenderer.pure.d.ts +30 -0
  52. package/Rendering/geometryBufferRenderer.pure.js +84 -0
  53. package/Rendering/geometryBufferRenderer.pure.js.map +1 -1
  54. package/Shaders/ShadersInclude/objectIdFunctions.d.ts +5 -0
  55. package/Shaders/ShadersInclude/objectIdFunctions.js +22 -0
  56. package/Shaders/ShadersInclude/objectIdFunctions.js.map +1 -0
  57. package/Shaders/ShadersInclude/openpbrBlockPrePass.js +3 -0
  58. package/Shaders/ShadersInclude/openpbrBlockPrePass.js.map +1 -1
  59. package/Shaders/ShadersInclude/pbrBlockPrePass.js +3 -0
  60. package/Shaders/ShadersInclude/pbrBlockPrePass.js.map +1 -1
  61. package/Shaders/ShadersInclude/prePassDeclaration.d.ts +1 -0
  62. package/Shaders/ShadersInclude/prePassDeclaration.js +5 -0
  63. package/Shaders/ShadersInclude/prePassDeclaration.js.map +1 -1
  64. package/Shaders/default.fragment.js +5 -1
  65. package/Shaders/default.fragment.js.map +1 -1
  66. package/Shaders/geometry.fragment.js +9 -1
  67. package/Shaders/geometry.fragment.js.map +1 -1
  68. package/Shaders/openpbr.fragment.js +2 -1
  69. package/Shaders/openpbr.fragment.js.map +1 -1
  70. package/Shaders/pbr.fragment.js +2 -1
  71. package/Shaders/pbr.fragment.js.map +1 -1
  72. package/ShadersWGSL/ShadersInclude/objectIdFunctions.d.ts +5 -0
  73. package/ShadersWGSL/ShadersInclude/objectIdFunctions.js +22 -0
  74. package/ShadersWGSL/ShadersInclude/objectIdFunctions.js.map +1 -0
  75. package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.js +3 -0
  76. package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.js.map +1 -1
  77. package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js +3 -0
  78. package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js.map +1 -1
  79. package/ShadersWGSL/ShadersInclude/prePassDeclaration.d.ts +1 -0
  80. package/ShadersWGSL/ShadersInclude/prePassDeclaration.js +5 -0
  81. package/ShadersWGSL/ShadersInclude/prePassDeclaration.js.map +1 -1
  82. package/ShadersWGSL/default.fragment.js +5 -1
  83. package/ShadersWGSL/default.fragment.js.map +1 -1
  84. package/ShadersWGSL/geometry.fragment.js +9 -1
  85. package/ShadersWGSL/geometry.fragment.js.map +1 -1
  86. package/ShadersWGSL/openpbr.fragment.js +2 -1
  87. package/ShadersWGSL/openpbr.fragment.js.map +1 -1
  88. package/ShadersWGSL/pbr.fragment.js +2 -1
  89. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  90. package/package.json +1 -1
@@ -8,6 +8,7 @@ import { type Scene } from "../scene.pure.js";
8
8
  import { type AbstractMesh } from "../Meshes/abstractMesh.pure.js";
9
9
  import { type Nullable } from "../types.js";
10
10
  import { ShaderLanguage } from "../Materials/shaderLanguage.js";
11
+ import { type GeometryRenderingObjectIdProvider } from "../Materials/materialHelper.geometryrendering.js";
11
12
  /** @internal */
12
13
  interface ISavedTransformationMatrix {
13
14
  world: Matrix;
@@ -76,6 +77,11 @@ export declare class GeometryBufferRenderer {
76
77
  * using getIndex(GeometryBufferRenderer.IRRADIANCE_TEXTURE_TYPE)
77
78
  */
78
79
  static readonly IRRADIANCE_TEXTURE_TYPE = 7;
80
+ /**
81
+ * Constant used to retrieve the object ID texture index in the G-Buffer textures array.
82
+ * Object IDs are stored as 24-bit unsigned integers encoded in the RGB channels.
83
+ */
84
+ static readonly OBJECT_ID_TEXTURE_TYPE = 8;
79
85
  /**
80
86
  * Dictionary used to store the previous transformation matrices of each rendered mesh
81
87
  * in order to compute objects velocities when enableVelocity is set to "true"
@@ -99,6 +105,16 @@ export declare class GeometryBufferRenderer {
99
105
  excludedSkinnedMeshesFromVelocity: AbstractMesh[];
100
106
  /** Gets or sets a boolean indicating if transparent meshes should be rendered */
101
107
  renderTransparentMeshes: boolean;
108
+ /**
109
+ * Provides the object ID written for each rendered mesh.
110
+ *
111
+ * IDs must be integers between 0 and 0xFFFFFF. ID 0 is reserved for background or excluded meshes.
112
+ * Instances use the ID of their source mesh. The default is the mesh unique ID.
113
+ * Default IDs are only stable for the lifetime of the current scene and should not be persisted.
114
+ * The provider runs in the render hot path and may be called multiple times for the same mesh in a frame.
115
+ * @see https://playground.babylonjs.com/#REC26C#0
116
+ */
117
+ objectIdProvider?: GeometryRenderingObjectIdProvider;
102
118
  /**
103
119
  * Gets or sets a boolean indicating if normals should be generated in world space (default: false, meaning normals are generated in view space)
104
120
  */
@@ -121,6 +137,7 @@ export declare class GeometryBufferRenderer {
121
137
  private _enableReflectivity;
122
138
  private _enableScreenspaceDepth;
123
139
  private _enableIrradiance;
140
+ private _enableObjectId;
124
141
  private _depthFormat;
125
142
  private _clearColor;
126
143
  private _clearDepthColor;
@@ -132,6 +149,7 @@ export declare class GeometryBufferRenderer {
132
149
  private _normalIndex;
133
150
  private _screenspaceDepthIndex;
134
151
  private _irradianceIndex;
152
+ private _objectIdIndex;
135
153
  private _linkedWithPrePass;
136
154
  private _prePassRenderer;
137
155
  private _attachmentsFromPrePass;
@@ -256,6 +274,18 @@ export declare class GeometryBufferRenderer {
256
274
  * Sets whether or not objects irradiance are enabled for the G buffer.
257
275
  */
258
276
  set enableIrradiance(enable: boolean);
277
+ /**
278
+ * Gets whether object IDs are enabled for the G buffer.
279
+ */
280
+ get enableObjectId(): boolean;
281
+ /**
282
+ * Sets whether object IDs are enabled for the G buffer.
283
+ *
284
+ * Object ID rendering currently requires a single-sample G buffer.
285
+ * Object ID rendering is not supported when the G buffer is linked to the PrePassRenderer.
286
+ * @see https://playground.babylonjs.com/#REC26C#0
287
+ */
288
+ set enableObjectId(enable: boolean);
259
289
  /**
260
290
  * This will store a mask in the alpha channel of the irradiance texture to indicate which pixels have
261
291
  * scattering and should be taken into account when applying image-based lighting.
@@ -12,6 +12,7 @@ import { BindClipPlane, PrepareStringDefinesForClipPlanes, AddClipPlaneUniforms
12
12
  import { BindMorphTargetParameters, BindSceneUniformBuffer, PrepareDefinesAndAttributesForMorphTargets, PushAttributesForInstances, PrepareDefinesForIBL, PrepareUniformsAndSamplersForIBL, } from "../Materials/materialHelper.functions.js";
13
13
  import { RegisterGeometryBufferRendererSceneComponent } from "./geometryBufferRendererSceneComponent.pure.js";
14
14
  import { IsGaussianSplattingClassName } from "../Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js";
15
+ import { _GetGeometryRenderingObjectId } from "../Materials/materialHelper.geometryrendering.js";
15
16
  export const Samplers = [
16
17
  "diffuseSampler",
17
18
  "bumpSampler",
@@ -54,6 +55,7 @@ export const Uniforms = [
54
55
  "morphTargetTextureInfo",
55
56
  "morphTargetTextureIndices",
56
57
  "boneTextureInfo",
58
+ "objectId",
57
59
  ];
58
60
  /**
59
61
  * This renderer is helpful to fill one of the render target with a geometry buffer.
@@ -103,6 +105,7 @@ export class GeometryBufferRenderer {
103
105
  this._enableVelocityLinear = false;
104
106
  this._enableScreenspaceDepth = false;
105
107
  this._enableIrradiance = false;
108
+ this._enableObjectId = false;
106
109
  this._attachmentsFromPrePass = [];
107
110
  }
108
111
  /**
@@ -143,6 +146,10 @@ export class GeometryBufferRenderer {
143
146
  this._irradianceIndex = index;
144
147
  this._enableIrradiance = true;
145
148
  }
149
+ else if (geometryBufferType === GeometryBufferRenderer.OBJECT_ID_TEXTURE_TYPE) {
150
+ this._objectIdIndex = index;
151
+ this._enableObjectId = true;
152
+ }
146
153
  }
147
154
  /**
148
155
  * @internal
@@ -202,6 +209,8 @@ export class GeometryBufferRenderer {
202
209
  return this._screenspaceDepthIndex;
203
210
  case GeometryBufferRenderer.IRRADIANCE_TEXTURE_TYPE:
204
211
  return this._irradianceIndex;
212
+ case GeometryBufferRenderer.OBJECT_ID_TEXTURE_TYPE:
213
+ return this._objectIdIndex;
205
214
  default:
206
215
  return -1;
207
216
  }
@@ -340,6 +349,43 @@ export class GeometryBufferRenderer {
340
349
  this._createRenderTargets();
341
350
  }
342
351
  }
352
+ /**
353
+ * Gets whether object IDs are enabled for the G buffer.
354
+ */
355
+ get enableObjectId() {
356
+ return this._enableObjectId;
357
+ }
358
+ /**
359
+ * Sets whether object IDs are enabled for the G buffer.
360
+ *
361
+ * Object ID rendering currently requires a single-sample G buffer.
362
+ * Object ID rendering is not supported when the G buffer is linked to the PrePassRenderer.
363
+ * @see https://playground.babylonjs.com/#REC26C#0
364
+ */
365
+ set enableObjectId(enable) {
366
+ if (enable && this._linkedWithPrePass) {
367
+ throw new Error("GeometryBufferRenderer: object ID textures are not supported when linked to the PrePassRenderer");
368
+ }
369
+ if (enable && this.samples !== 1) {
370
+ throw new Error("GeometryBufferRenderer: object ID textures currently require samples to be 1");
371
+ }
372
+ if (enable && !this._enableObjectId && !this._linkedWithPrePass) {
373
+ const engine = this._scene.getEngine();
374
+ const maxDrawBuffers = Math.min(engine.getCaps().maxDrawBuffers ?? 1, 8);
375
+ const attachmentCount = this._assignRenderTargetIndices()[0] + 1;
376
+ if (engine.getCaps().drawBuffersExtension && attachmentCount > maxDrawBuffers) {
377
+ throw new Error(`GeometryBufferRenderer: ${attachmentCount} color attachments were requested, but this engine supports at most ${maxDrawBuffers}`);
378
+ }
379
+ }
380
+ this._enableObjectId = enable;
381
+ if (!enable) {
382
+ this._objectIdIndex = -1;
383
+ }
384
+ if (!this._linkedWithPrePass) {
385
+ this.dispose();
386
+ this._createRenderTargets();
387
+ }
388
+ }
343
389
  /**
344
390
  * Gets the scene associated with the buffer.
345
391
  */
@@ -401,6 +447,7 @@ export class GeometryBufferRenderer {
401
447
  this._enableReflectivity = false;
402
448
  this._enableScreenspaceDepth = false;
403
449
  this._enableIrradiance = false;
450
+ this._enableObjectId = false;
404
451
  this._clearColor = new Color4(0, 0, 0, 0);
405
452
  this._clearDepthColor = new Color4(0, 0, 0, 1); // sets an invalid value by default - depth in the depth texture is view.z, so 0 is not possible because view.z can't be less than camera.minZ
406
453
  this._positionIndex = -1;
@@ -411,6 +458,7 @@ export class GeometryBufferRenderer {
411
458
  this._normalIndex = -1;
412
459
  this._screenspaceDepthIndex = -1;
413
460
  this._irradianceIndex = -1;
461
+ this._objectIdIndex = -1;
414
462
  this._linkedWithPrePass = false;
415
463
  /**
416
464
  * This will store a mask in the alpha channel of the irradiance texture to indicate which pixels have
@@ -764,6 +812,10 @@ export class GeometryBufferRenderer {
764
812
  }
765
813
  }
766
814
  }
815
+ if (this._enableObjectId) {
816
+ defines.push("#define OBJECT_ID");
817
+ defines.push("#define OBJECT_ID_INDEX " + this._objectIdIndex);
818
+ }
767
819
  if (this.generateNormalsInWorldSpace) {
768
820
  defines.push("#define NORMAL_WORLDSPACE");
769
821
  }
@@ -851,6 +903,9 @@ export class GeometryBufferRenderer {
851
903
  * Sets the number of samples used to render the buffer (anti aliasing).
852
904
  */
853
905
  set samples(value) {
906
+ if (this._enableObjectId && value !== 1) {
907
+ throw new Error("GeometryBufferRenderer: object ID textures currently require samples to be 1");
908
+ }
854
909
  this._multiRenderTarget.samples = value;
855
910
  }
856
911
  /**
@@ -919,11 +974,25 @@ export class GeometryBufferRenderer {
919
974
  textureNames.push("gBuffer_Irradiance");
920
975
  textureTypesAndFormats.push(this._textureTypesAndFormats[GeometryBufferRenderer.IRRADIANCE_TEXTURE_TYPE]);
921
976
  }
977
+ if (this._enableObjectId) {
978
+ this._objectIdIndex = count;
979
+ count++;
980
+ textureNames.push("gBuffer_ObjectId");
981
+ textureTypesAndFormats.push({
982
+ textureType: 0,
983
+ textureFormat: 5,
984
+ samplingMode: 1,
985
+ });
986
+ }
922
987
  return [count, textureNames, textureTypesAndFormats];
923
988
  }
924
989
  _createRenderTargets() {
925
990
  const engine = this._scene.getEngine();
926
991
  const [count, textureNames, textureTypesAndFormat] = this._assignRenderTargetIndices();
992
+ const maxDrawBuffers = Math.min(engine.getCaps().maxDrawBuffers ?? 1, 8);
993
+ if (engine.getCaps().drawBuffersExtension && count > maxDrawBuffers) {
994
+ throw new Error(`GeometryBufferRenderer: ${count} color attachments were requested, but this engine supports at most ${maxDrawBuffers}`);
995
+ }
927
996
  let type = 0;
928
997
  if (engine._caps.textureFloat && engine._caps.textureFloatLinearFiltering) {
929
998
  type = 1;
@@ -1274,6 +1343,16 @@ export class GeometryBufferRenderer {
1274
1343
  effect.setMatrix("previousWorld", this._previousTransformationMatrices[effectiveMesh.uniqueId].world);
1275
1344
  effect.setMatrix("previousViewProjection", this._previousTransformationMatrices[effectiveMesh.uniqueId].viewProjection);
1276
1345
  }
1346
+ if (this._enableObjectId) {
1347
+ let objectId = renderingMesh.uniqueId;
1348
+ if (this.objectIdProvider) {
1349
+ objectId = _GetGeometryRenderingObjectId(renderingMesh, this.objectIdProvider);
1350
+ }
1351
+ else if (objectId > 0xffffff) {
1352
+ throw new Error(`Invalid geometry object ID ${objectId} for mesh "${renderingMesh.name}". Object IDs must be integers between 0 and 0xFFFFFF.`);
1353
+ }
1354
+ effect.setFloat("objectId", objectId);
1355
+ }
1277
1356
  if (hardwareInstancedRendering && renderingMesh.hasThinInstances) {
1278
1357
  effect.setMatrix("world", world);
1279
1358
  }
@@ -1394,6 +1473,11 @@ GeometryBufferRenderer.VELOCITY_LINEAR_TEXTURE_TYPE = 6;
1394
1473
  * using getIndex(GeometryBufferRenderer.IRRADIANCE_TEXTURE_TYPE)
1395
1474
  */
1396
1475
  GeometryBufferRenderer.IRRADIANCE_TEXTURE_TYPE = 7;
1476
+ /**
1477
+ * Constant used to retrieve the object ID texture index in the G-Buffer textures array.
1478
+ * Object IDs are stored as 24-bit unsigned integers encoded in the RGB channels.
1479
+ */
1480
+ GeometryBufferRenderer.OBJECT_ID_TEXTURE_TYPE = 8;
1397
1481
  /**
1398
1482
  * @internal
1399
1483
  */