@babylonjs/core 7.11.1 → 7.11.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 (125) hide show
  1. package/Actions/abstractActionManager.d.ts +4 -0
  2. package/Actions/abstractActionManager.js +4 -0
  3. package/Actions/abstractActionManager.js.map +1 -1
  4. package/Animations/animatable.d.ts +10 -10
  5. package/Animations/animatable.js +5 -5
  6. package/Animations/animatable.js.map +1 -1
  7. package/Animations/animationGroupMask.d.ts +2 -2
  8. package/Animations/animationGroupMask.js +1 -1
  9. package/Animations/animationGroupMask.js.map +1 -1
  10. package/Animations/easing.d.ts +2 -2
  11. package/Animations/easing.js +1 -1
  12. package/Animations/easing.js.map +1 -1
  13. package/Behaviors/Meshes/attachToBoxBehavior.d.ts +3 -3
  14. package/Behaviors/Meshes/attachToBoxBehavior.js +3 -3
  15. package/Behaviors/Meshes/attachToBoxBehavior.js.map +1 -1
  16. package/Cameras/Inputs/freeCameraMouseInput.d.ts +2 -2
  17. package/Cameras/Inputs/freeCameraMouseInput.js +1 -1
  18. package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
  19. package/Cameras/Inputs/freeCameraTouchInput.d.ts +2 -2
  20. package/Cameras/Inputs/freeCameraTouchInput.js +1 -1
  21. package/Cameras/Inputs/freeCameraTouchInput.js.map +1 -1
  22. package/Culling/Helper/boundingInfoHelper.d.ts +28 -0
  23. package/Culling/Helper/boundingInfoHelper.js +178 -0
  24. package/Culling/Helper/boundingInfoHelper.js.map +1 -0
  25. package/Culling/Helper/webgl2BoundingHelper.d.ts +22 -0
  26. package/Culling/Helper/webgl2BoundingHelper.js +61 -0
  27. package/Culling/Helper/webgl2BoundingHelper.js.map +1 -0
  28. package/Culling/Octrees/octree.d.ts +2 -2
  29. package/Culling/Octrees/octree.js +1 -1
  30. package/Culling/Octrees/octree.js.map +1 -1
  31. package/Culling/index.d.ts +1 -0
  32. package/Culling/index.js +1 -0
  33. package/Culling/index.js.map +1 -1
  34. package/Culling/ray.d.ts +4 -4
  35. package/Culling/ray.js +2 -2
  36. package/Culling/ray.js.map +1 -1
  37. package/Debug/skeletonViewer.d.ts +6 -6
  38. package/Debug/skeletonViewer.js +3 -3
  39. package/Debug/skeletonViewer.js.map +1 -1
  40. package/DeviceInput/InputDevices/deviceSource.d.ts +2 -2
  41. package/DeviceInput/InputDevices/deviceSource.js +1 -1
  42. package/DeviceInput/InputDevices/deviceSource.js.map +1 -1
  43. package/Engines/Extensions/engine.transformFeedback.d.ts +5 -0
  44. package/Engines/Extensions/engine.transformFeedback.js +3 -0
  45. package/Engines/Extensions/engine.transformFeedback.js.map +1 -1
  46. package/Engines/abstractEngine.js +2 -3
  47. package/Engines/abstractEngine.js.map +1 -1
  48. package/Engines/engine.js +1 -0
  49. package/Engines/engine.js.map +1 -1
  50. package/Engines/nativeEngine.d.ts +7 -0
  51. package/Engines/nativeEngine.js +4 -1
  52. package/Engines/nativeEngine.js.map +1 -1
  53. package/Engines/webgpuEngine.js +1 -0
  54. package/Engines/webgpuEngine.js.map +1 -1
  55. package/Materials/Node/Blocks/Fragment/fragDepthBlock.js +1 -1
  56. package/Materials/Node/Blocks/Fragment/fragDepthBlock.js.map +1 -1
  57. package/Materials/Node/Blocks/Fragment/shadowMapBlock.js +1 -1
  58. package/Materials/Node/Blocks/Fragment/shadowMapBlock.js.map +1 -1
  59. package/Materials/Node/nodeMaterial.js +2 -0
  60. package/Materials/Node/nodeMaterial.js.map +1 -1
  61. package/Materials/effectRenderer.d.ts +2 -1
  62. package/Materials/effectRenderer.js +5 -2
  63. package/Materials/effectRenderer.js.map +1 -1
  64. package/Maths/math.color.d.ts +14 -14
  65. package/Maths/math.color.js +7 -7
  66. package/Maths/math.color.js.map +1 -1
  67. package/Maths/math.isovector.d.ts +4 -4
  68. package/Maths/math.isovector.js +2 -2
  69. package/Maths/math.isovector.js.map +1 -1
  70. package/Maths/math.vector.d.ts +12 -12
  71. package/Maths/math.vector.js +6 -6
  72. package/Maths/math.vector.js.map +1 -1
  73. package/Maths/math.vertexFormat.d.ts +10 -10
  74. package/Maths/math.vertexFormat.js +5 -5
  75. package/Maths/math.vertexFormat.js.map +1 -1
  76. package/Meshes/abstractMesh.d.ts +1 -1
  77. package/Meshes/abstractMesh.js +2 -2
  78. package/Meshes/abstractMesh.js.map +1 -1
  79. package/Meshes/mesh.d.ts +4 -0
  80. package/Meshes/mesh.js +17 -4
  81. package/Meshes/mesh.js.map +1 -1
  82. package/Misc/observable.d.ts +4 -4
  83. package/Misc/observable.js +2 -2
  84. package/Misc/observable.js.map +1 -1
  85. package/Misc/sceneOptimizer.d.ts +3 -3
  86. package/Misc/sceneOptimizer.js +2 -2
  87. package/Misc/sceneOptimizer.js.map +1 -1
  88. package/Particles/EmitterTypes/coneParticleEmitter.d.ts +2 -2
  89. package/Particles/EmitterTypes/coneParticleEmitter.js +1 -1
  90. package/Particles/EmitterTypes/coneParticleEmitter.js.map +1 -1
  91. package/Particles/EmitterTypes/cylinderParticleEmitter.d.ts +8 -8
  92. package/Particles/EmitterTypes/cylinderParticleEmitter.js +4 -4
  93. package/Particles/EmitterTypes/cylinderParticleEmitter.js.map +1 -1
  94. package/Particles/EmitterTypes/hemisphericParticleEmitter.d.ts +6 -6
  95. package/Particles/EmitterTypes/hemisphericParticleEmitter.js +3 -3
  96. package/Particles/EmitterTypes/hemisphericParticleEmitter.js.map +1 -1
  97. package/Particles/EmitterTypes/sphereParticleEmitter.d.ts +6 -6
  98. package/Particles/EmitterTypes/sphereParticleEmitter.js +3 -3
  99. package/Particles/EmitterTypes/sphereParticleEmitter.js.map +1 -1
  100. package/Particles/pointsCloudSystem.d.ts +0 -1
  101. package/Particles/pointsCloudSystem.js +0 -1
  102. package/Particles/pointsCloudSystem.js.map +1 -1
  103. package/Rendering/fluidRenderer/fluidRenderingObject.js +2 -2
  104. package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
  105. package/Shaders/gpuTransform.fragment.d.ts +5 -0
  106. package/Shaders/gpuTransform.fragment.js +11 -0
  107. package/Shaders/gpuTransform.fragment.js.map +1 -0
  108. package/Shaders/gpuTransform.vertex.d.ts +13 -0
  109. package/Shaders/gpuTransform.vertex.js +33 -0
  110. package/Shaders/gpuTransform.vertex.js.map +1 -0
  111. package/XR/features/WebXRBackgroundRemover.d.ts +2 -2
  112. package/XR/features/WebXRBackgroundRemover.js +1 -1
  113. package/XR/features/WebXRBackgroundRemover.js.map +1 -1
  114. package/XR/features/WebXRHitTest.d.ts +2 -2
  115. package/XR/features/WebXRHitTest.js +1 -1
  116. package/XR/features/WebXRHitTest.js.map +1 -1
  117. package/XR/features/WebXRHitTestLegacy.d.ts +2 -2
  118. package/XR/features/WebXRHitTestLegacy.js +1 -1
  119. package/XR/features/WebXRHitTestLegacy.js.map +1 -1
  120. package/XR/features/WebXRRawCameraAccess.js +0 -2
  121. package/XR/features/WebXRRawCameraAccess.js.map +1 -1
  122. package/XR/motionController/webXRAbstractMotionController.d.ts +2 -0
  123. package/XR/motionController/webXRAbstractMotionController.js +1 -0
  124. package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
  125. package/package.json +1 -1
