@woosh/meep-engine 3.53.0 → 3.54.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/package.json +1 -1
- package/src/core/math/noise/worley_noise_2d.d.ts +14 -0
- package/src/core/math/noise/worley_noise_2d.d.ts.map +1 -0
- package/src/core/math/noise/worley_noise_2d.js +74 -0
- package/src/engine/graphics/texture/atlas/CachingTextureAtlas.d.ts +6 -1
- package/src/engine/graphics/texture/atlas/CachingTextureAtlas.d.ts.map +1 -1
- package/src/engine/graphics/texture/atlas/CachingTextureAtlas.js +363 -325
- package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.d.ts +93 -14
- package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.d.ts.map +1 -1
- package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.js +322 -183
- package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.d.ts +9 -0
- package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.d.ts.map +1 -1
- package/src/engine/graphics/texture/atlas/ReferencedTextureAtlas.js +110 -83
- package/src/engine/graphics/texture/atlas/SpriteAtlas.d.ts +42 -0
- package/src/engine/graphics/texture/atlas/SpriteAtlas.d.ts.map +1 -0
- package/src/engine/{graphics3/decal/DecalAtlas.js → graphics/texture/atlas/SpriteAtlas.js} +202 -194
- package/src/engine/graphics/texture/atlas/SpriteAtlasFill.d.ts +12 -0
- package/src/engine/graphics/texture/atlas/SpriteAtlasFill.d.ts.map +1 -0
- package/src/engine/graphics/texture/atlas/SpriteAtlasFill.js +30 -0
- package/src/engine/graphics/texture/atlas/TextureAtlas.d.ts +7 -0
- package/src/engine/graphics/texture/atlas/TextureAtlas.d.ts.map +1 -1
- package/src/engine/graphics/texture/atlas/TextureAtlas.js +11 -1
- package/src/engine/graphics/texture/atlas/sprite_atlas_border.d.ts +52 -0
- package/src/engine/graphics/texture/atlas/sprite_atlas_border.d.ts.map +1 -0
- package/src/engine/{graphics3/decal/decal_atlas_border.js → graphics/texture/atlas/sprite_atlas_border.js} +69 -69
- package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
- package/src/engine/graphics3/DecalSystem.js +447 -450
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +9 -22
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.js +892 -951
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/generation/foliage/FOLIAGE_DESIGN.md +2 -1
- package/src/generation/foliage/config/BarkMaterialConfig.d.ts +4 -3
- package/src/generation/foliage/config/BarkMaterialConfig.d.ts.map +1 -1
- package/src/generation/foliage/config/BarkMaterialConfig.js +6 -6
- package/src/generation/foliage/config/FoliageBarkType.d.ts +11 -0
- package/src/generation/foliage/config/FoliageBarkType.d.ts.map +1 -0
- package/src/generation/foliage/config/FoliageBarkType.js +16 -0
- package/src/generation/foliage/config/FoliageMaterialConfig.d.ts +58 -5
- package/src/generation/foliage/config/FoliageMaterialConfig.d.ts.map +1 -1
- package/src/generation/foliage/config/FoliageMaterialConfig.js +279 -181
- package/src/generation/foliage/index.d.ts +2 -1
- package/src/generation/foliage/index.js +44 -43
- package/src/generation/foliage/material/make_bark_material.d.ts.map +1 -1
- package/src/generation/foliage/material/make_bark_material.js +23 -95
- package/src/generation/foliage/material/make_foliage_material.d.ts +29 -3
- package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -1
- package/src/generation/foliage/material/make_foliage_material.js +605 -359
- package/src/generation/foliage/mesh/branch_collar_project.d.ts.map +1 -1
- package/src/generation/foliage/mesh/branch_collar_project.js +205 -203
- package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +15 -0
- package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -1
- package/src/generation/foliage/mesh/foliage_collect_attachments.js +569 -502
- package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -1
- package/src/generation/foliage/mesh/tree_mesh_build_bark.js +1049 -1047
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +2 -1
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -1
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +454 -415
- package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -1
- package/src/generation/foliage/presets/make_tree_species_preset.js +870 -837
- package/src/generation/foliage/skeleton/crown_envelope_evaluate.js +121 -121
- package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts +10 -7
- package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.js +206 -179
- package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/tree_skeleton_grow.js +1871 -1104
- package/src/shade/playground/foliage_wind/foliage_world.d.ts +6 -0
- package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -1
- package/src/shade/playground/foliage_wind/foliage_world.js +602 -593
- package/src/shade/playground/foliage_wind/index.html +260 -254
- package/src/shade/playground/foliage_wind/main.js +275 -263
- package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
- package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
- package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
- package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +1 -1
- package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts +3 -3
- package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
- package/src/shade/renderer/hiz/HierarchicalZBuffer.js +350 -294
- package/src/shade/renderer/hiz/generate_downsampler_code.d.ts +0 -2
- package/src/shade/renderer/hiz/generate_downsampler_code.d.ts.map +1 -1
- package/src/shade/renderer/hiz/generate_downsampler_code.js +99 -100
- package/src/shade/renderer/hiz/hzb_pick_alignment.d.ts +15 -0
- package/src/shade/renderer/hiz/hzb_pick_alignment.d.ts.map +1 -0
- package/src/shade/renderer/hiz/hzb_pick_alignment.js +148 -0
- package/src/shade/renderer/hiz/hzb_plan_reduction_steps.d.ts +28 -0
- package/src/shade/renderer/hiz/hzb_plan_reduction_steps.d.ts.map +1 -0
- package/src/shade/renderer/hiz/hzb_plan_reduction_steps.js +58 -0
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts +5 -5
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +57 -67
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts +3 -3
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +1 -1
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.js +111 -112
- package/src/shade/renderer/hiz/shader_hzb_spd.d.ts +5 -0
- package/src/shade/renderer/hiz/shader_hzb_spd.d.ts.map +1 -0
- package/src/shade/renderer/hiz/shader_hzb_spd.js +160 -0
- package/src/shade/renderer/light/GPULightCollection.d.ts +8 -0
- package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
- package/src/shade/renderer/light/GPULightCollection.js +67 -0
- package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.d.ts +7 -0
- package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/FAR_FIELD_IRRADIANCE_SH_RESOURCE.js +13 -0
- package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.d.ts +10 -0
- package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/shader_project_far_field_irradiance_sh.js +72 -0
- package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.d.ts +39 -0
- package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.d.ts.map +1 -0
- package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.js +90 -0
- package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts +12 -0
- package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts.map +1 -0
- package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.js +56 -0
- package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts +31 -0
- package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts.map +1 -0
- package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.js +196 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts +10 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts.map +1 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.js +163 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.d.ts +4 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.d.ts.map +1 -0
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_cull_lights.js +137 -0
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +4 -3
- package/src/shade/renderer/particles/graph_particles_avboit.d.ts +4 -3
- package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles_avboit.js +28 -11
- package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts +9 -13
- package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_lighting.js +25 -20
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +21 -38
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/shader/chunk/depth/chunk_query_depth_from_screen_space_bb.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/depth/chunk_query_depth_from_screen_space_bb.js +62 -62
- package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.d.ts +6 -0
- package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/random/lowbias/chunk_hash_lowbias32_vec2u.js +19 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_get_mip_resolution.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_get_mip_resolution.js +16 -10
- package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_hierarchical_raymarch.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_hierarchical_raymarch.js +118 -117
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts +41 -7
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts.map +1 -1
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.js +162 -58
- package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.js +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +10 -12
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +583 -606
- package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_sample.d.ts +24 -0
- package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_sample.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi_sample.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +640 -640
- package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts +113 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.js +484 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.d.ts +50 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.js +60 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.d.ts +25 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.js +47 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.d.ts +74 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/IrradianceCascadePlacement.js +173 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts +26 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.js +83 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.d.ts +31 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_local_light.js +113 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.d.ts +121 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.js +356 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.d.ts +16 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.js +191 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_classify_froxels.d.ts +16 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_classify_froxels.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_lighting_regimes.d.ts +23 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_lighting_regimes.d.ts.map +1 -0
- package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
- package/src/shade/renderer/wind/GPUSceneWind.js +1 -1
- package/src/engine/graphics3/decal/DecalAtlasFill.js +0 -32
- package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_froxel_centre_ws.js +0 -49
- package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi.js +0 -50
- package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi_sample.js +0 -105
- package/src/shade/renderer/volumetrics/gi/graph_build_froxel_gi.js +0 -80
- package/src/shade/renderer/volumetrics/gi/shader_volumetrics_gi.js +0 -51
- package/src/shade/renderer/volumetrics/gi/volumetrics_gi_resources.js +0 -39
- package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.js +0 -121
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.js +0 -237
|
@@ -1,83 +1,110 @@
|
|
|
1
|
-
import { AbstractTextureAtlas } from "./AbstractTextureAtlas.js";
|
|
2
|
-
import { Reference } from "../../../reference/v2/Reference.js";
|
|
3
|
-
|
|
4
|
-
export class ReferencedTextureAtlas extends AbstractTextureAtlas {
|
|
5
|
-
/**
|
|
6
|
-
*
|
|
7
|
-
* @type {Map<Sampler2D, AtlasPatch>}
|
|
8
|
-
* @private
|
|
9
|
-
*/
|
|
10
|
-
__patches = new Map();
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
*
|
|
14
|
-
* @type {Map<AtlasPatch, number>}
|
|
15
|
-
* @private
|
|
16
|
-
*/
|
|
17
|
-
__ref_counts = new Map();
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
*
|
|
21
|
-
* @param {AbstractTextureAtlas} atlas
|
|
22
|
-
*/
|
|
23
|
-
constructor(atlas) {
|
|
24
|
-
super();
|
|
25
|
-
|
|
26
|
-
this.__atlas = atlas;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
* @
|
|
38
|
-
*/
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
*
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const ref_counts = this.__ref_counts;
|
|
64
|
-
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}
|
|
1
|
+
import { AbstractTextureAtlas } from "./AbstractTextureAtlas.js";
|
|
2
|
+
import { Reference } from "../../../reference/v2/Reference.js";
|
|
3
|
+
|
|
4
|
+
export class ReferencedTextureAtlas extends AbstractTextureAtlas {
|
|
5
|
+
/**
|
|
6
|
+
*
|
|
7
|
+
* @type {Map<Sampler2D, AtlasPatch>}
|
|
8
|
+
* @private
|
|
9
|
+
*/
|
|
10
|
+
__patches = new Map();
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
*
|
|
14
|
+
* @type {Map<AtlasPatch, number>}
|
|
15
|
+
* @private
|
|
16
|
+
*/
|
|
17
|
+
__ref_counts = new Map();
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
*
|
|
21
|
+
* @param {AbstractTextureAtlas} atlas
|
|
22
|
+
*/
|
|
23
|
+
constructor(atlas) {
|
|
24
|
+
super();
|
|
25
|
+
|
|
26
|
+
this.__atlas = atlas;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @returns {AbstractTextureAtlas}
|
|
31
|
+
*/
|
|
32
|
+
get atlas() {
|
|
33
|
+
return this.__atlas;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @returns {Sampler2D}
|
|
38
|
+
*/
|
|
39
|
+
get sampler() {
|
|
40
|
+
return this.__atlas.sampler;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
update() {
|
|
44
|
+
this.__atlas.update();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
reset() {
|
|
48
|
+
this.__patches.clear();
|
|
49
|
+
this.__ref_counts.clear();
|
|
50
|
+
|
|
51
|
+
if (typeof this.__atlas.reset === 'function') {
|
|
52
|
+
this.__atlas.reset();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
*
|
|
58
|
+
* @param {Reference} ref
|
|
59
|
+
* @param {AtlasPatch} patch
|
|
60
|
+
* @private
|
|
61
|
+
*/
|
|
62
|
+
__handle_ref_release(ref, patch) {
|
|
63
|
+
const ref_counts = this.__ref_counts;
|
|
64
|
+
|
|
65
|
+
const ref_count = ref_counts.get(patch);
|
|
66
|
+
if (ref_count === undefined) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
ref_counts.set(patch, ref_count - 1);
|
|
71
|
+
|
|
72
|
+
if (ref_count === 1) {
|
|
73
|
+
// last reference removed, clear patch
|
|
74
|
+
this.__atlas.remove(patch);
|
|
75
|
+
ref_counts.delete(patch);
|
|
76
|
+
this.__patches.delete(patch.sampler);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
*
|
|
83
|
+
* @param {Sampler2D} sampler
|
|
84
|
+
* @returns {Reference<AtlasPatch>}
|
|
85
|
+
*/
|
|
86
|
+
acquire(sampler) {
|
|
87
|
+
|
|
88
|
+
let patch = this.__patches.get(sampler);
|
|
89
|
+
|
|
90
|
+
const ref_counts = this.__ref_counts;
|
|
91
|
+
|
|
92
|
+
const atlas = this.__atlas;
|
|
93
|
+
|
|
94
|
+
if (patch === undefined) {
|
|
95
|
+
patch = atlas.add(sampler);
|
|
96
|
+
ref_counts.set(patch, 1);
|
|
97
|
+
|
|
98
|
+
this.__patches.set(sampler, patch);
|
|
99
|
+
} else {
|
|
100
|
+
ref_counts.set(patch, ref_counts.get(patch) + 1);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const ref = new Reference();
|
|
104
|
+
ref.bind(patch);
|
|
105
|
+
|
|
106
|
+
ref.onReleased.add(this.__handle_ref_release, this);
|
|
107
|
+
|
|
108
|
+
return ref;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A texture atlas whose patches can be **mipmapped without bleeding into each other**.
|
|
3
|
+
*
|
|
4
|
+
* A plain {@link TextureAtlas} reserves padding around each patch but never fills it, leaving a
|
|
5
|
+
* zeroed gutter that every mip level past the first averages against the patch content.
|
|
6
|
+
*
|
|
7
|
+
* Three things fix it, and all three are here: a border sized in proportion to the patch
|
|
8
|
+
* ({@link sprite_atlas_border}), a border that is actually **filled**, by a rule that suits what the
|
|
9
|
+
* channel means ({@link SpriteAtlasFill}), and a per-patch bound on how deep the mip chain may be
|
|
10
|
+
* sampled ({@link sprite_atlas_max_lod}), because no finite border protects every level.
|
|
11
|
+
*
|
|
12
|
+
* Packing, growth, repacking and uv bookkeeping are the base class's and are untouched — it already
|
|
13
|
+
* places content at `packing + padding`, which is the whole geometry of a bordered patch.
|
|
14
|
+
*/
|
|
15
|
+
export class SpriteAtlas extends TextureAtlas {
|
|
16
|
+
/**
|
|
17
|
+
* @param {SpriteAtlasFill} fill
|
|
18
|
+
* @param {number} [size] initial edge length; the atlas grows on demand
|
|
19
|
+
*/
|
|
20
|
+
constructor(fill: SpriteAtlasFill, size?: number);
|
|
21
|
+
/**
|
|
22
|
+
* @returns {SpriteAtlasFill}
|
|
23
|
+
*/
|
|
24
|
+
get fill(): number;
|
|
25
|
+
/**
|
|
26
|
+
* The border is the patch's own size, not the caller's choice — every patch in one atlas has to
|
|
27
|
+
* obey the same rule for {@link sprite_atlas_max_lod}'s "+1 from the neighbour" to hold.
|
|
28
|
+
*
|
|
29
|
+
* @param {import("../sampler/Sampler2D.js").Sampler2D} sampler
|
|
30
|
+
* @returns {number}
|
|
31
|
+
*/
|
|
32
|
+
compute_padding(sampler: import("../sampler/Sampler2D.js").Sampler2D): number;
|
|
33
|
+
/**
|
|
34
|
+
* @param {import("../sampler/Sampler2D.js").Sampler2D} sampler
|
|
35
|
+
* @returns {import("./AtlasPatch.js").AtlasPatch}
|
|
36
|
+
*/
|
|
37
|
+
add(sampler: import("../sampler/Sampler2D.js").Sampler2D): import("./AtlasPatch.js").AtlasPatch;
|
|
38
|
+
#private;
|
|
39
|
+
}
|
|
40
|
+
import { TextureAtlas } from "./TextureAtlas.js";
|
|
41
|
+
import { SpriteAtlasFill } from "./SpriteAtlasFill.js";
|
|
42
|
+
//# sourceMappingURL=SpriteAtlas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpriteAtlas.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/texture/atlas/SpriteAtlas.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;GAaG;AACH;IAMI;;;OAGG;IACH,kBAHW,eAAe,SACf,MAAM,EAQhB;IAED;;OAEG;IACH,mBAEC;IAED;;;;;;OAMG;IACH,yBAHW,OAAO,yBAAyB,EAAE,SAAS,GACzC,MAAM,CAMlB;IAED;;;OAGG;IACH,aAHW,OAAO,yBAAyB,EAAE,SAAS,GACzC,OAAO,iBAAiB,EAAE,UAAU,CAMhD;;CAsIJ;6BAvM4B,mBAAmB;gCAGhB,sBAAsB"}
|
|
@@ -1,194 +1,202 @@
|
|
|
1
|
-
import { assert } from "
|
|
2
|
-
import { BinaryDataType } from "
|
|
3
|
-
import { TextureAtlas } from "
|
|
4
|
-
import { AtlasPatchFlag } from "
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* A texture atlas whose patches can be **mipmapped without bleeding into each other**.
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* ({@link
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
const
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
1
|
+
import { assert } from "../../../../core/assert.js";
|
|
2
|
+
import { BinaryDataType } from "../../../../core/binary/type/BinaryDataType.js";
|
|
3
|
+
import { TextureAtlas } from "./TextureAtlas.js";
|
|
4
|
+
import { AtlasPatchFlag } from "./AtlasPatchFlag.js";
|
|
5
|
+
import { sprite_atlas_border } from "./sprite_atlas_border.js";
|
|
6
|
+
import { SpriteAtlasFill } from "./SpriteAtlasFill.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* A texture atlas whose patches can be **mipmapped without bleeding into each other**.
|
|
10
|
+
*
|
|
11
|
+
* A plain {@link TextureAtlas} reserves padding around each patch but never fills it, leaving a
|
|
12
|
+
* zeroed gutter that every mip level past the first averages against the patch content.
|
|
13
|
+
*
|
|
14
|
+
* Three things fix it, and all three are here: a border sized in proportion to the patch
|
|
15
|
+
* ({@link sprite_atlas_border}), a border that is actually **filled**, by a rule that suits what the
|
|
16
|
+
* channel means ({@link SpriteAtlasFill}), and a per-patch bound on how deep the mip chain may be
|
|
17
|
+
* sampled ({@link sprite_atlas_max_lod}), because no finite border protects every level.
|
|
18
|
+
*
|
|
19
|
+
* Packing, growth, repacking and uv bookkeeping are the base class's and are untouched — it already
|
|
20
|
+
* places content at `packing + padding`, which is the whole geometry of a bordered patch.
|
|
21
|
+
*/
|
|
22
|
+
export class SpriteAtlas extends TextureAtlas {
|
|
23
|
+
/**
|
|
24
|
+
* @type {SpriteAtlasFill}
|
|
25
|
+
*/
|
|
26
|
+
#fill;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @param {SpriteAtlasFill} fill
|
|
30
|
+
* @param {number} [size] initial edge length; the atlas grows on demand
|
|
31
|
+
*/
|
|
32
|
+
constructor(fill, size = 16) {
|
|
33
|
+
super(size, BinaryDataType.Uint8, 4);
|
|
34
|
+
|
|
35
|
+
assert.enum(fill, SpriteAtlasFill, 'fill');
|
|
36
|
+
|
|
37
|
+
this.#fill = fill;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @returns {SpriteAtlasFill}
|
|
42
|
+
*/
|
|
43
|
+
get fill() {
|
|
44
|
+
return this.#fill;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* The border is the patch's own size, not the caller's choice — every patch in one atlas has to
|
|
49
|
+
* obey the same rule for {@link sprite_atlas_max_lod}'s "+1 from the neighbour" to hold.
|
|
50
|
+
*
|
|
51
|
+
* @param {import("../sampler/Sampler2D.js").Sampler2D} sampler
|
|
52
|
+
* @returns {number}
|
|
53
|
+
*/
|
|
54
|
+
compute_padding(sampler) {
|
|
55
|
+
assert.defined(sampler, 'sampler');
|
|
56
|
+
|
|
57
|
+
return sprite_atlas_border(sampler.width, sampler.height);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* @param {import("../sampler/Sampler2D.js").Sampler2D} sampler
|
|
62
|
+
* @returns {import("./AtlasPatch.js").AtlasPatch}
|
|
63
|
+
*/
|
|
64
|
+
add(sampler) {
|
|
65
|
+
assert.defined(sampler, 'sampler');
|
|
66
|
+
|
|
67
|
+
return super.add(sampler, this.compute_padding(sampler));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* @param {import("./AtlasPatch.js").AtlasPatch} patch
|
|
72
|
+
*/
|
|
73
|
+
paintPatch(patch) {
|
|
74
|
+
const target = this.sampler;
|
|
75
|
+
const source = patch.sampler;
|
|
76
|
+
|
|
77
|
+
const width = patch.size.x;
|
|
78
|
+
const height = patch.size.y;
|
|
79
|
+
|
|
80
|
+
const x0 = patch.position.x;
|
|
81
|
+
const y0 = patch.position.y;
|
|
82
|
+
|
|
83
|
+
const border = patch.padding;
|
|
84
|
+
|
|
85
|
+
const premultiply = this.#fill === SpriteAtlasFill.PremultipliedCoverage;
|
|
86
|
+
|
|
87
|
+
const target_data = target.data;
|
|
88
|
+
const source_data = source.data;
|
|
89
|
+
const target_width = target.width;
|
|
90
|
+
|
|
91
|
+
for (let y = 0; y < height; y++) {
|
|
92
|
+
const source_row = y * width * 4;
|
|
93
|
+
const target_row = ((y0 + y) * target_width + x0) * 4;
|
|
94
|
+
|
|
95
|
+
for (let x = 0; x < width; x++) {
|
|
96
|
+
const s = source_row + x * 4;
|
|
97
|
+
const t = target_row + x * 4;
|
|
98
|
+
|
|
99
|
+
const alpha = source_data[s + 3];
|
|
100
|
+
|
|
101
|
+
if (premultiply) {
|
|
102
|
+
// integer rounding rather than truncation, so a fully opaque texel survives
|
|
103
|
+
// the round trip exactly
|
|
104
|
+
target_data[t] = (source_data[s] * alpha + 127) / 255 | 0;
|
|
105
|
+
target_data[t + 1] = (source_data[s + 1] * alpha + 127) / 255 | 0;
|
|
106
|
+
target_data[t + 2] = (source_data[s + 2] * alpha + 127) / 255 | 0;
|
|
107
|
+
} else {
|
|
108
|
+
target_data[t] = source_data[s];
|
|
109
|
+
target_data[t + 1] = source_data[s + 1];
|
|
110
|
+
target_data[t + 2] = source_data[s + 2];
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
target_data[t + 3] = alpha;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (premultiply) {
|
|
118
|
+
this.#fill_border_zero(x0, y0, width, height, border);
|
|
119
|
+
} else {
|
|
120
|
+
this.#fill_border_extend(x0, y0, width, height, border);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
patch.setFlag(AtlasPatchFlag.Painted);
|
|
124
|
+
patch.last_painted_version = source.version;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* @param {number} x0
|
|
129
|
+
* @param {number} y0
|
|
130
|
+
* @param {number} width
|
|
131
|
+
* @param {number} height
|
|
132
|
+
* @param {number} border
|
|
133
|
+
*/
|
|
134
|
+
#fill_border_zero(x0, y0, width, height, border) {
|
|
135
|
+
const target = this.sampler;
|
|
136
|
+
|
|
137
|
+
const data = target.data;
|
|
138
|
+
const target_width = target.width;
|
|
139
|
+
|
|
140
|
+
for (let y = y0 - border; y < y0 + height + border; y++) {
|
|
141
|
+
const inside_rows = y >= y0 && y < y0 + height;
|
|
142
|
+
|
|
143
|
+
for (let x = x0 - border; x < x0 + width + border; x++) {
|
|
144
|
+
if (inside_rows && x >= x0 && x < x0 + width) {
|
|
145
|
+
// the content itself, already painted
|
|
146
|
+
x = x0 + width - 1;
|
|
147
|
+
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const t = (y * target_width + x) * 4;
|
|
152
|
+
|
|
153
|
+
data[t] = 0;
|
|
154
|
+
data[t + 1] = 0;
|
|
155
|
+
data[t + 2] = 0;
|
|
156
|
+
data[t + 3] = 0;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* The nearest content texel, repeated outward — corners included, which is where a fill written
|
|
163
|
+
* as "rows then columns" leaves a hole.
|
|
164
|
+
*
|
|
165
|
+
* @param {number} x0
|
|
166
|
+
* @param {number} y0
|
|
167
|
+
* @param {number} width
|
|
168
|
+
* @param {number} height
|
|
169
|
+
* @param {number} border
|
|
170
|
+
*/
|
|
171
|
+
#fill_border_extend(x0, y0, width, height, border) {
|
|
172
|
+
const target = this.sampler;
|
|
173
|
+
|
|
174
|
+
const data = target.data;
|
|
175
|
+
const target_width = target.width;
|
|
176
|
+
|
|
177
|
+
for (let y = y0 - border; y < y0 + height + border; y++) {
|
|
178
|
+
const inside_rows = y >= y0 && y < y0 + height;
|
|
179
|
+
|
|
180
|
+
// clamp to the content, on both axes independently, which is what covers the corners
|
|
181
|
+
const source_y = y < y0 ? y0 : (y >= y0 + height ? y0 + height - 1 : y);
|
|
182
|
+
|
|
183
|
+
for (let x = x0 - border; x < x0 + width + border; x++) {
|
|
184
|
+
if (inside_rows && x >= x0 && x < x0 + width) {
|
|
185
|
+
x = x0 + width - 1;
|
|
186
|
+
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const source_x = x < x0 ? x0 : (x >= x0 + width ? x0 + width - 1 : x);
|
|
191
|
+
|
|
192
|
+
const s = (source_y * target_width + source_x) * 4;
|
|
193
|
+
const t = (y * target_width + x) * 4;
|
|
194
|
+
|
|
195
|
+
data[t] = data[s];
|
|
196
|
+
data[t + 1] = data[s + 1];
|
|
197
|
+
data[t + 2] = data[s + 2];
|
|
198
|
+
data[t + 3] = data[s + 3];
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How a {@link SpriteAtlas } fills the border around a patch.
|
|
3
|
+
*
|
|
4
|
+
* Two rules rather than one, because the correct fill depends on what the channel means and getting
|
|
5
|
+
* it wrong shows up only once the mip chain is built.
|
|
6
|
+
*/
|
|
7
|
+
export type SpriteAtlasFill = number;
|
|
8
|
+
export namespace SpriteAtlasFill {
|
|
9
|
+
let PremultipliedCoverage: number;
|
|
10
|
+
let EdgeExtend: number;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=SpriteAtlasFill.d.ts.map
|