@woosh/meep-engine 2.33.23 → 2.33.27
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/binary/BitSet.js +151 -167
- package/core/binary/BitSet.spec.js +99 -1
- package/core/binary/ValidatingBitSetWrapper.js +81 -0
- package/core/bvh2/BinaryNode.js +1 -1
- package/core/bvh2/aabb3/AABB3.js +21 -10
- 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 +22 -5
- package/core/cache/Cache.d.ts +4 -2
- package/core/cache/Cache.js +5 -2
- package/core/collection/ArrayUtils.js +1 -1
- package/core/collection/HashMap.d.ts +9 -2
- package/core/collection/HashSet.d.ts +7 -2
- package/core/collection/HashSet.js +7 -2
- 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/array/typed/typed_array_copy.js +1 -1
- 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/array_setFromProjectionMatrix.js +3 -3
- 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/normal/hemioct/unit_hemioct.spec.js +1 -1
- 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/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 +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/parser/simple/Token.d.ts +13 -0
- package/core/parser/simple/Token.js +61 -27
- 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/tools/FoliagePaintTool.js +4 -4
- 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 +62 -1
- package/engine/asset/loaders/image/ImageDecoderWorker.js +4 -3
- package/engine/asset/loaders/image/ImageRGBADataAsset.js +10 -2
- package/engine/asset/loaders/image/ImageRGBADataLoader.js +3 -3
- package/engine/asset/loaders/image/codec/NativeImageDecoder.js +2 -1
- package/engine/asset/loaders/image/png/PNG.js +113 -6
- package/engine/asset/loaders/image/png/PNGReader.js +5 -0
- package/engine/asset/loaders/material/bitmap2sampler_gl.js +1 -1
- package/engine/asset/loaders/material/computeImageBitmapEquality.js +6 -1
- package/engine/asset/loaders/material/computeMaterialHash.js +3 -1
- package/engine/asset/loaders/material/computeTextureEquality.js +40 -49
- package/engine/asset/loaders/material/computeTextureHash.js +2 -1
- package/engine/ecs/EntityBuilder.js +25 -5
- package/engine/ecs/EntityComponentDataset.js +1 -1
- 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/InstancedFoliage.js +277 -266
- package/engine/ecs/foliage/ecs/Foliage2System.js +7 -7
- package/engine/ecs/foliage/ecs/InstancedMeshComponent.js +37 -0
- package/engine/ecs/foliage/ecs/{Foliage2.js → InstancedMeshLayer.js} +3 -45
- package/engine/ecs/foliage/ecs/InstancedMeshSerializationAdapter.js +6 -5
- package/engine/ecs/foliage/ecs/InstancedMeshUtils.js +7 -6
- 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/storage/binary/BinarySerializationRegistry.js +1 -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/ecs/layers/TerrainLayer.js +12 -16
- 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/graphics/GraphicsEngine.js +11 -6
- 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/geometry/AttributeSpec.js +105 -0
- package/engine/graphics/{micron/format/MicronVertexDataSpec.js → geometry/VertexDataSpec.js} +56 -25
- package/engine/graphics/geometry/instancing/InstancedMeshGroup.js +14 -72
- package/engine/graphics/geometry/instancing/rewriteMaterial.js +70 -0
- package/engine/graphics/material/manager/MaterialManager.js +2 -1
- 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 +11 -9
- package/engine/graphics/micron/render/instanced/ThreeInstancedAdapter.js +0 -2
- 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 +8 -2
- package/engine/graphics/particles/particular/engine/emitter/PARTICULAR_PARTICLE_SPECIFICATION.js +80 -16
- package/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +71 -77
- package/engine/graphics/particles/particular/engine/emitter/ParticleEmitterFlag.js +5 -0
- package/engine/graphics/particles/particular/engine/emitter/ParticleLayer.js +2 -1
- 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 +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 +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 +81 -48
- 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 +938 -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 +16 -11
- 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/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/FPlusDebugMaterial.js +3 -3
- package/engine/graphics/render/forward_plus/materials/ForwardPlusThreeMaterial.js +1 -1
- 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 +594 -59
- package/engine/graphics/render/forward_plus/prototypeLightManager.js +208 -89
- 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 +74 -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/shaders/TerrainShader.js +4 -5
- package/engine/graphics/shadows/ShadowMapRenderer.js +8 -2
- package/engine/graphics/texture/atlas/ManagedTextureAtlas.js +12 -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/Sampler2D.js +3 -1
- package/engine/graphics/texture/sampler/convertTexture2Sampler2D.js +1 -1
- package/engine/graphics/texture/sampler/copy_Sampler2D_channel_data.js +66 -0
- package/engine/graphics/texture/sampler/distanceField.spec.js +1 -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 +1 -1
- 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/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/MinimapWorldGL.js +12 -5
- 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
|
@@ -0,0 +1,74 @@
|
|
|
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
|
+
|
|
47
|
+
// sphere intersects the plane
|
|
48
|
+
|
|
49
|
+
outside_plane_count++;
|
|
50
|
+
|
|
51
|
+
const plane_bit_mask = 1 << j;
|
|
52
|
+
|
|
53
|
+
outside_plane_bitfield |= plane_bit_mask;
|
|
54
|
+
} else {
|
|
55
|
+
// sphere is entirely below the plane
|
|
56
|
+
|
|
57
|
+
// query_bvh_frustum_from_objects.rejection_sphere_count++;
|
|
58
|
+
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (outside_plane_count < 2) {
|
|
66
|
+
return true;
|
|
67
|
+
} else {
|
|
68
|
+
return detailed_sphere_frustum_intersection_test(
|
|
69
|
+
radius, light_x, light_y, light_z,
|
|
70
|
+
outside_plane_count, outside_plane_bitfield,
|
|
71
|
+
points
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -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
|
+
}
|
|
@@ -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
|
|
|
@@ -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;
|
|
@@ -6,6 +6,7 @@ import { GameAssetType } from "../../../asset/GameAssetType.js";
|
|
|
6
6
|
import { HashMap } from "../../../../core/collection/HashMap.js";
|
|
7
7
|
import { strictEquals } from "../../../../core/function/Functions.js";
|
|
8
8
|
import { computeStringHash } from "../../../../core/primitives/strings/computeStringHash.js";
|
|
9
|
+
import { copy_Sampler2D_channel_data } from "../sampler/copy_Sampler2D_channel_data.js";
|
|
9
10
|
|
|
10
11
|
const CACHE_SIZE = 4194304;
|
|
11
12
|
|
|
@@ -139,10 +140,20 @@ export class ManagedAtlas {
|
|
|
139
140
|
|
|
140
141
|
const image = asset.create();
|
|
141
142
|
|
|
143
|
+
const source = new Sampler2D(image.data, image.itemSize, image.width, image.height);
|
|
142
144
|
//assert.equal(atlas.patches.filter(p => p.sampler.data === image.data).length, 0, "Atlas already contains this asset data");
|
|
143
145
|
|
|
144
146
|
//build sampler
|
|
145
|
-
|
|
147
|
+
let sampler;
|
|
148
|
+
|
|
149
|
+
if (source.itemSize !== 4) {
|
|
150
|
+
// source image is not in RGBA layout, resample
|
|
151
|
+
sampler = Sampler2D.uint8(4, image.width, image.height);
|
|
152
|
+
copy_Sampler2D_channel_data(source, sampler)
|
|
153
|
+
} else {
|
|
154
|
+
sampler = source;
|
|
155
|
+
}
|
|
156
|
+
|
|
146
157
|
const patch = atlas.add(sampler);
|
|
147
158
|
|
|
148
159
|
//record active patch
|
|
@@ -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);
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import QuadTree from '../../../../core/geom/2d/quad-tree/PointQuadTree.js';
|
|
5
5
|
import AABB2 from '../../../../core/geom/AABB2.js';
|
|
6
|
-
import { makeRangedRandom} from '../../../../core/math/MathUtils.js';
|
|
7
6
|
import { seededRandom } from "../../../../core/math/random/seededRandom.js";
|
|
7
|
+
import { makeRangedRandom } from "../../../../core/math/random/makeRangedRandom.js";
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
const Point2 = function (x, y) {
|
|
@@ -164,11 +164,13 @@ export function Sampler2D(data = [], itemSize = 1, width = 0, height = 0) {
|
|
|
164
164
|
* @type {Number}
|
|
165
165
|
*/
|
|
166
166
|
this.height = height;
|
|
167
|
+
|
|
167
168
|
/**
|
|
168
|
-
*
|
|
169
|
+
* Number of channels
|
|
169
170
|
* @type {Number}
|
|
170
171
|
*/
|
|
171
172
|
this.itemSize = itemSize;
|
|
173
|
+
|
|
172
174
|
/**
|
|
173
175
|
*
|
|
174
176
|
* @type {Array<number>|Uint8Array|Uint16Array|Int8Array|Float32Array|Float64Array}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Allows copying data from one sampler to another with unequal number of channels (a.itemSize !== b.itemSize)
|
|
3
|
+
* @example convert RGBA to RGB or R to RGB
|
|
4
|
+
* @param {Sampler2D} source
|
|
5
|
+
* @param {Sampler2D} destination
|
|
6
|
+
*/
|
|
7
|
+
export function copy_Sampler2D_channel_data(source, destination) {
|
|
8
|
+
if (source.width !== destination.width || source.height !== destination.height) {
|
|
9
|
+
throw new Error('Source and destination dimensions do not match');
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const source_item_size = source.itemSize;
|
|
13
|
+
const destination_item_size = destination.itemSize;
|
|
14
|
+
|
|
15
|
+
const pixel_count = source.width * source.height;
|
|
16
|
+
|
|
17
|
+
const destination_data = destination.data;
|
|
18
|
+
const source_data = source.data;
|
|
19
|
+
|
|
20
|
+
let i, j;
|
|
21
|
+
|
|
22
|
+
if (source_item_size === destination_item_size) {
|
|
23
|
+
// just copy data chunk
|
|
24
|
+
destination_data.set(source_data);
|
|
25
|
+
|
|
26
|
+
} else if (source_item_size > destination_item_size) {
|
|
27
|
+
|
|
28
|
+
for (i = 0; i < pixel_count; i++) {
|
|
29
|
+
const source_sample_offset = i * source_item_size;
|
|
30
|
+
const destination_sample_offset = i * destination_item_size;
|
|
31
|
+
|
|
32
|
+
for (j = 0; j < destination_item_size; j++) {
|
|
33
|
+
destination_data[destination_sample_offset + j] = source_data[source_sample_offset + j];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
} else if (source_item_size === 3 && destination_item_size === 4) {
|
|
38
|
+
// RGB -> RGBA
|
|
39
|
+
for (i = 0; i < pixel_count; i++) {
|
|
40
|
+
const i3 = i * 3;
|
|
41
|
+
const i4 = i * 4;
|
|
42
|
+
|
|
43
|
+
destination_data[i4] = source_data[i3];
|
|
44
|
+
destination_data[i4 + 1] = source_data[i3 + 1];
|
|
45
|
+
destination_data[i4 + 2] = source_data[i3 + 2];
|
|
46
|
+
|
|
47
|
+
destination_data[i4] = 255; // fill alpha
|
|
48
|
+
}
|
|
49
|
+
} else if (source_item_size === 2 && destination_item_size === 4) {
|
|
50
|
+
//RA -> RGBA
|
|
51
|
+
for (i = 0; i < pixel_count; i++) {
|
|
52
|
+
const i2 = i * 2;
|
|
53
|
+
const i4 = i * 4;
|
|
54
|
+
|
|
55
|
+
const r = source_data[i2];
|
|
56
|
+
|
|
57
|
+
destination_data[i4] = r;
|
|
58
|
+
destination_data[i4 + 1] = r;
|
|
59
|
+
destination_data[i4 + 2] = r;
|
|
60
|
+
|
|
61
|
+
destination_data[i4 + 3] = source_data[i2 + 1]; // fill alpha
|
|
62
|
+
}
|
|
63
|
+
} else {
|
|
64
|
+
throw new Error('Unsupported channel layout combination');
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { seededRandom } from "../../../../core/math/random/seededRandom.js";
|
|
2
2
|
import { Sampler2D } from "./Sampler2D.js";
|
|
3
3
|
import { computeUnsignedDistanceField } from "./distanceField.js";
|
|
4
|
-
import { randomIntegerBetween} from "../../../../core/math/
|
|
4
|
+
import { randomIntegerBetween } from "../../../../core/math/random/randomIntegerBetween.js";
|
|
5
5
|
|
|
6
6
|
describe('computeUnsignedDistanceField', () => {
|
|
7
7
|
test('empty', () => {
|