@@ -0,0 +1,178 @@
1
+ import { WebGL2BoundingHelper } from "./webgl2BoundingHelper.js";
2
+ import { VertexBuffer, Buffer } from "../../Buffers/buffer.js";
3
+ import { BindBonesParameters, BindMorphTargetParameters, PrepareAttributesForBakedVertexAnimation } from "../../Materials/materialHelper.functions.js";
4
+ /**
5
+ * Utility class to help with bounding info management
6
+ * #BCNJD4#5
7
+ * #BCNJD4#14
8
+ */
9
+ export class BoundingInfoHelper {
10
+ /**
11
+ * Creates a new BoundingInfoHelper
12
+ * @param engine defines the engine to use
13
+ */
14
+ constructor(engine) {
15
+ this._buffers = {};
16
+ this._effects = {};
17
+ if (engine.createTransformFeedback) {
18
+ // Go down the WebGL2 path
19
+ this._platform = new WebGL2BoundingHelper(engine);
20
+ }
21
+ }
22
+ /**
23
+ * Compute the bounding info of a mesh using shaders
24
+ * @param mesh defines the mesh to update
25
+ * @returns a promise that resolves when the bounding info is computed
26
+ */
27
+ computeAsync(mesh) {
28
+ return new Promise((resolve) => {
29
+ const source = mesh.getVertexBuffer(VertexBuffer.PositionKind);
30
+ if (!source) {
31
+ resolve(); // Take no action if mesh has no position
32
+ return;
33
+ }
34
+ const vertexCount = mesh.getTotalVertices();
35
+ let targetBuffer;
36
+ if (!this._buffers[mesh.uniqueId]) {
37
+ const targetData = new Float32Array(vertexCount * 3);
38
+ targetBuffer = new Buffer(mesh.getEngine(), targetData, true, 3);
39
+ this._buffers[mesh.uniqueId] = targetBuffer;
40
+ }
41
+ else {
42
+ targetBuffer = this._buffers[mesh.uniqueId];
43
+ }
44
+ // Get correct effect
45
+ let computeEffect;
46
+ let numInfluencers = 0;
47
+ const defines = [];
48
+ let uniforms = [];
49
+ const attribs = [VertexBuffer.PositionKind];
50
+ const samplers = [];
51
+ // Bones
52
+ if (mesh && mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {
53
+ attribs.push(VertexBuffer.MatricesIndicesKind);
54
+ attribs.push(VertexBuffer.MatricesWeightsKind);
55
+ if (mesh.numBoneInfluencers > 4) {
56
+ attribs.push(VertexBuffer.MatricesIndicesExtraKind);
57
+ attribs.push(VertexBuffer.MatricesWeightsExtraKind);
58
+ }
59
+ const skeleton = mesh.skeleton;
60
+ defines.push("#define NUM_BONE_INFLUENCERS " + mesh.numBoneInfluencers);
61
+ if (skeleton.isUsingTextureForMatrices) {
62
+ defines.push("#define BONETEXTURE");
63
+ if (uniforms.indexOf("boneTextureWidth") === -1) {
64
+ uniforms.push("boneTextureWidth");
65
+ }
66
+ if (samplers.indexOf("boneSampler") === -1) {
67
+ samplers.push("boneSampler");
68
+ }
69
+ }
70
+ else {
71
+ defines.push("#define BonesPerMesh " + (skeleton.bones.length + 1));
72
+ if (uniforms.indexOf("mBones") === -1) {
73
+ uniforms.push("mBones");
74
+ }
75
+ }
76
+ }
77
+ else {
78
+ defines.push("#define NUM_BONE_INFLUENCERS 0");
79
+ }
80
+ // Morph
81
+ const manager = mesh ? mesh.morphTargetManager : null;
82
+ if (manager) {
83
+ numInfluencers = manager.numMaxInfluencers || manager.numInfluencers;
84
+ if (numInfluencers > 0) {
85
+ defines.push("#define MORPHTARGETS");
86
+ }
87
+ if (manager.isUsingTextureForTargets) {
88
+ defines.push("#define MORPHTARGETS_TEXTURE");
89
+ if (uniforms.indexOf("morphTargetTextureIndices") === -1) {
90
+ uniforms.push("morphTargetTextureIndices");
91
+ }
92
+ if (samplers.indexOf("morphTargets") === -1) {
93
+ samplers.push("morphTargets");
94
+ }
95
+ }
96
+ defines.push("#define NUM_MORPH_INFLUENCERS " + numInfluencers);
97
+ for (let index = 0; index < numInfluencers; index++) {
98
+ attribs.push(VertexBuffer.PositionKind + index);
99
+ }
100
+ if (numInfluencers > 0) {
101
+ uniforms = uniforms.slice();
102
+ uniforms.push("morphTargetInfluences");
103
+ uniforms.push("morphTargetCount");
104
+ uniforms.push("morphTargetTextureInfo");
105
+ uniforms.push("morphTargetTextureIndices");
106
+ }
107
+ }
108
+ // Baked Vertex Animation
109
+ const bvaManager = mesh.bakedVertexAnimationManager;
110
+ if (bvaManager && bvaManager.isEnabled) {
111
+ defines.push("#define BAKED_VERTEX_ANIMATION_TEXTURE");
112
+ if (uniforms.indexOf("bakedVertexAnimationSettings") === -1) {
113
+ uniforms.push("bakedVertexAnimationSettings");
114
+ }
115
+ if (uniforms.indexOf("bakedVertexAnimationTextureSizeInverted") === -1) {
116
+ uniforms.push("bakedVertexAnimationTextureSizeInverted");
117
+ }
118
+ if (uniforms.indexOf("bakedVertexAnimationTime") === -1) {
119
+ uniforms.push("bakedVertexAnimationTime");
120
+ }
121
+ if (samplers.indexOf("bakedVertexAnimationTexture") === -1) {
122
+ samplers.push("bakedVertexAnimationTexture");
123
+ }
124
+ PrepareAttributesForBakedVertexAnimation(attribs, mesh, defines);
125
+ }
126
+ const join = defines.join("\n");
127
+ if (!this._effects[join]) {
128
+ computeEffect = this._platform.createUpdateEffect(attribs, join, uniforms, samplers, numInfluencers);
129
+ this._effects[join] = computeEffect;
130
+ }
131
+ else {
132
+ computeEffect = this._effects[join];
133
+ }
134
+ if (computeEffect.isReady()) {
135
+ this._updateBuffer(mesh, computeEffect, targetBuffer, resolve);
136
+ return;
137
+ }
138
+ computeEffect.onCompileObservable.addOnce(() => {
139
+ this._updateBuffer(mesh, computeEffect, targetBuffer, resolve);
140
+ });
141
+ });
142
+ }
143
+ _updateBuffer(mesh, effect, target, resolve) {
144
+ effect.getEngine().enableEffect(effect);
145
+ const vertexCount = mesh.getTotalVertices();
146
+ mesh._bindDirect(effect, null, true);
147
+ // Bones
148
+ BindBonesParameters(mesh, effect);
149
+ // Morph targets
150
+ const manager = mesh.morphTargetManager;
151
+ if (manager && manager.numInfluencers > 0) {
152
+ BindMorphTargetParameters(mesh, effect);
153
+ }
154
+ // BVA
155
+ const bvaManager = mesh.bakedVertexAnimationManager;
156
+ if (bvaManager && bvaManager.isEnabled) {
157
+ mesh.bakedVertexAnimationManager?.bind(effect, false);
158
+ }
159
+ // Execute
160
+ this._platform.updateBuffer(vertexCount, target);
161
+ // Retrieve data
162
+ mesh._refreshBoundingInfo(target.getData(), null);
163
+ resolve();
164
+ }
165
+ /**
166
+ * Dispose and release associated resources
167
+ */
168
+ dispose() {
169
+ for (const key in this._buffers) {
170
+ this._buffers[key].dispose();
171
+ }
172
+ for (const key in this._effects) {
173
+ this._effects[key].dispose();
174
+ }
175
+ this._platform.dispose();
176
+ }
177
+ }
178
+ //# sourceMappingURL=boundingInfoHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boundingInfoHelper.js","sourceRoot":"","sources":["../../../../../dev/core/src/Culling/Helper/boundingInfoHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebGL2BoundingHelper } from \"./webgl2BoundingHelper\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\nimport { VertexBuffer, Buffer } from \"core/Buffers/buffer\";\r\nimport { BindBonesParameters, BindMorphTargetParameters, PrepareAttributesForBakedVertexAnimation } from \"core/Materials/materialHelper.functions\";\r\nimport type { Effect } from \"core/Materials/effect\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport type { Engine } from \"core/Engines/engine\";\r\n\r\n/**\r\n * Utility class to help with bounding info management\r\n * #BCNJD4#5\r\n * #BCNJD4#14\r\n */\r\nexport class BoundingInfoHelper {\r\n private _platform: WebGL2BoundingHelper;\r\n private _buffers: { [key: number]: Buffer } = {};\r\n private _effects: { [key: string]: Effect } = {};\r\n\r\n /**\r\n * Creates a new BoundingInfoHelper\r\n * @param engine defines the engine to use\r\n */\r\n public constructor(engine: AbstractEngine) {\r\n if ((engine as Engine).createTransformFeedback) {\r\n // Go down the WebGL2 path\r\n this._platform = new WebGL2BoundingHelper(engine as Engine);\r\n }\r\n }\r\n\r\n /**\r\n * Compute the bounding info of a mesh using shaders\r\n * @param mesh defines the mesh to update\r\n * @returns a promise that resolves when the bounding info is computed\r\n */\r\n public computeAsync(mesh: Mesh): Promise<void> {\r\n return new Promise((resolve) => {\r\n const source = mesh.getVertexBuffer(VertexBuffer.PositionKind);\r\n\r\n if (!source) {\r\n resolve(); // Take no action if mesh has no position\r\n return;\r\n }\r\n\r\n const vertexCount = mesh.getTotalVertices();\r\n\r\n let targetBuffer: Buffer;\r\n if (!this._buffers[mesh.uniqueId]) {\r\n const targetData = new Float32Array(vertexCount * 3);\r\n targetBuffer = new Buffer(mesh.getEngine(), targetData, true, 3);\r\n this._buffers[mesh.uniqueId] = targetBuffer;\r\n } else {\r\n targetBuffer = this._buffers[mesh.uniqueId];\r\n }\r\n\r\n // Get correct effect\r\n let computeEffect: Effect;\r\n let numInfluencers = 0;\r\n const defines: string[] = [];\r\n let uniforms: string[] = [];\r\n const attribs = [VertexBuffer.PositionKind];\r\n const samplers: string[] = [];\r\n\r\n // Bones\r\n if (mesh && mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {\r\n attribs.push(VertexBuffer.MatricesIndicesKind);\r\n attribs.push(VertexBuffer.MatricesWeightsKind);\r\n if (mesh.numBoneInfluencers > 4) {\r\n attribs.push(VertexBuffer.MatricesIndicesExtraKind);\r\n attribs.push(VertexBuffer.MatricesWeightsExtraKind);\r\n }\r\n\r\n const skeleton = mesh.skeleton;\r\n\r\n defines.push(\"#define NUM_BONE_INFLUENCERS \" + mesh.numBoneInfluencers);\r\n\r\n if (skeleton.isUsingTextureForMatrices) {\r\n defines.push(\"#define BONETEXTURE\");\r\n\r\n if (uniforms.indexOf(\"boneTextureWidth\") === -1) {\r\n uniforms.push(\"boneTextureWidth\");\r\n }\r\n\r\n if (samplers.indexOf(\"boneSampler\") === -1) {\r\n samplers.push(\"boneSampler\");\r\n }\r\n } else {\r\n defines.push(\"#define BonesPerMesh \" + (skeleton.bones.length + 1));\r\n\r\n if (uniforms.indexOf(\"mBones\") === -1) {\r\n uniforms.push(\"mBones\");\r\n }\r\n }\r\n } else {\r\n defines.push(\"#define NUM_BONE_INFLUENCERS 0\");\r\n }\r\n\r\n // Morph\r\n const manager = mesh ? (<Mesh>mesh).morphTargetManager : null;\r\n if (manager) {\r\n numInfluencers = manager.numMaxInfluencers || manager.numInfluencers;\r\n if (numInfluencers > 0) {\r\n defines.push(\"#define MORPHTARGETS\");\r\n }\r\n if (manager.isUsingTextureForTargets) {\r\n defines.push(\"#define MORPHTARGETS_TEXTURE\");\r\n\r\n if (uniforms.indexOf(\"morphTargetTextureIndices\") === -1) {\r\n uniforms.push(\"morphTargetTextureIndices\");\r\n }\r\n\r\n if (samplers.indexOf(\"morphTargets\") === -1) {\r\n samplers.push(\"morphTargets\");\r\n }\r\n }\r\n defines.push(\"#define NUM_MORPH_INFLUENCERS \" + numInfluencers);\r\n for (let index = 0; index < numInfluencers; index++) {\r\n attribs.push(VertexBuffer.PositionKind + index);\r\n }\r\n if (numInfluencers > 0) {\r\n uniforms = uniforms.slice();\r\n uniforms.push(\"morphTargetInfluences\");\r\n uniforms.push(\"morphTargetCount\");\r\n uniforms.push(\"morphTargetTextureInfo\");\r\n uniforms.push(\"morphTargetTextureIndices\");\r\n }\r\n }\r\n\r\n // Baked Vertex Animation\r\n const bvaManager = (<Mesh>mesh).bakedVertexAnimationManager;\r\n\r\n if (bvaManager && bvaManager.isEnabled) {\r\n defines.push(\"#define BAKED_VERTEX_ANIMATION_TEXTURE\");\r\n if (uniforms.indexOf(\"bakedVertexAnimationSettings\") === -1) {\r\n uniforms.push(\"bakedVertexAnimationSettings\");\r\n }\r\n if (uniforms.indexOf(\"bakedVertexAnimationTextureSizeInverted\") === -1) {\r\n uniforms.push(\"bakedVertexAnimationTextureSizeInverted\");\r\n }\r\n if (uniforms.indexOf(\"bakedVertexAnimationTime\") === -1) {\r\n uniforms.push(\"bakedVertexAnimationTime\");\r\n }\r\n\r\n if (samplers.indexOf(\"bakedVertexAnimationTexture\") === -1) {\r\n samplers.push(\"bakedVertexAnimationTexture\");\r\n }\r\n PrepareAttributesForBakedVertexAnimation(attribs, mesh, defines);\r\n }\r\n\r\n const join = defines.join(\"\\n\");\r\n if (!this._effects[join]) {\r\n computeEffect = this._platform.createUpdateEffect(attribs, join, uniforms, samplers, numInfluencers);\r\n this._effects[join] = computeEffect;\r\n } else {\r\n computeEffect = this._effects[join];\r\n }\r\n\r\n if (computeEffect.isReady()) {\r\n this._updateBuffer(mesh, computeEffect, targetBuffer, resolve);\r\n return;\r\n }\r\n\r\n computeEffect.onCompileObservable.addOnce(() => {\r\n this._updateBuffer(mesh, computeEffect, targetBuffer, resolve);\r\n });\r\n });\r\n }\r\n\r\n private _updateBuffer(mesh: Mesh, effect: Effect, target: Buffer, resolve: () => void): void {\r\n effect.getEngine().enableEffect(effect);\r\n const vertexCount = mesh.getTotalVertices();\r\n mesh._bindDirect(effect, null, true);\r\n\r\n // Bones\r\n BindBonesParameters(mesh, effect);\r\n\r\n // Morph targets\r\n const manager = (<Mesh>mesh).morphTargetManager;\r\n if (manager && manager.numInfluencers > 0) {\r\n BindMorphTargetParameters(<Mesh>mesh, effect);\r\n }\r\n\r\n // BVA\r\n const bvaManager = (<Mesh>mesh).bakedVertexAnimationManager;\r\n\r\n if (bvaManager && bvaManager.isEnabled) {\r\n mesh.bakedVertexAnimationManager?.bind(effect, false);\r\n }\r\n\r\n // Execute\r\n this._platform.updateBuffer(vertexCount, target);\r\n\r\n // Retrieve data\r\n mesh._refreshBoundingInfo(target.getData()! as Float32Array, null);\r\n\r\n resolve();\r\n }\r\n\r\n /**\r\n * Dispose and release associated resources\r\n */\r\n public dispose(): void {\r\n for (const key in this._buffers) {\r\n this._buffers[key].dispose();\r\n }\r\n for (const key in this._effects) {\r\n this._effects[key].dispose();\r\n }\r\n this._platform.dispose();\r\n }\r\n}\r\n"]}
@@ -0,0 +1,22 @@
1
+ import type { Effect } from "../../Materials/effect.js";
2
+ import type { ThinEngine } from "../../Engines/thinEngine.js";
3
+ import type { Buffer } from "../../Meshes/buffer.js";
4
+ import "../../Shaders/gpuTransform.vertex";
5
+ import "../../Shaders/gpuTransform.fragment";
6
+ /** @internal */
7
+ export declare class WebGL2BoundingHelper {
8
+ private _engine;
9
+ private _computeEffect;
10
+ private _computeEffectOptions;
11
+ /**
12
+ * Creates a new WebGL2BoundingHelper
13
+ * @param engine defines the engine to use
14
+ */
15
+ constructor(engine: ThinEngine);
16
+ /** @internal */
17
+ createUpdateEffect(attributes: string[], defines: string, uniforms: string[], samplers: string[], numInfluencers: number): Effect;
18
+ /** @internal */
19
+ updateBuffer(count: number, targetBuffer: Buffer): void;
20
+ /** @internal */
21
+ dispose(): void;
22
+ }
@@ -0,0 +1,61 @@
1
+
2
+ import { RegisterClass } from "../../Misc/typeStore.js";
3
+ import "../../Shaders/gpuTransform.vertex.js";
4
+ import "../../Shaders/gpuTransform.fragment.js";
5
+ /** @internal */
6
+ export class WebGL2BoundingHelper {
7
+ /**
8
+ * Creates a new WebGL2BoundingHelper
9
+ * @param engine defines the engine to use
10
+ */
11
+ constructor(engine) {
12
+ this._engine = engine;
13
+ this._computeEffectOptions = {
14
+ attributes: ["position"],
15
+ uniformsNames: [],
16
+ uniformBuffersNames: [],
17
+ samplers: [],
18
+ defines: "",
19
+ fallbacks: null,
20
+ onCompiled: null,
21
+ onError: null,
22
+ indexParameters: null,
23
+ maxSimultaneousLights: 0,
24
+ transformFeedbackVaryings: [],
25
+ };
26
+ }
27
+ /** @internal */
28
+ createUpdateEffect(attributes, defines, uniforms, samplers, numInfluencers) {
29
+ this._computeEffectOptions.transformFeedbackVaryings = ["outPosition"];
30
+ this._computeEffectOptions.attributes = attributes;
31
+ this._computeEffectOptions.defines = defines;
32
+ this._computeEffectOptions.uniformsNames = uniforms;
33
+ this._computeEffectOptions.samplers = samplers;
34
+ this._computeEffectOptions.indexParameters = { maxSimultaneousMorphTargets: numInfluencers };
35
+ this._computeEffect = this._engine.createEffect("gpuTransform", this._computeEffectOptions, this._engine);
36
+ return this._computeEffect;
37
+ }
38
+ /** @internal */
39
+ updateBuffer(count, targetBuffer) {
40
+ const engine = this._engine;
41
+ // Update
42
+ engine.bindTransformFeedbackBuffer(targetBuffer.getBuffer());
43
+ engine.setRasterizerState(false);
44
+ engine.beginTransformFeedback(true);
45
+ engine.drawArraysType(2, 0, count);
46
+ engine.endTransformFeedback();
47
+ engine.setRasterizerState(true);
48
+ engine.readTransformFeedbackBuffer(targetBuffer.getData());
49
+ engine.bindTransformFeedbackBuffer(null);
50
+ }
51
+ /** @internal */
52
+ dispose() {
53
+ if (this._computeEffect) {
54
+ this._computeEffect.dispose();
55
+ }
56
+ this._computeEffect = null;
57
+ this._engine = null;
58
+ }
59
+ }
60
+ RegisterClass("BABYLON.WebGL2BoundingHelper", WebGL2BoundingHelper);
61
+ //# sourceMappingURL=webgl2BoundingHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgl2BoundingHelper.js","sourceRoot":"","sources":["../../../../../dev/core/src/Culling/Helper/webgl2BoundingHelper.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,mCAA+B;AACnD,OAAO,EAAE,aAAa,EAAE,gCAA4B;AAGpD,OAAO,mCAAmC,CAAC;AAC3C,OAAO,qCAAqC,CAAC;AAE7C,gBAAgB;AAChB,MAAM,OAAO,oBAAoB;IAK7B;;;OAGG;IACH,YAAY,MAAkB;QAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QAEtB,IAAI,CAAC,qBAAqB,GAAG;YACzB,UAAU,EAAE,CAAC,UAAU,CAAC;YACxB,aAAa,EAAE,EAAE;YACjB,mBAAmB,EAAE,EAAE;YACvB,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,IAAI;YACf,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,IAAI;YACb,eAAe,EAAE,IAAI;YACrB,qBAAqB,EAAE,CAAC;YACxB,yBAAyB,EAAE,EAAE;SAChC,CAAC;IACN,CAAC;IAED,gBAAgB;IACT,kBAAkB,CAAC,UAAoB,EAAE,OAAe,EAAE,QAAkB,EAAE,QAAkB,EAAE,cAAsB;QAC3H,IAAI,CAAC,qBAAqB,CAAC,yBAAyB,GAAG,CAAC,aAAa,CAAC,CAAC;QAEvE,IAAI,CAAC,qBAAqB,CAAC,UAAU,GAAG,UAAU,CAAC;QACnD,IAAI,CAAC,qBAAqB,CAAC,OAAO,GAAG,OAAO,CAAC;QAC7C,IAAI,CAAC,qBAAqB,CAAC,aAAa,GAAG,QAAQ,CAAC;QACpD,IAAI,CAAC,qBAAqB,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC/C,IAAI,CAAC,qBAAqB,CAAC,eAAe,GAAG,EAAE,2BAA2B,EAAE,cAAc,EAAE,CAAC;QAC7F,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAQ,CAAC,YAAY,CAAC,cAAc,EAAE,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,OAAQ,CAAC,CAAC;QAE5G,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED,gBAAgB;IACT,YAAY,CAAC,KAAa,EAAE,YAAoB;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAiB,CAAC;QAEtC,SAAS;QACT,MAAM,CAAC,2BAA2B,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,sBAAsB,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAClE,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAC9B,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,2BAA2B,CAAC,YAAY,CAAC,OAAO,EAAsB,CAAC,CAAC;QAC/E,MAAM,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,gBAAgB;IACT,OAAO;QACV,IAAI,IAAI,CAAC,cAAc,EAAE;YACrB,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;SACjC;QACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACxB,CAAC;CACJ;AAED,aAAa,CAAC,8BAA8B,EAAE,oBAAoB,CAAC,CAAC","sourcesContent":["import type { Effect, IEffectCreationOptions } from \"core/Materials/effect\";\r\nimport type { ThinEngine } from \"core/Engines/thinEngine\";\r\nimport type { Buffer } from \"core/Meshes/buffer\";\r\nimport type { Engine } from \"core/Engines/engine\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport type { Nullable } from \"core/types\";\r\n\r\nimport \"../../Shaders/gpuTransform.vertex\";\r\nimport \"../../Shaders/gpuTransform.fragment\";\r\n\r\n/** @internal */\r\nexport class WebGL2BoundingHelper {\r\n private _engine: Nullable<ThinEngine>;\r\n private _computeEffect: Nullable<Effect>;\r\n private _computeEffectOptions: IEffectCreationOptions;\r\n\r\n /**\r\n * Creates a new WebGL2BoundingHelper\r\n * @param engine defines the engine to use\r\n */\r\n constructor(engine: ThinEngine) {\r\n this._engine = engine;\r\n\r\n this._computeEffectOptions = {\r\n attributes: [\"position\"],\r\n uniformsNames: [],\r\n uniformBuffersNames: [],\r\n samplers: [],\r\n defines: \"\",\r\n fallbacks: null,\r\n onCompiled: null,\r\n onError: null,\r\n indexParameters: null,\r\n maxSimultaneousLights: 0,\r\n transformFeedbackVaryings: [],\r\n };\r\n }\r\n\r\n /** @internal */\r\n public createUpdateEffect(attributes: string[], defines: string, uniforms: string[], samplers: string[], numInfluencers: number): Effect {\r\n this._computeEffectOptions.transformFeedbackVaryings = [\"outPosition\"];\r\n\r\n this._computeEffectOptions.attributes = attributes;\r\n this._computeEffectOptions.defines = defines;\r\n this._computeEffectOptions.uniformsNames = uniforms;\r\n this._computeEffectOptions.samplers = samplers;\r\n this._computeEffectOptions.indexParameters = { maxSimultaneousMorphTargets: numInfluencers };\r\n this._computeEffect = this._engine!.createEffect(\"gpuTransform\", this._computeEffectOptions, this._engine!);\r\n\r\n return this._computeEffect;\r\n }\r\n\r\n /** @internal */\r\n public updateBuffer(count: number, targetBuffer: Buffer): void {\r\n const engine = this._engine as Engine;\r\n\r\n // Update\r\n engine.bindTransformFeedbackBuffer(targetBuffer.getBuffer());\r\n engine.setRasterizerState(false);\r\n engine.beginTransformFeedback(true);\r\n engine.drawArraysType(Constants.MATERIAL_PointFillMode, 0, count);\r\n engine.endTransformFeedback();\r\n engine.setRasterizerState(true);\r\n engine.readTransformFeedbackBuffer(targetBuffer.getData()! as ArrayBufferView);\r\n engine.bindTransformFeedbackBuffer(null);\r\n }\r\n\r\n /** @internal */\r\n public dispose(): void {\r\n if (this._computeEffect) {\r\n this._computeEffect.dispose();\r\n }\r\n this._computeEffect = null;\r\n this._engine = null;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.WebGL2BoundingHelper\", WebGL2BoundingHelper);\r\n"]}
@@ -10,7 +10,7 @@ import type { Plane } from "../../Maths/math.plane";
10
10
  * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimizeOctrees
11
11
  */
12
12
  export declare class Octree<T> {
13
- /** Defines the maximum depth (sub-levels) for your octree. Default value is 2, which means 8 8 8 = 512 blocks :) (This parameter takes precedence over capacity.) */
13
+ /** [2] Defines the maximum depth (sub-levels) for your octree. Default value is 2, which means 8 8 8 = 512 blocks :) (This parameter takes precedence over capacity.) */
14
14
  maxDepth: number;
15
15
  /**
16
16
  * Blocks within the octree containing objects
@@ -31,7 +31,7 @@ export declare class Octree<T> {
31
31
  * @param maxDepth defines the maximum depth (sub-levels) for your octree. Default value is 2, which means 8 8 8 = 512 blocks :) (This parameter takes precedence over capacity.)
32
32
  */
33
33
  constructor(creationFunc: (entry: T, block: OctreeBlock<T>) => void, maxBlockCapacity?: number,
34
- /** Defines the maximum depth (sub-levels) for your octree. Default value is 2, which means 8 8 8 = 512 blocks :) (This parameter takes precedence over capacity.) */
34
+ /** [2] Defines the maximum depth (sub-levels) for your octree. Default value is 2, which means 8 8 8 = 512 blocks :) (This parameter takes precedence over capacity.) */
35
35
  maxDepth?: number);
36
36
  /**
37
37
  * Updates the octree by adding blocks for the passed in meshes within the min and max world parameters
@@ -13,7 +13,7 @@ export class Octree {
13
13
  * @param maxDepth defines the maximum depth (sub-levels) for your octree. Default value is 2, which means 8 8 8 = 512 blocks :) (This parameter takes precedence over capacity.)
14
14
  */
15
15
  constructor(creationFunc, maxBlockCapacity,
16
- /** Defines the maximum depth (sub-levels) for your octree. Default value is 2, which means 8 8 8 = 512 blocks :) (This parameter takes precedence over capacity.) */
16
+ /** [2] Defines the maximum depth (sub-levels) for your octree. Default value is 2, which means 8 8 8 = 512 blocks :) (This parameter takes precedence over capacity.) */
17
17
  maxDepth = 2) {
18
18
  this.maxDepth = maxDepth;
19
19
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"octree.js","sourceRoot":"","sources":["../../../../../dev/core/src/Culling/Octrees/octree.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SmartArray } from \"../../Misc/smartArray\";\r\nimport { SmartArrayNoDuplicate } from \"../../Misc/smartArray\";\r\nimport type { Vector3 } from \"../../Maths/math.vector\";\r\nimport type { SubMesh } from \"../../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { Ray } from \"../../Culling/ray\";\r\nimport { OctreeBlock } from \"./octreeBlock\";\r\nimport type { Plane } from \"../../Maths/math.plane\";\r\n\r\n/**\r\n * Octrees are a really powerful data structure that can quickly select entities based on space coordinates.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimizeOctrees\r\n */\r\nexport class Octree<T> {\r\n /**\r\n * Blocks within the octree containing objects\r\n */\r\n public blocks: Array<OctreeBlock<T>>;\r\n /**\r\n * Content stored in the octree\r\n */\r\n public dynamicContent: T[] = [];\r\n\r\n private _maxBlockCapacity: number;\r\n private _selectionContent: SmartArrayNoDuplicate<T>;\r\n private _creationFunc: (entry: T, block: OctreeBlock<T>) => void;\r\n\r\n /**\r\n * Creates a octree\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimizeOctrees\r\n * @param creationFunc function to be used to instantiate the octree\r\n * @param maxBlockCapacity defines the maximum number of meshes you want on your octree's leaves (default: 64)\r\n * @param maxDepth defines the maximum depth (sub-levels) for your octree. Default value is 2, which means 8 8 8 = 512 blocks :) (This parameter takes precedence over capacity.)\r\n */\r\n constructor(\r\n creationFunc: (entry: T, block: OctreeBlock<T>) => void,\r\n maxBlockCapacity?: number,\r\n /** Defines the maximum depth (sub-levels) for your octree. Default value is 2, which means 8 8 8 = 512 blocks :) (This parameter takes precedence over capacity.) */\r\n public maxDepth = 2\r\n ) {\r\n this._maxBlockCapacity = maxBlockCapacity || 64;\r\n this._selectionContent = new SmartArrayNoDuplicate<T>(1024);\r\n this._creationFunc = creationFunc;\r\n }\r\n\r\n // Methods\r\n /**\r\n * Updates the octree by adding blocks for the passed in meshes within the min and max world parameters\r\n * @param worldMin worldMin for the octree blocks var blockSize = new Vector3((worldMax.x - worldMin.x) / 2, (worldMax.y - worldMin.y) / 2, (worldMax.z - worldMin.z) / 2);\r\n * @param worldMax worldMax for the octree blocks var blockSize = new Vector3((worldMax.x - worldMin.x) / 2, (worldMax.y - worldMin.y) / 2, (worldMax.z - worldMin.z) / 2);\r\n * @param entries meshes to be added to the octree blocks\r\n */\r\n public update(worldMin: Vector3, worldMax: Vector3, entries: T[]): void {\r\n OctreeBlock._CreateBlocks(worldMin, worldMax, entries, this._maxBlockCapacity, 0, this.maxDepth, this, this._creationFunc);\r\n }\r\n\r\n /**\r\n * Adds a mesh to the octree\r\n * @param entry Mesh to add to the octree\r\n */\r\n public addMesh(entry: T): void {\r\n for (let index = 0; index < this.blocks.length; index++) {\r\n const block = this.blocks[index];\r\n block.addEntry(entry);\r\n }\r\n }\r\n\r\n /**\r\n * Remove an element from the octree\r\n * @param entry defines the element to remove\r\n */\r\n public removeMesh(entry: T): void {\r\n for (let index = 0; index < this.blocks.length; index++) {\r\n const block = this.blocks[index];\r\n block.removeEntry(entry);\r\n }\r\n }\r\n\r\n /**\r\n * Selects an array of meshes within the frustum\r\n * @param frustumPlanes The frustum planes to use which will select all meshes within it\r\n * @param allowDuplicate If duplicate objects are allowed in the resulting object array\r\n * @returns array of meshes within the frustum\r\n */\r\n public select(frustumPlanes: Plane[], allowDuplicate?: boolean): SmartArray<T> {\r\n this._selectionContent.reset();\r\n\r\n for (let index = 0; index < this.blocks.length; index++) {\r\n const block = this.blocks[index];\r\n block.select(frustumPlanes, this._selectionContent, allowDuplicate);\r\n }\r\n\r\n if (allowDuplicate) {\r\n this._selectionContent.concat(this.dynamicContent);\r\n } else {\r\n this._selectionContent.concatWithNoDuplicate(this.dynamicContent);\r\n }\r\n\r\n return this._selectionContent;\r\n }\r\n\r\n /**\r\n * Test if the octree intersect with the given bounding sphere and if yes, then add its content to the selection array\r\n * @param sphereCenter defines the bounding sphere center\r\n * @param sphereRadius defines the bounding sphere radius\r\n * @param allowDuplicate defines if the selection array can contains duplicated entries\r\n * @returns an array of objects that intersect the sphere\r\n */\r\n public intersects(sphereCenter: Vector3, sphereRadius: number, allowDuplicate?: boolean): SmartArray<T> {\r\n this._selectionContent.reset();\r\n\r\n for (let index = 0; index < this.blocks.length; index++) {\r\n const block = this.blocks[index];\r\n block.intersects(sphereCenter, sphereRadius, this._selectionContent, allowDuplicate);\r\n }\r\n\r\n if (allowDuplicate) {\r\n this._selectionContent.concat(this.dynamicContent);\r\n } else {\r\n this._selectionContent.concatWithNoDuplicate(this.dynamicContent);\r\n }\r\n\r\n return this._selectionContent;\r\n }\r\n\r\n /**\r\n * Test if the octree intersect with the given ray and if yes, then add its content to resulting array\r\n * @param ray defines the ray to test with\r\n * @returns array of intersected objects\r\n */\r\n public intersectsRay(ray: Ray): SmartArray<T> {\r\n this._selectionContent.reset();\r\n\r\n for (let index = 0; index < this.blocks.length; index++) {\r\n const block = this.blocks[index];\r\n block.intersectsRay(ray, this._selectionContent);\r\n }\r\n\r\n this._selectionContent.concatWithNoDuplicate(this.dynamicContent);\r\n\r\n return this._selectionContent;\r\n }\r\n\r\n /**\r\n * Adds a mesh into the octree block if it intersects the block\r\n * @param entry defines the mesh to try to add to the block\r\n * @param block defines the block where the mesh should be added\r\n */\r\n public static CreationFuncForMeshes = (entry: AbstractMesh, block: OctreeBlock<AbstractMesh>): void => {\r\n const boundingInfo = entry.getBoundingInfo();\r\n if (!entry.isBlocked && boundingInfo.boundingBox.intersectsMinMax(block.minPoint, block.maxPoint)) {\r\n block.entries.push(entry);\r\n }\r\n };\r\n\r\n /**\r\n * Adds a submesh into the octree block if it intersects the block\r\n * @param entry defines the submesh to try to add to the block\r\n * @param block defines the block where the submesh should be added\r\n */\r\n public static CreationFuncForSubMeshes = (entry: SubMesh, block: OctreeBlock<SubMesh>): void => {\r\n const boundingInfo = entry.getBoundingInfo();\r\n if (boundingInfo.boundingBox.intersectsMinMax(block.minPoint, block.maxPoint)) {\r\n block.entries.push(entry);\r\n }\r\n };\r\n}\r\n"]}
1
+ {"version":3,"file":"octree.js","sourceRoot":"","sources":["../../../../../dev/core/src/Culling/Octrees/octree.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SmartArray } from \"../../Misc/smartArray\";\r\nimport { SmartArrayNoDuplicate } from \"../../Misc/smartArray\";\r\nimport type { Vector3 } from \"../../Maths/math.vector\";\r\nimport type { SubMesh } from \"../../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { Ray } from \"../../Culling/ray\";\r\nimport { OctreeBlock } from \"./octreeBlock\";\r\nimport type { Plane } from \"../../Maths/math.plane\";\r\n\r\n/**\r\n * Octrees are a really powerful data structure that can quickly select entities based on space coordinates.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimizeOctrees\r\n */\r\nexport class Octree<T> {\r\n /**\r\n * Blocks within the octree containing objects\r\n */\r\n public blocks: Array<OctreeBlock<T>>;\r\n /**\r\n * Content stored in the octree\r\n */\r\n public dynamicContent: T[] = [];\r\n\r\n private _maxBlockCapacity: number;\r\n private _selectionContent: SmartArrayNoDuplicate<T>;\r\n private _creationFunc: (entry: T, block: OctreeBlock<T>) => void;\r\n\r\n /**\r\n * Creates a octree\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimizeOctrees\r\n * @param creationFunc function to be used to instantiate the octree\r\n * @param maxBlockCapacity defines the maximum number of meshes you want on your octree's leaves (default: 64)\r\n * @param maxDepth defines the maximum depth (sub-levels) for your octree. Default value is 2, which means 8 8 8 = 512 blocks :) (This parameter takes precedence over capacity.)\r\n */\r\n constructor(\r\n creationFunc: (entry: T, block: OctreeBlock<T>) => void,\r\n maxBlockCapacity?: number,\r\n /** [2] Defines the maximum depth (sub-levels) for your octree. Default value is 2, which means 8 8 8 = 512 blocks :) (This parameter takes precedence over capacity.) */\r\n public maxDepth = 2\r\n ) {\r\n this._maxBlockCapacity = maxBlockCapacity || 64;\r\n this._selectionContent = new SmartArrayNoDuplicate<T>(1024);\r\n this._creationFunc = creationFunc;\r\n }\r\n\r\n // Methods\r\n /**\r\n * Updates the octree by adding blocks for the passed in meshes within the min and max world parameters\r\n * @param worldMin worldMin for the octree blocks var blockSize = new Vector3((worldMax.x - worldMin.x) / 2, (worldMax.y - worldMin.y) / 2, (worldMax.z - worldMin.z) / 2);\r\n * @param worldMax worldMax for the octree blocks var blockSize = new Vector3((worldMax.x - worldMin.x) / 2, (worldMax.y - worldMin.y) / 2, (worldMax.z - worldMin.z) / 2);\r\n * @param entries meshes to be added to the octree blocks\r\n */\r\n public update(worldMin: Vector3, worldMax: Vector3, entries: T[]): void {\r\n OctreeBlock._CreateBlocks(worldMin, worldMax, entries, this._maxBlockCapacity, 0, this.maxDepth, this, this._creationFunc);\r\n }\r\n\r\n /**\r\n * Adds a mesh to the octree\r\n * @param entry Mesh to add to the octree\r\n */\r\n public addMesh(entry: T): void {\r\n for (let index = 0; index < this.blocks.length; index++) {\r\n const block = this.blocks[index];\r\n block.addEntry(entry);\r\n }\r\n }\r\n\r\n /**\r\n * Remove an element from the octree\r\n * @param entry defines the element to remove\r\n */\r\n public removeMesh(entry: T): void {\r\n for (let index = 0; index < this.blocks.length; index++) {\r\n const block = this.blocks[index];\r\n block.removeEntry(entry);\r\n }\r\n }\r\n\r\n /**\r\n * Selects an array of meshes within the frustum\r\n * @param frustumPlanes The frustum planes to use which will select all meshes within it\r\n * @param allowDuplicate If duplicate objects are allowed in the resulting object array\r\n * @returns array of meshes within the frustum\r\n */\r\n public select(frustumPlanes: Plane[], allowDuplicate?: boolean): SmartArray<T> {\r\n this._selectionContent.reset();\r\n\r\n for (let index = 0; index < this.blocks.length; index++) {\r\n const block = this.blocks[index];\r\n block.select(frustumPlanes, this._selectionContent, allowDuplicate);\r\n }\r\n\r\n if (allowDuplicate) {\r\n this._selectionContent.concat(this.dynamicContent);\r\n } else {\r\n this._selectionContent.concatWithNoDuplicate(this.dynamicContent);\r\n }\r\n\r\n return this._selectionContent;\r\n }\r\n\r\n /**\r\n * Test if the octree intersect with the given bounding sphere and if yes, then add its content to the selection array\r\n * @param sphereCenter defines the bounding sphere center\r\n * @param sphereRadius defines the bounding sphere radius\r\n * @param allowDuplicate defines if the selection array can contains duplicated entries\r\n * @returns an array of objects that intersect the sphere\r\n */\r\n public intersects(sphereCenter: Vector3, sphereRadius: number, allowDuplicate?: boolean): SmartArray<T> {\r\n this._selectionContent.reset();\r\n\r\n for (let index = 0; index < this.blocks.length; index++) {\r\n const block = this.blocks[index];\r\n block.intersects(sphereCenter, sphereRadius, this._selectionContent, allowDuplicate);\r\n }\r\n\r\n if (allowDuplicate) {\r\n this._selectionContent.concat(this.dynamicContent);\r\n } else {\r\n this._selectionContent.concatWithNoDuplicate(this.dynamicContent);\r\n }\r\n\r\n return this._selectionContent;\r\n }\r\n\r\n /**\r\n * Test if the octree intersect with the given ray and if yes, then add its content to resulting array\r\n * @param ray defines the ray to test with\r\n * @returns array of intersected objects\r\n */\r\n public intersectsRay(ray: Ray): SmartArray<T> {\r\n this._selectionContent.reset();\r\n\r\n for (let index = 0; index < this.blocks.length; index++) {\r\n const block = this.blocks[index];\r\n block.intersectsRay(ray, this._selectionContent);\r\n }\r\n\r\n this._selectionContent.concatWithNoDuplicate(this.dynamicContent);\r\n\r\n return this._selectionContent;\r\n }\r\n\r\n /**\r\n * Adds a mesh into the octree block if it intersects the block\r\n * @param entry defines the mesh to try to add to the block\r\n * @param block defines the block where the mesh should be added\r\n */\r\n public static CreationFuncForMeshes = (entry: AbstractMesh, block: OctreeBlock<AbstractMesh>): void => {\r\n const boundingInfo = entry.getBoundingInfo();\r\n if (!entry.isBlocked && boundingInfo.boundingBox.intersectsMinMax(block.minPoint, block.maxPoint)) {\r\n block.entries.push(entry);\r\n }\r\n };\r\n\r\n /**\r\n * Adds a submesh into the octree block if it intersects the block\r\n * @param entry defines the submesh to try to add to the block\r\n * @param block defines the block where the submesh should be added\r\n */\r\n public static CreationFuncForSubMeshes = (entry: SubMesh, block: OctreeBlock<SubMesh>): void => {\r\n const boundingInfo = entry.getBoundingInfo();\r\n if (boundingInfo.boundingBox.intersectsMinMax(block.minPoint, block.maxPoint)) {\r\n block.entries.push(entry);\r\n }\r\n };\r\n}\r\n"]}
@@ -1,5 +1,6 @@
1
1
  export * from "./boundingBox";
2
2
  export * from "./boundingInfo";
3
+ export * from "./Helper/boundingInfoHelper";
3
4
  export * from "./boundingSphere";
4
5
  export * from "./Octrees/index";
5
6
  export * from "./ray";
package/Culling/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  /* eslint-disable import/no-internal-modules */
2
2
  export * from "./boundingBox.js";
3
3
  export * from "./boundingInfo.js";
4
+ export * from "./Helper/boundingInfoHelper.js";
4
5
  export * from "./boundingSphere.js";
5
6
  export * from "./Octrees/index.js";
6
7
  export * from "./ray.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dev/core/src/Culling/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,OAAO,CAAC","sourcesContent":["/* eslint-disable import/no-internal-modules */\r\nexport * from \"./boundingBox\";\r\nexport * from \"./boundingInfo\";\r\nexport * from \"./boundingSphere\";\r\nexport * from \"./Octrees/index\";\r\nexport * from \"./ray\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dev/core/src/Culling/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,OAAO,CAAC","sourcesContent":["/* eslint-disable import/no-internal-modules */\r\nexport * from \"./boundingBox\";\r\nexport * from \"./boundingInfo\";\r\nexport * from \"./Helper/boundingInfoHelper\";\r\nexport * from \"./boundingSphere\";\r\nexport * from \"./Octrees/index\";\r\nexport * from \"./ray\";\r\n"]}
package/Culling/ray.d.ts CHANGED
@@ -14,9 +14,9 @@ export declare class Ray {
14
14
  origin: Vector3;
15
15
  /** direction */
16
16
  direction: Vector3;
17
- /** length of the ray */
17
+ /** [Number.MAX_VALUE] length of the ray */
18
18
  length: number;
19
- /** The epsilon value to use when calculating the ray/triangle intersection (default: Epsilon from math constants) */
19
+ /** [Epsilon] The epsilon value to use when calculating the ray/triangle intersection (default: Epsilon from math constants) */
20
20
  epsilon: number;
21
21
  private static readonly _TmpVector3;
22
22
  private static _RayDistant;
@@ -33,9 +33,9 @@ export declare class Ray {
33
33
  origin: Vector3,
34
34
  /** direction */
35
35
  direction: Vector3,
36
- /** length of the ray */
36
+ /** [Number.MAX_VALUE] length of the ray */
37
37
  length?: number,
38
- /** The epsilon value to use when calculating the ray/triangle intersection (default: Epsilon from math constants) */
38
+ /** [Epsilon] The epsilon value to use when calculating the ray/triangle intersection (default: Epsilon from math constants) */
39
39
  epsilon?: number);
40
40
  /**
41
41
  * Clone the current ray
package/Culling/ray.js CHANGED
@@ -22,9 +22,9 @@ export class Ray {
22
22
  origin,
23
23
  /** direction */
24
24
  direction,
25
- /** length of the ray */
25
+ /** [Number.MAX_VALUE] length of the ray */
26
26
  length = Number.MAX_VALUE,
27
- /** The epsilon value to use when calculating the ray/triangle intersection (default: Epsilon from math constants) */
27
+ /** [Epsilon] The epsilon value to use when calculating the ray/triangle intersection (default: Epsilon from math constants) */
28
28
  epsilon = Epsilon) {
29
29
  this.origin = origin;
30
30
  this.direction = direction;