@woosh/meep-engine 2.33.23 → 2.33.24

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 (204) hide show
  1. package/core/bvh2/BinaryNode.js +1 -1
  2. package/core/bvh2/aabb3/AABB3.js +18 -0
  3. package/core/bvh2/aabb3/AABB3Math.js +1 -1
  4. package/core/bvh2/binary/2/BinaryUint32BVH.js +498 -0
  5. package/core/bvh2/binary/2/BinaryUint32BVH.spec.js +54 -0
  6. package/core/bvh2/binary/IndexedBinaryBVH.js +22 -26
  7. package/core/collection/ArrayUtils.js +1 -1
  8. package/core/collection/array/arrayQuickSort.js +9 -6
  9. package/core/collection/array/array_swap.js +22 -0
  10. package/core/collection/array/computeHashArray.js +22 -0
  11. package/core/collection/array/computeHashIntegerArray.js +15 -0
  12. package/core/collection/table/DataType2TypedArrayConstructorMapping.js +15 -0
  13. package/core/color/Color.js +2 -1
  14. package/core/function/FunctionCompiler.js +2 -1
  15. package/core/geom/3d/aabb/aabb3_computeDistanceAbovePlane.js +9 -33
  16. package/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +1 -1
  17. package/core/geom/3d/line/line3_computeSegmentPointDistance_sqr.js +41 -0
  18. package/core/geom/3d/morton/mortonEncode_magicbits.js +2 -1
  19. package/core/geom/3d/morton/reinterpret_float32_as_int32.js +13 -0
  20. package/core/geom/3d/morton/v3_morton_encode_transformed.js +33 -0
  21. package/core/geom/3d/ray/ray_computeNearestPointToPoint.js +37 -0
  22. package/core/geom/3d/shape/AbstractShape3D.js +29 -0
  23. package/core/geom/3d/shape/CompositeShape.js +60 -0
  24. package/core/geom/3d/shape/TransformedShape3D.js +70 -0
  25. package/core/geom/3d/shape/UnitCubeShape3D.js +13 -0
  26. package/core/geom/3d/shape/UnitSphereShape3D.js +16 -0
  27. package/core/geom/AABB2.js +1 -1
  28. package/core/geom/ConicRay.js +3 -1
  29. package/core/geom/LineSegment.js +0 -78
  30. package/core/geom/Matrix4.js +7 -8
  31. package/core/geom/Rectangle.js +2 -1
  32. package/core/geom/Vector1.js +1 -1
  33. package/core/geom/Vector3.js +2 -1
  34. package/core/geom/Vector4.js +2 -1
  35. package/core/geom/random/randomPointInBox.js +7 -3
  36. package/core/geom/random/randomPointInPoint.js +6 -3
  37. package/core/geom/random/randomPointInSphere.js +6 -3
  38. package/core/geom/random/randomPointOnBox.js +7 -3
  39. package/core/geom/random/randomPointOnSphere.js +6 -3
  40. package/core/geom/v3_length.js +8 -3
  41. package/core/graph/graph_k_means_cluster.js +1 -1
  42. package/core/math/MathUtils.js +0 -354
  43. package/core/math/MathUtils.spec.js +7 -1
  44. package/core/math/gaussian.js +9 -0
  45. package/core/math/hash/computeHashFloat.js +17 -0
  46. package/core/math/hash/computeHashFloatArray.js +34 -0
  47. package/core/math/hash/computeObjectHash.js +54 -0
  48. package/core/math/intersects1D.js +19 -0
  49. package/core/math/interval/NumericInterval.js +2 -2
  50. package/core/math/isValueBetween.js +10 -0
  51. package/core/math/isValueBetweenInclusive.js +10 -0
  52. package/core/math/noise/curl_noise_3dt.js +1 -1
  53. package/core/math/noise/sdnoise.js +10 -10
  54. package/core/math/overlap1D.js +19 -0
  55. package/core/math/pingpong.js +17 -0
  56. package/core/math/random/makeRangedRandom.js +19 -0
  57. package/core/math/random/randomFloatBetween.js +14 -0
  58. package/core/math/random/randomFromArray.js +19 -0
  59. package/core/math/random/randomGaussian.js +15 -0
  60. package/core/math/random/randomIntegerBetween.js +14 -0
  61. package/core/math/random/roundFair.js +15 -0
  62. package/core/math/separation1D.js +21 -0
  63. package/core/math/solveQuadratic.js +25 -0
  64. package/core/model/BoundedValue.js +1 -1
  65. package/core/model/node-graph/node/NodeInstancePortReference.js +1 -1
  66. package/core/model/node-graph/node/Port.js +1 -1
  67. package/core/model/reactive/evaluation/MultiPredicateEvaluator.spec.js +3 -1
  68. package/core/model/reactive/model/ReactiveBinaryExpression.js +1 -1
  69. package/core/model/reactive/model/terminal/ReactiveLiteralNumber.js +1 -1
  70. package/core/model/reactive/model/terminal/ReactiveReference.js +1 -1
  71. package/core/model/reactive/model/util/createRandomReactiveExpression.js +1 -1
  72. package/core/model/stat/LinearModifier.js +1 -1
  73. package/engine/animation/curve/AnimationCurve.js +72 -0
  74. package/engine/animation/curve/Keyframe.js +27 -0
  75. package/engine/animation/keyed2/AnimationTrack.js +27 -3
  76. package/engine/asset/Asset.js +1 -1
  77. package/engine/asset/loaders/GLTFAssetLoader.d.ts +1 -1
  78. package/engine/asset/loaders/GLTFAssetLoader.js +10 -0
  79. package/engine/asset/loaders/image/ImageRGBADataAsset.js +8 -1
  80. package/engine/asset/loaders/material/computeMaterialHash.js +3 -1
  81. package/engine/asset/loaders/material/computeTextureHash.js +2 -1
  82. package/engine/ecs/animation/Animation.js +2 -1
  83. package/engine/ecs/animation/InverseKinematics.js +2 -1
  84. package/engine/ecs/dynamic_actions/DynamicActorSystem.js +2 -1
  85. package/engine/ecs/dynamic_actions/DynamicRuleDescriptionTable.spec.js +3 -5
  86. package/engine/ecs/dynamic_actions/actions/definition/WeightedRandomActionDescription.js +1 -1
  87. package/engine/ecs/evaluation/complex/PointFitnessGaussianBlur.js +1 -1
  88. package/engine/ecs/foliage/ecs/Foliage2.js +1 -1
  89. package/engine/ecs/fow/shader/FogOfWarRenderer.js +1 -1
  90. package/engine/ecs/gui/GUIElement.js +1 -1
  91. package/engine/ecs/gui/hud/HeadsUpDisplay.js +1 -1
  92. package/engine/ecs/gui/position/ViewportPosition.js +2 -1
  93. package/engine/ecs/systems/RangedAttackSystem.js +1 -1
  94. package/engine/ecs/systems/SteeringSystem.js +1 -1
  95. package/engine/ecs/terrain/tiles/TerrainTileManager.js +1 -1
  96. package/engine/ecs/tooltip/TooltipComponent.js +15 -0
  97. package/engine/graphics/ecs/animation/animator/AnimationClip.js +2 -1
  98. package/engine/graphics/ecs/animation/animator/AnimationClipDefinition.js +2 -1
  99. package/engine/graphics/ecs/animation/animator/AnimationNotification.js +2 -1
  100. package/engine/graphics/ecs/animation/animator/AnimationNotificationDefinition.js +2 -1
  101. package/engine/graphics/ecs/animation/animator/graph/AnimationGraph.js +2 -1
  102. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationGraphDefinition.js +2 -1
  103. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationStateDefinition.js +1 -1
  104. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationTransitionDefinition.js +2 -1
  105. package/engine/graphics/ecs/camera/CameraClippingPlaneComputer.js +1 -1
  106. package/engine/graphics/ecs/highlight/HighlightDefinition.js +2 -1
  107. package/engine/graphics/ecs/light/Light.d.ts +1 -1
  108. package/engine/graphics/ecs/light/Light.js +3 -0
  109. package/engine/graphics/ecs/mesh/Mesh.js +2 -1
  110. package/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +13 -0
  111. package/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.d.ts +6 -0
  112. package/engine/graphics/geometry/AttributeSpec.js +105 -0
  113. package/engine/graphics/{micron/format/MicronVertexDataSpec.js → geometry/VertexDataSpec.js} +56 -25
  114. package/engine/graphics/micron/build/buildMicronGeometryFromBufferGeometry.js +7 -7
  115. package/engine/graphics/micron/build/fill_patch_geometry_data.js +1 -1
  116. package/engine/graphics/micron/buildPatchwork.js +1 -1
  117. package/engine/graphics/micron/format/MicronGeometry.js +3 -3
  118. package/engine/graphics/micron/format/serialization/MicronGeometryBinarySerializationAdapter.js +2 -2
  119. package/engine/graphics/micron/format/serialization/deserialize_attribute_spec.js +1 -1
  120. package/engine/graphics/micron/format/serialization/serialize_attribute_spec.js +1 -1
  121. package/engine/graphics/micron/render/PatchCacheKey.js +1 -1
  122. package/engine/graphics/micron/render/instanced/AttributeDataTexture.js +5 -5
  123. package/engine/graphics/micron/render/v1/ThreeVirtualGeometryAdapter.js +1 -1
  124. package/engine/graphics/particles/particular/engine/emitter/PARTICULAR_PARTICLE_SPECIFICATION.js +80 -16
  125. package/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +57 -52
  126. package/engine/graphics/particles/particular/engine/emitter/ParticleLayer.js +2 -1
  127. package/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +51 -12
  128. package/engine/graphics/particles/particular/engine/emitter/ParticlePool.spec.js +3 -2
  129. package/engine/graphics/particles/particular/engine/emitter/computeEmissionFunction.js +1 -1
  130. package/engine/graphics/particles/particular/engine/emitter/serde/ParameterLookupTableSerializationAdapter.js +8 -2
  131. package/engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.js +2 -1
  132. package/engine/graphics/particles/particular/engine/parameter/ParameterTrack.js +1 -1
  133. package/engine/graphics/particles/particular/engine/parameter/ParticleParameter.js +1 -1
  134. package/engine/graphics/particles/particular/engine/renderers/billboard/BILLBOARD_PARTICLE_SPECIFICATION.js +21 -0
  135. package/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.js +0 -20
  136. package/engine/graphics/particles/particular/engine/renderers/billboard/prototypeBillboardRenderer.js +9 -9
  137. package/engine/graphics/particles/particular/engine/simulator/SimulationStepApplyForce.js +2 -5
  138. package/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseAcceleration.js +2 -6
  139. package/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseVelocity.js +2 -7
  140. package/engine/graphics/particles/particular/engine/simulator/SimulationStepFixedPhysics.js +2 -5
  141. package/engine/graphics/particles/particular/engine/simulator/update_parameters.js +1 -1
  142. package/engine/graphics/particles/particular/engine/utils/distributeParticlesOnObject3D.js +1 -1
  143. package/engine/graphics/particles/particular/engine/utils/distrubuteParticlesOnMesh.js +1 -1
  144. package/engine/graphics/particles/particular/engine/utils/volume/ParticleVolume.js +384 -0
  145. package/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +558 -0
  146. package/engine/graphics/particles/particular/group/Operation.js +18 -0
  147. package/engine/graphics/particles/particular/group/OperationType.js +9 -0
  148. package/engine/graphics/particles/particular/group/ParticleAttribute.js +2 -1
  149. package/engine/graphics/particles/particular/group/ParticleAttributeType.js +11 -0
  150. package/engine/graphics/particles/particular/group/ParticleDataType.js +10 -0
  151. package/engine/graphics/particles/particular/group/ParticleGroup.js +7 -245
  152. package/engine/graphics/particles/particular/group/ParticleGroup.spec.js +3 -1
  153. package/engine/graphics/particles/particular/group/ParticleSpecification.js +21 -14
  154. package/engine/graphics/particles/particular/group/itemSizeFromAttributeType.js +20 -0
  155. package/engine/graphics/particles/particular/group/optimizeCommandQueue.js +162 -0
  156. package/engine/graphics/particles/particular/group/typedArrayConstructorFromDataType.js +19 -0
  157. package/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.js +1 -1
  158. package/engine/graphics/render/buffer/slot/parameter/ProgramValueSlotParameter.js +2 -1
  159. package/engine/graphics/render/buffer/slot/parameter/ProgramValueSlotParameterSet.js +1 -1
  160. package/engine/graphics/render/forward_plus/LightManager.js +117 -94
  161. package/engine/graphics/render/forward_plus/PointLight.js +9 -0
  162. package/engine/graphics/render/forward_plus/PointLightData.js +1 -1
  163. package/engine/graphics/render/forward_plus/SpotLight.js +9 -0
  164. package/engine/graphics/render/forward_plus/cluster/compute_light_data_hash_0.js +2 -2
  165. package/engine/graphics/render/forward_plus/plugin/ForwardPlusRenderingPlugin.js +1 -1
  166. package/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +5 -5
  167. package/engine/graphics/render/forward_plus/prototypeLightManager.js +180 -86
  168. package/engine/graphics/render/forward_plus/query/analytical_triplanar_corner_mapping.js +8 -0
  169. package/engine/graphics/render/forward_plus/query/cube_mapping.js +38 -0
  170. package/engine/graphics/render/forward_plus/query/detailed_sphere_frustum_intersection_test.js +86 -0
  171. package/engine/graphics/render/forward_plus/query/point_light_inside_volume.js +73 -0
  172. package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_objects.js +131 -0
  173. package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_texture.js +129 -0
  174. package/engine/graphics/render/forward_plus/query/spot_light_inside_volume.js +33 -0
  175. package/engine/graphics/render/forward_plus/read_frustum_corner.js +14 -0
  176. package/engine/graphics/render/forward_plus/testClusterEquality.js +22 -0
  177. package/engine/graphics/render/visibility/IncrementalDeltaSet.js +11 -0
  178. package/engine/graphics/render/visibility/hiz/prototypeHiZ.js +1 -1
  179. package/engine/graphics/texture/sampler/HarmonicDiffusionGrid.spec.js +1 -1
  180. package/engine/graphics/texture/sampler/SampleTraverser.js +1 -1
  181. package/engine/graphics/texture/sampler/distanceField.spec.js +1 -1
  182. package/engine/grid/components/GridObstacle.js +1 -1
  183. package/engine/intelligence/behavior/selector/WeightedElement.js +2 -1
  184. package/engine/intelligence/optimization/RandomOptimizer.js +1 -1
  185. package/engine/navigation/ecs/components/Path.js +1 -1
  186. package/engine/navigation/grid/FastBinaryHeap.spec.js +1 -1
  187. package/engine/sound/ecs/emitter/SoundEmitter.js +2 -1
  188. package/engine/sound/ecs/emitter/SoundTrack.js +2 -1
  189. package/engine/sound/material/concrete/RandomSoundMaterial.js +1 -1
  190. package/engine/ui/notification/notificationGenerator.js +1 -1
  191. package/generation/filtering/numeric/complex/CellFilterGaussianBlur.js +1 -1
  192. package/generation/grid/generation/GridTaskExecuteRuleTimes.js +2 -1
  193. package/generation/markers/actions/MarkerNodeActionSelectRandom.js +1 -1
  194. package/generation/markers/transform/MarkerNodeTransformerRecordUniqueRandomEnum.js +1 -1
  195. package/generation/placement/action/random/CellActionSelectRandom.js +1 -1
  196. package/generation/theme/ThemeEngine.js +1 -1
  197. package/misc/makeMaterialIconCached.js +2 -2
  198. package/package.json +1 -1
  199. package/view/elements/image/HTMLElementCacheKey.js +2 -1
  200. package/view/elements/radial/RadialText.js +2 -1
  201. package/view/minimap/gl/MinimapMarkersGL.js +6 -100
  202. package/view/minimap/gl/buildMaterial.js +94 -0
  203. package/engine/graphics/micron/format/MicronGeometryBufferAttributeSpec.js +0 -71
  204. package/engine/graphics/render/forward_plus/queryBVH_Frustum.js +0 -357
