@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.
- package/Actions/abstractActionManager.d.ts +4 -0
- package/Actions/abstractActionManager.js +4 -0
- package/Actions/abstractActionManager.js.map +1 -1
- package/Animations/animatable.d.ts +10 -10
- package/Animations/animatable.js +5 -5
- package/Animations/animatable.js.map +1 -1
- package/Animations/animationGroupMask.d.ts +2 -2
- package/Animations/animationGroupMask.js +1 -1
- package/Animations/animationGroupMask.js.map +1 -1
- package/Animations/easing.d.ts +2 -2
- package/Animations/easing.js +1 -1
- package/Animations/easing.js.map +1 -1
- package/Behaviors/Meshes/attachToBoxBehavior.d.ts +3 -3
- package/Behaviors/Meshes/attachToBoxBehavior.js +3 -3
- package/Behaviors/Meshes/attachToBoxBehavior.js.map +1 -1
- package/Cameras/Inputs/freeCameraMouseInput.d.ts +2 -2
- package/Cameras/Inputs/freeCameraMouseInput.js +1 -1
- package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
- package/Cameras/Inputs/freeCameraTouchInput.d.ts +2 -2
- package/Cameras/Inputs/freeCameraTouchInput.js +1 -1
- package/Cameras/Inputs/freeCameraTouchInput.js.map +1 -1
- package/Culling/Helper/boundingInfoHelper.d.ts +28 -0
- package/Culling/Helper/boundingInfoHelper.js +178 -0
- package/Culling/Helper/boundingInfoHelper.js.map +1 -0
- package/Culling/Helper/webgl2BoundingHelper.d.ts +22 -0
- package/Culling/Helper/webgl2BoundingHelper.js +61 -0
- package/Culling/Helper/webgl2BoundingHelper.js.map +1 -0
- package/Culling/Octrees/octree.d.ts +2 -2
- package/Culling/Octrees/octree.js +1 -1
- package/Culling/Octrees/octree.js.map +1 -1
- package/Culling/index.d.ts +1 -0
- package/Culling/index.js +1 -0
- package/Culling/index.js.map +1 -1
- package/Culling/ray.d.ts +4 -4
- package/Culling/ray.js +2 -2
- package/Culling/ray.js.map +1 -1
- package/Debug/skeletonViewer.d.ts +6 -6
- package/Debug/skeletonViewer.js +3 -3
- package/Debug/skeletonViewer.js.map +1 -1
- package/DeviceInput/InputDevices/deviceSource.d.ts +2 -2
- package/DeviceInput/InputDevices/deviceSource.js +1 -1
- package/DeviceInput/InputDevices/deviceSource.js.map +1 -1
- package/Engines/Extensions/engine.transformFeedback.d.ts +5 -0
- package/Engines/Extensions/engine.transformFeedback.js +3 -0
- package/Engines/Extensions/engine.transformFeedback.js.map +1 -1
- package/Engines/abstractEngine.js +2 -3
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/engine.js +1 -0
- package/Engines/engine.js.map +1 -1
- package/Engines/nativeEngine.d.ts +7 -0
- package/Engines/nativeEngine.js +4 -1
- package/Engines/nativeEngine.js.map +1 -1
- package/Engines/webgpuEngine.js +1 -0
- package/Engines/webgpuEngine.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/fragDepthBlock.js +1 -1
- package/Materials/Node/Blocks/Fragment/fragDepthBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/shadowMapBlock.js +1 -1
- package/Materials/Node/Blocks/Fragment/shadowMapBlock.js.map +1 -1
- package/Materials/Node/nodeMaterial.js +2 -0
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/effectRenderer.d.ts +2 -1
- package/Materials/effectRenderer.js +5 -2
- package/Materials/effectRenderer.js.map +1 -1
- package/Maths/math.color.d.ts +14 -14
- package/Maths/math.color.js +7 -7
- package/Maths/math.color.js.map +1 -1
- package/Maths/math.isovector.d.ts +4 -4
- package/Maths/math.isovector.js +2 -2
- package/Maths/math.isovector.js.map +1 -1
- package/Maths/math.vector.d.ts +12 -12
- package/Maths/math.vector.js +6 -6
- package/Maths/math.vector.js.map +1 -1
- package/Maths/math.vertexFormat.d.ts +10 -10
- package/Maths/math.vertexFormat.js +5 -5
- package/Maths/math.vertexFormat.js.map +1 -1
- package/Meshes/abstractMesh.d.ts +1 -1
- package/Meshes/abstractMesh.js +2 -2
- package/Meshes/abstractMesh.js.map +1 -1
- package/Meshes/mesh.d.ts +4 -0
- package/Meshes/mesh.js +17 -4
- package/Meshes/mesh.js.map +1 -1
- package/Misc/observable.d.ts +4 -4
- package/Misc/observable.js +2 -2
- package/Misc/observable.js.map +1 -1
- package/Misc/sceneOptimizer.d.ts +3 -3
- package/Misc/sceneOptimizer.js +2 -2
- package/Misc/sceneOptimizer.js.map +1 -1
- package/Particles/EmitterTypes/coneParticleEmitter.d.ts +2 -2
- package/Particles/EmitterTypes/coneParticleEmitter.js +1 -1
- package/Particles/EmitterTypes/coneParticleEmitter.js.map +1 -1
- package/Particles/EmitterTypes/cylinderParticleEmitter.d.ts +8 -8
- package/Particles/EmitterTypes/cylinderParticleEmitter.js +4 -4
- package/Particles/EmitterTypes/cylinderParticleEmitter.js.map +1 -1
- package/Particles/EmitterTypes/hemisphericParticleEmitter.d.ts +6 -6
- package/Particles/EmitterTypes/hemisphericParticleEmitter.js +3 -3
- package/Particles/EmitterTypes/hemisphericParticleEmitter.js.map +1 -1
- package/Particles/EmitterTypes/sphereParticleEmitter.d.ts +6 -6
- package/Particles/EmitterTypes/sphereParticleEmitter.js +3 -3
- package/Particles/EmitterTypes/sphereParticleEmitter.js.map +1 -1
- package/Particles/pointsCloudSystem.d.ts +0 -1
- package/Particles/pointsCloudSystem.js +0 -1
- package/Particles/pointsCloudSystem.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObject.js +2 -2
- package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
- package/Shaders/gpuTransform.fragment.d.ts +5 -0
- package/Shaders/gpuTransform.fragment.js +11 -0
- package/Shaders/gpuTransform.fragment.js.map +1 -0
- package/Shaders/gpuTransform.vertex.d.ts +13 -0
- package/Shaders/gpuTransform.vertex.js +33 -0
- package/Shaders/gpuTransform.vertex.js.map +1 -0
- package/XR/features/WebXRBackgroundRemover.d.ts +2 -2
- package/XR/features/WebXRBackgroundRemover.js +1 -1
- package/XR/features/WebXRBackgroundRemover.js.map +1 -1
- package/XR/features/WebXRHitTest.d.ts +2 -2
- package/XR/features/WebXRHitTest.js +1 -1
- package/XR/features/WebXRHitTest.js.map +1 -1
- package/XR/features/WebXRHitTestLegacy.d.ts +2 -2
- package/XR/features/WebXRHitTestLegacy.js +1 -1
- package/XR/features/WebXRHitTestLegacy.js.map +1 -1
- package/XR/features/WebXRRawCameraAccess.js +0 -2
- package/XR/features/WebXRRawCameraAccess.js.map +1 -1
- package/XR/motionController/webXRAbstractMotionController.d.ts +2 -0
- package/XR/motionController/webXRAbstractMotionController.js +1 -0
- package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
- 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"]}
|
package/Culling/index.d.ts
CHANGED
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";
|
package/Culling/index.js.map
CHANGED
|
@@ -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;
|