@woosh/meep-engine 2.56.1 → 2.58.0
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/editor/Editor.js +4 -4
- package/editor/ecs/component/editors/ColorEditor.js +1 -1
- package/editor/ecs/component/editors/ImagePathEditor.js +2 -2
- package/editor/ecs/component/editors/{LargeStrongEditor.js → LargeStringEditor.js} +1 -1
- package/editor/process/symbolic/buildThreeJSHelperEntity.js +3 -3
- package/editor/process/symbolic/makeGridPositionSymbolDisplay.js +3 -3
- package/editor/process/symbolic/makePositionedIconDisplaySymbol.js +3 -3
- package/editor/tools/GridPaintTool.js +3 -3
- package/editor/tools/TopDownCameraControlTool.js +1 -1
- package/editor/tools/TransformTool.js +1 -1
- package/editor/tools/engine/Tool.js +9 -23
- package/editor/tools/engine/ToolEngine.js +5 -7
- package/editor/tools/paint/TerrainHeightPaintTool.js +2 -2
- package/editor/tools/paint/TerrainPaintTool.js +2 -2
- package/editor/tools/paint/TerrainTexturePaintTool.js +2 -2
- package/editor/tools/v2/prototypeTransformControls.js +3 -3
- package/editor/view/ecs/ComponentControlView.js +2 -1
- package/package.json +1 -1
- package/samples/generation/main.js +2 -2
- package/samples/terrain/from_image.js +2 -2
- package/samples/terrain/from_image_2.js +4 -4
- package/src/core/binary/byteArrayToString.js +28 -0
- package/src/core/binary/downloadAsFile.js +28 -0
- package/src/core/binary/downloadUrlAsFile.js +14 -0
- package/src/core/binary/jsonToStringToByteArray.js +27 -0
- package/src/core/binary/stringToByteArray.js +24 -0
- package/src/core/bvh2/BinaryNode.spec.js +2 -1
- package/src/core/bvh2/bvh3/query/compute_tight_near_far_clipping_planes.js +1 -1
- package/src/core/bvh2/traversal/ThreeClippingPlaneComputingBVHVisitor.js +1 -1
- package/src/core/bvh2/traversal/__process_point_if_within_planes.js +1 -1
- package/src/core/cache/LoadingCache.js +3 -2
- package/src/core/collection/array/arraySetSortingDiff.spec.js +12 -12
- package/src/core/collection/array/weightedRandomFromArray.js +2 -2
- package/src/core/color/Color.js +6 -6
- package/src/core/color/Color.spec.js +27 -1
- package/src/core/color/YCbCr/YCbCr.spec.js +16 -0
- package/src/core/color/{YCbCr_to_rgb_uint24.js → YCbCr/YCbCr_to_rgb_uint24.js} +6 -6
- package/src/core/color/YCbCr/rgb_to_YCbCr_uint24.js +16 -0
- package/src/core/color/{hex2rgb.js → hex/hex2rgb.js} +1 -1
- package/src/core/color/{rgb2hex.js → hex/rgb2hex.js} +1 -1
- package/src/core/color/{hsv2rgb.js → hsv/hsv2rgb.js} +3 -3
- package/src/core/color/hsv/rgb2hsv.js +49 -0
- package/src/core/color/{kelvin_to_rgb.js → kelvin/kelvin_to_rgb.js} +1 -1
- package/src/core/color/{kelvin_to_rgb.spec.js → kelvin/kelvin_to_rgb.spec.js} +2 -2
- package/src/core/color/{prototype_kelvin_to_rgb.js → kelvin/prototype_kelvin_to_rgb.js} +5 -5
- package/src/core/color/{rgb_to_kelvin.spec.js → kelvin/rgb_to_kelvin.spec.js} +1 -1
- package/src/core/color/{parseColor.js → parse_color.js} +5 -5
- package/src/core/color/parse_color.spec.js +18 -0
- package/src/core/color/rgb2uint24.js +3 -3
- package/src/core/color/sRGB/sRGB.spec.js +16 -0
- package/src/core/color/xyz/XYZ.spec.js +16 -0
- package/src/core/color/xyz/rgb_to_xyz.js +15 -0
- package/src/core/color/xyz/xyz_to_rgb.js +14 -0
- package/src/core/events/signal/Signal.js +5 -0
- package/src/core/events/signal/{signalAggregateByTimeWindow.js → signal_aggregate_by_time_window.js} +1 -1
- package/src/core/events/signal/{SignalUtils.js → signal_filter.js} +1 -2
- package/src/core/fsm/simple/SimpleStateMachine.spec.js +34 -2
- package/src/core/geom/2d/spline_bezier2_2d.js +26 -0
- package/src/core/geom/2d/spline_bezier2_2d.spec.js +16 -0
- package/src/core/geom/3d/SurfacePoint3.js +1 -1
- package/src/core/geom/3d/aabb/aabb3_compute_plane_side.js +1 -1
- package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.js +1 -1
- package/src/core/geom/3d/aabb/aabb3_transformed_compute_plane_side.js +1 -1
- package/src/core/geom/3d/compute_circle_bounding_box.js +1 -1
- package/src/core/geom/3d/cone/computeConeBoundingBox.js +1 -1
- package/src/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +1 -1
- package/src/core/geom/3d/line/line3_computeSegmentPointDistance_sqr.js +1 -1
- package/src/core/geom/3d/line/line3_compute_nearest_point_to_point.js +1 -1
- package/src/core/geom/3d/matrix/m4_multiply.js +2 -2
- package/src/core/geom/3d/matrix/m4_multiply.spec.js +11 -0
- package/src/core/geom/3d/matrix/m4_multiply_alphatensor.spec.js +11 -0
- package/src/core/geom/3d/morton/split_by_2.js +1 -1
- package/src/core/geom/3d/normal/hemioct/unit_hemioct.spec.js +1 -1
- package/src/core/geom/3d/normal/spherical/sphere_map_transform.js +1 -1
- package/src/core/geom/3d/plane/is_point_within_planes.js +1 -1
- package/src/core/geom/3d/plane/lerp_planes_to_array.js +1 -1
- package/src/core/geom/3d/plane/plane3_compute_convex_3_plane_intersection.js +1 -1
- package/src/core/geom/3d/plane/plane3_compute_line_segment_intersection.js +1 -1
- package/src/core/geom/3d/plane/plane3_compute_ray_intersection.js +1 -1
- package/src/core/geom/3d/plane/plane3_lerp.js +2 -2
- package/src/core/geom/3d/plane/plane3_projectPoint.js +1 -1
- package/src/core/geom/3d/plane/plane3_slerp.js +3 -3
- package/src/core/geom/3d/ray/ray_computeNearestPointToPoint.js +1 -1
- package/src/core/geom/3d/ray/ray_distance_to_point.js +1 -1
- package/src/core/geom/3d/shape/UnionShape3D.js +3 -3
- package/src/core/geom/3d/shape/UnitCubeShape3D.js +1 -1
- package/src/core/geom/3d/shape/UnitSphereShape3D.js +1 -1
- package/src/core/geom/3d/shape/util/shape_to_visual_entity.js +10 -10
- package/src/core/geom/3d/sphere/sphere_intersects_ray.js +1 -1
- package/src/core/geom/3d/tetrahedra/TetrahedralMesh.js +6 -0
- package/src/core/geom/3d/tetrahedra/compute_bounding_simplex_3d.js +1 -1
- package/src/core/geom/3d/tetrahedra/compute_bounding_simplex_3d.spec.js +1 -1
- package/src/core/geom/3d/tetrahedra/compute_circumsphere.js +1 -1
- package/src/core/geom/3d/tetrahedra/delaunay/compute_delaunay_tetrahedral_mesh.js +1 -0
- package/src/core/geom/3d/tetrahedra/delaunay/compute_delaunay_tetrahedral_mesh.spec.js +10 -2
- package/src/core/geom/3d/tetrahedra/prototypeTetrahedraBuilder.js +2 -2
- package/src/core/geom/3d/topology/bounds/computeTriangleClusterNormalBoundingCone.js +1 -1
- package/src/core/geom/3d/topology/samples/sampleFloodFill.js +4 -4
- package/src/core/geom/3d/topology/simplify/compute_face_normal_change_dot_product.js +1 -1
- package/src/core/geom/3d/topology/simplify/quadratic/Quadratic3.js +1 -1
- package/src/core/geom/3d/topology/simplify/tm_edge_collapse_is_degenerate_flip.js +2 -2
- package/src/core/geom/3d/topology/struct/TopoVertex.js +1 -1
- package/src/core/geom/3d/topology/util/compute_face_connection_weight.js +2 -2
- package/src/core/geom/3d/triangle/computeTrianglePlaneSide.js +1 -1
- package/src/core/geom/3d/triangle/computeTriangleRayIntersection.js +1 -1
- package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricEdge.js +1 -1
- package/src/core/geom/3d/v3_compute_triangle_normal.js +1 -1
- package/src/core/geom/Quaternion.js +1 -1
- package/src/core/geom/Vector3.js +7 -7
- package/src/core/geom/Vector3.spec.js +68 -1
- package/src/core/geom/mat2/m2_add.js +17 -0
- package/src/core/geom/mat2/m2_determinant.js +8 -0
- package/src/core/geom/mat2/m2_multiply.js +17 -0
- package/src/core/geom/mat2/m2_multiply_scalar.js +18 -0
- package/src/core/geom/mat2/m2_multiply_transposed.js +18 -0
- package/src/core/geom/mat2/m2_sub_transposed.js +17 -0
- package/src/{view → core/geom/mat3}/m3_cm_compose_transform.js +0 -29
- package/src/core/geom/mat3/m3_cm_extract_rotation.js +8 -0
- package/src/core/geom/mat3/m3_cm_from_translation.js +19 -0
- package/src/{view/multiplyMatrices3.js → core/geom/mat3/m3_multiply.js} +2 -2
- package/src/{view → core/geom/mat3}/m3_rm_compose_transform.js +0 -9
- package/src/core/geom/mat3/m3_rm_extract_scale.js +7 -0
- package/src/core/geom/{3d/vector/allocate_v3.js → vec3/v3_allocate.js} +1 -1
- package/src/core/geom/{v3_angle_between.js → vec3/v3_angle_between.js} +1 -1
- package/src/core/geom/vec3/v3_dot_array_array.js +20 -0
- package/src/core/geom/{v3_lerp.js → vec3/v3_lerp.js} +1 -1
- package/src/core/graph/SquareMatrix.js +26 -3
- package/src/core/graph/SquareMatrix.spec.js +52 -2
- package/src/core/math/clamp01.js +1 -0
- package/src/core/math/fract.js +3 -1
- package/src/core/math/inverseLerp.js +7 -5
- package/src/core/math/lerp.js +5 -5
- package/src/core/math/physics/spring/computeHookeForce.js +9 -0
- package/src/core/math/remap.js +19 -0
- package/src/core/math/remap.spec.js +15 -0
- package/src/core/math/smoothStep.spec.js +16 -0
- package/src/core/math/spline/spline_bezier2.js +13 -0
- package/src/core/math/spline/spline_bezier2.spec.js +13 -0
- package/src/core/model/object/compareValues.js +2 -2
- package/src/core/model/object/read_property.js +10 -2
- package/src/core/model/object/write_property.js +3 -23
- package/src/core/model/object/write_property.spec.js +26 -0
- package/src/core/primitives/numbers/number_pretty_print.spec.js +19 -0
- package/src/core/process/action/AsynchronousDelayAction.js +2 -2
- package/src/core/process/executor/profile/ConcurrentExecutorProfiler.js +1 -1
- package/src/engine/EngineHarness.js +7 -7
- package/src/engine/EntityCreator.js +5 -5
- package/src/engine/__module.js +1 -1
- package/src/engine/achievements/AchievementManager.js +2 -2
- package/src/engine/animation/AnimationUtils.js +4 -4
- package/src/engine/animation/behavior/animateProperty.js +2 -2
- package/src/engine/animation/curve/draw/build_plot_entity_from_array.js +3 -3
- package/src/engine/animation/playAnimationTrack.js +3 -3
- package/src/engine/animation/playTrackRealTime.js +3 -3
- package/src/engine/animation/removeEntityWithMeshParticlesEffect.js +2 -2
- package/src/engine/control/ControlContext.js +7 -7
- package/src/engine/ecs/{EntityBuilder.d.ts → Entity.d.ts} +5 -5
- package/src/engine/ecs/{EntityBuilder.js → Entity.js} +29 -29
- package/src/engine/ecs/{EntityBuilder.spec.js → Entity.spec.js} +17 -17
- package/src/engine/ecs/EntityBlueprint.d.ts +2 -2
- package/src/engine/ecs/EntityBlueprint.js +3 -3
- package/src/engine/ecs/EntityBlueprint.spec.js +2 -2
- package/src/engine/ecs/{EntityBuilderFlags.js → EntityFlags.js} +1 -1
- package/src/engine/ecs/EntityObserver.spec.js +8 -8
- package/src/engine/ecs/dynamic_actions/DynamicActorSystem.js +5 -5
- package/src/engine/ecs/foliage/ecs/InstancedMeshUtils.js +3 -3
- package/src/engine/ecs/gui/menu/radial/RadialContextMenu.d.ts +2 -2
- package/src/engine/ecs/gui/menu/radial/RadialContextMenu.js +5 -5
- package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +2 -2
- package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +2 -2
- package/src/engine/ecs/parent/EntityNode.d.ts +3 -3
- package/src/engine/ecs/parent/EntityNode.js +5 -5
- package/src/engine/ecs/parent/testHuDPerf.js +2 -2
- package/src/engine/ecs/speaker/VoiceSystem.js +5 -5
- package/src/engine/ecs/systems/SteeringSystem.js +1 -1
- package/src/engine/ecs/terrain/ecs/splat/SplatMapOptimizerDebugger.js +1 -1
- package/src/engine/ecs/tooltip/testTooltipComponentSystem.js +3 -3
- package/src/engine/graphics/camera/makeOrbitalCameraController.js +3 -3
- package/src/engine/graphics/camera/testClippingPlaneComputation.js +3 -3
- package/src/engine/graphics/debug/createDebugLabel.js +3 -3
- package/src/engine/graphics/ecs/camera/Camera.js +1 -1
- package/src/engine/graphics/ecs/camera/CameraClippingPlaneComputer.js +1 -1
- package/src/engine/graphics/ecs/camera/filter/setup_filtered_camera_controller.js +3 -3
- package/src/engine/graphics/ecs/decal/v2/FPDecalSystem.js +3 -11
- package/src/engine/graphics/ecs/decal/v2/prototypeDecalEditor.js +3 -3
- package/src/engine/graphics/ecs/decal/v2/prototypeDecalSystem.js +14 -14
- package/src/engine/graphics/ecs/highlight/Highlight.js +20 -102
- package/src/engine/graphics/ecs/mesh/Mesh.js +12 -18
- package/src/engine/graphics/ecs/mesh/MeshSystem.js +41 -26
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.js +1 -1
- package/src/engine/graphics/ecs/mesh-v2/aggregate/prototypeSGMesh.js +3 -3
- package/src/engine/graphics/ecs/mesh-v2/sample/prototypeShadedGeometry.js +5 -5
- package/src/engine/graphics/ecs/mesh-v2/sample/prototype_sg_raycast.js +6 -6
- package/src/engine/graphics/ecs/path/ribbon/RibbonPathBuilder.js +3 -3
- package/src/engine/graphics/ecs/path/testPathDisplaySystem.js +3 -3
- package/src/engine/graphics/ecs/path/tube/build/TubePathBuilder.js +4 -4
- package/src/engine/graphics/ecs/path/tube/build/makeTubeGeometry.js +1 -1
- package/src/engine/graphics/ecs/path/tube/build/make_cap.js +3 -3
- package/src/engine/graphics/ecs/path/tube/build/make_ring_vertices.js +1 -1
- package/src/engine/graphics/ecs/path/tube/prototypeAnimatedPathMask.js +3 -3
- package/src/engine/graphics/ecs/sprite/SpriteSystemPE.js +2 -2
- package/src/engine/graphics/ecs/sprite/prototypeSpriteSystem.js +2 -2
- package/src/engine/graphics/geometry/MikkT/InitTriInfo.js +5 -6
- package/src/engine/graphics/geometry/MikkT/MikkTSpace.js +3 -3
- package/src/engine/graphics/geometry/MikkT/NormalizeSafe.js +1 -2
- package/src/engine/graphics/geometry/MikkT/STSpace.js +3 -3
- package/src/engine/graphics/geometry/MikkT/v3_scale_dot_sub_normalize.js +2 -2
- package/src/engine/graphics/geometry/bvh/buffered/BVHGeometryRaycaster.js +1 -1
- package/src/engine/graphics/geometry/clipping/ClippedGeometry.js +1 -1
- package/src/engine/graphics/geometry/optimization/merge/prototypeGeometryMerge.js +4 -4
- package/src/engine/graphics/impostors/octahedral/prototypeBaker.js +7 -7
- package/src/engine/graphics/particles/node-based/editor/ParticleSpecificationEditorView.js +1 -1
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +102 -95
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleLayer.spec.js +25 -0
- package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +0 -35
- package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.spec.js +39 -2
- package/src/engine/graphics/particles/particular/engine/renderers/billboard/prototypeBillboardRenderer.js +2 -2
- package/src/engine/graphics/particles/particular/engine/shader/ShaderManager.js +22 -6
- package/src/engine/graphics/particles/particular/engine/utils/volume/ParticleVolume.d.ts +2 -2
- package/src/engine/graphics/particles/particular/engine/utils/volume/ParticleVolume.js +3 -3
- package/src/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +10 -10
- package/src/engine/graphics/render/buffer/buffers/prototypeNormalFrameBuffer.js +2 -2
- package/src/engine/graphics/render/buffer/simple-fx/taa/prototypeTAA.js +2 -2
- package/src/engine/graphics/render/forward_plus/LightManager.js +1 -1
- package/src/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +13 -13
- package/src/engine/graphics/render/forward_plus/prototype/prototypeLightManager.js +3 -3
- package/src/engine/graphics/render/forward_plus/query/detailed_sphere_frustum_intersection_test.js +1 -1
- package/src/engine/graphics/render/layers/RenderLayerUtils.js +1 -1
- package/src/engine/graphics/render/visibility/hiz/prototypeHiZ.js +8 -7
- package/src/engine/graphics/sh3/LightProbeVolume.js +3 -3
- package/src/engine/graphics/sh3/path_tracer/PathTracer.js +2 -2
- package/src/engine/graphics/sh3/path_tracer/prototypePathTracer.js +2 -2
- package/src/engine/graphics/sh3/path_tracer/random_in_hemisphere.js +1 -1
- package/src/engine/graphics/sh3/path_tracer/ray_hit_apply_transform.js +1 -1
- package/src/engine/graphics/sh3/path_tracer/ray_reflect.js +1 -1
- package/src/engine/graphics/sh3/prototypeSH3Probe.js +3 -3
- package/src/engine/graphics/sh3/sky/hosek/data.js +3744 -0
- package/src/engine/graphics/sh3/sky/hosek/sky_hosek_compute_irradiance_by_direction.js +10 -3786
- package/src/engine/graphics/sh3/visualise_probe.js +3 -3
- package/src/engine/graphics/shadows/testShadowMapRendering.js +3 -3
- package/src/engine/graphics/texture/atlas/AbstractTextureAtlas.js +1 -1
- package/src/engine/graphics/texture/atlas/AtlasPatch.js +0 -1
- package/src/engine/graphics/texture/atlas/AtlasPatchFlag.js +8 -1
- package/src/engine/graphics/texture/atlas/CachingTextureAtlas.js +25 -0
- package/src/engine/graphics/texture/atlas/CachingTextureAtlas.spec.js +54 -0
- package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.js +101 -160
- package/src/engine/graphics/texture/atlas/TextureAtlas.js +18 -1
- package/src/engine/graphics/texture/sampler/downloadSamplerAsPNG.js +1 -1
- package/src/engine/graphics/texture/sampler/sampler2d_ensure_uint8_RGBA.js +22 -0
- package/src/engine/graphics/texture/sprite/prototypeSpriteCutoutGeometry.js +2 -2
- package/src/engine/graphics/util/projectSphere.js +1 -1
- package/src/engine/input/ecs/controllers/KeyboardCameraController.js +2 -2
- package/src/engine/input/ecs/util/TopDownCameraControllerHelper.js +2 -2
- package/src/engine/intelligence/behavior/composite/ParallelBehavior.spec.js +13 -12
- package/src/engine/navigation/ecs/components/Path.js +1 -1
- package/src/engine/physics/fluid/prototype.js +3 -3
- package/src/engine/physics/mls-mpm/MLS_MPM.js +11 -106
- package/src/engine/reference/v2/Reference.js +6 -2
- package/src/engine/save/storage/JsonStringCodec.js +1 -1
- package/src/engine/save/storage/LocalStorage.js +2 -1
- package/src/engine/sound/ecs/emitter/SoundEmitter.js +7 -7
- package/src/engine/sound/ecs/emitter/SoundTrack.js +6 -6
- package/src/engine/ui/GUIEngine.js +4 -4
- package/src/engine/ui/notification/NotificationManager.js +3 -3
- package/src/generation/filtering/numeric/complex/CellFilterAngleToNormal.js +1 -1
- package/src/generation/grid/generation/road/GridTaskGenerateRoads.js +2 -4
- package/src/generation/markers/debug/visualizeMarkers.js +2 -2
- package/src/generation/markers/prototypeGridCellActionPlaceMarker.js +2 -2
- package/src/generation/placement/action/random/weighted/CellActionSelectWeightedRandom.js +2 -2
- package/src/generation/theme/ThemeEngine.js +2 -2
- package/src/generation/theme/ThemeEngine.spec.js +7 -0
- package/src/view/View.js +21 -13
- package/src/view/elements/ColorPickerView.js +2 -2
- package/src/view/minimap/gl/MarkerGL.js +20 -18
- package/src/view/minimap/gl/MinimapMarkersGL.js +2 -1
- package/editor/tools/FoliagePaintTool.js +0 -168
- package/editor/tools/engine/ToolStateMachine.js +0 -53
- package/src/core/NumberFormat.js +0 -4
- package/src/core/binary/ByteArrayTools.js +0 -137
- package/src/core/binary/NaiveBitSet.js +0 -69
- package/src/core/binary/objects/StandardTypeBuilder.js +0 -126
- package/src/core/binary/serde/JsonSerializer.js +0 -113
- package/src/core/color/rgb2hsv.js +0 -47
- package/src/core/color/rgb_to_YCbCr_uint24.js +0 -16
- package/src/core/fsm/StateMachine.js +0 -440
- package/src/core/fsm/Transition.js +0 -65
- package/src/core/geom/Bezier.js +0 -24
- package/src/core/geom/Bezier.spec.js +0 -16
- package/src/core/math/spline/quadraticCurve.js +0 -11
- package/src/core/math/spline/quadraticCurve.spec.js +0 -13
- package/src/core/primitives/numbers/compareNumbers.js +0 -9
- package/src/engine/graphics/ecs/decal/Decal.js +0 -10
- package/src/engine/graphics/ecs/decal/DecalSystem.js +0 -99
- package/src/engine/graphics/ecs/decal/threejs/DecalGeometry.js +0 -298
- package/src/engine/graphics/ecs/trail/Trail.js +0 -83
- package/src/engine/graphics/ecs/trail/TrailMaterial.js +0 -67
- package/src/engine/graphics/ecs/trail/TrailMaterial2.js +0 -73
- package/src/engine/graphics/ecs/trail/TrailSystem.js +0 -162
- package/src/engine/graphics/ecs/water2/NodeWaterShader1.js +0 -213
- package/src/engine/graphics/ecs/water2/shader/JBWaterShader.js +0 -315
- package/src/engine/graphics/geometry/MikkT/Length.js +0 -10
- package/src/engine/graphics/texture/ImageLoader.js +0 -33
- package/src/engine/graphics/three/DDSLoader.js +0 -286
- package/src/engine/graphics/three/Water2.js +0 -343
- package/src/engine/physics/spring/computeHookeForce.js +0 -9
- package/src/engine/reference/v1/ReferenceManager.js +0 -124
- /package/src/core/color/{hex2rgb.spec.js → hex/hex2rgb.spec.js} +0 -0
- /package/src/core/color/{rgb2hex.spec.js → hex/rgb2hex.spec.js} +0 -0
- /package/src/core/color/{hsv2rgb.spec.js → hsv/hsv2rgb.spec.js} +0 -0
- /package/src/core/color/{rgb_to_kelvin.js → kelvin/rgb_to_kelvin.js} +0 -0
- /package/src/core/color/{linear_to_sRGB.js → sRGB/linear_to_sRGB.js} +0 -0
- /package/src/core/color/{sRGB_to_linear.js → sRGB/sRGB_to_linear.js} +0 -0
- /package/src/core/geom/{m3_determinant.js → mat3/m3_determinant.js} +0 -0
- /package/src/core/geom/{v3_distance.js → vec3/v3_distance.js} +0 -0
- /package/src/core/geom/{v3_distance_above_plane.js → vec3/v3_distance_above_plane.js} +0 -0
- /package/src/core/geom/{v3_distance_above_plane.spec.js → vec3/v3_distance_above_plane.spec.js} +0 -0
- /package/src/core/geom/{v3_distance_sqr.d.ts → vec3/v3_distance_sqr.d.ts} +0 -0
- /package/src/core/geom/{v3_distance_sqr.js → vec3/v3_distance_sqr.js} +0 -0
- /package/src/core/geom/{v3_dot.js → vec3/v3_dot.js} +0 -0
- /package/src/core/geom/{v3_length.js → vec3/v3_length.js} +0 -0
- /package/src/core/geom/{v3_length_sqr.js → vec3/v3_length_sqr.js} +0 -0
- /package/src/core/geom/{v3_slerp.js → vec3/v3_slerp.js} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { EngineHarness } from "../../../EngineHarness.js";
|
|
2
2
|
import { ImpostorBaker } from "./ImpostorBaker.js";
|
|
3
3
|
import { ShadedGeometry } from "../../ecs/mesh-v2/ShadedGeometry.js";
|
|
4
|
-
import
|
|
4
|
+
import Entity from "../../../ecs/Entity.js";
|
|
5
5
|
import ViewportPosition from "../../../ecs/gui/position/ViewportPosition.js";
|
|
6
6
|
import GUIElement from "../../../ecs/gui/GUIElement.js";
|
|
7
7
|
import GUIElementSystem from "../../../ecs/gui/GUIElementSystem.js";
|
|
@@ -79,7 +79,7 @@ async function main(engine) {
|
|
|
79
79
|
mode: 'alpha'
|
|
80
80
|
});
|
|
81
81
|
|
|
82
|
-
new
|
|
82
|
+
new Entity()
|
|
83
83
|
.add(new ViewportPosition({
|
|
84
84
|
offset: new Vector2(0, 0)
|
|
85
85
|
}))
|
|
@@ -110,7 +110,7 @@ async function main(engine) {
|
|
|
110
110
|
sg_mesh.castShadow = false;
|
|
111
111
|
sg_mesh.receiveShadow = false;
|
|
112
112
|
|
|
113
|
-
const entity_true_mesh = new
|
|
113
|
+
const entity_true_mesh = new Entity();
|
|
114
114
|
entity_true_mesh
|
|
115
115
|
.add(sg_mesh)
|
|
116
116
|
.add(t1)
|
|
@@ -122,7 +122,7 @@ async function main(engine) {
|
|
|
122
122
|
|
|
123
123
|
/**
|
|
124
124
|
*
|
|
125
|
-
* @param {
|
|
125
|
+
* @param {Entity} entity
|
|
126
126
|
* @param {number} [speed]
|
|
127
127
|
* @param {Vector3} [axis]
|
|
128
128
|
*/
|
|
@@ -173,7 +173,7 @@ function make_impostor_wireframe(id, t = new Transform()) {
|
|
|
173
173
|
sg.clearFlag(ShadedGeometryFlags.CastShadow);
|
|
174
174
|
sg.clearFlag(ShadedGeometryFlags.ReceiveShadow);
|
|
175
175
|
|
|
176
|
-
return new
|
|
176
|
+
return new Entity()
|
|
177
177
|
.add(transform)
|
|
178
178
|
.add(sg)
|
|
179
179
|
;
|
|
@@ -183,7 +183,7 @@ function make_impostor_wireframe(id, t = new Transform()) {
|
|
|
183
183
|
*
|
|
184
184
|
* @param {ImpostorDescription} id
|
|
185
185
|
* @param {Transform} t
|
|
186
|
-
* @returns {
|
|
186
|
+
* @returns {Entity}
|
|
187
187
|
*/
|
|
188
188
|
function make_impostor_entity(id, t = new Transform()) {
|
|
189
189
|
|
|
@@ -201,7 +201,7 @@ function make_impostor_entity(id, t = new Transform()) {
|
|
|
201
201
|
sg.clearFlag(ShadedGeometryFlags.CastShadow);
|
|
202
202
|
sg.clearFlag(ShadedGeometryFlags.ReceiveShadow);
|
|
203
203
|
|
|
204
|
-
return new
|
|
204
|
+
return new Entity()
|
|
205
205
|
.add(transform)
|
|
206
206
|
.add(sg)
|
|
207
207
|
;
|
|
@@ -8,10 +8,10 @@ import { MouseEvents } from "../../../../input/devices/events/MouseEvents.js";
|
|
|
8
8
|
import InterfaceCommand from "../../../../../view/interaction/InterfaceCommand.js";
|
|
9
9
|
import { InteractionCommand } from "../../../../../view/interaction/InteractionCommand.js";
|
|
10
10
|
import { serializeNodeGraphToJSON } from "../../../../../core/model/node-graph/json/serializeNodeGraphToJSON.js";
|
|
11
|
-
import { downloadAsFile } from "../../../../../core/binary/ByteArrayTools.js";
|
|
12
11
|
import {
|
|
13
12
|
deserializeNodeGraphFromJSON
|
|
14
13
|
} from "../../../../../core/model/node-graph/json/deserializeNodeGraphFromJSON.js";
|
|
14
|
+
import {downloadAsFile} from "../../../../../core/binary/downloadAsFile.js";
|
|
15
15
|
|
|
16
16
|
export class ParticleSpecificationEditorView extends View {
|
|
17
17
|
constructor() {
|
|
@@ -3,7 +3,7 @@ import List from "../../../../../../core/collection/list/List.js";
|
|
|
3
3
|
import { lerp } from "../../../../../../core/math/lerp.js";
|
|
4
4
|
import { max2 } from "../../../../../../core/math/max2.js";
|
|
5
5
|
import { min2 } from "../../../../../../core/math/min2.js";
|
|
6
|
-
import { Box3, BufferGeometry, Frustum,
|
|
6
|
+
import { Box3, BufferGeometry, Frustum, Points, PointsMaterial } from 'three';
|
|
7
7
|
import { ParticlePool } from "./ParticlePool.js";
|
|
8
8
|
import { ParticleParameter } from "../parameter/ParticleParameter.js";
|
|
9
9
|
import { ParameterSet } from "../parameter/ParameterSet.js";
|
|
@@ -28,13 +28,13 @@ import {
|
|
|
28
28
|
PARTICLE_ATTRIBUTE_UV,
|
|
29
29
|
PARTICLE_ATTRIBUTE_VELOCITY
|
|
30
30
|
} from "./PARTICLE_ATTRIBUTES.js";
|
|
31
|
-
import { composeMatrix4 } from "../../../../util/composeMatrix4.js";
|
|
32
31
|
import { update_parameters } from "../simulator/update_parameters.js";
|
|
33
|
-
import { distance_to_camera } from "./distance_to_camera.js";
|
|
34
32
|
import { computeEmissionFunction } from "./computeEmissionFunction.js";
|
|
35
33
|
import { PARTICULAR_PARTICLE_SPECIFICATION } from "./PARTICULAR_PARTICLE_SPECIFICATION.js";
|
|
36
34
|
import { computeHashIntegerArray } from "../../../../../../core/collection/array/computeHashIntegerArray.js";
|
|
37
35
|
import { frustum_from_camera } from "../../../../ecs/camera/frustum_from_camera.js";
|
|
36
|
+
import { v3_dot_array_array } from "../../../../../../core/geom/vec3/v3_dot_array_array.js";
|
|
37
|
+
import { compose_matrix4_array } from "../../../../../../core/geom/3d/compose_matrix4_array.js";
|
|
38
38
|
|
|
39
39
|
const EMPTY_GEOMETRY = new BufferGeometry();
|
|
40
40
|
|
|
@@ -53,6 +53,8 @@ const SERIALIZABLE_FLAGS = ParticleEmitterFlag.PreWarm
|
|
|
53
53
|
*/
|
|
54
54
|
const corners = new Float64Array(24);
|
|
55
55
|
|
|
56
|
+
const scratch_near_plane_normal = new Float32Array(3);
|
|
57
|
+
|
|
56
58
|
/**
|
|
57
59
|
*
|
|
58
60
|
* @type {number[]}
|
|
@@ -81,16 +83,16 @@ function generateStandardParameterSet(parameters) {
|
|
|
81
83
|
}
|
|
82
84
|
|
|
83
85
|
|
|
84
|
-
const
|
|
86
|
+
const UINT16_MAX = 65535; // = 2^16 - 1
|
|
85
87
|
|
|
86
88
|
/**
|
|
87
89
|
*
|
|
88
|
-
* @param {AtlasPatch}
|
|
90
|
+
* @param {AtlasPatch} patch
|
|
89
91
|
* @param {ParticlePool} particles
|
|
90
92
|
* @param {number} ref
|
|
91
93
|
*/
|
|
92
|
-
function write_particle_patch_uv(
|
|
93
|
-
const uv =
|
|
94
|
+
function write_particle_patch_uv(patch, particles, ref) {
|
|
95
|
+
const uv = patch.uv;
|
|
94
96
|
|
|
95
97
|
const uv_position = uv.position;
|
|
96
98
|
|
|
@@ -105,96 +107,101 @@ function write_particle_patch_uv(atlasPatch, particles, ref) {
|
|
|
105
107
|
particles.writeAttributeVector4(
|
|
106
108
|
ref,
|
|
107
109
|
PARTICLE_ATTRIBUTE_UV,
|
|
108
|
-
u0 *
|
|
110
|
+
u0 * UINT16_MAX, v0 * UINT16_MAX, u1 * UINT16_MAX, v1 * UINT16_MAX
|
|
109
111
|
);
|
|
110
112
|
}
|
|
111
113
|
|
|
112
114
|
export class ParticleEmitter {
|
|
113
|
-
constructor() {
|
|
114
|
-
/**
|
|
115
|
-
* @type {ParameterSet}
|
|
116
|
-
*/
|
|
117
|
-
this.parameters = new ParameterSet();
|
|
118
|
-
generateStandardParameterSet(this.parameters);
|
|
119
115
|
|
|
116
|
+
/**
|
|
117
|
+
* @private
|
|
118
|
+
* @type {List<ParticleLayer>}
|
|
119
|
+
*/
|
|
120
|
+
layers = new List();
|
|
120
121
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
122
|
+
/**
|
|
123
|
+
*
|
|
124
|
+
* @type {Vector3}
|
|
125
|
+
*/
|
|
126
|
+
position = new Vector3(0, 0, 0);
|
|
127
|
+
scale = new Vector3(1, 1, 1);
|
|
128
|
+
rotation = new Quaternion(0, 0, 0, 1);
|
|
126
129
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
this.rotation = new Quaternion(0, 0, 0, 1);
|
|
130
|
+
/**
|
|
131
|
+
*
|
|
132
|
+
* @type {Vector3}
|
|
133
|
+
* @private
|
|
134
|
+
*/
|
|
135
|
+
__lastSpawnPosition = new Vector3(0, 0, 0);
|
|
134
136
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
137
|
+
/**
|
|
138
|
+
* How long has this emitter been sleeping for?
|
|
139
|
+
* This amount of time needs to be simulated when we wake the emitter up, but we can typically do it in a small number of large steps
|
|
140
|
+
* @type {number}
|
|
141
|
+
*/
|
|
142
|
+
sleepTime = 0;
|
|
141
143
|
|
|
142
|
-
|
|
144
|
+
/**
|
|
145
|
+
*
|
|
146
|
+
* @type {BlendingType|number}
|
|
147
|
+
*/
|
|
148
|
+
blendingMode = BlendingType.Normal;
|
|
143
149
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
150
|
+
/**
|
|
151
|
+
*
|
|
152
|
+
* @type {ParticlePool|null}
|
|
153
|
+
*/
|
|
154
|
+
particles = null;
|
|
149
155
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
156
|
+
/**
|
|
157
|
+
*
|
|
158
|
+
* @type {Object3D|null}
|
|
159
|
+
*/
|
|
160
|
+
mesh = null;
|
|
155
161
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
162
|
+
/**
|
|
163
|
+
*
|
|
164
|
+
* @type {LeafNode}
|
|
165
|
+
*/
|
|
166
|
+
bvhLeaf = new LeafNode(this, 0, 0, 0, 0, 0, 0);
|
|
161
167
|
|
|
168
|
+
/**
|
|
169
|
+
*
|
|
170
|
+
* @type {AABB3}
|
|
171
|
+
*/
|
|
172
|
+
particleBounds = new AABB3(Infinity, Infinity, Infinity, -Infinity, -Infinity, -Infinity);
|
|
162
173
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
174
|
+
/**
|
|
175
|
+
*
|
|
176
|
+
* @type {AABB3}
|
|
177
|
+
*/
|
|
178
|
+
emissionBounds = new AABB3(0, 0, 0, 0, 0, 0);
|
|
168
179
|
|
|
169
180
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
181
|
+
/**
|
|
182
|
+
* Bit Field of {@link ParticleEmitterFlag}
|
|
183
|
+
* @type {number}
|
|
184
|
+
*/
|
|
185
|
+
flags = ParticleEmitterFlag.DepthSorting | ParticleEmitterFlag.HashNeedUpdate | ParticleEmitterFlag.Emitting;
|
|
175
186
|
|
|
187
|
+
/**
|
|
188
|
+
*
|
|
189
|
+
* @type {number}
|
|
190
|
+
* @private
|
|
191
|
+
*/
|
|
192
|
+
__hash = 0;
|
|
193
|
+
|
|
194
|
+
constructor() {
|
|
176
195
|
/**
|
|
177
|
-
*
|
|
178
|
-
* @type {AABB3}
|
|
196
|
+
* @type {ParameterSet}
|
|
179
197
|
*/
|
|
180
|
-
this.
|
|
198
|
+
this.parameters = new ParameterSet();
|
|
199
|
+
generateStandardParameterSet(this.parameters);
|
|
200
|
+
|
|
181
201
|
|
|
182
202
|
this.position.onChanged.add(this.updateTransform, this);
|
|
183
203
|
this.scale.onChanged.add(this.updateTransform, this);
|
|
184
204
|
this.rotation.onChanged.add(this.updateTransform, this);
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* Bit Field of {@link ParticleEmitterFlag}
|
|
188
|
-
* @type {number}
|
|
189
|
-
*/
|
|
190
|
-
this.flags = ParticleEmitterFlag.DepthSorting | ParticleEmitterFlag.HashNeedUpdate | ParticleEmitterFlag.Emitting;
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
*
|
|
194
|
-
* @type {number}
|
|
195
|
-
* @private
|
|
196
|
-
*/
|
|
197
|
-
this.__hash = 0;
|
|
198
205
|
}
|
|
199
206
|
|
|
200
207
|
updateTransform() {
|
|
@@ -442,9 +449,7 @@ export class ParticleEmitter {
|
|
|
442
449
|
const rotation = this.rotation;
|
|
443
450
|
const scale = this.scale;
|
|
444
451
|
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
const m4 = matrix4.elements;
|
|
452
|
+
compose_matrix4_array(matrix4, position, rotation, scale);
|
|
448
453
|
|
|
449
454
|
for (let i = 0; i < numLayers; i++) {
|
|
450
455
|
const particleLayer = layers.get(i);
|
|
@@ -463,9 +468,9 @@ export class ParticleEmitter {
|
|
|
463
468
|
const z = corners[j + 2];
|
|
464
469
|
|
|
465
470
|
//apply matrix transform
|
|
466
|
-
const _x =
|
|
467
|
-
const _y =
|
|
468
|
-
const _z =
|
|
471
|
+
const _x = matrix4[0] * x + matrix4[4] * y + matrix4[8] * z + matrix4[12];
|
|
472
|
+
const _y = matrix4[1] * x + matrix4[5] * y + matrix4[9] * z + matrix4[13];
|
|
473
|
+
const _z = matrix4[2] * x + matrix4[6] * y + matrix4[10] * z + matrix4[14];
|
|
469
474
|
|
|
470
475
|
|
|
471
476
|
//update bounds
|
|
@@ -479,7 +484,7 @@ export class ParticleEmitter {
|
|
|
479
484
|
}
|
|
480
485
|
}
|
|
481
486
|
|
|
482
|
-
this.
|
|
487
|
+
this.emissionBounds.setBounds(
|
|
483
488
|
bounds_x0, bounds_y0, bounds_z0,
|
|
484
489
|
bounds_x1, bounds_y1, bounds_z1
|
|
485
490
|
);
|
|
@@ -534,7 +539,7 @@ export class ParticleEmitter {
|
|
|
534
539
|
this.computeParticleBounds();
|
|
535
540
|
}
|
|
536
541
|
|
|
537
|
-
const ebb = this.
|
|
542
|
+
const ebb = this.emissionBounds;
|
|
538
543
|
const pbb = this.particleBounds;
|
|
539
544
|
|
|
540
545
|
const bounds_x0 = min2(ebb.x0, pbb.x0);
|
|
@@ -732,6 +737,7 @@ export class ParticleEmitter {
|
|
|
732
737
|
assert.notNull(camera, 'camera');
|
|
733
738
|
|
|
734
739
|
//sort particles by distance from camera to ensure proper rendering order
|
|
740
|
+
// NOTE we don't use full distance calculation, but DOT product instead, as the final component is always the same and we only care about relative distance for comparison
|
|
735
741
|
|
|
736
742
|
/**
|
|
737
743
|
*
|
|
@@ -748,10 +754,11 @@ export class ParticleEmitter {
|
|
|
748
754
|
frustum_from_camera(camera, frustum);
|
|
749
755
|
const nearPlane = frustum.planes[0];
|
|
750
756
|
const nearPlaneNormal = nearPlane.normal;
|
|
757
|
+
nearPlaneNormal.toArray(scratch_near_plane_normal);
|
|
751
758
|
|
|
752
759
|
//Bind attribute array directly for faster access
|
|
753
760
|
const positionAttribute = particles.attributes[PARTICLE_ATTRIBUTE_POSITION];
|
|
754
|
-
const
|
|
761
|
+
const position_array = positionAttribute.array;
|
|
755
762
|
|
|
756
763
|
|
|
757
764
|
if (particleCount <= 1) {
|
|
@@ -777,18 +784,18 @@ export class ParticleEmitter {
|
|
|
777
784
|
i = left;
|
|
778
785
|
j = right;
|
|
779
786
|
|
|
780
|
-
const
|
|
787
|
+
const pivot_index = (left + right) >> 1;
|
|
781
788
|
|
|
782
|
-
const pivot =
|
|
789
|
+
const pivot = v3_dot_array_array(position_array, pivot_index * 3, scratch_near_plane_normal, 0);
|
|
783
790
|
|
|
784
791
|
/* partition */
|
|
785
792
|
while (i <= j) {
|
|
786
793
|
|
|
787
|
-
while (
|
|
794
|
+
while (v3_dot_array_array(position_array, i * 3, scratch_near_plane_normal, 0) > pivot) {
|
|
788
795
|
i++;
|
|
789
796
|
}
|
|
790
797
|
|
|
791
|
-
while (
|
|
798
|
+
while (v3_dot_array_array(position_array, j * 3, scratch_near_plane_normal, 0) < pivot) {
|
|
792
799
|
j--;
|
|
793
800
|
}
|
|
794
801
|
|
|
@@ -912,7 +919,7 @@ export class ParticleEmitter {
|
|
|
912
919
|
const emitter_position = this.position;
|
|
913
920
|
const last_spawn_position = this.__lastSpawnPosition;
|
|
914
921
|
|
|
915
|
-
|
|
922
|
+
compose_matrix4_array(matrix4, emitter_position, this.rotation, this.scale);
|
|
916
923
|
|
|
917
924
|
let time = -layer.timeSinceLastEmission;
|
|
918
925
|
|
|
@@ -935,13 +942,13 @@ export class ParticleEmitter {
|
|
|
935
942
|
|
|
936
943
|
if (this.getFlag(ParticleEmitterFlag.PositionChanged)) {
|
|
937
944
|
//compute position in between
|
|
938
|
-
matrix4
|
|
939
|
-
matrix4
|
|
940
|
-
matrix4
|
|
945
|
+
matrix4[12] = lerp(emitter_position.x, last_spawn_position.x, f);
|
|
946
|
+
matrix4[13] = lerp(emitter_position.y, last_spawn_position.y, f);
|
|
947
|
+
matrix4[14] = lerp(emitter_position.z, last_spawn_position.z, f);
|
|
941
948
|
}
|
|
942
949
|
|
|
943
950
|
//apply emitter transform
|
|
944
|
-
v3position.
|
|
951
|
+
v3position.applyMatrix4(matrix4);
|
|
945
952
|
|
|
946
953
|
|
|
947
954
|
//randomize initial age across time delta
|
|
@@ -1032,7 +1039,7 @@ export class ParticleEmitter {
|
|
|
1032
1039
|
const emissionFunction = computeEmissionFunction(layer.emissionFrom, layer.emissionShape);
|
|
1033
1040
|
|
|
1034
1041
|
//compute transform matrix of the emitter
|
|
1035
|
-
|
|
1042
|
+
compose_matrix4_array(matrix4, this.position, this.rotation, this.scale);
|
|
1036
1043
|
|
|
1037
1044
|
//pre-grow particle pool
|
|
1038
1045
|
particles.growCapacity(particles.capacity + count);
|
|
@@ -1052,7 +1059,7 @@ export class ParticleEmitter {
|
|
|
1052
1059
|
v3position.add(layer.position);
|
|
1053
1060
|
|
|
1054
1061
|
//apply emitter transform
|
|
1055
|
-
v3position.
|
|
1062
|
+
v3position.applyMatrix4(matrix4);
|
|
1056
1063
|
|
|
1057
1064
|
|
|
1058
1065
|
//randomize initial age across time delta
|
|
@@ -1212,7 +1219,7 @@ ParticleEmitter.Attributes = {
|
|
|
1212
1219
|
ParticleEmitter.SERIALIZABLE_FLAGS = SERIALIZABLE_FLAGS;
|
|
1213
1220
|
|
|
1214
1221
|
|
|
1215
|
-
const matrix4 = new
|
|
1222
|
+
const matrix4 = new Float32Array(16);
|
|
1216
1223
|
|
|
1217
1224
|
const defaultPointsMaterial = new PointsMaterial({ color: 0xFFFFFF });
|
|
1218
1225
|
|
|
@@ -73,3 +73,28 @@ test('BinaryBuffer serialization consistency', () => {
|
|
|
73
73
|
expect(actual.particleVelocityDirection.roughlyEquals(expected.particleVelocityDirection)).toBe(true);
|
|
74
74
|
expect(actual.particleSpeed.equals(expected.particleSpeed)).toBe(true);
|
|
75
75
|
});
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
test("hash - basics", () => {
|
|
79
|
+
const layer = new ParticleLayer();
|
|
80
|
+
|
|
81
|
+
const hash = layer.hash();
|
|
82
|
+
|
|
83
|
+
expect(layer.hash()).toEqual(hash); // consistency
|
|
84
|
+
expect(typeof hash).toBe("number");
|
|
85
|
+
expect(Number.isInteger(hash)).toBe(true);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
test("equals - basics", () => {
|
|
89
|
+
const a = new ParticleLayer();
|
|
90
|
+
|
|
91
|
+
expect(a.equals(a)).toBe(true);
|
|
92
|
+
|
|
93
|
+
const b = new ParticleLayer();
|
|
94
|
+
|
|
95
|
+
expect(a.equals(b)).toBe(true);
|
|
96
|
+
|
|
97
|
+
b.emissionRate++;
|
|
98
|
+
|
|
99
|
+
expect(a.equals(b)).toBe(false);
|
|
100
|
+
});
|
|
@@ -231,41 +231,6 @@ export class ParticlePool {
|
|
|
231
231
|
}
|
|
232
232
|
}
|
|
233
233
|
|
|
234
|
-
/**
|
|
235
|
-
*
|
|
236
|
-
* @param {AttributeSpec} spec
|
|
237
|
-
* @return {number}
|
|
238
|
-
* @private
|
|
239
|
-
*/
|
|
240
|
-
__compute_attribute_byte_size(spec) {
|
|
241
|
-
|
|
242
|
-
const item_size = spec.itemSize;
|
|
243
|
-
|
|
244
|
-
const TypedArrayConstructor = compute_typed_array_constructor_from_data_type(spec.type);
|
|
245
|
-
|
|
246
|
-
const element_byte_size = TypedArrayConstructor.BYTES_PER_ELEMENT;
|
|
247
|
-
|
|
248
|
-
return item_size * element_byte_size * this.capacity;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
*
|
|
253
|
-
* @return {number}
|
|
254
|
-
* @private
|
|
255
|
-
*/
|
|
256
|
-
__compute_attribute_byte_size_total() {
|
|
257
|
-
|
|
258
|
-
const spec_attributes = this.spec.attributes;
|
|
259
|
-
const l = spec_attributes.length;
|
|
260
|
-
|
|
261
|
-
let r = 0;
|
|
262
|
-
for (let i = 0; i < l; i++) {
|
|
263
|
-
r += this.__compute_attribute_byte_size(spec_attributes[i]);
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
return r;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
234
|
build() {
|
|
270
235
|
const geometry = new BufferGeometry();
|
|
271
236
|
geometry.dynamic = true;
|
|
@@ -10,8 +10,8 @@ import { AttributeSpec } from "../../../../geometry/AttributeSpec.js";
|
|
|
10
10
|
function samplePool() {
|
|
11
11
|
const specification = new VertexDataSpec();
|
|
12
12
|
|
|
13
|
-
specification.add(AttributeSpec.fromJSON({name:'a', type:BinaryDataType.Float32, itemSize:1}));
|
|
14
|
-
specification.add(AttributeSpec.fromJSON({name:'b', type:BinaryDataType.Float32, itemSize:4}));
|
|
13
|
+
specification.add(AttributeSpec.fromJSON({ name: 'a', type: BinaryDataType.Float32, itemSize: 1 }));
|
|
14
|
+
specification.add(AttributeSpec.fromJSON({ name: 'b', type: BinaryDataType.Float32, itemSize: 4 }));
|
|
15
15
|
|
|
16
16
|
const pool = new ParticlePool(specification);
|
|
17
17
|
|
|
@@ -186,3 +186,40 @@ test('read/write scalar attribute', () => {
|
|
|
186
186
|
|
|
187
187
|
expect(pool.readAttributeScalar(1, 0)).toBe(42);
|
|
188
188
|
});
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
test("update on empty pool", () => {
|
|
192
|
+
|
|
193
|
+
const pool = samplePool();
|
|
194
|
+
|
|
195
|
+
expect(pool.size()).toBe(0);
|
|
196
|
+
|
|
197
|
+
pool.update();
|
|
198
|
+
|
|
199
|
+
expect(pool.size()).toBe(0);
|
|
200
|
+
|
|
201
|
+
pool.update();
|
|
202
|
+
|
|
203
|
+
expect(pool.size()).toBe(0);
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
test("swap", () => {
|
|
207
|
+
|
|
208
|
+
const pool = samplePool();
|
|
209
|
+
|
|
210
|
+
populatePool(pool, 2);
|
|
211
|
+
|
|
212
|
+
pool.writeAttributeScalar(0, 0, 17);
|
|
213
|
+
pool.writeAttributeScalar(1, 0, 23);
|
|
214
|
+
|
|
215
|
+
pool.swap(0, 1);
|
|
216
|
+
|
|
217
|
+
expect(pool.readAttributeScalar(0, 0)).toBe(23);
|
|
218
|
+
expect(pool.readAttributeScalar(1, 0)).toBe(17);
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
test("calling dispose on newly created instance should not throw", () => {
|
|
222
|
+
const pool = samplePool();
|
|
223
|
+
|
|
224
|
+
pool.dispose();
|
|
225
|
+
});
|
|
@@ -7,7 +7,7 @@ import { writeSample2DDataToDataTexture } from "../../../../../texture/sampler/w
|
|
|
7
7
|
import { ImageRGBADataLoader } from "../../../../../../asset/loaders/image/ImageRGBADataLoader.js";
|
|
8
8
|
import { EngineConfiguration } from "../../../../../../EngineConfiguration.js";
|
|
9
9
|
import { MeshSystem } from "../../../../../ecs/mesh/MeshSystem.js";
|
|
10
|
-
import
|
|
10
|
+
import Entity from "../../../../../../ecs/Entity.js";
|
|
11
11
|
import { Transform } from "../../../../../../ecs/transform/Transform.js";
|
|
12
12
|
import Mesh from "../../../../../ecs/mesh/Mesh.js";
|
|
13
13
|
import Vector3 from "../../../../../../../core/geom/Vector3.js";
|
|
@@ -155,7 +155,7 @@ async function main(engine) {
|
|
|
155
155
|
});
|
|
156
156
|
|
|
157
157
|
|
|
158
|
-
new
|
|
158
|
+
new Entity()
|
|
159
159
|
.add(Mesh.fromJSON({ url: 'data/models/Jauntmessina/Red_Robot/gltf/Model.gltf' }))
|
|
160
160
|
.add(new Transform())
|
|
161
161
|
.build(ecd)
|
|
@@ -88,6 +88,12 @@ function buildDataTexture(
|
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
export class ShaderManager {
|
|
91
|
+
/**
|
|
92
|
+
*
|
|
93
|
+
* @type {Map<ParticleLayer, Reference<AtlasPatch>>}
|
|
94
|
+
*/
|
|
95
|
+
#sprite_references = new Map();
|
|
96
|
+
|
|
91
97
|
/**
|
|
92
98
|
*
|
|
93
99
|
* @param {AssetManager} assetManager
|
|
@@ -107,7 +113,6 @@ export class ShaderManager {
|
|
|
107
113
|
* @type {ManagedAtlas}
|
|
108
114
|
*/
|
|
109
115
|
this.spriteAtlas = new ManagedAtlas(assetManager);
|
|
110
|
-
this.spriteAtlas.autoUpdate = false;
|
|
111
116
|
|
|
112
117
|
/**
|
|
113
118
|
*
|
|
@@ -275,9 +280,12 @@ export class ShaderManager {
|
|
|
275
280
|
|
|
276
281
|
const patchPromise = spriteAtlas.acquire(layer.imageURL);
|
|
277
282
|
|
|
278
|
-
patchPromise.then(
|
|
279
|
-
|
|
280
|
-
|
|
283
|
+
patchPromise.then(ref => {
|
|
284
|
+
this.#sprite_references.set(layer, ref);
|
|
285
|
+
layer.setAtlasPatch(ref.getValue());
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
patchPromise.catch((e) => {
|
|
281
289
|
console.warn(`Failed to load sprite '${layer.imageURL}':`, e);
|
|
282
290
|
});
|
|
283
291
|
}
|
|
@@ -349,7 +357,7 @@ export class ShaderManager {
|
|
|
349
357
|
const entry = this.materialMap.get(emitter);
|
|
350
358
|
|
|
351
359
|
if (entry === undefined) {
|
|
352
|
-
console.error(`Attempted to
|
|
360
|
+
console.error(`Attempted to deregister emitter that was not registered (not found in materialMap). Request ignored.`, emitter);
|
|
353
361
|
return;
|
|
354
362
|
}
|
|
355
363
|
|
|
@@ -363,7 +371,15 @@ export class ShaderManager {
|
|
|
363
371
|
const layer_count = particle_layers.length;
|
|
364
372
|
for (let i = 0; i < layer_count; i++) {
|
|
365
373
|
const layer = particle_layers.get(i);
|
|
366
|
-
|
|
374
|
+
|
|
375
|
+
// TODO deal with the case where we remove the layer before sprite is loaded
|
|
376
|
+
const ref = this.#sprite_references.get(layer);
|
|
377
|
+
|
|
378
|
+
if (ref !== undefined) {
|
|
379
|
+
ref.release();
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
layer.setAtlasPatch(null); // clear patch
|
|
367
383
|
}
|
|
368
384
|
|
|
369
385
|
if (entry.count <= 0) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import Entity from "../../../../../../ecs/Entity";
|
|
2
2
|
import {AbstractShape3D} from "../../../../../../../core/geom/3d/shape/AbstractShape3D";
|
|
3
3
|
import {AttributeValue} from "./AttributeValue";
|
|
4
4
|
import {SamplingFunctionKind} from "./SamplingFunctionKind";
|
|
@@ -17,7 +17,7 @@ interface Attributes {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
export class ParticleVolume {
|
|
20
|
-
readonly entity:
|
|
20
|
+
readonly entity: Entity
|
|
21
21
|
|
|
22
22
|
from(args?: Args): void
|
|
23
23
|
|