@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,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* @param {OperationType} operator
|
|
4
|
+
* @param {Array} operands
|
|
5
|
+
* @constructor
|
|
6
|
+
*/
|
|
7
|
+
export function Operation(operator, operands) {
|
|
8
|
+
/**
|
|
9
|
+
*
|
|
10
|
+
* @type {OperationType}
|
|
11
|
+
*/
|
|
12
|
+
this.operator = operator;
|
|
13
|
+
/**
|
|
14
|
+
*
|
|
15
|
+
* @type {Array}
|
|
16
|
+
*/
|
|
17
|
+
this.operands = operands;
|
|
18
|
+
}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* @param {string} name
|
|
4
4
|
* @param {ParticleAttributeType} attributeType
|
|
5
5
|
* @param {ParticleDataType} dataType
|
|
6
|
+
* @deprecated use {@link AttributeSpec} instead
|
|
6
7
|
* @constructor
|
|
7
8
|
*/
|
|
8
9
|
export function ParticleAttribute(name, attributeType, dataType) {
|
|
@@ -21,4 +22,4 @@ export function ParticleAttribute(name, attributeType, dataType) {
|
|
|
21
22
|
* @type {ParticleDataType}
|
|
22
23
|
*/
|
|
23
24
|
this.dataType = dataType;
|
|
24
|
-
}
|
|
25
|
+
}
|
|
@@ -11,95 +11,13 @@ import {
|
|
|
11
11
|
InstancedBufferGeometry
|
|
12
12
|
} from "three";
|
|
13
13
|
import ObservedValue from "../../../../../core/model/ObservedValue.js";
|
|
14
|
+
import { typedArrayConstructorFromDataType } from "./typedArrayConstructorFromDataType.js";
|
|
15
|
+
import { itemSizeFromAttributeType } from "./itemSizeFromAttributeType.js";
|
|
16
|
+
import { OperationType } from "./OperationType.js";
|
|
17
|
+
import { Operation } from "./Operation.js";
|
|
18
|
+
import { optimizeCommandQueue } from "./optimizeCommandQueue.js";
|
|
14
19
|
|
|
15
20
|
|
|
16
|
-
/**
|
|
17
|
-
*
|
|
18
|
-
* @enum {number}
|
|
19
|
-
*/
|
|
20
|
-
const ParticleDataType = {
|
|
21
|
-
Float32: 0,
|
|
22
|
-
Float64: 1,
|
|
23
|
-
Uint8: 2
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
*
|
|
28
|
-
* @enum {number}
|
|
29
|
-
*/
|
|
30
|
-
const ParticleAttributeType = {
|
|
31
|
-
Scalar: 1,
|
|
32
|
-
Vector2: 2,
|
|
33
|
-
Vector3: 3,
|
|
34
|
-
Vector4: 4
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
*
|
|
39
|
-
* @enum {number}
|
|
40
|
-
*/
|
|
41
|
-
const OperationType = {
|
|
42
|
-
Remove: 0,
|
|
43
|
-
Add: 1,
|
|
44
|
-
WriteAttribute: 2
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
*
|
|
49
|
-
* @param {OperationType} operator
|
|
50
|
-
* @param {Array} operands
|
|
51
|
-
* @constructor
|
|
52
|
-
*/
|
|
53
|
-
function Operation(operator, operands) {
|
|
54
|
-
/**
|
|
55
|
-
*
|
|
56
|
-
* @type {OperationType}
|
|
57
|
-
*/
|
|
58
|
-
this.operator = operator;
|
|
59
|
-
/**
|
|
60
|
-
*
|
|
61
|
-
* @type {Array}
|
|
62
|
-
*/
|
|
63
|
-
this.operands = operands;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
*
|
|
68
|
-
* @param {ParticleAttributeType} type
|
|
69
|
-
*/
|
|
70
|
-
export function itemSizeFromAttributeType(type) {
|
|
71
|
-
switch (type) {
|
|
72
|
-
case ParticleAttributeType.Scalar:
|
|
73
|
-
return 1;
|
|
74
|
-
case ParticleAttributeType.Vector2:
|
|
75
|
-
return 2;
|
|
76
|
-
case ParticleAttributeType.Vector3:
|
|
77
|
-
return 3;
|
|
78
|
-
case ParticleAttributeType.Vector4:
|
|
79
|
-
return 4;
|
|
80
|
-
default:
|
|
81
|
-
throw new Error(`Unsupported attribute type: ${type}`);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
*
|
|
87
|
-
* @param {ParticleDataType} type
|
|
88
|
-
* @returns {*}
|
|
89
|
-
*/
|
|
90
|
-
export function typedArrayConstructorFromDataType(type) {
|
|
91
|
-
switch (type) {
|
|
92
|
-
case ParticleDataType.Float32:
|
|
93
|
-
return Float32Array;
|
|
94
|
-
case ParticleDataType.Float64:
|
|
95
|
-
return Float64Array;
|
|
96
|
-
case ParticleDataType.Uint8:
|
|
97
|
-
return Uint8Array;
|
|
98
|
-
default:
|
|
99
|
-
throw new Error(`Unsupported type: ${type}`);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
21
|
/**
|
|
104
22
|
*
|
|
105
23
|
* @param {ParticleSpecification} spec
|
|
@@ -264,161 +182,7 @@ ParticleGroup.prototype.update = function () {
|
|
|
264
182
|
};
|
|
265
183
|
|
|
266
184
|
ParticleGroup.prototype.optimizeCommandQueue = function () {
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
/**
|
|
270
|
-
* TODO this is pretty slow and should be optimized
|
|
271
|
-
* @param {Array.<Operation>} queue
|
|
272
|
-
*/
|
|
273
|
-
function cutRedundantOperations(queue) {
|
|
274
|
-
const queueLength = queue.length;
|
|
275
|
-
loop_Main: for (let i = queueLength - 1; i >= 0; i--) {
|
|
276
|
-
const opA = queue[i];
|
|
277
|
-
if (opA.operator === OperationType.Add) {
|
|
278
|
-
//nothing to do
|
|
279
|
-
continue;
|
|
280
|
-
}
|
|
281
|
-
const operandsA = opA.operands;
|
|
282
|
-
if (opA.operator === OperationType.Remove) {
|
|
283
|
-
//hunt and delete operations before this remove that affect deleted references
|
|
284
|
-
for (let k = 0, kl = operandsA.length; k < kl; k++) {
|
|
285
|
-
const refA = operandsA[k];
|
|
286
|
-
|
|
287
|
-
//walk the queue back and remove all previous operations on these references
|
|
288
|
-
loop_B: for (let j = i - 1; j >= 0; j--) {
|
|
289
|
-
const opB = queue[j];
|
|
290
|
-
const operandsB = opB.operands;
|
|
291
|
-
const operatorB = opB.operator;
|
|
292
|
-
if (operatorB === OperationType.WriteAttribute) {
|
|
293
|
-
const refB = operandsB[0];
|
|
294
|
-
if (refA === refB) {
|
|
295
|
-
//cut operation
|
|
296
|
-
queue.splice(j, 1);
|
|
297
|
-
i--;
|
|
298
|
-
}
|
|
299
|
-
} else if (operatorB === OperationType.Add) {
|
|
300
|
-
for (let m = 0, ml = operandsB.length; m < ml; m++) {
|
|
301
|
-
const refB = operandsB[m];
|
|
302
|
-
if (refA === refB) {
|
|
303
|
-
let jump = 0;
|
|
304
|
-
//delete operation and add operation cancel each other out
|
|
305
|
-
if (kl > 1) {
|
|
306
|
-
operandsA.splice(k, 1);
|
|
307
|
-
kl--;
|
|
308
|
-
k--;
|
|
309
|
-
} else {
|
|
310
|
-
queue.splice(i, 1);
|
|
311
|
-
i--;
|
|
312
|
-
jump |= 2;
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
if (ml > 1) {
|
|
316
|
-
operandsB.splice(m, 1);
|
|
317
|
-
m--;
|
|
318
|
-
ml--;
|
|
319
|
-
} else {
|
|
320
|
-
//cut operation from the queue
|
|
321
|
-
queue.splice(j, 1);
|
|
322
|
-
i--;
|
|
323
|
-
jump |= 1;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
if ((jump & 2) !== 0) {
|
|
327
|
-
continue loop_Main;
|
|
328
|
-
} else if (jump !== 0) {
|
|
329
|
-
continue loop_B;
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
} else if (opA.operator === OperationType.WriteAttribute) {
|
|
337
|
-
//find other operations that modify the same attribute, any previous operations are redundant at this point
|
|
338
|
-
const refA = operandsA[0];
|
|
339
|
-
const attributeIndexA = operandsA[1];
|
|
340
|
-
//walk the queue back and remove all previous operations on these references
|
|
341
|
-
for (let j = i - 1; j >= 0; j--) {
|
|
342
|
-
const opB = queue[j];
|
|
343
|
-
if (opB.operator !== OperationType.WriteAttribute) {
|
|
344
|
-
//ignore
|
|
345
|
-
continue;
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
const operandsB = opB.operands;
|
|
349
|
-
if (operandsB[0] === refA && operandsB[1] === attributeIndexA) {
|
|
350
|
-
//operation will be overwritten anyway, cut it
|
|
351
|
-
queue.splice(j, 1);
|
|
352
|
-
i--;
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
/**
|
|
360
|
-
*
|
|
361
|
-
* @param {Array.<Operation>} queue
|
|
362
|
-
*/
|
|
363
|
-
function groupOperations(queue) {
|
|
364
|
-
let l = queue.length;
|
|
365
|
-
for (let i = 0; i < l; i++) {
|
|
366
|
-
const opA = queue[i];
|
|
367
|
-
const operatorA = opA.operator;
|
|
368
|
-
const operandsA = opA.operands;
|
|
369
|
-
if (operatorA === OperationType.Add || operatorA === OperationType.Remove) {
|
|
370
|
-
for (let j = i + 1; j < l; j++) {
|
|
371
|
-
const opB = queue[j];
|
|
372
|
-
if (opB.operator === operatorA) {
|
|
373
|
-
const operandsB = opB.operands;
|
|
374
|
-
const numOperands = operandsB.length;
|
|
375
|
-
|
|
376
|
-
for (let k = 0; k < numOperands; k++) {
|
|
377
|
-
const refB = operandsB[k];
|
|
378
|
-
if (operandsA.indexOf(refB) === -1) {
|
|
379
|
-
operandsA.push(refB);
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
queue.splice(j, 1);
|
|
384
|
-
j--;
|
|
385
|
-
l--;
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
/**
|
|
393
|
-
* @param {Array.<Operation>} queue
|
|
394
|
-
*/
|
|
395
|
-
function sortOperations(queue) {
|
|
396
|
-
queue.sort(function (a, b) {
|
|
397
|
-
const operatorA = a.operator;
|
|
398
|
-
const operatorB = b.operator;
|
|
399
|
-
|
|
400
|
-
//it's important that Add and Remove operations are sorted to the front of the queue, before Write operations
|
|
401
|
-
if (operatorA < operatorB) {
|
|
402
|
-
return -1;
|
|
403
|
-
} else if (operatorB > operatorA) {
|
|
404
|
-
return 1;
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
if (operatorA !== OperationType.WriteAttribute) {
|
|
408
|
-
return 0;
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
const attributeIndexA = a.operands[1];
|
|
412
|
-
const attributeIndexB = b.operands[1];
|
|
413
|
-
|
|
414
|
-
//sort write operations by buffer index
|
|
415
|
-
return attributeIndexB - attributeIndexA;
|
|
416
|
-
});
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
cutRedundantOperations(queue);
|
|
420
|
-
groupOperations(queue);
|
|
421
|
-
sortOperations(queue);
|
|
185
|
+
optimizeCommandQueue(this.commandQueue);
|
|
422
186
|
};
|
|
423
187
|
|
|
424
188
|
/**
|
|
@@ -869,7 +633,5 @@ ParticleGroup.prototype.setSize = function (newSize) {
|
|
|
869
633
|
};
|
|
870
634
|
|
|
871
635
|
export {
|
|
872
|
-
ParticleGroup
|
|
873
|
-
ParticleAttributeType,
|
|
874
|
-
ParticleDataType
|
|
636
|
+
ParticleGroup
|
|
875
637
|
};
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ParticleGroup, } from "./ParticleGroup.js";
|
|
2
2
|
import { ParticleSpecification } from "./ParticleSpecification.js";
|
|
3
3
|
import { ParticleAttribute } from "./ParticleAttribute.js";
|
|
4
|
+
import { ParticleDataType } from "./ParticleDataType.js";
|
|
5
|
+
import { ParticleAttributeType } from "./ParticleAttributeType.js";
|
|
4
6
|
|
|
5
7
|
test("After calling grow(1) size is increased by 1", () => {
|
|
6
8
|
const spec = new ParticleSpecification();
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import { ParticleGroup } from "./ParticleGroup.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
1
|
/**
|
|
5
2
|
*
|
|
6
3
|
* @constructor
|
|
4
|
+
* @deprecated use {@link VertexDataSpec} instead
|
|
7
5
|
*/
|
|
8
6
|
export function ParticleSpecification() {
|
|
9
7
|
/**
|
|
@@ -13,6 +11,25 @@ export function ParticleSpecification() {
|
|
|
13
11
|
this.attributes = [];
|
|
14
12
|
}
|
|
15
13
|
|
|
14
|
+
/**
|
|
15
|
+
*
|
|
16
|
+
* @param {string} name
|
|
17
|
+
* @return {undefined|ParticleAttribute}
|
|
18
|
+
*/
|
|
19
|
+
ParticleSpecification.prototype.getByName = function (name) {
|
|
20
|
+
const attributes = this.attributes;
|
|
21
|
+
const n = attributes.length;
|
|
22
|
+
for (let i = 0; i < n; i++) {
|
|
23
|
+
const attribute = attributes[i];
|
|
24
|
+
|
|
25
|
+
if (attribute.name === name) {
|
|
26
|
+
return attribute;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return undefined;
|
|
31
|
+
};
|
|
32
|
+
|
|
16
33
|
/**
|
|
17
34
|
*
|
|
18
35
|
* @param {ParticleAttribute} attribute
|
|
@@ -20,9 +37,7 @@ export function ParticleSpecification() {
|
|
|
20
37
|
*/
|
|
21
38
|
ParticleSpecification.prototype.add = function (attribute) {
|
|
22
39
|
//check uniqueness of name
|
|
23
|
-
if (this.
|
|
24
|
-
return a.name === attribute.name;
|
|
25
|
-
})) {
|
|
40
|
+
if (this.getByName(attribute.name) !== undefined) {
|
|
26
41
|
throw new Error(`Attribute named '${attribute.name}' already exists`);
|
|
27
42
|
}
|
|
28
43
|
|
|
@@ -31,11 +46,3 @@ ParticleSpecification.prototype.add = function (attribute) {
|
|
|
31
46
|
//for chaining, return self
|
|
32
47
|
return this;
|
|
33
48
|
};
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
*
|
|
37
|
-
* @return {ParticleGroup}
|
|
38
|
-
*/
|
|
39
|
-
ParticleSpecification.prototype.build = function () {
|
|
40
|
-
return new ParticleGroup(this);
|
|
41
|
-
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ParticleAttributeType } from "./ParticleAttributeType.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
*
|
|
5
|
+
* @param {ParticleAttributeType} type
|
|
6
|
+
*/
|
|
7
|
+
export function itemSizeFromAttributeType(type) {
|
|
8
|
+
switch (type) {
|
|
9
|
+
case ParticleAttributeType.Scalar:
|
|
10
|
+
return 1;
|
|
11
|
+
case ParticleAttributeType.Vector2:
|
|
12
|
+
return 2;
|
|
13
|
+
case ParticleAttributeType.Vector3:
|
|
14
|
+
return 3;
|
|
15
|
+
case ParticleAttributeType.Vector4:
|
|
16
|
+
return 4;
|
|
17
|
+
default:
|
|
18
|
+
throw new Error(`Unsupported attribute type: ${type}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { OperationType } from "./OperationType.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
*
|
|
5
|
+
* @param {Operation[]} queue
|
|
6
|
+
*/
|
|
7
|
+
export function optimizeCommandQueue(queue) {
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* TODO this is pretty slow and should be optimized
|
|
11
|
+
* @param {Array.<Operation>} queue
|
|
12
|
+
*/
|
|
13
|
+
function cutRedundantOperations(queue) {
|
|
14
|
+
const queueLength = queue.length;
|
|
15
|
+
loop_Main: for (let i = queueLength - 1; i >= 0; i--) {
|
|
16
|
+
const opA = queue[i];
|
|
17
|
+
if (opA.operator === OperationType.Add) {
|
|
18
|
+
//nothing to do
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
const operandsA = opA.operands;
|
|
22
|
+
if (opA.operator === OperationType.Remove) {
|
|
23
|
+
//hunt and delete operations before this remove that affect deleted references
|
|
24
|
+
for (let k = 0, kl = operandsA.length; k < kl; k++) {
|
|
25
|
+
const refA = operandsA[k];
|
|
26
|
+
|
|
27
|
+
//walk the queue back and remove all previous operations on these references
|
|
28
|
+
loop_B: for (let j = i - 1; j >= 0; j--) {
|
|
29
|
+
const opB = queue[j];
|
|
30
|
+
const operandsB = opB.operands;
|
|
31
|
+
const operatorB = opB.operator;
|
|
32
|
+
if (operatorB === OperationType.WriteAttribute) {
|
|
33
|
+
const refB = operandsB[0];
|
|
34
|
+
if (refA === refB) {
|
|
35
|
+
//cut operation
|
|
36
|
+
queue.splice(j, 1);
|
|
37
|
+
i--;
|
|
38
|
+
}
|
|
39
|
+
} else if (operatorB === OperationType.Add) {
|
|
40
|
+
for (let m = 0, ml = operandsB.length; m < ml; m++) {
|
|
41
|
+
const refB = operandsB[m];
|
|
42
|
+
if (refA === refB) {
|
|
43
|
+
let jump = 0;
|
|
44
|
+
//delete operation and add operation cancel each other out
|
|
45
|
+
if (kl > 1) {
|
|
46
|
+
operandsA.splice(k, 1);
|
|
47
|
+
kl--;
|
|
48
|
+
k--;
|
|
49
|
+
} else {
|
|
50
|
+
queue.splice(i, 1);
|
|
51
|
+
i--;
|
|
52
|
+
jump |= 2;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (ml > 1) {
|
|
56
|
+
operandsB.splice(m, 1);
|
|
57
|
+
m--;
|
|
58
|
+
ml--;
|
|
59
|
+
} else {
|
|
60
|
+
//cut operation from the queue
|
|
61
|
+
queue.splice(j, 1);
|
|
62
|
+
i--;
|
|
63
|
+
jump |= 1;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if ((jump & 2) !== 0) {
|
|
67
|
+
continue loop_Main;
|
|
68
|
+
} else if (jump !== 0) {
|
|
69
|
+
continue loop_B;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
} else if (opA.operator === OperationType.WriteAttribute) {
|
|
77
|
+
//find other operations that modify the same attribute, any previous operations are redundant at this point
|
|
78
|
+
const refA = operandsA[0];
|
|
79
|
+
const attributeIndexA = operandsA[1];
|
|
80
|
+
//walk the queue back and remove all previous operations on these references
|
|
81
|
+
for (let j = i - 1; j >= 0; j--) {
|
|
82
|
+
const opB = queue[j];
|
|
83
|
+
if (opB.operator !== OperationType.WriteAttribute) {
|
|
84
|
+
//ignore
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const operandsB = opB.operands;
|
|
89
|
+
if (operandsB[0] === refA && operandsB[1] === attributeIndexA) {
|
|
90
|
+
//operation will be overwritten anyway, cut it
|
|
91
|
+
queue.splice(j, 1);
|
|
92
|
+
i--;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
*
|
|
101
|
+
* @param {Array.<Operation>} queue
|
|
102
|
+
*/
|
|
103
|
+
function groupOperations(queue) {
|
|
104
|
+
let l = queue.length;
|
|
105
|
+
for (let i = 0; i < l; i++) {
|
|
106
|
+
const opA = queue[i];
|
|
107
|
+
const operatorA = opA.operator;
|
|
108
|
+
const operandsA = opA.operands;
|
|
109
|
+
if (operatorA === OperationType.Add || operatorA === OperationType.Remove) {
|
|
110
|
+
for (let j = i + 1; j < l; j++) {
|
|
111
|
+
const opB = queue[j];
|
|
112
|
+
if (opB.operator === operatorA) {
|
|
113
|
+
const operandsB = opB.operands;
|
|
114
|
+
const numOperands = operandsB.length;
|
|
115
|
+
|
|
116
|
+
for (let k = 0; k < numOperands; k++) {
|
|
117
|
+
const refB = operandsB[k];
|
|
118
|
+
if (operandsA.indexOf(refB) === -1) {
|
|
119
|
+
operandsA.push(refB);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
queue.splice(j, 1);
|
|
124
|
+
j--;
|
|
125
|
+
l--;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* @param {Array.<Operation>} queue
|
|
134
|
+
*/
|
|
135
|
+
function sortOperations(queue) {
|
|
136
|
+
queue.sort(function (a, b) {
|
|
137
|
+
const operatorA = a.operator;
|
|
138
|
+
const operatorB = b.operator;
|
|
139
|
+
|
|
140
|
+
//it's important that Add and Remove operations are sorted to the front of the queue, before Write operations
|
|
141
|
+
if (operatorA < operatorB) {
|
|
142
|
+
return -1;
|
|
143
|
+
} else if (operatorB > operatorA) {
|
|
144
|
+
return 1;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (operatorA !== OperationType.WriteAttribute) {
|
|
148
|
+
return 0;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const attributeIndexA = a.operands[1];
|
|
152
|
+
const attributeIndexB = b.operands[1];
|
|
153
|
+
|
|
154
|
+
//sort write operations by buffer index
|
|
155
|
+
return attributeIndexB - attributeIndexA;
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
cutRedundantOperations(queue);
|
|
160
|
+
groupOperations(queue);
|
|
161
|
+
sortOperations(queue);
|
|
162
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ParticleDataType } from "./ParticleDataType.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
*
|
|
5
|
+
* @param {ParticleDataType} type
|
|
6
|
+
* @returns {*}
|
|
7
|
+
*/
|
|
8
|
+
export function typedArrayConstructorFromDataType(type) {
|
|
9
|
+
switch (type) {
|
|
10
|
+
case ParticleDataType.Float32:
|
|
11
|
+
return Float32Array;
|
|
12
|
+
case ParticleDataType.Float64:
|
|
13
|
+
return Float64Array;
|
|
14
|
+
case ParticleDataType.Uint8:
|
|
15
|
+
return Uint8Array;
|
|
16
|
+
default:
|
|
17
|
+
throw new Error(`Unsupported type: ${type}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { max2 } from "../../../../../../core/math/max2.js";
|
|
2
1
|
import { EnginePlugin } from "../../../../../plugin/EnginePlugin.js";
|
|
3
2
|
import {
|
|
4
3
|
LinearFilter,
|
|
@@ -14,6 +13,7 @@ import { BlendingType } from "../../../../texture/sampler/BlendingType.js";
|
|
|
14
13
|
import { DepthLimitedBlur } from "../DepthLimitedBlur.js";
|
|
15
14
|
import { renderScreenSpace } from "../../../utils/renderScreenSpace.js";
|
|
16
15
|
import { StandardFrameBuffers } from "../../../../StandardFrameBuffers.js";
|
|
16
|
+
import { CompositingStages } from "../../../../composit/CompositingStages.js";
|
|
17
17
|
|
|
18
18
|
export class AmbientOcclusionPostProcessEffect extends EnginePlugin {
|
|
19
19
|
constructor() {
|
|
@@ -50,7 +50,7 @@ export class AmbientOcclusionPostProcessEffect extends EnginePlugin {
|
|
|
50
50
|
* @type {boolean}
|
|
51
51
|
* @private
|
|
52
52
|
*/
|
|
53
|
-
this.__use_normals =
|
|
53
|
+
this.__use_normals = false;
|
|
54
54
|
|
|
55
55
|
/**
|
|
56
56
|
* Resolution scale at which AO is to be rendered. Higher scale will lead to sharper and better looking results
|
|
@@ -160,9 +160,9 @@ export class AmbientOcclusionPostProcessEffect extends EnginePlugin {
|
|
|
160
160
|
uniforms.bias.value = 0.5;
|
|
161
161
|
uniforms.intensity.value = 0.18;
|
|
162
162
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
uniforms.scale.value =
|
|
163
|
+
// scale is divided by camera far in the shader, we unbias it here
|
|
164
|
+
// TODO remove this term from the shader
|
|
165
|
+
uniforms.scale.value = far * 0.25;
|
|
166
166
|
|
|
167
167
|
uniforms.kernelRadius.value = 30;
|
|
168
168
|
uniforms.minResolution.value = 0;
|
|
@@ -184,12 +184,14 @@ export class AmbientOcclusionPostProcessEffect extends EnginePlugin {
|
|
|
184
184
|
|
|
185
185
|
/**
|
|
186
186
|
*
|
|
187
|
-
* @param {WebGLRenderer} renderer
|
|
188
|
-
* @param {Camera} camera
|
|
189
|
-
* @param {Scene} scene
|
|
190
187
|
* @private
|
|
191
188
|
*/
|
|
192
|
-
__render(
|
|
189
|
+
__render() {
|
|
190
|
+
const engine = this.engine;
|
|
191
|
+
const graphics = engine.graphics;
|
|
192
|
+
|
|
193
|
+
const renderer = graphics.renderer;
|
|
194
|
+
|
|
193
195
|
this.__prepare_draw();
|
|
194
196
|
|
|
195
197
|
const __old_state_rt = renderer.getRenderTarget();
|
|
@@ -295,6 +297,9 @@ export class AmbientOcclusionPostProcessEffect extends EnginePlugin {
|
|
|
295
297
|
this.__composit_layer = graphics.layerComposer.createLayer({}, BlendingType.Multiply);
|
|
296
298
|
this.__composit_layer.name = 'Ambient Occlusion';
|
|
297
299
|
|
|
300
|
+
// apply ambient occlusion on opaque pass, otherwise it would occlude transparent geometry
|
|
301
|
+
this.__composit_layer.stage = CompositingStages.POST_OPAQUE;
|
|
302
|
+
|
|
298
303
|
const material = this.__material;
|
|
299
304
|
const uniforms = material.uniforms;
|
|
300
305
|
|
|
@@ -309,7 +314,7 @@ export class AmbientOcclusionPostProcessEffect extends EnginePlugin {
|
|
|
309
314
|
this.setNormalBufferUsage(true);
|
|
310
315
|
}
|
|
311
316
|
|
|
312
|
-
|
|
317
|
+
this.__composit_layer.on.preRender.add(this.__render, this);
|
|
313
318
|
graphics.viewport.size.onChanged.add(this.__update_render_target_size, this);
|
|
314
319
|
|
|
315
320
|
this.__update_render_target_size();
|
|
@@ -330,7 +335,7 @@ export class AmbientOcclusionPostProcessEffect extends EnginePlugin {
|
|
|
330
335
|
// remove the layer
|
|
331
336
|
graphics.layerComposer.remove(this.__composit_layer);
|
|
332
337
|
|
|
333
|
-
|
|
338
|
+
this.__composit_layer.on.preRender.remove(this.__render, this);
|
|
334
339
|
graphics.viewport.size.onChanged.add(this.__update_render_target_size, this);
|
|
335
340
|
|
|
336
341
|
return super.shutdown();
|