@@ -1,19 +1,6 @@
1
- import {
2
- DataTexture,
3
- LinearMipMapLinearFilter,
4
- NearestFilter,
5
- NormalBlending,
6
- Points,
7
- RGBAFormat,
8
- ShaderMaterial,
9
- Vector2 as ThreeVector2
10
- } from 'three';
1
+ import { DataTexture, Points } from 'three';
11
2
  import { AssetManager } from "../../../engine/asset/AssetManager.js";
12
3
  import { ManagedAtlas } from "../../../engine/graphics/texture/atlas/ManagedTextureAtlas.js";
13
- import {
14
- ParticleAttributeType,
15
- ParticleDataType,
16
- } from "../../../engine/graphics/particles/particular/group/ParticleGroup.js";
17
4
  import { EntityObserver } from "../../../engine/ecs/EntityObserver.js";
18
5
  import { Transform } from "../../../engine/ecs/transform/Transform.js";
19
6
  import MinimapMarker from "../../../../model/game/ecs/component/minimap/MinimapMarker.js";
@@ -24,91 +11,10 @@ import { ParticleSpecification } from "../../../engine/graphics/particles/partic
24
11
  import { ParticleAttribute } from "../../../engine/graphics/particles/particular/group/ParticleAttribute.js";
25
12
  import Vector2 from "../../../core/geom/Vector2.js";
