@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.
- package/core/bvh2/BinaryNode.js +1 -1
- package/core/bvh2/aabb3/AABB3.js +18 -0
- package/core/bvh2/aabb3/AABB3Math.js +1 -1
- package/core/bvh2/binary/2/BinaryUint32BVH.js +498 -0
- package/core/bvh2/binary/2/BinaryUint32BVH.spec.js +54 -0
- package/core/bvh2/binary/IndexedBinaryBVH.js +22 -26
- package/core/collection/ArrayUtils.js +1 -1
- package/core/collection/array/arrayQuickSort.js +9 -6
- package/core/collection/array/array_swap.js +22 -0
- package/core/collection/array/computeHashArray.js +22 -0
- package/core/collection/array/computeHashIntegerArray.js +15 -0
- package/core/collection/table/DataType2TypedArrayConstructorMapping.js +15 -0
- package/core/color/Color.js +2 -1
- package/core/function/FunctionCompiler.js +2 -1
- package/core/geom/3d/aabb/aabb3_computeDistanceAbovePlane.js +9 -33
- package/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +1 -1
- package/core/geom/3d/line/line3_computeSegmentPointDistance_sqr.js +41 -0
- package/core/geom/3d/morton/mortonEncode_magicbits.js +2 -1
- package/core/geom/3d/morton/reinterpret_float32_as_int32.js +13 -0
- package/core/geom/3d/morton/v3_morton_encode_transformed.js +33 -0
- package/core/geom/3d/ray/ray_computeNearestPointToPoint.js +37 -0
- package/core/geom/3d/shape/AbstractShape3D.js +29 -0
- package/core/geom/3d/shape/CompositeShape.js +60 -0
- package/core/geom/3d/shape/TransformedShape3D.js +70 -0
- package/core/geom/3d/shape/UnitCubeShape3D.js +13 -0
- package/core/geom/3d/shape/UnitSphereShape3D.js +16 -0
- package/core/geom/AABB2.js +1 -1
- package/core/geom/ConicRay.js +3 -1
- package/core/geom/LineSegment.js +0 -78
- package/core/geom/Matrix4.js +7 -8
- package/core/geom/Rectangle.js +2 -1
- package/core/geom/Vector1.js +1 -1
- package/core/geom/Vector3.js +2 -1
- package/core/geom/Vector4.js +2 -1
- package/core/geom/random/randomPointInBox.js +7 -3
- package/core/geom/random/randomPointInPoint.js +6 -3
- package/core/geom/random/randomPointInSphere.js +6 -3
- package/core/geom/random/randomPointOnBox.js +7 -3
- package/core/geom/random/randomPointOnSphere.js +6 -3
- package/core/geom/v3_length.js +8 -3
- package/core/graph/graph_k_means_cluster.js +1 -1
- package/core/math/MathUtils.js +0 -354
- package/core/math/MathUtils.spec.js +7 -1
- package/core/math/gaussian.js +9 -0
- package/core/math/hash/computeHashFloat.js +17 -0
- package/core/math/hash/computeHashFloatArray.js +34 -0
- package/core/math/hash/computeObjectHash.js +54 -0
- package/core/math/intersects1D.js +19 -0
- package/core/math/interval/NumericInterval.js +2 -2
- package/core/math/isValueBetween.js +10 -0
- package/core/math/isValueBetweenInclusive.js +10 -0
- package/core/math/noise/curl_noise_3dt.js +1 -1
- package/core/math/noise/sdnoise.js +10 -10
- package/core/math/overlap1D.js +19 -0
- package/core/math/pingpong.js +17 -0
- package/core/math/random/makeRangedRandom.js +19 -0
- package/core/math/random/randomFloatBetween.js +14 -0
- package/core/math/random/randomFromArray.js +19 -0
- package/core/math/random/randomGaussian.js +15 -0
- package/core/math/random/randomIntegerBetween.js +14 -0
- package/core/math/random/roundFair.js +15 -0
- package/core/math/separation1D.js +21 -0
- package/core/math/solveQuadratic.js +25 -0
- package/core/model/BoundedValue.js +1 -1
- package/core/model/node-graph/node/NodeInstancePortReference.js +1 -1
- package/core/model/node-graph/node/Port.js +1 -1
- package/core/model/reactive/evaluation/MultiPredicateEvaluator.spec.js +3 -1
- package/core/model/reactive/model/ReactiveBinaryExpression.js +1 -1
- package/core/model/reactive/model/terminal/ReactiveLiteralNumber.js +1 -1
- package/core/model/reactive/model/terminal/ReactiveReference.js +1 -1
- package/core/model/reactive/model/util/createRandomReactiveExpression.js +1 -1
- package/core/model/stat/LinearModifier.js +1 -1
- package/engine/animation/curve/AnimationCurve.js +72 -0
- package/engine/animation/curve/Keyframe.js +27 -0
- package/engine/animation/keyed2/AnimationTrack.js +27 -3
- package/engine/asset/Asset.js +1 -1
- package/engine/asset/loaders/GLTFAssetLoader.d.ts +1 -1
- package/engine/asset/loaders/GLTFAssetLoader.js +10 -0
- package/engine/asset/loaders/image/ImageRGBADataAsset.js +8 -1
- package/engine/asset/loaders/material/computeMaterialHash.js +3 -1
- package/engine/asset/loaders/material/computeTextureHash.js +2 -1
- package/engine/ecs/animation/Animation.js +2 -1
- package/engine/ecs/animation/InverseKinematics.js +2 -1
- package/engine/ecs/dynamic_actions/DynamicActorSystem.js +2 -1
- package/engine/ecs/dynamic_actions/DynamicRuleDescriptionTable.spec.js +3 -5
- package/engine/ecs/dynamic_actions/actions/definition/WeightedRandomActionDescription.js +1 -1
- package/engine/ecs/evaluation/complex/PointFitnessGaussianBlur.js +1 -1
- package/engine/ecs/foliage/ecs/Foliage2.js +1 -1
- package/engine/ecs/fow/shader/FogOfWarRenderer.js +1 -1
- package/engine/ecs/gui/GUIElement.js +1 -1
- package/engine/ecs/gui/hud/HeadsUpDisplay.js +1 -1
- package/engine/ecs/gui/position/ViewportPosition.js +2 -1
- package/engine/ecs/systems/RangedAttackSystem.js +1 -1
- package/engine/ecs/systems/SteeringSystem.js +1 -1
- package/engine/ecs/terrain/tiles/TerrainTileManager.js +1 -1
- package/engine/ecs/tooltip/TooltipComponent.js +15 -0
- package/engine/graphics/ecs/animation/animator/AnimationClip.js +2 -1
- package/engine/graphics/ecs/animation/animator/AnimationClipDefinition.js +2 -1
- package/engine/graphics/ecs/animation/animator/AnimationNotification.js +2 -1
- package/engine/graphics/ecs/animation/animator/AnimationNotificationDefinition.js +2 -1
- package/engine/graphics/ecs/animation/animator/graph/AnimationGraph.js +2 -1
- package/engine/graphics/ecs/animation/animator/graph/definition/AnimationGraphDefinition.js +2 -1
- package/engine/graphics/ecs/animation/animator/graph/definition/AnimationStateDefinition.js +1 -1
- package/engine/graphics/ecs/animation/animator/graph/definition/AnimationTransitionDefinition.js +2 -1
- package/engine/graphics/ecs/camera/CameraClippingPlaneComputer.js +1 -1
- package/engine/graphics/ecs/highlight/HighlightDefinition.js +2 -1
- package/engine/graphics/ecs/light/Light.d.ts +1 -1
- package/engine/graphics/ecs/light/Light.js +3 -0
- package/engine/graphics/ecs/mesh/Mesh.js +2 -1
- package/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +13 -0
- package/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.d.ts +6 -0
- package/engine/graphics/geometry/AttributeSpec.js +105 -0
- package/engine/graphics/{micron/format/MicronVertexDataSpec.js → geometry/VertexDataSpec.js} +56 -25
- package/engine/graphics/micron/build/buildMicronGeometryFromBufferGeometry.js +7 -7
- package/engine/graphics/micron/build/fill_patch_geometry_data.js +1 -1
- package/engine/graphics/micron/buildPatchwork.js +1 -1
- package/engine/graphics/micron/format/MicronGeometry.js +3 -3
- package/engine/graphics/micron/format/serialization/MicronGeometryBinarySerializationAdapter.js +2 -2
- package/engine/graphics/micron/format/serialization/deserialize_attribute_spec.js +1 -1
- package/engine/graphics/micron/format/serialization/serialize_attribute_spec.js +1 -1
- package/engine/graphics/micron/render/PatchCacheKey.js +1 -1
- package/engine/graphics/micron/render/instanced/AttributeDataTexture.js +5 -5
- package/engine/graphics/micron/render/v1/ThreeVirtualGeometryAdapter.js +1 -1
- package/engine/graphics/particles/particular/engine/emitter/PARTICULAR_PARTICLE_SPECIFICATION.js +80 -16
- package/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +57 -52
- package/engine/graphics/particles/particular/engine/emitter/ParticleLayer.js +2 -1
- package/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +51 -12
- package/engine/graphics/particles/particular/engine/emitter/ParticlePool.spec.js +3 -2
- package/engine/graphics/particles/particular/engine/emitter/computeEmissionFunction.js +1 -1
- package/engine/graphics/particles/particular/engine/emitter/serde/ParameterLookupTableSerializationAdapter.js +8 -2
- package/engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.js +2 -1
- package/engine/graphics/particles/particular/engine/parameter/ParameterTrack.js +1 -1
- package/engine/graphics/particles/particular/engine/parameter/ParticleParameter.js +1 -1
- package/engine/graphics/particles/particular/engine/renderers/billboard/BILLBOARD_PARTICLE_SPECIFICATION.js +21 -0
- package/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.js +0 -20
- package/engine/graphics/particles/particular/engine/renderers/billboard/prototypeBillboardRenderer.js +9 -9
- package/engine/graphics/particles/particular/engine/simulator/SimulationStepApplyForce.js +2 -5
- package/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseAcceleration.js +2 -6
- package/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseVelocity.js +2 -7
- package/engine/graphics/particles/particular/engine/simulator/SimulationStepFixedPhysics.js +2 -5
- package/engine/graphics/particles/particular/engine/simulator/update_parameters.js +1 -1
- package/engine/graphics/particles/particular/engine/utils/distributeParticlesOnObject3D.js +1 -1
- package/engine/graphics/particles/particular/engine/utils/distrubuteParticlesOnMesh.js +1 -1
- package/engine/graphics/particles/particular/engine/utils/volume/ParticleVolume.js +384 -0
- package/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +558 -0
- package/engine/graphics/particles/particular/group/Operation.js +18 -0
- package/engine/graphics/particles/particular/group/OperationType.js +9 -0
- package/engine/graphics/particles/particular/group/ParticleAttribute.js +2 -1
- package/engine/graphics/particles/particular/group/ParticleAttributeType.js +11 -0
- package/engine/graphics/particles/particular/group/ParticleDataType.js +10 -0
- package/engine/graphics/particles/particular/group/ParticleGroup.js +7 -245
- package/engine/graphics/particles/particular/group/ParticleGroup.spec.js +3 -1
- package/engine/graphics/particles/particular/group/ParticleSpecification.js +21 -14
- package/engine/graphics/particles/particular/group/itemSizeFromAttributeType.js +20 -0
- package/engine/graphics/particles/particular/group/optimizeCommandQueue.js +162 -0
- package/engine/graphics/particles/particular/group/typedArrayConstructorFromDataType.js +19 -0
- package/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.js +1 -1
- package/engine/graphics/render/buffer/slot/parameter/ProgramValueSlotParameter.js +2 -1
- package/engine/graphics/render/buffer/slot/parameter/ProgramValueSlotParameterSet.js +1 -1
- package/engine/graphics/render/forward_plus/LightManager.js +117 -94
- package/engine/graphics/render/forward_plus/PointLight.js +9 -0
- package/engine/graphics/render/forward_plus/PointLightData.js +1 -1
- package/engine/graphics/render/forward_plus/SpotLight.js +9 -0
- package/engine/graphics/render/forward_plus/cluster/compute_light_data_hash_0.js +2 -2
- package/engine/graphics/render/forward_plus/plugin/ForwardPlusRenderingPlugin.js +1 -1
- package/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +5 -5
- package/engine/graphics/render/forward_plus/prototypeLightManager.js +180 -86
- package/engine/graphics/render/forward_plus/query/analytical_triplanar_corner_mapping.js +8 -0
- package/engine/graphics/render/forward_plus/query/cube_mapping.js +38 -0
- package/engine/graphics/render/forward_plus/query/detailed_sphere_frustum_intersection_test.js +86 -0
- package/engine/graphics/render/forward_plus/query/point_light_inside_volume.js +73 -0
- package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_objects.js +131 -0
- package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_texture.js +129 -0
- package/engine/graphics/render/forward_plus/query/spot_light_inside_volume.js +33 -0
- package/engine/graphics/render/forward_plus/read_frustum_corner.js +14 -0
- package/engine/graphics/render/forward_plus/testClusterEquality.js +22 -0
- package/engine/graphics/render/visibility/IncrementalDeltaSet.js +11 -0
- package/engine/graphics/render/visibility/hiz/prototypeHiZ.js +1 -1
- package/engine/graphics/texture/sampler/HarmonicDiffusionGrid.spec.js +1 -1
- package/engine/graphics/texture/sampler/SampleTraverser.js +1 -1
- package/engine/graphics/texture/sampler/distanceField.spec.js +1 -1
- package/engine/grid/components/GridObstacle.js +1 -1
- package/engine/intelligence/behavior/selector/WeightedElement.js +2 -1
- package/engine/intelligence/optimization/RandomOptimizer.js +1 -1
- package/engine/navigation/ecs/components/Path.js +1 -1
- package/engine/navigation/grid/FastBinaryHeap.spec.js +1 -1
- package/engine/sound/ecs/emitter/SoundEmitter.js +2 -1
- package/engine/sound/ecs/emitter/SoundTrack.js +2 -1
- package/engine/sound/material/concrete/RandomSoundMaterial.js +1 -1
- package/engine/ui/notification/notificationGenerator.js +1 -1
- package/generation/filtering/numeric/complex/CellFilterGaussianBlur.js +1 -1
- package/generation/grid/generation/GridTaskExecuteRuleTimes.js +2 -1
- package/generation/markers/actions/MarkerNodeActionSelectRandom.js +1 -1
- package/generation/markers/transform/MarkerNodeTransformerRecordUniqueRandomEnum.js +1 -1
- package/generation/placement/action/random/CellActionSelectRandom.js +1 -1
- package/generation/theme/ThemeEngine.js +1 -1
- package/misc/makeMaterialIconCached.js +2 -2
- package/package.json +1 -1
- package/view/elements/image/HTMLElementCacheKey.js +2 -1
- package/view/elements/radial/RadialText.js +2 -1
- package/view/minimap/gl/MinimapMarkersGL.js +6 -100
- package/view/minimap/gl/buildMaterial.js +94 -0
- package/engine/graphics/micron/format/MicronGeometryBufferAttributeSpec.js +0 -71
- 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
|
-
|
|
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
|
|
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;
|