@woosh/meep-engine 2.33.20 → 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/assert.js +3 -1
- 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/__detailed_box_volume_intersection.js +11 -8
- package/core/collection/ArrayUtils.js +1 -1
- package/core/collection/HashMap.js +66 -22
- 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/CircleMath.js +4 -4
- package/core/geom/3d/aabb/aabb3_computeDistanceAbovePlane.js +9 -33
- package/core/geom/3d/cone/computeConeBoundingBox.js +4 -4
- package/core/geom/3d/{compute_bounding_cone_of_2_cones.js → cone/compute_bounding_cone_of_2_cones.js} +3 -3
- package/core/geom/3d/{compute_bounding_cone_of_2_cones.spec.js → cone/compute_bounding_cone_of_2_cones.spec.js} +1 -1
- package/core/geom/3d/frustum/array_setFromProjectionMatrix.js +1 -1
- package/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +11 -3
- 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/{encode_unit3_hemioct.js → normal/hemioct/encode_unit3_hemioct.js} +0 -0
- package/core/geom/3d/{unit_hemioct.spec.js → normal/hemioct/unit_hemioct.spec.js} +1 -1
- package/core/geom/3d/normal/lamber_azimuth/transform.js +61 -0
- package/core/geom/3d/normal/spherical/sphere_map_transform.js +77 -0
- package/core/geom/3d/{lerp_planes_to_array.js → plane/lerp_planes_to_array.js} +1 -3
- package/core/geom/3d/plane/plane3_lerp.js +3 -1
- package/core/geom/3d/plane/plane3_slerp.js +4 -1
- package/core/geom/3d/{plane_computeConvex3PlaneIntersection.js → plane/plane_computeConvex3PlaneIntersection.js} +14 -16
- 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/3d/topology/TopoTriangle.js +1 -1
- package/core/geom/3d/topology/TopoVertex.js +1 -1
- package/core/geom/3d/topology/bounds/computeTraingleClusterNormalBoundingCone.js +2 -2
- package/core/geom/3d/topology/simplify/compute_face_normal_change_dot_product.js +1 -1
- package/core/geom/3d/topology/simplify/quadratic/Quadratic3.js +1 -1
- package/core/geom/3d/triangle/computeTrianglePlaneSide.js +1 -1
- package/core/geom/3d/triangle/computeTriangleRayIntersection.js +1 -1
- 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 +1 -77
- package/core/geom/Matrix4.js +8 -8
- package/core/geom/Plane.js +15 -10
- package/core/geom/Quaternion.js +2 -1
- package/core/geom/Rectangle.js +2 -1
- package/core/geom/Vector1.js +1 -1
- package/core/geom/Vector3.d.ts +2 -0
- package/core/geom/Vector3.js +35 -159
- package/core/geom/Vector3.spec.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_angle_between.js +31 -0
- package/core/geom/v3_distance.js +16 -0
- package/core/geom/v3_distance_sqr.js +17 -0
- package/core/geom/v3_dot.js +13 -0
- package/core/geom/v3_length.js +10 -0
- package/core/geom/v3_length_sqr.js +10 -0
- package/core/geom/v3_lerp.js +21 -0
- package/core/geom/v3_slerp.js +48 -0
- 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/core/primitives/array/computeIntegerArrayHash.js +6 -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/computeImageBitmapEquality.js +11 -0
- package/engine/asset/loaders/material/computeImageBitmapHash.js +22 -28
- package/engine/asset/loaders/material/computeMaterialHash.js +4 -3
- package/engine/asset/loaders/material/computeTextureEquality.js +13 -5
- 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/animation/OneBoneSurfaceAlignmentSolver.js +3 -1
- package/engine/ecs/animation/TwoBoneInverseKinematicsSolver.js +3 -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/FogOfWar.js +2 -3
- 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 +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 +3 -2
- package/engine/ecs/terrain/ecs/Terrain.js +6 -0
- package/engine/ecs/terrain/ecs/layers/TerrainLayers.js +5 -0
- package/engine/ecs/terrain/ecs/splat/SplatMapping.js +5 -0
- package/engine/ecs/terrain/tiles/TerrainTileManager.js +1 -1
- package/engine/ecs/tooltip/TooltipComponent.js +15 -0
- package/engine/ecs/util/hideEntityGracefully.js +18 -0
- package/engine/graphics/GraphicsEngine.js +1 -0
- package/engine/graphics/camera/testClippingPlaneComputation.js +2 -2
- 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 +2 -2
- package/engine/graphics/ecs/highlight/HighlightDefinition.js +2 -1
- package/engine/graphics/ecs/highlight/renderer/OutlineRenderer.js +0 -53
- 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/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/geometry/bvh/buffered/BVHGeometryRaycaster.js +2 -1
- package/engine/graphics/micron/build/buildMicronGeometryFromBufferGeometry.js +7 -7
- package/engine/graphics/micron/build/clustering/computeFaceCurvatureScore.js +1 -1
- package/engine/graphics/micron/build/clustering/compute_face_connection_weight.js +1 -1
- package/engine/graphics/micron/build/fill_patch_geometry_data.js +1 -1
- package/engine/graphics/micron/build/hierarchy/computePatchMergeScore.js +1 -1
- package/engine/graphics/micron/build/hierarchy/patch_combine.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/refinement/is_patch_facing_back.js +2 -2
- package/engine/graphics/micron/render/v1/ThreeVirtualGeometryAdapter.js +1 -1
- package/engine/graphics/particles/particular/engine/ParticularEngine.js +4 -2
- package/engine/graphics/particles/particular/engine/emitter/PARTICULAR_PARTICLE_SPECIFICATION.js +84 -0
- package/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +92 -144
- package/engine/graphics/particles/particular/engine/emitter/ParticleLayer.js +14 -3
- 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 +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 +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/shader/ShaderManager.js +7 -25
- 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/buffers/prototypeNormalFrameBuffer.js +2 -2
- 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 +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 +15 -33
- package/engine/graphics/render/forward_plus/plugin/ForwardPlusRenderingPlugin.js +1 -1
- package/engine/graphics/render/forward_plus/plugin/MaterialTransformer.js +12 -2
- package/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +6 -6
- package/engine/graphics/render/forward_plus/prototypeLightManager.js +231 -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 +8 -5
- package/engine/graphics/render/visibility/IncrementalDeltaSet.js +11 -0
- package/engine/graphics/render/visibility/hiz/prototypeHiZ.js +2 -2
- package/engine/graphics/texture/atlas/AtlasPatch.js +7 -2
- package/engine/graphics/texture/atlas/TextureAtlas.js +18 -14
- 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/projectSphere.js +1 -1
- package/engine/grid/components/GridObstacle.js +3 -10
- package/engine/intelligence/behavior/selector/WeightedElement.js +2 -1
- package/engine/intelligence/optimization/RandomOptimizer.js +1 -1
- package/engine/navigation/ecs/components/Path.js +3 -2
- 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/CellFilterAngleToNormal.js +3 -2
- package/generation/filtering/numeric/complex/CellFilterGaussianBlur.js +1 -1
- package/generation/grid/generation/GridTaskExecuteRuleTimes.js +2 -1
- package/generation/markers/GridCellActionPlaceMarker.js +13 -1
- package/generation/markers/MarkerNode.js +6 -0
- 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 +5 -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 +19 -101
- 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
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,6 +1,5 @@
|
|
|
1
|
-
import Vector3 from "../../../../core/geom/Vector3.js";
|
|
2
1
|
import { computePointDistanceToPlane } from "../../../../core/geom/Plane.js";
|
|
3
|
-
import { plane_three_computeConvex3PlaneIntersection } from "../../../../core/geom/3d/plane_computeConvex3PlaneIntersection.js";
|
|
2
|
+
import { plane_three_computeConvex3PlaneIntersection } from "../../../../core/geom/3d/plane/plane_computeConvex3PlaneIntersection.js";
|
|
4
3
|
|
|
5
4
|
/**
|
|
6
5
|
*
|
|
@@ -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(),
|
|
@@ -5,12 +5,15 @@ import AABB2 from "../../../../core/geom/AABB2.js";
|
|
|
5
5
|
export class AtlasPatch {
|
|
6
6
|
constructor() {
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
8
|
+
* Position in the atlas where the raw patch data is found, excludes padding
|
|
9
|
+
* @readonly
|
|
9
10
|
* @type {Vector2}
|
|
10
11
|
*/
|
|
11
12
|
this.position = new Vector2(0, 0);
|
|
13
|
+
|
|
12
14
|
/**
|
|
13
|
-
*
|
|
15
|
+
* Size in pixels of the patch, excludes padding
|
|
16
|
+
* @readonly
|
|
14
17
|
* @type {Vector2}
|
|
15
18
|
*/
|
|
16
19
|
this.size = new Vector2(0, 0);
|
|
@@ -34,11 +37,13 @@ export class AtlasPatch {
|
|
|
34
37
|
this.sampler = null;
|
|
35
38
|
|
|
36
39
|
/**
|
|
40
|
+
* @readonly
|
|
37
41
|
* @type {Rectangle}
|
|
38
42
|
*/
|
|
39
43
|
this.uv = new Rectangle(0, 0, 0, 0);
|
|
40
44
|
|
|
41
45
|
/**
|
|
46
|
+
* Area in the atlas where patch along with the padding is packed into
|
|
42
47
|
* Used for packing inside TextureAtlas. Do not modify manually
|
|
43
48
|
* @readonly
|
|
44
49
|
* @protected
|
|
@@ -82,8 +82,8 @@ export class TextureAtlas {
|
|
|
82
82
|
* @returns {boolean}
|
|
83
83
|
*/
|
|
84
84
|
contains(patch) {
|
|
85
|
-
assert.
|
|
86
|
-
assert.
|
|
85
|
+
assert.notNull(patch, 'patch');
|
|
86
|
+
assert.defined(patch, 'patch');
|
|
87
87
|
assert.ok(patch.isAtlasPatch, 'patch argument is not an AtlasPatch');
|
|
88
88
|
|
|
89
89
|
return this.patches.includes(patch);
|
|
@@ -116,28 +116,32 @@ export class TextureAtlas {
|
|
|
116
116
|
*
|
|
117
117
|
* @param {number} x
|
|
118
118
|
* @param {number} y
|
|
119
|
-
* @returns {boolean}
|
|
119
|
+
* @returns {boolean} true if resizing successful, false otherwise
|
|
120
120
|
*/
|
|
121
121
|
resize(x, y) {
|
|
122
122
|
//check if any patches would be cut
|
|
123
123
|
const patches = this.patches;
|
|
124
124
|
const numPatches = patches.length;
|
|
125
|
-
const patchBoundsViolated = patches.some(patch => {
|
|
126
125
|
|
|
127
|
-
|
|
126
|
+
//update patch UVs
|
|
127
|
+
for (let i = 0; i < numPatches; i++) {
|
|
128
|
+
const patch = patches[i];
|
|
129
|
+
|
|
130
|
+
if (patch.getFlag(AtlasPatchFlag.Packed)) {
|
|
128
131
|
//only care about packed patches
|
|
129
|
-
return false;
|
|
130
|
-
}
|
|
131
132
|
|
|
132
|
-
|
|
133
|
-
|
|
133
|
+
const pp = patch.position;
|
|
134
|
+
const ps = patch.size;
|
|
134
135
|
|
|
135
|
-
|
|
136
|
-
|
|
136
|
+
const x1 = pp.x + ps.x + patch.padding;
|
|
137
|
+
const y1 = pp.y + ps.y + patch.padding;
|
|
137
138
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
139
|
+
if (x1 >= x || y1 >= y) {
|
|
140
|
+
// patch bounds would violate the desired atlas extends
|
|
141
|
+
//Resizing atlas would result in some patches not fitting
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
141
145
|
}
|
|
142
146
|
|
|
143
147
|
//update patch UVs
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { seededRandom } from "../../../../core/math/random/seededRandom.js";
|
|
2
2
|
import { HarmonicDiffusionGrid } from "./HarmonicDiffusionGrid.js";
|
|
3
|
-
import { randomIntegerBetween} from "../../../../core/math/
|
|
3
|
+
import { randomIntegerBetween } from "../../../../core/math/random/randomIntegerBetween.js";
|
|
4
4
|
|
|
5
5
|
test("constructor doesn't throw", () => {
|
|
6
6
|
new HarmonicDiffusionGrid([], 0, 0);
|