26
13
  import { writeSample2DDataToDataTexture } from "../../../engine/graphics/texture/sampler/writeSampler2DDataToDataTexture.js";
27
-
28
- /**
29
- *
30
- * @return {ShaderMaterial}
31
- */
32
- function buildMaterial() {
33
- function vertexShader() {
34
- return `
35
- attribute float size;
36
- attribute vec4 aPatch;
37
-
38
- varying vec4 vPatch;
39
-
40
- uniform vec2 resolution;
41
-
42
- vec2 extractScale2D(mat4 matrix){
43
- float sx = length(matrix[0].xy);
44
- float sz = length(matrix[2].xy);
45
-
46
- return vec2(sx, sz);
47
- }
48
-
49
- void main() {
50
- vPatch = aPatch;
51
- vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
52
-
53
- //extract scale
54
- vec2 scale = extractScale2D(projectionMatrix);
55
-
56
- float radius = size / 2.0;
57
-
58
- gl_Position = projectionMatrix * mvPosition;
59
- gl_PointSize = resolution.y * radius * max(scale.x, scale.y);
60
- }`;
61
- }
62
-
63
- function fragmentShader() {
64
- return `
65
- uniform sampler2D atlas;
66
-
67
- varying vec4 vPatch;
68
- void main() {
69
- vec2 uv = gl_PointCoord*vPatch.zw + vPatch.xy;
70
- vec4 texel = texture2D( atlas, uv );
71
-
72
- if(texel.a == 0.0){
73
- discard;
74
- }
75
-
76
- gl_FragColor = texel;
77
- }`;
78
- }
79
-
80
-
81
- const dataTexture = new DataTexture(new Uint8Array(4), 1, 1, RGBAFormat);
82
- dataTexture.flipY = false;
83
- dataTexture.generateMipmaps = true;
84
- dataTexture.minFilter = LinearMipMapLinearFilter;
85
- dataTexture.magFilter = NearestFilter;
86
-
87
- const uniforms = {
88
- atlas: {
89
- type: 't',
90
- value: dataTexture
91
- },
92
- resolution: {
93
- type: 'v2',
94
- value: new ThreeVector2()
95
- }
96
- };
97
-
98
- const material = new ShaderMaterial({
99
- uniforms,
100
- vertexShader: vertexShader(),
101
- fragmentShader: fragmentShader(),
102
- blending: NormalBlending,
103
- lights: false,
104
- fog: false,
105
- depthTest: false,
106
- transparent: true,
107
- vertexColors: false
108
- });
109
-
110
- return material;
111
- }
14
+ import { ParticleDataType } from "../../../engine/graphics/particles/particular/group/ParticleDataType.js";
15
+ import { ParticleAttributeType } from "../../../engine/graphics/particles/particular/group/ParticleAttributeType.js";
16
+ import { buildMaterial } from "./buildMaterial.js";
17
+ import { ParticleGroup } from "../../../engine/graphics/particles/particular/group/ParticleGroup.js";
112
18
 
