Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
Bevy Micro LDTK
Manage
Activity
Members
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Model registry
Analyze
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Microhacks
Bevy Micro LDTK
Commits
58556d2b
Verified
Commit
58556d2b
authored
1 year ago
by
Louis
Browse files
Options
Downloads
Patches
Plain Diff
Use Intermediary Asset To Load External Levels
parent
3dd73b79
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
src/assets/asset_events.rs
+27
-3
27 additions, 3 deletions
src/assets/asset_events.rs
src/ldtk/mod.rs
+32
-19
32 additions, 19 deletions
src/ldtk/mod.rs
src/lib.rs
+9
-2
9 additions, 2 deletions
src/lib.rs
with
68 additions
and
24 deletions
src/assets/asset_events.rs
+
27
−
3
View file @
58556d2b
...
...
@@ -3,7 +3,7 @@ use std::collections::HashMap;
use
bevy
::
prelude
::
*
;
use
crate
::
assets
::{
LevelIndex
,
TileMetadata
,
TilesetIndex
};
use
crate
::
ldtk
::{
Level
,
Project
};
use
crate
::
ldtk
::{
Level
,
LevelSet
,
Project
};
use
crate
::{
LdtkLevel
,
LevelDataUpdated
};
pub
fn
handle_ldtk_project_events
(
...
...
@@ -15,7 +15,7 @@ pub fn handle_ldtk_project_events(
)
{
for
event
in
events
.read
()
{
match
event
{
AssetEvent
::
Added
{
id
}
|
AssetEvent
::
Modified
{
id
}
=>
{
AssetEvent
::
LoadedWithDependencies
{
id
}
|
AssetEvent
::
Modified
{
id
}
=>
{
let
handle
=
Handle
::
Weak
(
*
id
);
if
let
Some
(
project
)
=
assets
.get
(
handle
)
{
for
level
in
project
.get_all_levels
()
{
...
...
@@ -43,6 +43,30 @@ pub fn handle_ldtk_project_events(
}
}
pub
(
crate
)
fn
handle_ldtk_level_set_events
(
mut
events
:
EventReader
<
AssetEvent
<
LevelSet
>>
,
level_sets
:
Res
<
Assets
<
LevelSet
>>
,
assets
:
Res
<
Assets
<
Level
>>
,
mut
level_index
:
ResMut
<
LevelIndex
>
,
mut
update_events
:
EventWriter
<
LevelDataUpdated
>
,
)
{
for
event
in
events
.read
()
{
match
event
{
AssetEvent
::
LoadedWithDependencies
{
id
}
|
AssetEvent
::
Modified
{
id
}
=>
{
let
handle
=
Handle
::
Weak
(
*
id
);
if
let
Some
(
level
)
=
level_sets
.get
(
handle
)
{
for
level
in
level
.0
.iter
()
.flat_map
(|
hd
|
assets
.get
(
hd
))
{
level_index
.insert
(
level
.identifier
.clone
(),
LdtkLevel
::
from
(
level
.clone
()));
update_events
.send
(
LevelDataUpdated
(
level
.identifier
.clone
()));
}
}
}
_
=>
{}
}
}
}
pub
fn
handle_ldtk_level_events
(
mut
events
:
EventReader
<
AssetEvent
<
Level
>>
,
assets
:
Res
<
Assets
<
Level
>>
,
...
...
@@ -51,7 +75,7 @@ pub fn handle_ldtk_level_events(
)
{
for
event
in
events
.read
()
{
match
event
{
AssetEvent
::
Added
{
id
}
|
AssetEvent
::
Modified
{
id
}
=>
{
AssetEvent
::
LoadedWithDependencies
{
id
}
|
AssetEvent
::
Modified
{
id
}
=>
{
let
handle
=
Handle
::
Weak
(
*
id
);
if
let
Some
(
level
)
=
assets
.get
(
handle
)
{
level_index
.insert
(
level
.identifier
.clone
(),
LdtkLevel
::
from
(
level
.clone
()));
...
...
This diff is collapsed.
Click to expand it.
src/ldtk/mod.rs
+
32
−
19
View file @
58556d2b
...
...
@@ -21,7 +21,7 @@ use bevy::asset::io::Reader;
use
bevy
::
asset
::{
AssetLoader
,
AsyncReadExt
,
BoxedFuture
,
LoadContext
,
UntypedAssetId
,
VisitAssetDependencies
,
};
use
bevy
::
prelude
::
Asset
;
use
bevy
::
prelude
::
{
Asset
,
Handle
}
;
use
bevy
::
reflect
::{
TypePath
,
TypeUuid
,
Uuid
};
use
crate
::
ldtk
;
...
...
@@ -178,6 +178,10 @@ pub enum LdtkLoadError {
pub
type
LdtkProject
=
Project
;
#[derive(Asset,
TypePath,
TypeUuid)]
#[uuid
=
"905609d0-8687-11ee-9e30-4705d421a1e2"
]
pub
(
crate
)
struct
LevelSet
(
pub
Vec
<
Handle
<
Level
>>
);
#[derive(Default)]
pub
struct
LdtkLoader
;
impl
AssetLoader
for
LdtkLoader
{
...
...
@@ -196,29 +200,38 @@ impl AssetLoader for LdtkLoader {
reader
.read_to_end
(
&
mut
bytes
)
.await
?
;
let
project
=
Project
::
from_bytes
(
bytes
.as_slice
())
?
;
let
levels
=
project
.levels
.iter
()
.flat_map
(|
level
|
{
log
::
debug!
(
"Checking if level is external: {} [{}]"
,
level
.identifier
,
level
.external_rel_path
.is_some
()
);
level
.external_rel_path
.as_ref
()
.map
(|
path
|
(
level
.identifier
.clone
(),
path
))
});
let
levels
=
project
.levels
.iter
()
.flat_map
(|
level
|
{
log
::
debug!
(
"Checking if level is external: {} [{}]"
,
level
.identifier
,
level
.external_rel_path
.is_some
()
);
level
.external_rel_path
.as_ref
()
.map
(|
path
|
(
level
.identifier
.clone
(),
path
))
})
.collect
::
<
Vec
<
(
String
,
&
String
)
>>
();
let
parent_path
=
load_context
.path
()
.parent
()
.map
(|
pp
|
pp
.to_path_buf
());
for
(
id
,
path
)
in
levels
{
load_context
.labeled_asset_scope
(
id
,
|
lc
|
{
match
&
parent_path
{
Some
(
parent
)
=>
lc
.load
::
<
Level
>
(
parent
.join
(
path
)),
None
=>
lc
.load
::
<
Level
>
(
path
),
};
let
mut
level_set
=
Vec
::
with_capacity
(
levels
.len
());
for
(
_
,
path
)
in
levels
{
level_set
.push
(
match
&
parent_
path
{
Some
(
parent
)
=>
load_context
.load
::
<
Level
>
(
parent
.join
(
path
)
)
,
None
=>
load_context
.load
::
<
Level
>
(
path
),
});
}
load_context
.add_labeled_asset
(
format!
(
"{}ExternalLevels"
,
project
.iid
),
LevelSet
(
level_set
),
);
Ok
(
project
)
})
}
...
...
This diff is collapsed.
Click to expand it.
src/lib.rs
+
9
−
2
View file @
58556d2b
...
...
@@ -82,12 +82,19 @@ mod __plugin {
app
.add_event
::
<
super
::
system
::
LevelDataUpdated
>
()
.init_asset
::
<
super
::
ldtk
::
Project
>
()
.init_asset
::
<
super
::
ldtk
::
Level
>
()
.init_asset
::
<
super
::
ldtk
::
LevelSet
>
()
.init_asset_loader
::
<
super
::
ldtk
::
LdtkLoader
>
()
.init_asset_loader
::
<
super
::
ldtk
::
LdtkLevelLoader
>
()
.init_resource
::
<
super
::
assets
::
TilesetIndex
>
()
.init_resource
::
<
super
::
assets
::
LevelIndex
>
()
.add_systems
(
Update
,
super
::
assets
::
handle_ldtk_project_events
)
.add_systems
(
Update
,
super
::
assets
::
handle_ldtk_level_events
);
.add_systems
(
Update
,
(
super
::
assets
::
handle_ldtk_project_events
,
super
::
assets
::
handle_ldtk_level_events
,
super
::
assets
::
handle_ldtk_level_set_events
,
),
);
}
}
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment