@woosh/meep-engine 2.33.22 → 2.33.26
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/bvh2/traversal/ThreeClippingPlaneComputingBVHVisitor.js +5 -1
- package/core/bvh2/traversal/__detailed_box_volume_intersection.js +31 -11
- 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/binarySearchHighIndex.js +1 -1
- package/core/collection/array/computeHashArray.js +22 -0
- package/core/collection/array/computeHashIntegerArray.js +15 -0
- package/core/collection/array/copyArray.js +2 -2
- 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 +10 -2
- 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/normal/hemioct/unit_hemioct.spec.js +1 -1
- package/core/geom/3d/plane/plane_computeConvex3PlaneIntersection.js +13 -14
- package/core/geom/3d/ray/ray_computeNearestPointToPoint.js +37 -0
- package/core/geom/3d/shape/AbstractShape3D.js +65 -0
- package/core/geom/3d/shape/TransformedShape3D.js +181 -0
- package/core/geom/3d/shape/TransformedShape3D.spec.js +33 -0
- package/core/geom/3d/shape/UnionShape3D.js +255 -0
- package/core/geom/3d/shape/UnitCubeShape3D.js +101 -0
- package/core/geom/3d/shape/UnitCubeShape3D.spec.js +42 -0
- package/core/geom/3d/shape/UnitSphereShape3D.js +55 -0
- package/core/geom/3d/shape/util/compute_signed_distance_gradient_by_sampling.js +48 -0
- package/core/geom/3d/shape/util/shape_to_visual_entity.js +159 -0
- package/core/geom/3d/voxel/DenseBitVolume3D.js +87 -0
- package/core/geom/3d/voxel/buildVolumeFromProjectedGeometry.js +23 -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/Plane.js +14 -9
- 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 +9 -5
- 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/json/resolvePathByArray.js +2 -2
- 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/core/primitives/array/computeIntegerArrayHash.js +1 -1
- package/{engine/graphics/render/forward_plus/materials → core/primitives/strings}/insert_after.js +3 -0
- package/core/primitives/strings/insert_after_or_replace.js +27 -0
- package/editor/process/symbolic/makeHelperBoxGeometry.js +44 -0
- package/editor/view/ecs/EntityEditor.js +2 -2
- package/editor/view/ecs/components/particles/ParticleEmitterController.js +2 -2
- package/engine/EngineHarness.js +1 -0
- package/engine/animation/AnimationUtils.js +5 -5
- 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/computeImageBitmapEquality.js +11 -0
- package/engine/asset/loaders/material/computeImageBitmapHash.js +22 -28
- package/engine/asset/loaders/material/computeMaterialHash.js +3 -1
- package/engine/asset/loaders/material/computeTextureHash.js +2 -1
- package/engine/ecs/EntityBuilder.js +25 -5
- package/engine/ecs/animation/Animation.js +2 -1
- package/engine/ecs/animation/InverseKinematics.js +2 -1
- package/engine/ecs/attachment/AttachmentBinding.js +8 -0
- package/engine/ecs/attachment/AttachmentSystem.js +4 -0
- package/engine/ecs/attachment/TransformAttachmentBinding.js +14 -44
- package/engine/ecs/components/Tag.js +27 -6
- 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/FogOfWar.js +4 -0
- package/engine/ecs/fow/FogOfWarSystem.js +2 -0
- 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/hud/HeadsUpDisplaySystem.js +2 -0
- package/engine/ecs/gui/position/ViewportPosition.js +2 -1
- package/engine/ecs/system/AbstractContextSystem.js +1 -1
- package/engine/ecs/systems/RangedAttackSystem.js +1 -1
- package/engine/ecs/systems/SteeringSystem.js +1 -1
- package/engine/ecs/systems/TagSystem.js +17 -0
- package/engine/ecs/terrain/tiles/TerrainTileManager.js +1 -1
- package/engine/ecs/tooltip/TooltipComponent.js +15 -0
- package/engine/ecs/transform/Transform.js +19 -6
- package/engine/ecs/util/hideEntityGracefully.js +18 -0
- package/engine/graphics/GraphicsEngine.js +11 -23
- package/engine/graphics/camera/testClippingPlaneComputation.js +2 -2
- package/engine/graphics/composit/CompositLayer.js +17 -4
- package/engine/graphics/composit/CompositingStages.js +8 -0
- package/engine/graphics/composit/LayerCompositer.js +35 -6
- 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/highlight/plugin/OutlineRenderPlugin.js +11 -7
- package/engine/graphics/ecs/light/Light.d.ts +1 -1
- package/engine/graphics/ecs/light/Light.js +5 -0
- package/engine/graphics/ecs/light/binding/three/ThreeLightBinding.js +5 -1
- package/engine/graphics/ecs/mesh/Mesh.js +2 -1
- package/engine/graphics/ecs/mesh-v2/DrawMode.js +5 -0
- package/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +13 -0
- package/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +32 -18
- package/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.d.ts +6 -0
- package/engine/graphics/ecs/path/testPathDisplaySystem.js +98 -98
- package/engine/graphics/ecs/trail2d/Trail2D.js +17 -4
- package/engine/graphics/ecs/trail2d/Trail2DSystem.d.ts +2 -3
- package/engine/graphics/ecs/trail2d/Trail2DSystem.js +34 -118
- 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/ParticleEmitterLibrary.js +3 -0
- package/engine/graphics/particles/ecs/{ParticleEmitterSystem2.js → ParticleEmitterSystem.js} +17 -9
- package/engine/graphics/particles/particular/engine/ParticularEngine.js +12 -4
- package/engine/graphics/particles/particular/engine/emitter/PARTICULAR_PARTICLE_SPECIFICATION.js +84 -0
- package/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +106 -169
- package/engine/graphics/particles/particular/engine/emitter/ParticleEmitterFlag.js +5 -0
- package/engine/graphics/particles/particular/engine/emitter/ParticleLayer.js +14 -3
- package/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +141 -14
- package/engine/graphics/particles/particular/engine/emitter/ParticlePool.spec.js +8 -7
- package/engine/graphics/particles/particular/engine/emitter/computeEmissionFunction.js +37 -0
- package/engine/graphics/particles/particular/engine/emitter/distance_to_camera.js +25 -0
- 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 +24 -0
- package/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.js +262 -71
- package/engine/graphics/particles/particular/engine/renderers/billboard/prototypeBillboardRenderer.js +9 -9
- package/engine/graphics/particles/particular/engine/shader/ShaderManager.js +80 -46
- package/engine/graphics/particles/particular/engine/shader/debugAtlas.js +14 -0
- 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/AttributeValue.js +141 -0
- package/engine/graphics/particles/particular/engine/utils/volume/ParticleVolume.js +478 -0
- package/engine/graphics/particles/particular/engine/utils/volume/lut_to_sampler.js +27 -0
- package/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +935 -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/buffers/prototypeNormalFrameBuffer.js +2 -2
- package/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.js +13 -7
- 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 +126 -95
- 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/computeFrustumCorners.js +14 -32
- package/engine/graphics/render/forward_plus/materials/FP_INJECTION_POINT_ACCUMULATION.js +1 -0
- package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_ACCUMULATION.js +32 -0
- package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_DECODE_PARS.js +51 -0
- package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_PREAMBLE.js +25 -0
- package/engine/graphics/render/forward_plus/materials/fp_build_fragment_shader.js +31 -120
- package/engine/graphics/render/forward_plus/materials/fp_build_vertex_lighting_shared.js +35 -0
- package/engine/graphics/render/forward_plus/materials/fp_build_vertex_shader.js +4 -5
- package/engine/graphics/render/forward_plus/plugin/ForwardPlusRenderingPlugin.js +1 -1
- package/engine/graphics/render/forward_plus/plugin/MaterialTransformer.js +10 -3
- package/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +595 -60
- package/engine/graphics/render/forward_plus/prototypeLightManager.js +256 -136
- 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/layers/RenderLayerUtils.js +7 -4
- package/engine/graphics/render/visibility/IncrementalDeltaSet.js +11 -0
- package/engine/graphics/render/visibility/hiz/prototypeHiZ.js +2 -2
- package/engine/graphics/shaders/TerrainShader.js +4 -5
- package/engine/graphics/shadows/ShadowMapRenderer.js +8 -2
- package/engine/graphics/texture/atlas/AtlasPatch.js +7 -2
- package/engine/graphics/texture/atlas/TextureAtlas.js +2 -2
- package/engine/graphics/texture/sampler/HarmonicDiffusionGrid.spec.js +1 -1
- package/engine/graphics/texture/sampler/SampleTraverser.js +1 -1
- package/engine/graphics/texture/sampler/Sampler2D.js +8 -7
- package/engine/graphics/texture/sampler/distanceField.spec.js +1 -1
- package/engine/graphics/texture/sampler/scaleSampler2D.js +7 -10
- package/engine/graphics/trail/x/RibbonMaterialX.js +3 -3
- package/engine/graphics/trail/x/RibbonX.js +17 -2
- package/engine/graphics/trail/x/RibbonXPlugin.js +51 -1
- package/engine/graphics/util/composeMatrix4.js +33 -23
- package/engine/graphics/util/decompose_matrix_4_array.js +61 -0
- package/engine/grid/components/GridObstacle.js +3 -10
- package/engine/intelligence/behavior/ecs/BehaviorComponent.js +30 -14
- package/engine/intelligence/behavior/selector/WeightedElement.js +2 -1
- package/engine/intelligence/optimization/RandomOptimizer.js +1 -1
- package/engine/knowledge/database/StaticKnowledgeDataTable.js +6 -1
- package/engine/navigation/ecs/components/Path.js +1 -6
- package/engine/navigation/grid/FastBinaryHeap.spec.js +1 -1
- package/engine/reference/v2/Reference.js +6 -0
- 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 +2 -2
- package/misc/makeMaterialIconCached.js +2 -2
- package/package.json +3 -3
- package/view/View.js +4 -2
- 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 -345
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
const _lut_array_buffer = new ArrayBuffer(84);
|
|
2
|
+
/**
|
|
3
|
+
* Mapping from 3 plane bitfield, corresponding to intersection point of the planes
|
|
4
|
+
* @type {number[]}
|
|
5
|
+
*/
|
|
6
|
+
export const triplanar_corner_mapping = new Uint8Array(_lut_array_buffer, 0, 43);
|
|
7
|
+
|
|
8
|
+
triplanar_corner_mapping[0b010101] = 0;
|
|
9
|
+
triplanar_corner_mapping[0b100101] = 1;
|
|
10
|
+
triplanar_corner_mapping[0b011001] = 2;
|
|
11
|
+
triplanar_corner_mapping[0b101001] = 3;
|
|
12
|
+
triplanar_corner_mapping[0b010110] = 4;
|
|
13
|
+
triplanar_corner_mapping[0b100110] = 5;
|
|
14
|
+
triplanar_corner_mapping[0b011010] = 6;
|
|
15
|
+
triplanar_corner_mapping[0b101010] = 7;
|
|
16
|
+
/**
|
|
17
|
+
* Mapping from 2 plane bitfield to 2 corner bitfield, corresponding to corner indices of intersecting planes
|
|
18
|
+
* @type {number[]}
|
|
19
|
+
*/
|
|
20
|
+
export const biplanar_edge_mapping = new Uint8Array(_lut_array_buffer, 43, 41);
|
|
21
|
+
|
|
22
|
+
biplanar_edge_mapping[0b000101] = 0 | (1 << 3);
|
|
23
|
+
biplanar_edge_mapping[0b000110] = 4 | (5 << 3);
|
|
24
|
+
|
|
25
|
+
biplanar_edge_mapping[0b001001] = 2 | (3 << 3);
|
|
26
|
+
biplanar_edge_mapping[0b001010] = 6 | (7 << 3);
|
|
27
|
+
|
|
28
|
+
biplanar_edge_mapping[0b010100] = 0 | (4 << 3);
|
|
29
|
+
biplanar_edge_mapping[0b011000] = 2 | (6 << 3);
|
|
30
|
+
|
|
31
|
+
biplanar_edge_mapping[0b100100] = 1 | (5 << 3);
|
|
32
|
+
biplanar_edge_mapping[0b101000] = 3 | (7 << 3);
|
|
33
|
+
|
|
34
|
+
biplanar_edge_mapping[0b010001] = 0 | (2 << 3);
|
|
35
|
+
biplanar_edge_mapping[0b010010] = 4 | (6 << 3);
|
|
36
|
+
|
|
37
|
+
biplanar_edge_mapping[0b100001] = 1 | (3 << 3);
|
|
38
|
+
biplanar_edge_mapping[0b100010] = 5 | (7 << 3);
|
package/engine/graphics/render/forward_plus/query/detailed_sphere_frustum_intersection_test.js
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { v3_distance_sqr } from "../../../../../core/geom/v3_distance_sqr.js";
|
|
2
|
+
import { biplanar_edge_mapping, triplanar_corner_mapping } from "./cube_mapping.js";
|
|
3
|
+
import { line3_computeSegmentPointDistance_sqr } from "../../../../../core/geom/3d/line/line3_computeSegmentPointDistance_sqr.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
*
|
|
7
|
+
* @param {number} radius
|
|
8
|
+
* @param {number} light_x
|
|
9
|
+
* @param {number} light_y
|
|
10
|
+
* @param {number} light_z
|
|
11
|
+
* @param {number} outside_plane_count
|
|
12
|
+
* @param {number} outside_plane_bitfield
|
|
13
|
+
* @param {number[]} points
|
|
14
|
+
* @return {boolean}
|
|
15
|
+
*/
|
|
16
|
+
export function detailed_sphere_frustum_intersection_test(
|
|
17
|
+
radius, light_x, light_y, light_z,
|
|
18
|
+
outside_plane_count, outside_plane_bitfield,
|
|
19
|
+
points
|
|
20
|
+
) {
|
|
21
|
+
|
|
22
|
+
const radius_sqr = radius * radius;
|
|
23
|
+
|
|
24
|
+
if (outside_plane_count === 3) {
|
|
25
|
+
// nearest point in a corner, find the corner
|
|
26
|
+
const point_index = triplanar_corner_mapping[outside_plane_bitfield];
|
|
27
|
+
|
|
28
|
+
const point_address = point_index * 3;
|
|
29
|
+
|
|
30
|
+
const point_x = points[point_address];
|
|
31
|
+
const point_y = points[point_address + 1];
|
|
32
|
+
const point_z = points[point_address + 2];
|
|
33
|
+
|
|
34
|
+
const distance_to_light_sqr = v3_distance_sqr(
|
|
35
|
+
point_x, point_y, point_z,
|
|
36
|
+
light_x, light_y, light_z
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
// query_bvh_frustum_from_objects.checks_sphere_frustum_corner++;
|
|
40
|
+
|
|
41
|
+
// return distance_to_light_sqr <= radius_sqr;
|
|
42
|
+
|
|
43
|
+
if (distance_to_light_sqr > radius_sqr) {
|
|
44
|
+
|
|
45
|
+
// query_bvh_frustum_from_objects.rejection_sphere_count++;
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
} else if (outside_plane_count === 2) {
|
|
50
|
+
// nearest point is on an edge of two plane intersection
|
|
51
|
+
const edge_bitfield = biplanar_edge_mapping[outside_plane_bitfield];
|
|
52
|
+
|
|
53
|
+
// get 2 corners from edge bitfield
|
|
54
|
+
const corner_index_0 = edge_bitfield & 0b111;
|
|
55
|
+
const corner_address_0 = corner_index_0 * 3;
|
|
56
|
+
|
|
57
|
+
const corner_index_1 = (edge_bitfield >> 3) & 0b111;
|
|
58
|
+
const corner_address_1 = corner_index_1 * 3;
|
|
59
|
+
|
|
60
|
+
const point_0_x = points[corner_address_0];
|
|
61
|
+
const point_0_y = points[corner_address_0 + 1];
|
|
62
|
+
const point_0_z = points[corner_address_0 + 2];
|
|
63
|
+
|
|
64
|
+
const point_1_x = points[corner_address_1];
|
|
65
|
+
const point_1_y = points[corner_address_1 + 1];
|
|
66
|
+
const point_1_z = points[corner_address_1 + 2];
|
|
67
|
+
|
|
68
|
+
const distance_to_frustum_sqr = line3_computeSegmentPointDistance_sqr(
|
|
69
|
+
point_0_x, point_0_y, point_0_z,
|
|
70
|
+
point_1_x, point_1_y, point_1_z,
|
|
71
|
+
light_x, light_y, light_z
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
// query_bvh_frustum_from_objects.checks_sphere_frustum_edge++;
|
|
75
|
+
|
|
76
|
+
// return distance_to_frustum_sqr <= radius_sqr;
|
|
77
|
+
|
|
78
|
+
if (distance_to_frustum_sqr > radius_sqr) {
|
|
79
|
+
|
|
80
|
+
// query_bvh_frustum_from_objects.rejection_sphere_count++;
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { detailed_sphere_frustum_intersection_test } from "./detailed_sphere_frustum_intersection_test.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
*
|
|
5
|
+
* @param {number} light_x
|
|
6
|
+
* @param {number} light_y
|
|
7
|
+
* @param {number} light_z
|
|
8
|
+
* @param {number} radius
|
|
9
|
+
* @param {number[]} points
|
|
10
|
+
* @param {number[]|Float32Array|Float64Array} planes
|
|
11
|
+
* @returns {boolean}
|
|
12
|
+
*/
|
|
13
|
+
export function point_light_inside_volume(
|
|
14
|
+
light_x, light_y, light_z, radius,
|
|
15
|
+
points, planes
|
|
16
|
+
) {
|
|
17
|
+
let j = 0;
|
|
18
|
+
let outside_plane_count = 0;
|
|
19
|
+
let outside_plane_bitfield = 0;
|
|
20
|
+
|
|
21
|
+
// validate if the sphere intersects the plane-bound space
|
|
22
|
+
|
|
23
|
+
// query_bvh_frustum_from_objects.checks_sphere++;
|
|
24
|
+
|
|
25
|
+
for (; j < 6; j++) {
|
|
26
|
+
|
|
27
|
+
const plane_address = j * 4;
|
|
28
|
+
|
|
29
|
+
const plane_normal_x = planes[plane_address];
|
|
30
|
+
const plane_normal_y = planes[plane_address + 1];
|
|
31
|
+
const plane_normal_z = planes[plane_address + 2];
|
|
32
|
+
const plane_constant = planes[plane_address + 3];
|
|
33
|
+
|
|
34
|
+
/*
|
|
35
|
+
compute distance from the center of the sphere to the plane
|
|
36
|
+
NOTE: inlined computation of distance from point to plane
|
|
37
|
+
*/
|
|
38
|
+
const distance = (plane_normal_x * light_x + plane_normal_y * light_y + plane_normal_z * light_z) + plane_constant;
|
|
39
|
+
|
|
40
|
+
// query_bvh_frustum_from_objects.checks_sphere_plane++;
|
|
41
|
+
|
|
42
|
+
if (distance < 0) {
|
|
43
|
+
// center of the sphere is below the plane
|
|
44
|
+
|
|
45
|
+
if (distance < -radius) {
|
|
46
|
+
// sphere is entirely below the plane
|
|
47
|
+
|
|
48
|
+
// query_bvh_frustum_from_objects.rejection_sphere_count++;
|
|
49
|
+
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// sphere intersects the plane
|
|
54
|
+
|
|
55
|
+
outside_plane_count++;
|
|
56
|
+
|
|
57
|
+
const plane_bit_mask = 1 << j;
|
|
58
|
+
|
|
59
|
+
outside_plane_bitfield |= plane_bit_mask;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (outside_plane_count < 2) {
|
|
65
|
+
return true;
|
|
66
|
+
} else {
|
|
67
|
+
return detailed_sphere_frustum_intersection_test(
|
|
68
|
+
radius, light_x, light_y, light_z,
|
|
69
|
+
outside_plane_count, outside_plane_bitfield,
|
|
70
|
+
points
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { aabb3_computeDistanceAbovePlane } from "../../../../../core/geom/3d/aabb/aabb3_computeDistanceAbovePlane.js";
|
|
2
|
+
import { point_light_inside_volume } from "./point_light_inside_volume.js";
|
|
3
|
+
import { spot_light_inside_volume } from "./spot_light_inside_volume.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
*
|
|
7
|
+
* @type {(BinaryNode|LeafNode)[]}
|
|
8
|
+
*/
|
|
9
|
+
const stack = [];
|
|
10
|
+
|
|
11
|
+
let stackPointer = 0;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Most of the data is in flat continuous array for cache coherence
|
|
15
|
+
* @param {PointLightData[]} destination
|
|
16
|
+
* @param {number} destination_offset
|
|
17
|
+
* @param {BinaryNode<PointLightData>} root
|
|
18
|
+
* @param {number[]|Float32Array|Float64Array} planes
|
|
19
|
+
* @param {number[]|Float32Array|Float64Array} points
|
|
20
|
+
* @returns {number} number of items added to the destination, non-negative integer
|
|
21
|
+
*/
|
|
22
|
+
export function query_bvh_frustum_from_objects(
|
|
23
|
+
destination,
|
|
24
|
+
destination_offset,
|
|
25
|
+
root, planes, points
|
|
26
|
+
) {
|
|
27
|
+
let i = 0;
|
|
28
|
+
let j = 0;
|
|
29
|
+
// read out points
|
|
30
|
+
const stackOffset = stackPointer;
|
|
31
|
+
|
|
32
|
+
stack[stackPointer] = root;
|
|
33
|
+
|
|
34
|
+
stackPointer++;
|
|
35
|
+
|
|
36
|
+
stack_loop:while (stackPointer-- > stackOffset) {
|
|
37
|
+
|
|
38
|
+
// query_bvh_frustum_from_objects.iteration_count++;
|
|
39
|
+
|
|
40
|
+
const n = stack[stackPointer];
|
|
41
|
+
|
|
42
|
+
if (n.isBinaryNode === true) {
|
|
43
|
+
|
|
44
|
+
for (j = 0; j < 6; j++) {
|
|
45
|
+
|
|
46
|
+
const plane_address = j * 4;
|
|
47
|
+
|
|
48
|
+
const plane_normal_x = planes[plane_address];
|
|
49
|
+
const plane_normal_y = planes[plane_address + 1];
|
|
50
|
+
const plane_normal_z = planes[plane_address + 2];
|
|
51
|
+
const plane_constant = planes[plane_address + 3];
|
|
52
|
+
|
|
53
|
+
const distanceAbovePlane = aabb3_computeDistanceAbovePlane(
|
|
54
|
+
plane_normal_x, plane_normal_y, plane_normal_z, plane_constant,
|
|
55
|
+
n.x0, n.y0, n.z0,
|
|
56
|
+
n.x1, n.y1, n.z1
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
if (distanceAbovePlane < 0) {
|
|
60
|
+
// node is below the plane
|
|
61
|
+
|
|
62
|
+
// query_bvh_frustum_from_objects.rejection_count++;
|
|
63
|
+
|
|
64
|
+
continue stack_loop;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
if (n.right !== null) {
|
|
70
|
+
stack[stackPointer] = n.right;
|
|
71
|
+
stackPointer++;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (n.left !== null) {
|
|
75
|
+
stack[stackPointer] = n.left;
|
|
76
|
+
stackPointer++
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
} else {
|
|
80
|
+
|
|
81
|
+
// leaf node
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
*
|
|
85
|
+
* @type {PointLightData}
|
|
86
|
+
*/
|
|
87
|
+
const light_data = n.object;
|
|
88
|
+
|
|
89
|
+
const light = light_data.light;
|
|
90
|
+
|
|
91
|
+
if (light.isPointLight) {
|
|
92
|
+
|
|
93
|
+
const light_position = light.position;
|
|
94
|
+
|
|
95
|
+
const light_x = light_position.x;
|
|
96
|
+
const light_y = light_position.y;
|
|
97
|
+
const light_z = light_position.z;
|
|
98
|
+
|
|
99
|
+
const radius = light.radius.getValue();
|
|
100
|
+
|
|
101
|
+
if (!point_light_inside_volume(light_x, light_y, light_z, radius, points, planes)) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
} else if (light.isSpotLight) {
|
|
105
|
+
if (!spot_light_inside_volume(light, points, planes)) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
destination[destination_offset + i] = light_data;
|
|
111
|
+
|
|
112
|
+
i++;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
//drop the stack frame
|
|
118
|
+
stackPointer = stackOffset;
|
|
119
|
+
|
|
120
|
+
return i;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
query_bvh_frustum_from_objects.iteration_count = 0;
|
|
124
|
+
query_bvh_frustum_from_objects.rejection_count = 0;
|
|
125
|
+
query_bvh_frustum_from_objects.rejection_sphere_count = 0;
|
|
126
|
+
query_bvh_frustum_from_objects.plane_tests = 0;
|
|
127
|
+
query_bvh_frustum_from_objects.plane_tests_early_exits = 0;
|
|
128
|
+
query_bvh_frustum_from_objects.checks_sphere = 0;
|
|
129
|
+
query_bvh_frustum_from_objects.checks_sphere_plane = 0;
|
|
130
|
+
query_bvh_frustum_from_objects.checks_sphere_frustum_corner = 0;
|
|
131
|
+
query_bvh_frustum_from_objects.checks_sphere_frustum_edge = 0;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { aabb3_computeDistanceAbovePlane } from "../../../../../core/geom/3d/aabb/aabb3_computeDistanceAbovePlane.js";
|
|
2
|
+
import { point_light_inside_volume } from "./point_light_inside_volume.js";
|
|
3
|
+
import { BVH_BINARY_NODE_SIZE, BVH_LEAF_NODE_SIZE } from "../../../../../core/bvh2/binary/2/BinaryUint32BVH.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
*
|
|
7
|
+
* @type {number[]}
|
|
8
|
+
*/
|
|
9
|
+
const stack = [];
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Most of the data is in flat continuous array for cache coherence
|
|
13
|
+
* @param {number[]} destination
|
|
14
|
+
* @param {number} destination_offset
|
|
15
|
+
* @param {BinaryUint32BVH} root
|
|
16
|
+
* @param {number[]|Uint8ClampedArray} source_data
|
|
17
|
+
* @param {number[]|Float32Array|Float64Array} planes
|
|
18
|
+
* @param {number[]|Float32Array|Float64Array} points
|
|
19
|
+
* @returns {number} number of items added to the destination, non-negative integer
|
|
20
|
+
*/
|
|
21
|
+
export function query_bvh_frustum_from_texture(
|
|
22
|
+
destination,
|
|
23
|
+
destination_offset,
|
|
24
|
+
root,
|
|
25
|
+
source_data,
|
|
26
|
+
planes, points
|
|
27
|
+
) {
|
|
28
|
+
|
|
29
|
+
let stackPointer = 1;
|
|
30
|
+
let result = 0;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* After performing empirical tests, stack-based depth-first traversal turns out faster than using a queue
|
|
34
|
+
* @type {number}
|
|
35
|
+
*/
|
|
36
|
+
stack[0] = 0;
|
|
37
|
+
|
|
38
|
+
const binary_node_count = root.getBinaryNodeCount();
|
|
39
|
+
const last_valid_index = binary_node_count + root.getLeafNodeCount();
|
|
40
|
+
const data_view = root.getDataView();
|
|
41
|
+
|
|
42
|
+
stack_loop:while (stackPointer-- > 0) {
|
|
43
|
+
|
|
44
|
+
// query_bvh_frustum_from_objects.iteration_count++;
|
|
45
|
+
const node_index = stack[stackPointer];
|
|
46
|
+
|
|
47
|
+
if (node_index < binary_node_count) {
|
|
48
|
+
// is intermediate node
|
|
49
|
+
const node_address = node_index * BVH_BINARY_NODE_SIZE;
|
|
50
|
+
|
|
51
|
+
const n_x0 = data_view.getFloat32(node_address);
|
|
52
|
+
const n_y0 = data_view.getFloat32(node_address + 4);
|
|
53
|
+
const n_z0 = data_view.getFloat32(node_address + 8);
|
|
54
|
+
const n_x1 = data_view.getFloat32(node_address + 12);
|
|
55
|
+
const n_y1 = data_view.getFloat32(node_address + 16);
|
|
56
|
+
const n_z1 = data_view.getFloat32(node_address + 20);
|
|
57
|
+
|
|
58
|
+
for (let j = 0; j < 6; j++) {
|
|
59
|
+
|
|
60
|
+
const plane_address = j * 4;
|
|
61
|
+
|
|
62
|
+
const plane_normal_x = planes[plane_address];
|
|
63
|
+
const plane_normal_y = planes[plane_address + 1];
|
|
64
|
+
const plane_normal_z = planes[plane_address + 2];
|
|
65
|
+
const plane_constant = planes[plane_address + 3];
|
|
66
|
+
|
|
67
|
+
const distanceAbovePlane = aabb3_computeDistanceAbovePlane(
|
|
68
|
+
plane_normal_x, plane_normal_y, plane_normal_z, plane_constant,
|
|
69
|
+
n_x0, n_y0, n_z0,
|
|
70
|
+
n_x1, n_y1, n_z1
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
if (distanceAbovePlane < 0) {
|
|
74
|
+
// node is below the plane
|
|
75
|
+
|
|
76
|
+
// query_bvh_frustum_from_objects.rejection_count++;
|
|
77
|
+
|
|
78
|
+
continue stack_loop;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// TODO under current scheme we can reserve 6 bit in what we push onto the stack for plane mask (allows us to skip some planar tests)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const left_index = (node_index << 1) + 1;
|
|
85
|
+
const right_index = left_index + 1;
|
|
86
|
+
|
|
87
|
+
if (left_index < last_valid_index) {
|
|
88
|
+
stack[stackPointer] = left_index;
|
|
89
|
+
stackPointer++;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (right_index < last_valid_index) {
|
|
93
|
+
stack[stackPointer] = right_index;
|
|
94
|
+
stackPointer++;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
} else {
|
|
99
|
+
// leaf node
|
|
100
|
+
const leaf_index = node_index - binary_node_count;
|
|
101
|
+
const node_address = leaf_index * BVH_LEAF_NODE_SIZE + binary_node_count * BVH_BINARY_NODE_SIZE;
|
|
102
|
+
|
|
103
|
+
const light_index = data_view.getUint32(node_address + 24);
|
|
104
|
+
|
|
105
|
+
const light_address = light_index * 8;
|
|
106
|
+
|
|
107
|
+
// TODO figure out light type from address
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
const light_x = source_data[light_address];
|
|
111
|
+
const light_y = source_data[light_address + 1];
|
|
112
|
+
const light_z = source_data[light_address + 2];
|
|
113
|
+
|
|
114
|
+
const radius = source_data[light_address + 3];
|
|
115
|
+
|
|
116
|
+
if (!point_light_inside_volume(light_x, light_y, light_z, radius, points, planes)) {
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// write to output
|
|
121
|
+
destination[destination_offset + result] = light_index;
|
|
122
|
+
|
|
123
|
+
result++;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { computeConePlaneSide } from "../../../../../core/geom/3d/cone/computeConePlaneSide.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
*
|
|
5
|
+
* @param {SpotLight} light
|
|
6
|
+
* @param {number[]} points
|
|
7
|
+
* @param {number[]|Float32Array|Float64Array} planes
|
|
8
|
+
* @returns {boolean}
|
|
9
|
+
*/
|
|
10
|
+
export function spot_light_inside_volume(light, points, planes) {
|
|
11
|
+
for (let j = 0; j < 6; j++) {
|
|
12
|
+
|
|
13
|
+
const plane_address = j * 4;
|
|
14
|
+
|
|
15
|
+
const plane_normal_x = planes[plane_address];
|
|
16
|
+
const plane_normal_y = planes[plane_address + 1];
|
|
17
|
+
const plane_normal_z = planes[plane_address + 2];
|
|
18
|
+
const plane_constant = planes[plane_address + 3];
|
|
19
|
+
|
|
20
|
+
const side = computeConePlaneSide(
|
|
21
|
+
plane_normal_x, plane_normal_y, plane_normal_z, plane_constant,
|
|
22
|
+
light.position.x, light.position.y, light.position.z,
|
|
23
|
+
light.direction.x, light.direction.y, light.direction.z,
|
|
24
|
+
light.angle.getValue(), light.distance.getValue()
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
if (side < 0) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* @param {number[]|Float32Array|Float64Array} source
|
|
4
|
+
* @param {number} source_index
|
|
5
|
+
* @param {number[]|Float32Array|Float64Array} destination
|
|
6
|
+
* @param {number} destination_offset
|
|
7
|
+
*/
|
|
8
|
+
export function read_frustum_corner(source, source_index, destination, destination_offset) {
|
|
9
|
+
const address = source_index * 3;
|
|
10
|
+
|
|
11
|
+
destination[destination_offset] = source[address];
|
|
12
|
+
destination[destination_offset + 1] = source[address + 1];
|
|
13
|
+
destination[destination_offset + 2] = source[address + 2];
|
|
14
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* @param {number[]} light_data
|
|
4
|
+
* @param {number} count
|
|
5
|
+
* @param {number[]|Uint32Array|Uint16Array|Uint8Array|Uint8ClampedArray} light_lookup_texture_data
|
|
6
|
+
* @param {number} address
|
|
7
|
+
* @returns {boolean}
|
|
8
|
+
*/
|
|
9
|
+
export function testClusterEquality(light_data, count, light_lookup_texture_data, address) {
|
|
10
|
+
for (let i = 0; i < count; i++) {
|
|
11
|
+
|
|
12
|
+
const existing_light_address = light_lookup_texture_data[address + i];
|
|
13
|
+
|
|
14
|
+
const datum = light_data[i] * 2;
|
|
15
|
+
|
|
16
|
+
if (datum !== existing_light_address) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import Vector3 from "../../../../core/geom/Vector3.js";
|
|
2
1
|
import { computePointDistanceToPlane } from "../../../../core/geom/Plane.js";
|
|
3
2
|
import { plane_three_computeConvex3PlaneIntersection } from "../../../../core/geom/3d/plane/plane_computeConvex3PlaneIntersection.js";
|
|
4
3
|
|
|
@@ -10,7 +9,11 @@ import { plane_three_computeConvex3PlaneIntersection } from "../../../../core/ge
|
|
|
10
9
|
*/
|
|
11
10
|
export function buildPlanarRenderLayerClipPlaneComputationMethod(traversePlanes, bias = 0) {
|
|
12
11
|
|
|
13
|
-
|
|
12
|
+
/**
|
|
13
|
+
*
|
|
14
|
+
* @type {number[]}
|
|
15
|
+
*/
|
|
16
|
+
const p = [];
|
|
14
17
|
|
|
15
18
|
const adjacentPlanePairs = [
|
|
16
19
|
[],
|
|
@@ -38,7 +41,7 @@ export function buildPlanarRenderLayerClipPlaneComputationMethod(traversePlanes,
|
|
|
38
41
|
const p0 = pair[0];
|
|
39
42
|
const p1 = pair[1];
|
|
40
43
|
|
|
41
|
-
const planeIntersection = plane_three_computeConvex3PlaneIntersection(p, p0, p1, objectPlane);
|
|
44
|
+
const planeIntersection = plane_three_computeConvex3PlaneIntersection(p, 0, p0, p1, objectPlane);
|
|
42
45
|
|
|
43
46
|
if (!planeIntersection) {
|
|
44
47
|
//no intersection
|
|
@@ -48,7 +51,7 @@ export function buildPlanarRenderLayerClipPlaneComputationMethod(traversePlanes,
|
|
|
48
51
|
|
|
49
52
|
const plane_normal = nearPlane.normal;
|
|
50
53
|
|
|
51
|
-
const distanceToNearPlane = computePointDistanceToPlane(p
|
|
54
|
+
const distanceToNearPlane = computePointDistanceToPlane(p[0], p[1], p[2], plane_normal.x, plane_normal.y, plane_normal.z, nearPlane.constant);
|
|
52
55
|
|
|
53
56
|
//update near and far plane distances
|
|
54
57
|
if (distanceToNearPlane > 0 && distanceToNearPlane < range.near) {
|
|
@@ -2,6 +2,7 @@ import { BitSet } from "../../../../core/binary/BitSet.js";
|
|
|
2
2
|
import Signal from "../../../../core/events/signal/Signal.js";
|
|
3
3
|
import { assert } from "../../../../core/assert.js";
|
|
4
4
|
import { IllegalStateException } from "../../../../core/fsm/exceptions/IllegalStateException.js";
|
|
5
|
+
import { arrayQuickSort } from "../../../../core/collection/array/arrayQuickSort.js";
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* @readonly
|
|
@@ -68,6 +69,16 @@ export class IncrementalDeltaSet {
|
|
|
68
69
|
this.state = IncrementalDeltaSetState.Clear;
|
|
69
70
|
}
|
|
70
71
|
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
*
|
|
75
|
+
* @param {function(T):number} score_function
|
|
76
|
+
* @param {*} [score_context]
|
|
77
|
+
*/
|
|
78
|
+
sort(score_function, score_context) {
|
|
79
|
+
arrayQuickSort(this.elements, score_function, score_context, 0, this.size - 1);
|
|
80
|
+
}
|
|
81
|
+
|
|
71
82
|
/**
|
|
72
83
|
*
|
|
73
84
|
* @param {V} element
|
|
@@ -62,7 +62,6 @@ import { buildCanvasViewFromTexture } from "./buildCanvasViewFromTexture.js";
|
|
|
62
62
|
import { BatchOcclusionQuery } from "./query/BatchOcclusionQuery.js";
|
|
63
63
|
import HeadsUpDisplay from "../../../../ecs/gui/hud/HeadsUpDisplay.js";
|
|
64
64
|
import LabelView from "../../../../../view/common/LabelView.js";
|
|
65
|
-
import { randomFloatBetween } from "../../../../../core/math/MathUtils.js";
|
|
66
65
|
import { seededRandom } from "../../../../../core/math/random/seededRandom.js";
|
|
67
66
|
import { Sampler2D } from "../../../texture/sampler/Sampler2D.js";
|
|
68
67
|
import { inverseLerp } from "../../../../../core/math/inverseLerp.js";
|
|
@@ -71,6 +70,7 @@ import { max2 } from "../../../../../core/math/max2.js";
|
|
|
71
70
|
import { min2 } from "../../../../../core/math/min2.js";
|
|
72
71
|
import { buildCubeURLs } from "../../../texture/cubemap/buildCubeURLs.js";
|
|
73
72
|
import { mat4 } from "gl-matrix";
|
|
73
|
+
import { randomFloatBetween } from "../../../../../core/math/random/randomFloatBetween.js";
|
|
74
74
|
|
|
75
75
|
const engineHarness = new EngineHarness();
|
|
76
76
|
|
|
@@ -112,7 +112,7 @@ function makeConfig(engine) {
|
|
|
112
112
|
new ClingToTerrainSystem(),
|
|
113
113
|
new TerrainSystem(graphics, assetManager),
|
|
114
114
|
new WaterSystem(graphics),
|
|
115
|
-
new Trail2DSystem(
|
|
115
|
+
new Trail2DSystem(engine),
|
|
116
116
|
new Foliage2System(assetManager, graphics),
|
|
117
117
|
new ViewportPositionSystem(graphics.viewport.size),
|
|
118
118
|
new GridPosition2TransformSystem(),
|
|
@@ -121,7 +121,6 @@ function fragment() {
|
|
|
121
121
|
uniform float opacity;
|
|
122
122
|
|
|
123
123
|
varying vec3 vViewPosition;
|
|
124
|
-
|
|
125
124
|
|
|
126
125
|
|
|
127
126
|
#include <common>
|
|
@@ -364,10 +363,10 @@ function fragment() {
|
|
|
364
363
|
|
|
365
364
|
vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;
|
|
366
365
|
|
|
367
|
-
|
|
366
|
+
gl_FragColor = vec4( outgoingLight, diffuseColor.a );
|
|
368
367
|
|
|
369
368
|
#if defined( TONE_MAPPING )
|
|
370
|
-
|
|
369
|
+
gl_FragColor.rgb = toneMapping( pc_fragColor.rgb );
|
|
371
370
|
#endif
|
|
372
371
|
|
|
373
372
|
//encode fragment
|
|
@@ -378,12 +377,12 @@ function fragment() {
|
|
|
378
377
|
#else
|
|
379
378
|
float fogFactor = smoothstep( fogNear, fogFar, fogDepth );
|
|
380
379
|
#endif
|
|
381
|
-
|
|
380
|
+
gl_FragColor.rgb = mix( pc_fragColor.rgb, fogColor, fogFactor );
|
|
382
381
|
#endif
|
|
383
382
|
|
|
384
383
|
#ifdef PREMULTIPLIED_ALPHA
|
|
385
384
|
// Get get normal blending with premultipled, use with CustomBlending, OneFactor, OneMinusSrcAlphaFactor, AddEquation.
|
|
386
|
-
|
|
385
|
+
gl_FragColor.rgb *= pc_fragColor.a;
|
|
387
386
|
#endif
|
|
388
387
|
|
|
389
388
|
#ifdef DITHERING
|
|
@@ -173,13 +173,19 @@ export class ShadowMapRenderer {
|
|
|
173
173
|
|
|
174
174
|
if (shadow.map === null) {
|
|
175
175
|
|
|
176
|
-
const pars = {
|
|
176
|
+
const pars = {
|
|
177
|
+
format: RGBAFormat,
|
|
178
|
+
scissorTest: false,
|
|
179
|
+
stencilBuffer: false
|
|
180
|
+
};
|
|
177
181
|
|
|
178
182
|
if (!shadow.isPointLightShadow && renderer.shadowMap.type === VSMShadowMap) {
|
|
179
183
|
pars.minFilter = LinearFilter;
|
|
180
184
|
pars.magFilter = LinearFilter;
|
|
181
185
|
|
|
182
|
-
shadow.mapPass = new WebGLRenderTarget(_shadowMapSize.x, _shadowMapSize.y,
|
|
186
|
+
shadow.mapPass = new WebGLRenderTarget(_shadowMapSize.x, _shadowMapSize.y, Object.assign({
|
|
187
|
+
depthBuffer: false
|
|
188
|
+
}, pars));
|
|
183
189
|
|
|
184
190
|
} else {
|
|
185
191
|
pars.minFilter = NearestFilter;
|