113
19
  /**
114
20
  *
@@ -164,7 +70,7 @@ export class MinimapMarkersGL extends MinimapWorldLayer {
164
70
  *
165
71
  * @type {ParticleGroup}
166
72
  */
167
- const particles = this.particles = particleSpecification.build();
73
+ const particles = this.particles = new ParticleGroup(particleSpecification);
168
74
 
169
75
  this.entityObserver = new EntityObserver([Transform, MinimapMarker], addElement, removeElement);
170
76
 
@@ -0,0 +1,94 @@
1
+ import {
2
+ DataTexture,
3
+ LinearMipMapLinearFilter,
4
+ NearestFilter,
5
+ NormalBlending,
6
+ RGBAFormat,
7
+ ShaderMaterial,
8
+ Vector2 as ThreeVector2
9
+ } from "three";
10
+
11
+ /**
12
+ *
13
+ * @return {ShaderMaterial}
14
+ */
15
+ export function buildMaterial() {
16
+ function vertexShader() {
17
+ return `
18
+ attribute float size;
19
+ attribute vec4 aPatch;
20
+
21
+ varying vec4 vPatch;
22
+
23
+ uniform vec2 resolution;
24
+
25
+ vec2 extractScale2D(mat4 matrix){
26
+ float sx = length(matrix[0].xy);
27
+ float sz = length(matrix[2].xy);
28
+
29
+ return vec2(sx, sz);
30
+ }
31
+
32
+ void main() {
33
+ vPatch = aPatch;
34
+ vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
35
+
36
+ //extract scale
37
+ vec2 scale = extractScale2D(projectionMatrix);
38
+
39
+ float radius = size / 2.0;
40
+
41
+ gl_Position = projectionMatrix * mvPosition;
42
+ gl_PointSize = resolution.y * radius * max(scale.x, scale.y);
43
+ }`;
44
+ }
45
+
46
+ function fragmentShader() {
47
+ return `
48
+ uniform sampler2D atlas;
49
+
50
+ varying vec4 vPatch;
51
+ void main() {
52
+ vec2 uv = gl_PointCoord*vPatch.zw + vPatch.xy;
53
+ vec4 texel = texture2D( atlas, uv );
54
+
55
+ if(texel.a == 0.0){
56
+ discard;
57
+ }
58
+
59
+ gl_FragColor = texel;
60
+ }`;
61
+ }
62
+
63
+
64
+ const dataTexture = new DataTexture(new Uint8Array(4), 1, 1, RGBAFormat);
65
+ dataTexture.flipY = false;
66
+ dataTexture.generateMipmaps = true;
67
+ dataTexture.minFilter = LinearMipMapLinearFilter;
68
+ dataTexture.magFilter = NearestFilter;
69
+
70
+ const uniforms = {
71
+ atlas: {
72
+ type: 't',
73
+ value: dataTexture
74
+ },
75
+ resolution: {
76
+ type: 'v2',
77
+ value: new ThreeVector2()
78
+ }
79
+ };
80
+
81
+ const material = new ShaderMaterial({
82
+ uniforms,
83
+ vertexShader: vertexShader(),
84
+ fragmentShader: fragmentShader(),
85
+ blending: NormalBlending,
86
+ lights: false,
87
+ fog: false,
88
+ depthTest: false,
89
+ transparent: true,
90
+ vertexColors: false
91
+ });
92
+
93
+ return material;
94
+ }
@@ -1,71 +0,0 @@
1
- import { DataType } from "../../../../core/collection/table/DataType.js";
2
- import { computeStringHash } from "../../../../core/primitives/strings/computeStringHash.js";
3
- import { DataTypeByteSizes } from "../../../../core/collection/table/DataTypeByteSizes.js";
4
-
5
- export class MicronGeometryBufferAttributeSpec {
6
- constructor() {
7
- /**
8
- *
9
- * @type {string}
10
- */
11
- this.name = "";
12
- /**
13
- *
14
- * @type {DataType}
15
- */
16
- this.type = DataType.Float32;
17
- /**
18
- *
19
- * @type {number}
20
- */
21
- this.itemSize = 1;
22
-
23
- /**
24
- * Normalized values will be automatically converted to float32 in the shader
25
- * This gives good optimization opportunities for things like normal vectors
26
- * @type {boolean}
27
- */
28
- this.normalized = false;
29
- }
30
-
31
- hash() {
32
- return computeStringHash(this.name);
33
- }
34
-
35
- /**
36
- *
37
- * @param {MicronGeometryBufferAttributeSpec} other
38
- * @returns {boolean}
39
- */
40
- equals(other) {
41
- return this.type === other.type
42
- && this.itemSize === other.itemSize
43
- && this.normalized === other.normalized
44
- && this.name === other.name
45
- ;
46
- }
47
-
48
- /**
49
- *
50
- * @returns {number}
51
- */
52
- getByteSize() {
53
- return this.itemSize * DataTypeByteSizes[this.type];
54
- }
55
-
56
- /**
57
- *
58
- * @param {MicronGeometryBufferAttributeSpec} a
59
- * @param {MicronGeometryBufferAttributeSpec} b
60
- * @return {number}
61
- */
62
- static byName(a, b) {
63
- return a.name.localeCompare(b.name);
64
- }
65
- }
66
-
67
- /**
68
- * @readonly
69
- * @type {boolean}
70
- */
71
- MicronGeometryBufferAttributeSpec.prototype.isMicronGeometryBufferAttributeSpec = true;
@@ -1,357 +0,0 @@
1
- import { line3_computeSegmentPointDistance_sqr } from "../../../../core/geom/LineSegment.js";
2
- import { computeConePlaneSide } from "../../../../core/geom/3d/cone/computeConePlaneSide.js";
3
- import { aabb3_computeDistanceAbovePlane } from "../../../../core/geom/3d/aabb/aabb3_computeDistanceAbovePlane.js";
4
- import { v3_distance_sqr } from "../../../../core/geom/v3_distance_sqr.js";
5
-
6
- /**
7
- *
8
- * @type {(BinaryNode|LeafNode)[]}
9
- */
10
- const stack = [];
11
-
12
- let stackPointer = 0;
13
-
14
- const _lut_array_buffer = new ArrayBuffer(84);
15
-
16
- /**
17
- * Mapping from 3 plane bitfield, corresponding to intersection point of the planes
18
- * @type {number[]}
19
- */
20
- const triplanar_corner_mapping = new Uint8Array(_lut_array_buffer, 0, 43);
21
-
22
- triplanar_corner_mapping[0b010101] = 0;
23
- triplanar_corner_mapping[0b100101] = 1;
24
- triplanar_corner_mapping[0b011001] = 2;
25
- triplanar_corner_mapping[0b101001] = 3;
26
- triplanar_corner_mapping[0b010110] = 4;
27
- triplanar_corner_mapping[0b100110] = 5;
28
- triplanar_corner_mapping[0b011010] = 6;
29
- triplanar_corner_mapping[0b101010] = 7;
30
-
31
- function analytical_triplanar_corner_mapping(field) {
32
- return ((field << 1) & 0b100) | ((field >> 2) & 0b10) | ((field >> 5) & 0b1);
33
- }
34
-
35
- /**
36
- * Mapping from 2 plane bitfield to 2 corner bitfield, corresponding to corner indices of intersecting planes
37
- * @type {number[]}
38
- */
39
- const biplanar_edge_mapping = new Uint8Array(_lut_array_buffer, 43, 41);
40
-
41
- biplanar_edge_mapping[0b000101] = 0 | (1 << 3);
42
- biplanar_edge_mapping[0b000110] = 4 | (5 << 3);
43
-
44
- biplanar_edge_mapping[0b001001] = 2 | (3 << 3);
45
- biplanar_edge_mapping[0b001010] = 6 | (7 << 3);
46
-
47
- biplanar_edge_mapping[0b010100] = 0 | (4 << 3);
48
- biplanar_edge_mapping[0b011000] = 2 | (6 << 3);
49
-
50
- biplanar_edge_mapping[0b100100] = 1 | (5 << 3);
51
- biplanar_edge_mapping[0b101000] = 3 | (7 << 3);
52
-
53
- biplanar_edge_mapping[0b010001] = 0 | (2 << 3);
54
- biplanar_edge_mapping[0b010010] = 4 | (6 << 3);
55
-
56
- biplanar_edge_mapping[0b100001] = 1 | (3 << 3);
57
- biplanar_edge_mapping[0b100010] = 5 | (7 << 3);
58
-
59
- /**
60
- *
61
- * @param {number} radius
62
- * @param {number} light_x
63
- * @param {number} light_y
64
- * @param {number} light_z
65
- * @param {number} outside_plane_count
66
- * @param {number} outside_plane_bitfield
67
- * @param {number[]} points
68
- * @return {boolean}
69
- */
70
- function detailed_sphere_frustum_intersection_test(
71
- radius, light_x, light_y, light_z,
72
- outside_plane_count, outside_plane_bitfield,
73
- points
74
- ) {
75
-
76
- const radius_sqr = radius * radius;
77
-
78
- if (outside_plane_count === 3) {
79
- // nearest point in a corner, find the corner
80
- const point_index = analytical_triplanar_corner_mapping(outside_plane_bitfield);
81
-
82
- const point_address = point_index * 3;
83
-
84
- const point_x = points[point_address];
85
- const point_y = points[point_address + 1];
86
- const point_z = points[point_address + 2];
87
-
88
- const distance_to_light_sqr = v3_distance_sqr(
89
- point_x, point_y, point_z,
90
- light_x, light_y, light_z
91
- );
92
-
93
- // queryBVH_Frustum.checks_sphere_frustum_corner++;
94
-
95
- // return distance_to_light_sqr <= radius_sqr;
96
-
97
- if (distance_to_light_sqr > radius_sqr) {
98
-
99
- // queryBVH_Frustum.rejection_sphere_count++;
100
- return false;
101
- }
102
-
103
- } else if (outside_plane_count === 2) {
104
- // nearest point is on an edge of two plane intersection
105
- const edge_bitfield = biplanar_edge_mapping[outside_plane_bitfield];
106
-
107
- // get 2 corners from edge bitfield
108
- const corner_index_0 = edge_bitfield & 0b111;
109
- const corner_address_0 = corner_index_0 * 3;
110
-
111
- const corner_index_1 = (edge_bitfield >> 3) & 0b111;
112
- const corner_address_1 = corner_index_1 * 3;
113
-
114
- const point_0_x = points[corner_address_0];
115
- const point_0_y = points[corner_address_0 + 1];
116
- const point_0_z = points[corner_address_0 + 2];
117
-
118
- const point_1_x = points[corner_address_1];
119
- const point_1_y = points[corner_address_1 + 1];
120
- const point_1_z = points[corner_address_1 + 2];
121
-
122
- const distance_to_frustum_sqr = line3_computeSegmentPointDistance_sqr(
123
- point_0_x, point_0_y, point_0_z,
124
- point_1_x, point_1_y, point_1_z,
125
- light_x, light_y, light_z
126
- );
127
-
128
- // queryBVH_Frustum.checks_sphere_frustum_edge++;
129
-
130
- // return distance_to_frustum_sqr <= radius_sqr;
131
-
132
- if (distance_to_frustum_sqr > radius_sqr) {
133
-
134
- // queryBVH_Frustum.rejection_sphere_count++;
135
- return false;
136
- }
137
- }
138
-
139
- return true;
140
- }
141
-
142
- /**
143
- *
144
- * @param {PointLight} light
145
- * @param {number[]} points
146
- * @param {number[]|Float32Array|Float64Array} planes
147
- * @returns {boolean}
148
- */
149
- function point_light_inside_volume(light, points, planes) {
150
- let j = 0;
151
- let outside_plane_count = 0;
152
- let outside_plane_bitfield = 0;
153
-
154
- // validate if the sphere intersects the plane-bound space
155
-
156
- const light_position = light.position;
157
-
158
- const light_x = light_position.x;
159
- const light_y = light_position.y;
160
- const light_z = light_position.z;
161
-
162
- const radius = light.radius.getValue();
163
-
164
- // queryBVH_Frustum.checks_sphere++;
165
-
166
- for (; j < 6; j++) {
167
-
168
- const plane_address = j * 4;
169
-
170
- const plane_normal_x = planes[plane_address];
171
- const plane_normal_y = planes[plane_address + 1];
172
- const plane_normal_z = planes[plane_address + 2];
173
- const plane_constant = planes[plane_address + 3];
174
-
175
- /*
176
- compute distance from the center of the sphere to the plane
177
- NOTE: inlined computation of distance from point to plane
178
- */
179
- const distance = (plane_normal_x * light_x + plane_normal_y * light_y + plane_normal_z * light_z) + plane_constant;
180
-
181
- // queryBVH_Frustum.checks_sphere_plane++;
182
-
183
- if (distance < 0) {
184
- // center of the sphere is below the plane
185
-
186
- if (distance < -radius) {
187
- // sphere is entirely below the plane
188
-
189
- // queryBVH_Frustum.rejection_sphere_count++;
190
-
191
- return false;
192
- }
193
-
194
- // sphere intersects the plane
195
-
196
- outside_plane_count++;
197
-
198
- const plane_bit_mask = 1 << j;
199
-
200
- outside_plane_bitfield |= plane_bit_mask;
201
- }
202
-
203
- }
204
-
205
- if (outside_plane_count < 2) {
206
- return true;
207
- } else {
208
- return detailed_sphere_frustum_intersection_test(
209
- radius, light_x, light_y, light_z,
210
- outside_plane_count, outside_plane_bitfield,
211
- points
212
- );
213
- }
214
- }
215
-
216
- /**
217
- *
218
- * @param {SpotLight} light
219
- * @param {number[]} points
220
- * @param {number[]|Float32Array|Float64Array} planes
221
- * @returns {boolean}
222
- */
223
- function spot_light_inside_volume(light, points, planes) {
224
- for (let j = 0; j < 6; j++) {
225
-
226
- const plane_address = j * 4;
227
-
228
- const plane_normal_x = planes[plane_address];
229
- const plane_normal_y = planes[plane_address + 1];
230
- const plane_normal_z = planes[plane_address + 2];
231
- const plane_constant = planes[plane_address + 3];
232
-
233
- const side = computeConePlaneSide(
234
- plane_normal_x, plane_normal_y, plane_normal_z, plane_constant,
235
- light.position.x, light.position.y, light.position.z,
236
- light.direction.x, light.direction.y, light.direction.z,
237
- light.angle.getValue(), light.distance.getValue()
238
- );
239
-
240
- if (side < 0) {
241
- return false;
242
- }
243
- }
244
-
245
- return true;
246
- }
247
-
248
- /**
249
- * Most of the data is in flat continuous array for cache coherence
250
- * @param {PointLightData[]} destination
251
- * @param {number} destination_offset
252
- * @param {BinaryNode<PointLightData>} root
253
- * @param {number[]|Float32Array|Float64Array} planes
254
- * @param {number[]|Float32Array|Float64Array} points
255
- * @returns {number} number of items added to the destination, non-negative integer
256
- */
257
- export function queryBVH_Frustum(
258
- destination,
259
- destination_offset,
260
- root, planes, points
261
- ) {
262
- let i = 0;
263
- let j = 0;
264
- // read out points
265
- const stackOffset = stackPointer;
266
-
267
- stack[stackPointer] = root;
268
-
269
- stackPointer++;
270
-
271
- stack_loop:while (stackPointer-- > stackOffset) {
272
-
273
- // queryBVH_Frustum.iteration_count++;
274
-
275
- const n = stack[stackPointer];
276
-
277
- if (n.isBinaryNode === true) {
278
-
279
- for (j = 0; j < 6; j++) {
280
-
281
- const plane_address = j * 4;
282
-
283
- const plane_normal_x = planes[plane_address];
284
- const plane_normal_y = planes[plane_address + 1];
285
- const plane_normal_z = planes[plane_address + 2];
286
- const plane_constant = planes[plane_address + 3];
287
-
288
- const distanceAbovePlane = aabb3_computeDistanceAbovePlane(
289
- plane_normal_x, plane_normal_y, plane_normal_z, plane_constant,
290
- n.x0, n.y0, n.z0,
291
- n.x1, n.y1, n.z1
292
- );
293
-
294
- if (distanceAbovePlane < 0) {
295
- // node is below the plane
296
-
297
- // queryBVH_Frustum.rejection_count++;
298
-
299
- continue stack_loop;
300
- }
301
- }
302
-
303
-
304
- if (n.right !== null) {
305
- stack[stackPointer] = n.right;
306
- stackPointer++;
307
- }
308
-
309
- if (n.left !== null) {
310
- stack[stackPointer] = n.left;
311
- stackPointer++
312
- }
313
-
314
- } else {
315
-
316
- // leaf node
317
-
318
- /**
319
- *
320
- * @type {PointLightData}
321
- */
322
- const light_data = n.object;
323
-
324
- const light = light_data.light;
325
-
326
- if (light.isPointLight) {
327
- if (!point_light_inside_volume(light, points, planes)) {
328
- continue;
329
- }
330
- } else if (light.isSpotLight) {
331
- if (!spot_light_inside_volume(light, points, planes)) {
332
- continue;
333
- }
334
- }
335
-
336
- destination[destination_offset + i] = light_data;
337
-
338
- i++;
339
- }
340
-
341
- }
342
-
343
- //drop the stack frame
344
- stackPointer = stackOffset;
345
-
346
- return i;
347
- }
348
-
349
- queryBVH_Frustum.iteration_count = 0;
350
- queryBVH_Frustum.rejection_count = 0;
351
- queryBVH_Frustum.rejection_sphere_count = 0;
352
- queryBVH_Frustum.plane_tests = 0;
353
- queryBVH_Frustum.plane_tests_early_exits = 0;
354
- queryBVH_Frustum.checks_sphere = 0;
355
- queryBVH_Frustum.checks_sphere_plane = 0;
356
- queryBVH_Frustum.checks_sphere_frustum_corner = 0;
357
- queryBVH_Frustum.checks_sphere_frustum_edge = 0;