"git@weirdboi.dev:microhacks/bevy-micro-ldtk.git" did not exist on "9fdee62be86aacbc9a7305e151fc3c710c7e3c55"
Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
use crate::bevy::renderer::FontTextureCache;
use crate::KayakFont;
use bevy::asset::AssetServer;
use bevy::prelude::{
AssetEvent, Assets, Commands, EventReader, Handle, Image, Local, Res, ResMut, Resource,
};
use bevy::render::{
render_resource::{TextureFormat, TextureUsages},
Extract,
};
use bevy::utils::HashSet;
#[derive(Default, Resource)]
pub struct ExtractedFonts {
pub fonts: Vec<(Handle<KayakFont>, KayakFont)>,
}
pub(crate) fn extract_fonts(
mut not_processed: Local<Vec<Handle<KayakFont>>>,
mut commands: Commands,
font_assets: Extract<Res<Assets<KayakFont>>>,
mut events: Extract<EventReader<AssetEvent<KayakFont>>>,
textures: Extract<Res<Assets<Image>>>,
asset_server: Res<AssetServer>,
) {
let mut extracted_fonts = ExtractedFonts { fonts: Vec::new() };
let mut changed_assets = HashSet::default();
let mut removed = Vec::new();
for event in events.read() {
match event {
AssetEvent::Added { id } => {
let id = asset_server.get_id_handle(*id).unwrap();
changed_assets.insert(id.clone_weak());
}
AssetEvent::Modified { id } => {
let id = asset_server.get_id_handle(*id).unwrap();
changed_assets.insert(id.clone_weak());
}
AssetEvent::Removed { id } => {
let id = asset_server.get_id_handle(*id).unwrap();
if !changed_assets.remove(&id) {
removed.push(id.clone_weak());
}
}
AssetEvent::LoadedWithDependencies { id } => {
let id = asset_server.get_id_handle(*id).unwrap();
changed_assets.insert(id.clone_weak());
}
AssetEvent::Unused { id: _ } => {}
}
}
for handle in not_processed.drain(..) {
changed_assets.insert(handle);
}
for handle in changed_assets {
let font_asset = font_assets.get(&handle).unwrap();
if let Some(image) = textures.get(font_asset.image.get()) {
if !image
.texture_descriptor
.usage
.contains(TextureUsages::COPY_SRC)
|| image.texture_descriptor.format != TextureFormat::Rgba8Unorm
{
not_processed.push(handle);
continue;
}
} else {
not_processed.push(handle);
continue;
}
let font = font_asset.clone();
extracted_fonts.fonts.push((handle, font));
}
commands.insert_resource(extracted_fonts);
}
pub(crate) fn prepare_fonts(
mut extracted_fonts: ResMut<ExtractedFonts>,
mut font_texture_cache: ResMut<FontTextureCache>,
) {
let fonts: Vec<_> = extracted_fonts.fonts.drain(..).collect();
for (handle, font) in fonts {
font_texture_cache.add(handle, font);
}
}