@woosh/meep-engine 2.37.18 → 2.38.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/core/assert.js +1 -1
- package/core/binary/float2uint8.js +8 -0
- package/core/binary/uint82float.js +8 -0
- package/core/bvh2/bvh3/ExplicitBinaryBoundingVolumeHierarchy.js +6 -4
- package/core/collection/array/array_get_index_in_range.js +16 -0
- package/core/collection/array/typed/isTypedArray.js +20 -0
- package/core/collection/array/typedArrayToDataType.js +1 -0
- package/{engine/navigation/grid → core/collection/heap}/BinaryHeap.js +6 -1
- package/{engine/navigation/grid → core/collection/heap}/FastBinaryHeap.js +3 -2
- package/{engine/navigation/grid → core/collection/heap}/FastBinaryHeap.spec.js +3 -3
- package/core/collection/heap/Uin32Heap.spec.js +59 -0
- package/core/collection/heap/Uint32Heap.js +385 -0
- package/core/collection/list/List.d.ts +1 -1
- package/core/collection/table/RowFirstTable.js +34 -0
- package/core/collection/table/RowFirstTable.spec.js +59 -1
- package/core/color/Color.js +83 -1
- package/core/color/YCbCr_to_rgb_uint24.js +3 -4
- package/core/color/hsv2rgb.js +4 -3
- package/core/color/linear_to_sRGB.js +4 -5
- package/core/color/rgb2hex.js +1 -1
- package/core/color/rgb2uint24.js +6 -4
- package/core/color/rgb_to_YCbCr_uint24.js +11 -13
- package/core/events/signal/Signal.d.ts +11 -9
- package/core/events/signal/Signal.spec.js +16 -0
- package/core/geom/2d/quad-tree/qt_collect_by_circle.js +67 -0
- package/core/geom/3d/topology/computeTopoMeshVertexDuplicates.js +9 -6
- package/core/geom/3d/topology/expandConnectivityByLocality.js +5 -5
- package/core/geom/3d/topology/query/query_edge_is_boundary.js +7 -0
- package/core/geom/3d/topology/query/query_edge_is_manifold.js +13 -0
- package/core/geom/3d/topology/query/query_edge_is_manifold_or_boundary.js +11 -0
- package/core/geom/3d/topology/query/query_edge_is_wire.js +13 -0
- package/core/geom/3d/topology/query/query_edge_other_vertex.js +20 -0
- package/core/geom/3d/topology/query/query_edge_share_vert.js +9 -0
- package/core/geom/3d/topology/query/query_face_get_other_edges.js +39 -0
- package/core/geom/3d/topology/query/query_face_next_vertex.js +19 -0
- package/core/geom/3d/topology/query/query_face_prev_vertex.js +18 -0
- package/core/geom/3d/topology/query/query_vertex_in_edge.js +14 -0
- package/core/geom/3d/topology/query/query_vertex_pair_share_face.js +24 -0
- package/core/geom/3d/topology/query/query_vertices_in_edge.js +19 -0
- package/core/geom/3d/topology/simplify/collapseEdge.spec.js +3 -5
- package/core/geom/3d/topology/simplify/collapse_all_degenerate_edges.js +8 -10
- package/core/geom/3d/topology/simplify/compute_face_normal_change_dot_product.js +12 -2
- package/core/geom/3d/topology/simplify/decimate_edge_collapse_snap.js +277 -0
- package/core/geom/3d/topology/simplify/edge_collapse_quadratic.js +126 -0
- package/core/geom/3d/topology/simplify/prototypeMeshSimplification.js +502 -0
- package/core/geom/3d/topology/simplify/quadratic/Quadratic3.js +37 -5
- package/core/geom/3d/topology/simplify/quadratic/build_vertex_quadratics.js +86 -1
- package/core/geom/3d/topology/simplify/simplifyTopoMesh.js +4 -4
- package/core/geom/3d/topology/simplify/simplifyTopoMesh2.js +119 -0
- package/core/geom/3d/topology/simplify/tm_edge_collapse_is_degenerate_flip.js +81 -0
- package/core/geom/3d/topology/{TopoEdge.js → struct/TopoEdge.js} +47 -20
- package/core/geom/3d/topology/{TopoEdge.spec.js → struct/TopoEdge.spec.js} +0 -0
- package/core/geom/3d/topology/{TopoMesh.js → struct/TopoMesh.js} +20 -41
- package/core/geom/3d/topology/{TopoTriangle.js → struct/TopoTriangle.js} +15 -25
- package/core/geom/3d/topology/{TopoVertex.js → struct/TopoVertex.js} +21 -4
- package/core/geom/3d/topology/{TopoVertex.spec.js → struct/TopoVertex.spec.js} +0 -0
- package/core/geom/3d/topology/tm_edge_kill.js +24 -0
- package/core/geom/3d/topology/tm_edge_splice.js +42 -0
- package/core/geom/3d/topology/tm_face_area.js +18 -0
- package/core/geom/3d/topology/tm_face_kill.js +12 -0
- package/core/geom/3d/topology/tm_face_normal.js +14 -0
- package/core/geom/3d/topology/tm_kill_only_edge.js +35 -0
- package/core/geom/3d/topology/tm_kill_only_face.js +12 -0
- package/core/geom/3d/topology/tm_kill_only_vert.js +14 -0
- package/core/geom/3d/topology/tm_vert_kill.js +19 -0
- package/core/geom/3d/topology/tm_vert_splice.js +64 -0
- package/core/geom/3d/topology/tm_vertex_compute_normal.js +42 -0
- package/core/geom/3d/topology/topoMeshToBufferGeometry.js +18 -4
- package/core/geom/3d/topology/weld_duplicate_vertices.js +63 -0
- package/core/geom/Quaternion.d.ts +21 -1
- package/core/geom/Quaternion.js +279 -200
- package/core/geom/Quaternion.spec.js +71 -2
- package/core/geom/Vector2.js +3 -3
- package/core/geom/Vector3.d.ts +2 -0
- package/core/geom/Vector3.js +31 -7
- package/core/geom/Vector3.schema.json +16 -0
- package/core/geom/Vector4.js +16 -0
- package/core/geom/packing/MaxRectangles.js +1 -1
- package/core/graph/cluster_mesh_metis.js +16 -0
- package/core/graph/coarsen_graph.js +1 -1
- package/core/graph/graph_k_means_cluster.js +1 -1
- package/core/json/JsonUtils.js +2 -20
- package/core/math/bell_membership_function.js +19 -0
- package/core/math/exp2.js +8 -0
- package/core/math/interval/NumericInterval.js +17 -0
- package/core/math/physics/brdf/brdf_burley.js +25 -0
- package/core/math/physics/bsdf/bsdf_schlick.js +22 -0
- package/core/math/physics/irradiance/interpolate_irradiance_linear.js +18 -0
- package/{engine/sound/ecs/emitter/attenuate/attenuateSoundLogarithmic.js → core/math/physics/irradiance/interpolate_irradiance_lograrithmic.js} +2 -2
- package/{engine/sound/ecs/emitter/attenuate/attenuateSoundSmith.js → core/math/physics/irradiance/interpolate_irradiance_smith.js} +1 -1
- package/core/math/random/seededRandom.js +2 -31
- package/core/math/random/seededRandom_Mulberry32.js +31 -0
- package/core/math/random/seededRandom_sine.js +33 -0
- package/core/model/ObservedEnum.js +8 -0
- package/editor/Editor.js +97 -1
- package/editor/actions/concrete/ModifyPatchSampler2DAction.js +118 -0
- package/editor/actions/concrete/ModifyPatchSampler2DAction.spec.js +30 -0
- package/editor/actions/concrete/PatchTerrainHeightAction.js +13 -105
- package/editor/ecs/component/FieldDescriptor.js +34 -0
- package/editor/ecs/component/FieldValueAdapter.js +20 -0
- package/editor/ecs/component/TypeEditor.js +33 -0
- package/editor/ecs/component/TypeSchema.d.ts +38 -0
- package/editor/ecs/component/createFieldEditor.js +90 -0
- package/editor/ecs/component/createObjectEditor.js +266 -60
- package/editor/ecs/component/editors/ColorEditor.js +39 -0
- package/editor/ecs/component/editors/HTMLElementEditor.js +17 -0
- package/editor/ecs/component/editors/ImagePathEditor.js +50 -0
- package/editor/ecs/component/editors/NumericIntervalEditor.js +86 -0
- package/editor/ecs/component/editors/ObservedBooleanEditor.js +13 -0
- package/editor/ecs/component/editors/ObservedEnumEditor.js +32 -0
- package/editor/ecs/component/editors/ObservedIntegerEditor.js +43 -0
- package/editor/ecs/component/editors/ObservedStringEditor.js +51 -0
- package/editor/ecs/component/editors/Sampler2DEditor.js +107 -0
- package/editor/ecs/component/editors/collection/ListEditor.js +83 -0
- package/editor/ecs/component/editors/common/BitFlagsEditor.js +80 -0
- package/editor/ecs/component/editors/common/EnumEditor.js +41 -0
- package/editor/ecs/component/editors/common/makeV3_editor.js +85 -0
- package/editor/ecs/component/editors/common/noEditor.js +9 -0
- package/editor/ecs/component/editors/ecs/GridObstacleEditor.js +17 -0
- package/editor/ecs/component/editors/ecs/MinimapMarkerEditor.js +16 -0
- package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.js +44 -0
- package/editor/ecs/component/editors/ecs/ParameterTrackEditor.js +17 -0
- package/editor/ecs/component/editors/ecs/ParticleEmitterEditor.js +58 -0
- package/editor/ecs/component/editors/ecs/ParticleEmitterLayerEditor.js +54 -0
- package/editor/ecs/component/editors/ecs/SimulationStepDefinitionEditor.js +21 -0
- package/editor/ecs/component/editors/ecs/Trail2DEditor.js +33 -0
- package/editor/ecs/component/editors/ecs/TransformEditor.js +23 -0
- package/editor/ecs/component/editors/ecs/terrain/SplatMappingEditor.js +21 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainEditor.js +89 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainLayerEditor.js +18 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainLayersEditor.js +22 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainOverlayEditor.js +20 -0
- package/editor/ecs/component/editors/geom/QuaternionEditor.js +56 -0
- package/editor/ecs/component/editors/geom/Vector1Editor.js +57 -0
- package/editor/ecs/component/editors/geom/Vector2Editor.js +11 -0
- package/editor/ecs/component/editors/geom/Vector3Editor.js +13 -0
- package/editor/ecs/component/editors/geom/Vector4Editor.js +12 -0
- package/editor/ecs/component/editors/primitive/ArrayEditor.js +46 -0
- package/editor/ecs/component/editors/primitive/BooleanEditor.js +27 -0
- package/editor/ecs/component/editors/primitive/FunctionEditor.js +29 -0
- package/editor/ecs/component/editors/primitive/NumberEditor.js +60 -0
- package/editor/ecs/component/editors/primitive/ObjectEditor.js +12 -0
- package/editor/ecs/component/editors/primitive/StringEditor.js +31 -0
- package/editor/ecs/component/editors/three/BufferGeometryEditor.js +28 -0
- package/editor/ecs/component/editors/three/MaterialEditor.js +27 -0
- package/editor/ecs/component/editors/three/MeshEditor.js +35 -0
- package/editor/ecs/component/editors/three/TextureEditor.js +32 -0
- package/editor/ecs/component/findNearestRegisteredType.js +59 -0
- package/editor/ecs/component/prototypeObjectEditor.js +379 -0
- package/editor/tools/SelectionTool.js +1 -1
- package/editor/tools/paint/TerrainHeightPaintTool.js +88 -68
- package/editor/tools/paint/TerrainPaintTool.js +2 -1
- package/editor/tools/paint/TerrainTexturePaintTool.js +8 -73
- package/editor/view/EditorView.js +1 -1
- package/editor/view/ecs/ComponentControlView.js +2 -30
- package/editor/view/ecs/EntityEditor.js +61 -139
- package/editor/view/ecs/components/GridObstacleController.js +4 -4
- package/editor/view/ecs/components/TerrainController.js +1 -1
- package/editor/view/ecs/components/common/NumberController.js +19 -7
- package/editor/view/node-graph/NodeGraphView.js +2 -2
- package/editor/view/node-graph/NodeView.js +7 -9
- package/engine/animation/keyed2/AnimationTrack.js +1 -1
- package/engine/asset/AssetManager.d.ts +1 -1
- package/engine/asset/AssetManager.js +390 -388
- package/engine/asset/loaders/gltf/extensions/MSFT_texture_dds.js +14 -2
- package/engine/ecs/components/TagEditor.js +15 -0
- package/engine/ecs/fow/FogOfWarEditor.js +13 -0
- package/engine/ecs/parent/ParentEntitySystem.js +57 -0
- package/engine/ecs/terrain/ecs/OffsetScaleTransform2D.d.ts +6 -0
- package/engine/ecs/terrain/ecs/Terrain.js +44 -43
- package/engine/ecs/terrain/ecs/TerrainSystem.js +2 -2
- package/engine/ecs/terrain/ecs/layers/TerrainLayer.js +1 -1
- package/engine/ecs/terrain/ecs/splat/SplatMapping.js +26 -28
- package/engine/ecs/terrain/overlay/TerrainOverlay.js +71 -66
- package/engine/ecs/terrain/tiles/TerrainTileManager.js +23 -0
- package/engine/ecs/terrain/util/loadVisibleTerrainTiles.js +1 -1
- package/engine/ecs/terrain/util/paintTerrainOverlayViaLookupTable.js +13 -7
- package/engine/ecs/terrain/util/tensionOptimizeUV.js +1 -1
- package/engine/ecs/transform/Transform.d.ts +2 -0
- package/engine/ecs/transform/Transform.editor.schema.json +16 -0
- package/engine/ecs/transform/Transform.js +3 -0
- package/engine/graphics/ecs/highlight/HighlightEditor.js +17 -0
- package/engine/graphics/ecs/light/Light.js +0 -47
- package/engine/graphics/ecs/light/LightSerializationAdapter.js +50 -0
- package/engine/graphics/ecs/mesh/MeshEditor.js +28 -0
- package/engine/graphics/ecs/mesh-v2/DrawMode.js +2 -1
- package/engine/graphics/ecs/mesh-v2/aggregate/prototypeSGMesh.js +3 -3
- package/engine/graphics/ecs/mesh-v2/build_three_object.js +3 -1
- package/engine/graphics/ecs/mesh-v2/sg_compute_hierarchy_bounding_box_by_parent_entity.js +31 -0
- package/engine/graphics/ecs/mesh-v2/sg_hierarchy_compute_bounding_box_via_parent_entity.d.ts +4 -0
- package/engine/graphics/ecs/sprite/Sprite.js +11 -0
- package/engine/graphics/ecs/sprite/SpriteSystemPE.js +133 -0
- package/engine/graphics/ecs/sprite/prototypeSpriteSystem.js +1570 -0
- package/engine/graphics/micron/build/PatchRepresentation.js +7 -3
- package/engine/graphics/micron/build/buildMicronGeometryFromBufferGeometry.js +18 -8
- package/engine/graphics/micron/build/clustering/build_clustering_2.js +1 -1
- package/engine/graphics/micron/build/clustering/build_leaf_patches.js +2 -2
- package/engine/graphics/micron/build/clustering/build_leaf_patches_metis.js +1 -1
- package/engine/graphics/micron/build/hierarchy/buildAbstractPatchHierarchy.js +21 -3
- package/engine/graphics/micron/build/hierarchy/merge_patches.js +96 -43
- package/engine/graphics/micron/build/hierarchy/qvdr_build_simplified_clusters.js +11 -5
- package/engine/graphics/micron/format/VirtualGeometry.js +46 -3
- package/engine/graphics/micron/format/micron_build_proxy_geometry.js +4 -2
- package/engine/graphics/micron/prototypeVirtualGeometry.js +47 -10
- package/engine/graphics/micron/render/instanced/shader/shader_rewrite_standard.js +17 -17
- package/engine/graphics/micron/render/refinement/get_geometry_patch_cut.js +15 -3
- package/engine/graphics/micron/simplifyGeometry.js +1 -1
- package/engine/graphics/particles/particular/engine/ParticularEngine.js +5 -0
- package/engine/graphics/particles/particular/engine/emitter/ParticleLayer.js +17 -9
- package/engine/graphics/particles/particular/engine/renderers/ParticleRenderer.js +12 -10
- package/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.js +7 -2
- package/engine/graphics/particles/particular/engine/renderers/billboard/SoftBillboardParticlePool.js +27 -0
- package/engine/graphics/particles/particular/engine/renderers/billboard/SoftBillboardParticleRenderer.js +80 -0
- package/engine/graphics/particles/particular/engine/shader/ShaderManager.js +16 -4
- package/engine/graphics/shaders/TerrainShader.js +8 -8
- package/engine/graphics/texture/atlas/TextureAtlasDebugger.js +2 -1
- package/engine/graphics/texture/sampler/Sampler2D.js +206 -201
- package/engine/graphics/texture/sampler/Sampler2D.spec.js +34 -35
- package/engine/graphics/texture/sampler/bicubic.js +59 -0
- package/engine/graphics/texture/sampler/downsampleSample2D.spec.js +2 -2
- package/engine/graphics/texture/sampler/genericResampleSampler2D.js +0 -2
- package/engine/graphics/texture/sampler/prototypeSamplerFiltering.js +146 -0
- package/engine/graphics/texture/sampler/{downsampleSampler2D.js → sampler2D_scale_down_linear.js} +8 -4
- package/engine/graphics/texture/sampler/sampler2_d_scale_down_lanczos.js +140 -0
- package/engine/graphics/texture/sampler/scaleSampler2D.js +3 -3
- package/engine/graphics/texture/sampler/writeSampler2DDataToDataTexture.js +1 -1
- package/engine/graphics/util/ScaleObject3ToBox.js +14 -1
- package/engine/graphics/util/makeMeshPreviewScene.js +2 -1
- package/engine/grid/components/GridObstacle.js +0 -44
- package/engine/grid/components/GridObstacleSerializationAdapter.js +46 -0
- package/engine/input/devices/PointerDevice.d.ts +1 -1
- package/engine/input/devices/PointerDevice.js +17 -2
- package/engine/input/ecs/util/TerrainCameraTargetSampler.js +2 -2
- package/engine/navigation/ecs/components/Path.d.ts +2 -0
- package/engine/navigation/ecs/components/Path.js +6 -1
- package/engine/navigation/ecs/components/computeNonuniformCatmullRomSplineSample.js +117 -0
- package/engine/navigation/grid/AStar.js +1 -1
- package/engine/navigation/grid/GridField.js +3 -2
- package/engine/platform/GetURLHash.js +27 -0
- package/engine/platform/WebEnginePlatform.js +1 -22
- package/engine/sound/ecs/emitter/SoundEmitter.js +10 -6
- package/engine/ui/DraggableAspect.js +2 -2
- package/generation/GridGenerator.js +7 -6
- package/generation/example/SampleGenerator0.js +39 -35
- package/generation/example/filters/SampleGroundMoistureFilter.js +58 -17
- package/generation/example/generators/interactive/mir_generator_place_buff_objects.js +7 -6
- package/generation/example/generators/mir_generator_place_bases.js +7 -3
- package/generation/example/generators/mir_generator_place_road_decorators.js +3 -3
- package/generation/example/generators/mir_generator_place_starting_point.js +3 -2
- package/generation/example/themes/SampleTheme0.js +11 -7
- package/generation/filtering/numeric/CellFilterLiteralFloat.js +5 -0
- package/generation/filtering/numeric/complex/CellFilterDilate.js +36 -0
- package/generation/filtering/numeric/complex/CellFilterGaussianBlur.js +15 -5
- package/generation/filtering/numeric/complex/CellFilterSimplexNoise.js +53 -1
- package/generation/filtering/numeric/math/CellFilterMax2.js +3 -0
- package/generation/filtering/numeric/math/CellFilterMembershipGeneralizedBell.js +55 -0
- package/generation/filtering/numeric/sampling/AbstractCellFilterSampleGridLayer.js +42 -0
- package/generation/filtering/numeric/sampling/CellFilterSampleLayerCubic.js +36 -0
- package/generation/filtering/numeric/sampling/CellFilterSampleLayerLinear.js +41 -0
- package/generation/grid/GridData.d.ts +5 -1
- package/generation/grid/GridData.js +35 -36
- package/generation/grid/MarkerMatchCounter.js +5 -3
- package/generation/grid/generation/discrete/GridTaskConnectRooms.js +1 -1
- package/generation/grid/generation/discrete/layer/GridTaskBuildSourceDistanceMap.js +1 -1
- package/generation/grid/generation/discrete/layer/GridTaskDistanceToMarkers.js +1 -1
- package/generation/grid/generation/road/GridTaskGenerateRoads.js +1 -1
- package/generation/markers/GridActionRuleSet.js +15 -32
- package/generation/markers/GridCellActionPlaceMarker.js +12 -8
- package/generation/markers/debug/visualizeMarkers.js +56 -36
- package/generation/markers/emitter/MarkerNodeEmitterFromAction.js +8 -8
- package/generation/markers/prototypeGridCellActionPlaceMarker.js +209 -0
- package/generation/markers/transform/MarkerNodeTransformerOffsetPosition.js +1 -5
- package/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.spec.js +2 -2
- package/generation/placement/GridCellPlacementRule.js +31 -25
- package/generation/theme/ThemeEngine.js +1 -1
- package/package.json +1 -1
- package/samples/terrain/from_image.js +7 -3
- package/samples/terrain/main.js +1 -1
- package/view/View.js +23 -1
- package/view/common/LabelView.js +1 -1
- package/view/compose3x3transform.js +32 -8
- package/view/controller/dat/DatGuiUtils.js +1 -1
- package/view/elements/DropDownSelectionView.js +11 -3
- package/view/elements/image/ImageView.js +3 -1
- package/core/model/ObservedReal.js +0 -55
- package/editor/ecs/component/ObjectEditor.js +0 -0
- package/engine/graphics/particles/particular/engine/renderers/SoftBillboardParticleRenderer.js +0 -7
- package/engine/sound/ecs/emitter/attenuate/attenuateSoundLinear.js +0 -11
- package/generation/filtering/numeric/CellFilterReadGridLayer.js +0 -73
|
@@ -40,503 +40,505 @@ function PendingAsset(description) {
|
|
|
40
40
|
|
|
41
41
|
|
|
42
42
|
/**
|
|
43
|
-
*
|
|
44
|
-
* @param {Engine} engine
|
|
45
|
-
* @constructor
|
|
43
|
+
* @class
|
|
46
44
|
*/
|
|
47
|
-
|
|
45
|
+
export class AssetManager {
|
|
48
46
|
/**
|
|
49
47
|
*
|
|
50
|
-
* @
|
|
48
|
+
* @param {Engine} engine
|
|
49
|
+
* @constructor
|
|
51
50
|
*/
|
|
52
|
-
|
|
51
|
+
constructor(engine) {
|
|
52
|
+
/**
|
|
53
|
+
*
|
|
54
|
+
* @type {HashMap<AssetDescription, Asset>}
|
|
55
|
+
*/
|
|
56
|
+
this.assets = new HashMap();
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
*
|
|
60
|
+
* @type {ObservedMap<AssetDescription, PendingAsset>}
|
|
61
|
+
*/
|
|
62
|
+
this.requestMap = new ObservedMap(new HashMap());
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Registered loaders
|
|
66
|
+
* @type {Object<AssetLoader>}
|
|
67
|
+
*/
|
|
68
|
+
this.loaders = {};
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* After asset is loaded, a chain of transforms can be applied to it, these are registered here
|
|
72
|
+
* Transformers are executed in the order in which they are added
|
|
73
|
+
* @type {Object<AssetTransformer[]>}
|
|
74
|
+
*/
|
|
75
|
+
this.transformers = {};
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Named links to specific assets. Useful to later re-mapping assets and having meaningful names for them
|
|
79
|
+
* @type {Map<string, AssetDescription>}
|
|
80
|
+
*/
|
|
81
|
+
this.aliases = new Map();
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* This will be added to asset path for actual network resolution
|
|
85
|
+
* @type {string}
|
|
86
|
+
*/
|
|
87
|
+
this.rootPath = '';
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
*
|
|
91
|
+
* @type {Engine}
|
|
92
|
+
* @private
|
|
93
|
+
*/
|
|
94
|
+
this.__engine = engine;
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
*
|
|
98
|
+
* @type {CrossOriginConfig}
|
|
99
|
+
*/
|
|
100
|
+
this.crossOriginConfig = new CrossOriginConfig();
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
*
|
|
104
|
+
* @type {HashSet<AssetDescription>}
|
|
105
|
+
*/
|
|
106
|
+
this.failures = new HashSet();
|
|
107
|
+
/**
|
|
108
|
+
* @readonly
|
|
109
|
+
* @type {boolean}
|
|
110
|
+
*/
|
|
111
|
+
this.isAssetManager = true;
|
|
112
|
+
}
|
|
53
113
|
|
|
54
114
|
/**
|
|
55
|
-
*
|
|
56
|
-
* @
|
|
115
|
+
* Remove asset if it is loaded, does nothing otherwise
|
|
116
|
+
* @param {String} path
|
|
117
|
+
* @param {String} type
|
|
118
|
+
* @returns {boolean} true if asset was removed, else otherwise
|
|
57
119
|
*/
|
|
58
|
-
|
|
120
|
+
remove(path, type) {
|
|
59
121
|
|
|
60
|
-
|
|
61
|
-
* Registered loaders
|
|
62
|
-
* @type {Object<AssetLoader>}
|
|
63
|
-
*/
|
|
64
|
-
this.loaders = {};
|
|
122
|
+
const assetDescription = new AssetDescription(path, type);
|
|
65
123
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
* Transformers are executed in the order in which they are added
|
|
69
|
-
* @type {Object<AssetTransformer[]>}
|
|
70
|
-
*/
|
|
71
|
-
this.transformers = {};
|
|
124
|
+
return this.assets.delete(assetDescription);
|
|
125
|
+
}
|
|
72
126
|
|
|
73
127
|
/**
|
|
74
|
-
*
|
|
75
|
-
* @type {Map<string, AssetDescription>}
|
|
128
|
+
* Clear out all loaded assets
|
|
76
129
|
*/
|
|
77
|
-
|
|
130
|
+
clear() {
|
|
131
|
+
this.assets.clear();
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
dumpLoadedAssetList() {
|
|
135
|
+
return JSON.stringify(extractAssetListFromManager(this), 3, 3);
|
|
136
|
+
}
|
|
78
137
|
|
|
79
138
|
/**
|
|
80
|
-
*
|
|
81
|
-
* @
|
|
139
|
+
* @param {String} path
|
|
140
|
+
* @param {String} type
|
|
141
|
+
* @returns {Promise<Asset>}
|
|
82
142
|
*/
|
|
83
|
-
|
|
143
|
+
promise(path, type) {
|
|
144
|
+
return new Promise((resolve, reject) => {
|
|
145
|
+
this.get(path, type, resolve, reject);
|
|
146
|
+
});
|
|
147
|
+
}
|
|
84
148
|
|
|
85
149
|
/**
|
|
86
150
|
*
|
|
87
|
-
* @
|
|
88
|
-
* @
|
|
151
|
+
* @param {String} path
|
|
152
|
+
* @param {String} type
|
|
153
|
+
* @param {function(asset:Asset)} callback
|
|
154
|
+
* @param {function(*)} failure
|
|
155
|
+
* @param {function(loaded:number, total:number)} [progress]
|
|
89
156
|
*/
|
|
90
|
-
|
|
157
|
+
get(path, type, callback, failure, progress) {
|
|
158
|
+
if (typeof path !== "string") {
|
|
159
|
+
throw new Error("Path must be string. Path = " + JSON.stringify(path));
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const assetDescription = new AssetDescription(path, type);
|
|
163
|
+
|
|
164
|
+
const asset = this.assets.get(assetDescription);
|
|
165
|
+
|
|
166
|
+
if (asset !== undefined) {
|
|
167
|
+
callback(asset);
|
|
168
|
+
} else {
|
|
169
|
+
//create request object
|
|
170
|
+
const assetRequest = new AssetRequest(callback, failure, progress);
|
|
171
|
+
//submit request
|
|
172
|
+
this.submitRequest(path, type, assetRequest);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
91
175
|
|
|
92
176
|
/**
|
|
93
177
|
*
|
|
94
|
-
* @
|
|
178
|
+
* @param {string} path
|
|
179
|
+
* @param {string} type
|
|
180
|
+
* @param {Asset} asset
|
|
95
181
|
*/
|
|
96
|
-
|
|
182
|
+
insert(path, type, asset) {
|
|
183
|
+
const assetDescription = new AssetDescription(path, type);
|
|
184
|
+
|
|
185
|
+
this.assets.set(assetDescription, asset);
|
|
186
|
+
}
|
|
97
187
|
|
|
98
188
|
/**
|
|
99
189
|
*
|
|
100
|
-
* @
|
|
190
|
+
* @param {string} path
|
|
191
|
+
* @param {string} type
|
|
192
|
+
* @param {AssetRequest} request
|
|
193
|
+
* @private
|
|
101
194
|
*/
|
|
102
|
-
|
|
103
|
-
|
|
195
|
+
submitRequest(path, type, request) {
|
|
196
|
+
const requestMap = this.requestMap;
|
|
104
197
|
|
|
105
|
-
|
|
106
|
-
* Remove asset if it is loaded, does nothing otherwise
|
|
107
|
-
* @param {String} path
|
|
108
|
-
* @param {String} type
|
|
109
|
-
* @returns {boolean} true if asset was removed, else otherwise
|
|
110
|
-
*/
|
|
111
|
-
AssetManager.prototype.remove = function (path, type) {
|
|
198
|
+
const assetDescription = new AssetDescription(path, type);
|
|
112
199
|
|
|
113
|
-
|
|
200
|
+
let pendingAsset = requestMap.get(assetDescription);
|
|
201
|
+
if (pendingAsset !== undefined) {
|
|
202
|
+
//already loading
|
|
203
|
+
pendingAsset.requests.push(request);
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
114
206
|
|
|
115
|
-
|
|
116
|
-
};
|
|
207
|
+
pendingAsset = new PendingAsset(assetDescription);
|
|
117
208
|
|
|
118
|
-
|
|
119
|
-
* Clear out all loaded assets
|
|
120
|
-
*/
|
|
121
|
-
AssetManager.prototype.clear = function () {
|
|
122
|
-
this.assets.clear();
|
|
123
|
-
};
|
|
209
|
+
requestMap.set(assetDescription, pendingAsset);
|
|
124
210
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
};
|
|
211
|
+
const requests = pendingAsset.requests;
|
|
212
|
+
requests.push(request);
|
|
128
213
|
|
|
129
|
-
|
|
130
|
-
* @param {String} path
|
|
131
|
-
* @param {String} type
|
|
132
|
-
* @returns {Promise<Asset>}
|
|
133
|
-
*/
|
|
134
|
-
AssetManager.prototype.promise = function (path, type) {
|
|
135
|
-
return new Promise((resolve, reject) => {
|
|
136
|
-
this.get(path, type, resolve, reject);
|
|
137
|
-
});
|
|
138
|
-
};
|
|
214
|
+
const loader = this.loaders[type];
|
|
139
215
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
if (typeof path !== "string") {
|
|
150
|
-
throw new Error("Path must be string. Path = " + JSON.stringify(path));
|
|
151
|
-
}
|
|
216
|
+
if (loader === void 0) {
|
|
217
|
+
if (typeof request.failureCallback === "function") {
|
|
218
|
+
request.failureCallback(`no loader exists for asset type '${type}', valid types are: ${Object.keys(this.loaders).join(', ')}`);
|
|
219
|
+
} else {
|
|
220
|
+
//uncaught
|
|
221
|
+
console.error("Uncaught asset load failure: No loader for asset type", type);
|
|
222
|
+
}
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
152
225
|
|
|
153
|
-
|
|
226
|
+
const assets = this.assets;
|
|
227
|
+
const failures = this.failures;
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
*
|
|
231
|
+
* @param {Asset} loaded_asset
|
|
232
|
+
*/
|
|
233
|
+
const success = async (loaded_asset) => {
|
|
234
|
+
let asset = loaded_asset;
|
|
235
|
+
|
|
236
|
+
// apply transform chain
|
|
237
|
+
const transformers = this.transformers[type];
|
|
238
|
+
if (transformers !== undefined) {
|
|
239
|
+
const transformer_count = transformers.length;
|
|
240
|
+
for (let i = 0; i < transformer_count; i++) {
|
|
241
|
+
const transformer = transformers[i];
|
|
242
|
+
|
|
243
|
+
const transformed_asset = await transformer.transform(asset, assetDescription);
|
|
244
|
+
|
|
245
|
+
if (typeof transformed_asset !== "object") {
|
|
246
|
+
console.error('Transformer produced invalid result. Ignoring result.', transformer, assetDescription);
|
|
247
|
+
} else {
|
|
248
|
+
asset = transformed_asset;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
154
252
|
|
|
155
|
-
|
|
253
|
+
//link asset description
|
|
254
|
+
asset.description = assetDescription;
|
|
156
255
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
};
|
|
256
|
+
//register asset
|
|
257
|
+
assets.set(assetDescription, asset);
|
|
258
|
+
requests.forEach(function (request) {
|
|
259
|
+
try {
|
|
260
|
+
request.successCallback(asset);
|
|
261
|
+
} catch (e) {
|
|
262
|
+
console.error("Failed to execute asset success callback", e);
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
//clear callbacks
|
|
266
|
+
requestMap.delete(assetDescription);
|
|
267
|
+
}
|
|
166
268
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
269
|
+
function failure(error) {
|
|
270
|
+
requests.forEach(function (request) {
|
|
271
|
+
try {
|
|
272
|
+
request.failureCallback(error);
|
|
273
|
+
} catch (e) {
|
|
274
|
+
console.error("Failed to execute asset failure callback", e);
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
//clear callbacks
|
|
278
|
+
requestMap.delete(assetDescription);
|
|
175
279
|
|
|
176
|
-
|
|
177
|
-
|
|
280
|
+
// record failure
|
|
281
|
+
failures.add(assetDescription);
|
|
282
|
+
}
|
|
178
283
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
*/
|
|
186
|
-
AssetManager.prototype.submitRequest = function (path, type, request) {
|
|
187
|
-
const requestMap = this.requestMap;
|
|
284
|
+
function progress(current, total) {
|
|
285
|
+
requests.forEach(function (request) {
|
|
286
|
+
if (typeof request.pogressCallback !== "function") {
|
|
287
|
+
//progress callback is not a function, ignore
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
188
290
|
|
|
189
|
-
|
|
291
|
+
try {
|
|
292
|
+
request.pogressCallback(current, total);
|
|
293
|
+
} catch (e) {
|
|
294
|
+
console.error("Failed to execute asset progress callback", e);
|
|
295
|
+
}
|
|
296
|
+
});
|
|
190
297
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
pendingAsset.requests.push(request);
|
|
195
|
-
return;
|
|
196
|
-
}
|
|
298
|
+
pendingAsset.progress.setValue(current);
|
|
299
|
+
pendingAsset.progress.setUpperLimit(total);
|
|
300
|
+
}
|
|
197
301
|
|
|
198
|
-
|
|
302
|
+
try {
|
|
303
|
+
const fullPath = this.rootPath + path;
|
|
199
304
|
|
|
200
|
-
|
|
305
|
+
if (typeof loader === "function") {
|
|
201
306
|
|
|
202
|
-
|
|
203
|
-
requests.push(request);
|
|
307
|
+
loader(fullPath, success, failure, progress);
|
|
204
308
|
|
|
205
|
-
|
|
309
|
+
} else {
|
|
206
310
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
console.error(
|
|
311
|
+
loader.load(fullPath, success, failure, progress);
|
|
312
|
+
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
} catch (e) {
|
|
316
|
+
console.error(`Loader failed on invocation. path=${path}, type=${type}`, request, 'Loader exception: ', e);
|
|
317
|
+
failure(e);
|
|
213
318
|
}
|
|
214
|
-
return;
|
|
215
319
|
}
|
|
216
320
|
|
|
217
|
-
const assets = this.assets;
|
|
218
|
-
const failures = this.failures;
|
|
219
|
-
|
|
220
321
|
/**
|
|
221
322
|
*
|
|
222
|
-
* @param {
|
|
323
|
+
* @param {string} type
|
|
324
|
+
* @return {boolean}
|
|
223
325
|
*/
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
// apply transform chain
|
|
228
|
-
const transformers = this.transformers[type];
|
|
229
|
-
if (transformers !== undefined) {
|
|
230
|
-
const transformer_count = transformers.length;
|
|
231
|
-
for (let i = 0; i < transformer_count; i++) {
|
|
232
|
-
const transformer = transformers[i];
|
|
233
|
-
|
|
234
|
-
const transformed_asset = await transformer.transform(asset, assetDescription);
|
|
235
|
-
|
|
236
|
-
if (typeof transformed_asset !== "object") {
|
|
237
|
-
console.error('Transformer produced invalid result. Ignoring result.', transformer, assetDescription);
|
|
238
|
-
} else {
|
|
239
|
-
asset = transformed_asset;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
//link asset description
|
|
245
|
-
asset.description = assetDescription;
|
|
246
|
-
|
|
247
|
-
//register asset
|
|
248
|
-
assets.set(assetDescription, asset);
|
|
249
|
-
requests.forEach(function (request) {
|
|
250
|
-
try {
|
|
251
|
-
request.successCallback(asset);
|
|
252
|
-
} catch (e) {
|
|
253
|
-
console.error("Failed to execute asset success callback", e);
|
|
254
|
-
}
|
|
255
|
-
});
|
|
256
|
-
//clear callbacks
|
|
257
|
-
requestMap.delete(assetDescription);
|
|
326
|
+
hasLoaderForType(type) {
|
|
327
|
+
return this.getLoaderByType(type) !== undefined;
|
|
258
328
|
}
|
|
259
329
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
});
|
|
268
|
-
//clear callbacks
|
|
269
|
-
requestMap.delete(assetDescription);
|
|
330
|
+
/**
|
|
331
|
+
*
|
|
332
|
+
* @param {string} type
|
|
333
|
+
* @returns {AssetLoader|undefined}
|
|
334
|
+
*/
|
|
335
|
+
getLoaderByType(type) {
|
|
336
|
+
assert.isString(type, 'type');
|
|
270
337
|
|
|
271
|
-
|
|
272
|
-
failures.add(assetDescription);
|
|
338
|
+
return this.loaders[type];
|
|
273
339
|
}
|
|
274
340
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
} catch (e) {
|
|
285
|
-
console.error("Failed to execute asset progress callback", e);
|
|
286
|
-
}
|
|
287
|
-
});
|
|
288
|
-
|
|
289
|
-
pendingAsset.progress.setValue(current);
|
|
290
|
-
pendingAsset.progress.setUpperLimit(total);
|
|
341
|
+
/**
|
|
342
|
+
*
|
|
343
|
+
* @param {string} type
|
|
344
|
+
* @return {AssetDescription[]}
|
|
345
|
+
* @private
|
|
346
|
+
*/
|
|
347
|
+
__getLoadedAssetDescriptorsByType(type) {
|
|
348
|
+
const loaded_assets = Array.from(this.assets.keys());
|
|
349
|
+
return loaded_assets.filter(t => t.type === type);
|
|
291
350
|
}
|
|
292
351
|
|
|
293
|
-
|
|
294
|
-
|
|
352
|
+
/**
|
|
353
|
+
* @template T
|
|
354
|
+
* @param {string} type
|
|
355
|
+
* @param {AssetTransformer<T>} transformer
|
|
356
|
+
*/
|
|
357
|
+
registerTransformer(type, transformer) {
|
|
358
|
+
let transformers = this.transformers[type];
|
|
295
359
|
|
|
296
|
-
if (
|
|
360
|
+
if (transformers === undefined) {
|
|
361
|
+
transformers = [];
|
|
297
362
|
|
|
298
|
-
|
|
363
|
+
this.transformers[type] = transformers;
|
|
364
|
+
}
|
|
299
365
|
|
|
300
|
-
|
|
366
|
+
transformers.push(transformer);
|
|
301
367
|
|
|
302
|
-
|
|
368
|
+
// check for loaded assets
|
|
369
|
+
const matching_assets = this.__getLoadedAssetDescriptorsByType(type);
|
|
303
370
|
|
|
371
|
+
if (matching_assets.length > 0) {
|
|
372
|
+
console.warn(`Following assets of matching type '${type}' are already loaded and transform is not applied to them:\n\t${matching_assets.join('\n\t')}`);
|
|
304
373
|
}
|
|
305
374
|
|
|
306
|
-
} catch (e) {
|
|
307
|
-
console.error(`Loader failed on invocation. path=${path}, type=${type}`, request, 'Loader exception: ', e);
|
|
308
|
-
failure(e);
|
|
309
375
|
}
|
|
310
|
-
};
|
|
311
376
|
|
|
312
|
-
/**
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
return this.getLoaderByType(type) !== undefined;
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
/**
|
|
322
|
-
*
|
|
323
|
-
* @param {string} type
|
|
324
|
-
* @returns {AssetLoader|undefined}
|
|
325
|
-
*/
|
|
326
|
-
AssetManager.prototype.getLoaderByType = function (type) {
|
|
327
|
-
assert.isString(type, 'type');
|
|
328
|
-
|
|
329
|
-
return this.loaders[type];
|
|
330
|
-
};
|
|
331
|
-
|
|
332
|
-
/**
|
|
333
|
-
*
|
|
334
|
-
* @param {string} type
|
|
335
|
-
* @return {AssetDescription[]}
|
|
336
|
-
* @private
|
|
337
|
-
*/
|
|
338
|
-
AssetManager.prototype.__getLoadedAssetDescriptorsByType = function (type) {
|
|
339
|
-
const loaded_assets = Array.from(this.assets.keys());
|
|
340
|
-
return loaded_assets.filter(t => t.type === type);
|
|
341
|
-
}
|
|
377
|
+
/**
|
|
378
|
+
* @template T
|
|
379
|
+
* @param {string} type
|
|
380
|
+
* @param {AssetTransformer<T>} transformer
|
|
381
|
+
*/
|
|
382
|
+
unregisterTransformer(type, transformer) {
|
|
342
383
|
|
|
343
|
-
|
|
344
|
-
* @template T
|
|
345
|
-
* @param {string} type
|
|
346
|
-
* @param {AssetTransformer<T>} transformer
|
|
347
|
-
*/
|
|
348
|
-
AssetManager.prototype.registerTransformer = function (type, transformer) {
|
|
349
|
-
let transformers = this.transformers[type];
|
|
384
|
+
const transformers = this.transformers[type];
|
|
350
385
|
|
|
351
|
-
|
|
352
|
-
|
|
386
|
+
if (transformers === undefined) {
|
|
387
|
+
// not found
|
|
388
|
+
return false;
|
|
389
|
+
}
|
|
353
390
|
|
|
354
|
-
|
|
355
|
-
|
|
391
|
+
if (!array_remove_element(transformers, 0, transformers.length, transformer)) {
|
|
392
|
+
// not found
|
|
393
|
+
return false;
|
|
394
|
+
}
|
|
356
395
|
|
|
357
|
-
|
|
396
|
+
// check for loaded assets
|
|
397
|
+
const matching_assets = this.__getLoadedAssetDescriptorsByType(type);
|
|
358
398
|
|
|
359
|
-
|
|
360
|
-
|
|
399
|
+
if (matching_assets.length > 0) {
|
|
400
|
+
console.warn(`Following assets of matching type '${type}' are already loaded and transform was probably already applied to them:\n\t${matching_assets.join('\n\t')}`);
|
|
401
|
+
}
|
|
361
402
|
|
|
362
|
-
|
|
363
|
-
console.warn(`Following assets of matching type '${type}' are already loaded and transform is not applied to them:\n\t${matching_assets.join('\n\t')}`);
|
|
403
|
+
return true;
|
|
364
404
|
}
|
|
365
405
|
|
|
366
|
-
|
|
406
|
+
/**
|
|
407
|
+
* @template T
|
|
408
|
+
* @param {string} type
|
|
409
|
+
* @param {AssetLoader<T>} loader
|
|
410
|
+
* @throws if a loader is already registered for the given type
|
|
411
|
+
*/
|
|
412
|
+
async registerLoader(type, loader) {
|
|
413
|
+
assert.isString(type, 'type');
|
|
414
|
+
|
|
415
|
+
const existing_loader = this.getLoaderByType(type);
|
|
416
|
+
|
|
417
|
+
if (existing_loader !== undefined) {
|
|
418
|
+
if (existing_loader === loader) {
|
|
419
|
+
// all is well, already registered
|
|
420
|
+
return existing_loader;
|
|
421
|
+
} else if (Object.getPrototypeOf(existing_loader) === Object.getPrototypeOf(loader)) {
|
|
422
|
+
console.warn(`Another instance of this loader is already registered for type '${type}'. Ignoring.`);
|
|
423
|
+
return existing_loader;
|
|
424
|
+
} else {
|
|
425
|
+
throw new Error(`Loader for type '${type}' is already registered`);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
367
428
|
|
|
368
|
-
|
|
369
|
-
* @template T
|
|
370
|
-
* @param {string} type
|
|
371
|
-
* @param {AssetTransformer<T>} transformer
|
|
372
|
-
*/
|
|
373
|
-
AssetManager.prototype.unregisterTransformer = function (type, transformer) {
|
|
429
|
+
if (typeof loader === "function") {
|
|
374
430
|
|
|
375
|
-
const transformers = this.transformers[type];
|
|
376
431
|
|
|
377
|
-
|
|
378
|
-
// not found
|
|
379
|
-
return false;
|
|
380
|
-
}
|
|
432
|
+
console.warn(`function-based loaders are deprecated (${type})`);
|
|
381
433
|
|
|
382
|
-
|
|
383
|
-
// not found
|
|
384
|
-
return false;
|
|
385
|
-
}
|
|
434
|
+
} else {
|
|
386
435
|
|
|
387
|
-
|
|
388
|
-
const matching_assets = this.__getLoadedAssetDescriptorsByType(type);
|
|
436
|
+
await loader.link(this, this.__engine);
|
|
389
437
|
|
|
390
|
-
|
|
391
|
-
console.warn(`Following assets of matching type '${type}' are already loaded and transform was probably already applied to them:\n\t${matching_assets.join('\n\t')}`);
|
|
392
|
-
}
|
|
438
|
+
}
|
|
393
439
|
|
|
394
|
-
|
|
395
|
-
}
|
|
440
|
+
this.loaders[type] = loader;
|
|
396
441
|
|
|
397
|
-
|
|
398
|
-
* @template T
|
|
399
|
-
* @param {string} type
|
|
400
|
-
* @param {AssetLoader<T>} loader
|
|
401
|
-
* @throws if a loader is already registered for the given type
|
|
402
|
-
*/
|
|
403
|
-
AssetManager.prototype.registerLoader = async function (type, loader) {
|
|
404
|
-
assert.isString(type, 'type');
|
|
405
|
-
|
|
406
|
-
const existing_loader = this.getLoaderByType(type);
|
|
407
|
-
|
|
408
|
-
if (existing_loader !== undefined) {
|
|
409
|
-
if (existing_loader === loader) {
|
|
410
|
-
// all is well, already registered
|
|
411
|
-
return existing_loader;
|
|
412
|
-
} else if (Object.getPrototypeOf(existing_loader) === Object.getPrototypeOf(loader)) {
|
|
413
|
-
console.warn(`Another instance of this loader is already registered for type '${type}'. Ignoring.`);
|
|
414
|
-
return existing_loader;
|
|
415
|
-
} else {
|
|
416
|
-
throw new Error(`Loader for type '${type}' is already registered`);
|
|
417
|
-
}
|
|
442
|
+
return loader;
|
|
418
443
|
}
|
|
419
444
|
|
|
420
|
-
|
|
445
|
+
/**
|
|
446
|
+
*
|
|
447
|
+
* @param {string} type
|
|
448
|
+
*/
|
|
449
|
+
async unregisterLoader(type) {
|
|
450
|
+
const loader = this.getLoaderByType(type);
|
|
421
451
|
|
|
452
|
+
if (loader === undefined) {
|
|
453
|
+
// asset loader is not registered, nothing to do
|
|
454
|
+
return;
|
|
422
455
|
|
|
423
|
-
|
|
456
|
+
}
|
|
424
457
|
|
|
425
|
-
|
|
458
|
+
// first remove the loader from registry so no further asset requests can be made
|
|
459
|
+
delete this.loaders[type];
|
|
426
460
|
|
|
427
|
-
|
|
461
|
+
// TODO address all pending requests, possibly waiting for all of them to finalize
|
|
428
462
|
|
|
463
|
+
// finally unlink the loader
|
|
464
|
+
await loader.unlink();
|
|
429
465
|
}
|
|
430
466
|
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
467
|
+
/**
|
|
468
|
+
* @template T
|
|
469
|
+
* Retrieve an asset if it is loaded, returns null if asset is not loaded.
|
|
470
|
+
* @param {String} path
|
|
471
|
+
* @param {String} type
|
|
472
|
+
* @returns {Asset<T>|null}
|
|
473
|
+
*/
|
|
474
|
+
tryGet(path, type) {
|
|
475
|
+
const assetDescription = new AssetDescription(path, type);
|
|
440
476
|
|
|
441
|
-
|
|
442
|
-
// asset loader is not registered, nothing to do
|
|
443
|
-
return;
|
|
477
|
+
const asset = this.assets.get(assetDescription);
|
|
444
478
|
|
|
479
|
+
if (asset !== undefined) {
|
|
480
|
+
return asset;
|
|
481
|
+
} else {
|
|
482
|
+
return null;
|
|
483
|
+
}
|
|
445
484
|
}
|
|
446
485
|
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
/**
|
|
457
|
-
* @template T
|
|
458
|
-
* Retrieve an asset if it is loaded, returns null if asset is not loaded.
|
|
459
|
-
* @param {String} path
|
|
460
|
-
* @param {String} type
|
|
461
|
-
* @returns {Asset<T>|null}
|
|
462
|
-
*/
|
|
463
|
-
AssetManager.prototype.tryGet = function (path, type) {
|
|
464
|
-
const assetDescription = new AssetDescription(path, type);
|
|
465
|
-
|
|
466
|
-
const asset = this.assets.get(assetDescription);
|
|
486
|
+
/**
|
|
487
|
+
*
|
|
488
|
+
* @param {string} path
|
|
489
|
+
* @param {string} type
|
|
490
|
+
* @returns {boolean}
|
|
491
|
+
*/
|
|
492
|
+
isFailed(path, type) {
|
|
493
|
+
const ad = new AssetDescription(path, type);
|
|
467
494
|
|
|
468
|
-
|
|
469
|
-
return asset;
|
|
470
|
-
} else {
|
|
471
|
-
return null;
|
|
495
|
+
return this.failures.has(ad);
|
|
472
496
|
}
|
|
473
|
-
};
|
|
474
497
|
|
|
475
|
-
/**
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
const ad = new AssetDescription(path, type);
|
|
498
|
+
/**
|
|
499
|
+
* @template T
|
|
500
|
+
* @param {string} alias
|
|
501
|
+
* @return {Promise<Asset<T>>}
|
|
502
|
+
*/
|
|
503
|
+
promiseByAlias(alias) {
|
|
504
|
+
assert.typeOf(alias, 'string', 'alias');
|
|
483
505
|
|
|
484
|
-
|
|
485
|
-
|
|
506
|
+
// resolve alias
|
|
507
|
+
const assetDescription = this.aliases.get(alias);
|
|
486
508
|
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
* @return {Promise<Asset<T>>}
|
|
491
|
-
*/
|
|
492
|
-
AssetManager.prototype.promiseByAlias = function (alias) {
|
|
493
|
-
assert.typeOf(alias, 'string', 'alias');
|
|
494
|
-
|
|
495
|
-
// resolve alias
|
|
496
|
-
const assetDescription = this.aliases.get(alias);
|
|
509
|
+
if (assetDescription === undefined) {
|
|
510
|
+
return new Promise.reject(`Alias '${alias}' not found`);
|
|
511
|
+
}
|
|
497
512
|
|
|
498
|
-
|
|
499
|
-
return new Promise.reject(`Alias '${alias}' not found`);
|
|
513
|
+
return this.promise(assetDescription.path, assetDescription.path);
|
|
500
514
|
}
|
|
501
515
|
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
* @return {AssetDescription}
|
|
509
|
-
*/
|
|
510
|
-
AssetManager.prototype.resolveAlias = function (alias) {
|
|
511
|
-
|
|
512
|
-
// todo consider cloning result to protect against mutation
|
|
513
|
-
|
|
514
|
-
return this.aliases.get(alias);
|
|
516
|
+
/**
|
|
517
|
+
*
|
|
518
|
+
* @param {string} alias
|
|
519
|
+
* @return {AssetDescription}
|
|
520
|
+
*/
|
|
521
|
+
resolveAlias(alias) {
|
|
515
522
|
|
|
516
|
-
|
|
523
|
+
// todo consider cloning result to protect against mutation
|
|
517
524
|
|
|
518
|
-
|
|
519
|
-
*
|
|
520
|
-
* @param {string} alias
|
|
521
|
-
* @param {string} path
|
|
522
|
-
* @param {string} type
|
|
523
|
-
*/
|
|
524
|
-
AssetManager.prototype.assignAlias = function (alias, path, type) {
|
|
525
|
-
assert.isString(alias, 'alias');
|
|
526
|
-
assert.isString(path, 'path');
|
|
527
|
-
assert.isString(type, 'type');
|
|
525
|
+
return this.aliases.get(alias);
|
|
528
526
|
|
|
529
|
-
|
|
527
|
+
}
|
|
530
528
|
|
|
531
|
-
|
|
532
|
-
|
|
529
|
+
/**
|
|
530
|
+
*
|
|
531
|
+
* @param {string} alias
|
|
532
|
+
* @param {string} path
|
|
533
|
+
* @param {string} type
|
|
534
|
+
*/
|
|
535
|
+
assignAlias(alias, path, type) {
|
|
536
|
+
assert.isString(alias, 'alias');
|
|
537
|
+
assert.isString(path, 'path');
|
|
538
|
+
assert.isString(type, 'type');
|
|
533
539
|
|
|
534
|
-
|
|
535
|
-
* @readonly
|
|
536
|
-
* @type {boolean}
|
|
537
|
-
*/
|
|
538
|
-
AssetManager.prototype.isAssetManager = true;
|
|
540
|
+
const assetDescription = new AssetDescription(path, type);
|
|
539
541
|
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
}
|
|
542
|
+
this.aliases.set(alias, assetDescription);
|
|
543
|
+
}
|
|
544
|
+
}
|