Skip to content

Commit fe59044

Browse files
committed
[iceshard] Introduced ResourceFilter interface to allow systems to filter for resources.
* Only meant to be used for editor / development tools. * Removed old remains of the Metadata type. (Was replaced with ice::Config)
1 parent 283cd36 commit fe59044

15 files changed

+289
-14
lines changed

source/code/systems/asset_system/public/ice/asset_category_archive.hxx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ namespace ice
1212

1313
struct AssetCategoryDefinition
1414
{
15+
constexpr auto valid() const noexcept { return ice::span::any(resource_extensions); }
16+
17+
ice::String name;
1518
ice::Span<ice::Shard const> asset_params;
1619
ice::Span<ice::String const> resource_extensions;
1720

source/code/systems/resource_system/natvis/resource.natvis

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,19 @@
33

44
<!-- URI Type -->
55
<Type Name="ice::URI">
6-
<DisplayString Condition="_forced_scheme == 0">URI {{ path={_uri,sb} }}</DisplayString>
7-
<DisplayString Condition="_forced_scheme == 1">URI {{ urn, path={_uri,s8b} }}</DisplayString>
8-
<DisplayString Condition="_forced_scheme == 2">URI {{ file, path={_uri,s8b} }}</DisplayString>
6+
<DisplayString Condition="_forced_scheme == 0">URI {{ urn, path={_uri,s8b} }}</DisplayString>
7+
<DisplayString Condition="_forced_scheme == 1">URI {{ file, path={_uri,s8b} }}</DisplayString>
8+
<DisplayString Condition="_forced_scheme == 2">URI {{ hailstorm, path={_uri,s8b} }}</DisplayString>
99
<DisplayString Condition="_forced_scheme == 3">URI {{ dynlib, path={_uri,s8b} }}</DisplayString>
10+
<DisplayString Condition="_forced_scheme == 4">URI {{ path={_uri,sb} }}</DisplayString>
1011

1112
<Expand>
1213
<Synthetic Name="[scheme]" Condition="_forced_scheme != 0">
13-
<DisplayString Condition="_forced_scheme == 1">urn</DisplayString>
14-
<DisplayString Condition="_forced_scheme == 2">file</DisplayString>
14+
<DisplayString Condition="_forced_scheme == 0">urn</DisplayString>
15+
<DisplayString Condition="_forced_scheme == 1">file</DisplayString>
16+
<DisplayString Condition="_forced_scheme == 2">hailstorm</DisplayString>
1517
<DisplayString Condition="_forced_scheme == 3">dynlib</DisplayString>
18+
<DisplayString Condition="_forced_scheme == 4">invalid</DisplayString>
1619
</Synthetic>
1720
<Item Name="[path]">_uri,sb</Item>
1821
</Expand>

source/code/systems/resource_system/private/resource_filesystem_loose.cxx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ namespace ice
5656
ice::string::push_back(native_filepath, ISP_PATH_LITERAL(".isrm"));
5757
}
5858

59+
IPT_MESSAGE_STR(filepath);
5960
ice::Expected<ice::native_file::File> handle = ice::native_file::open_file(aioport, native_filepath);
6061
if (handle)
6162
{

source/code/systems/resource_system/private/resource_provider_filesystem.cxx

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
#include "resource_provider_filesystem.hxx"
55
#include "resource_provider_hailstorm.hxx"
66
#include "resource_filesystem_baked.hxx"
7+
#include <ice/resource_filter.hxx>
8+
#include <ice/config.hxx>
79

810
namespace ice
911
{
@@ -52,6 +54,58 @@ namespace ice
5254
return ice::Scheme_File;
5355
}
5456

57+
auto FileSystemResourceProvider::filter_resource_uris(
58+
ice::ResourceFilter const& filter,
59+
ice::Array<ice::URI>& out_uris
60+
) noexcept -> ice::TaskExpected<ice::ucount>
61+
{
62+
ice::ucount collected = 0;
63+
for (ice::FileSystemResource const* resource : _resources)
64+
{
65+
if (filter.allows_resource(resource))
66+
{
67+
ice::Data metadata_data{};
68+
if (filter.requires_metadata())
69+
{
70+
metadata_data = co_await load_resource(resource, "meta");
71+
72+
if (filter.filter_thread() != nullptr)
73+
{
74+
co_await *filter.filter_thread();
75+
}
76+
77+
if (metadata_data.location == nullptr || metadata_data.size == 0_B)
78+
{
79+
continue;
80+
}
81+
82+
ice::Config metadata{};
83+
ice::Memory metadata_mem{};
84+
if (reinterpret_cast<char const*>(metadata_data.location)[0] == '{')
85+
{
86+
metadata = ice::config::from_json(_named_allocator, ice::string::from_data(metadata_data), metadata_mem);
87+
}
88+
else
89+
{
90+
metadata = ice::config::from_data(metadata_data);
91+
}
92+
93+
if (filter.allows_metadata(metadata) == false)
94+
{
95+
_named_allocator.deallocate(metadata_mem);
96+
continue;
97+
}
98+
99+
_named_allocator.deallocate(metadata_mem);
100+
}
101+
102+
ice::array::push_back(out_uris, resource->uri());
103+
collected += 1;
104+
}
105+
}
106+
co_return collected;
107+
}
108+
55109
auto FileSystemResourceProvider::collect(
56110
ice::Array<ice::Resource*>& out_changes
57111
) noexcept -> ice::ucount

source/code/systems/resource_system/private/resource_provider_filesystem.hxx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ namespace ice
4444

4545
auto schemeid() const noexcept -> ice::StringID override;
4646

47+
auto filter_resource_uris(
48+
ice::ResourceFilter const& filter,
49+
ice::Array<ice::URI>& out_uris
50+
) noexcept -> ice::TaskExpected<ice::ucount> override;
51+
4752
auto collect(
4853
ice::Array<ice::Resource*>& out_changes
4954
) noexcept -> ice::ucount override;

source/code/systems/resource_system/private/resource_tracker.cxx

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include "resource_tracker.hxx"
55
#include "resource_internal.hxx"
6+
#include <ice/resource_filter.hxx>
67

78
#include <ice/sync_manual_events.hxx>
89

@@ -80,14 +81,17 @@ namespace ice
8081
}
8182

8283
auto ResourceTrackerImplementation::attach_writer(
83-
ice::UniquePtr<ice::ResourceWriter> provider
84+
ice::UniquePtr<ice::ResourceWriter> writer
8485
) noexcept -> ice::ResourceWriter*
8586
{
86-
ice::ResourceWriter* const result = provider.get();
87+
ice::ResourceWriter* const result = writer.get();
88+
ice::ResourceProvider* const provider = attach_provider(ice::move(writer));
89+
ICE_ASSERT_CORE(provider != nullptr);
90+
8791
ice::multi_hashmap::insert(
8892
_resource_writers,
89-
ice::hash(provider->schemeid()),
90-
ice::move(provider)
93+
ice::hash(result->schemeid()),
94+
result
9195
);
9296
return result;
9397
}
@@ -104,12 +108,14 @@ namespace ice
104108

105109
this->sync_provider(temp_resources, *provider);
106110
}
111+
#if 0
107112
for (auto const& writer : _resource_writers)
108113
{
109114
ice::array::clear(temp_resources);
110115

111116
this->sync_provider(temp_resources, *writer);
112117
}
118+
#endif
113119
}
114120

115121
auto ResourceTrackerImplementation::find_resource(
@@ -143,6 +149,41 @@ namespace ice
143149
return result;
144150
}
145151

152+
auto ResourceTrackerImplementation::filter_resource_provider_uris(
153+
ice::ResourceProvider& provider,
154+
ice::ResourceFilter const& filter,
155+
ice::Array<ice::URI>& out_uris
156+
) const noexcept -> ice::TaskExpected<ice::ucount>
157+
{
158+
co_return co_await provider.filter_resource_uris(filter, out_uris);
159+
}
160+
161+
auto ResourceTrackerImplementation::filter_resource_uris(
162+
ice::ResourceFilter const& filter,
163+
ice::Array<ice::URI>& out_uris
164+
) const noexcept -> ice::TaskExpected<ice::ucount>
165+
{
166+
ice::ucount collected = 0;
167+
for (ice::UniquePtr<ice::ResourceProvider> const& provider : _resource_providers)
168+
{
169+
static constexpr ice::String const keywords[]{ "blocked", "allowed" };
170+
bool const scheme_allowed = filter.allows_scheme(provider->schemeid());
171+
bool const hostname_allowed = filter.allows_hostname(provider->hostname());
172+
ICE_LOG_IF(
173+
!scheme_allowed || !hostname_allowed,
174+
LogSeverity::Debug, LogTag::Engine,
175+
"Provider was filtered out. [scheme: {} ({}), hostname: {} ({})]",
176+
provider->schemeid(), keywords[i32(scheme_allowed)],
177+
provider->hostname(), keywords[i32(hostname_allowed)]
178+
);
179+
if (scheme_allowed && hostname_allowed)
180+
{
181+
collected += co_await filter_resource_provider_uris(*provider, filter, out_uris);
182+
}
183+
}
184+
co_return collected;
185+
}
186+
146187
auto ResourceTrackerImplementation::set_resource(
147188
ice::URI const& uri,
148189
ice::ResourceHandle const& resource_handle
@@ -239,7 +280,7 @@ namespace ice
239280
while (it != nullptr)
240281
{
241282
[[maybe_unused]]
242-
ice::ResourceWriter* candidate_writer = it.value().get();
283+
ice::ResourceWriter* candidate_writer = it.value();
243284

244285
// We only allow to create resources for specific writers.
245286
if (candidate_writer->hostname() == resource_uri.host())

source/code/systems/resource_system/private/resource_tracker.hxx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,17 @@ namespace ice
149149
ice::ResourceHandle const& resource_handle
150150
) const noexcept -> ice::ResourceHandle override;
151151

152+
auto filter_resource_provider_uris(
153+
ice::ResourceProvider& provider,
154+
ice::ResourceFilter const& filter,
155+
ice::Array<ice::URI>& out_uris
156+
) const noexcept -> ice::TaskExpected<ice::ucount>;
157+
158+
auto filter_resource_uris(
159+
ice::ResourceFilter const& filter,
160+
ice::Array<ice::URI>& out_uris
161+
) const noexcept -> ice::TaskExpected<ice::ucount> override;
162+
152163

153164
auto set_resource(
154165
ice::URI const& uri,
@@ -217,7 +228,7 @@ namespace ice
217228

218229
ice::HashMap<ice::Resource*> _resources;
219230
ice::HashMap<ice::UniquePtr<ice::ResourceProvider>, ContainerLogic::Complex> _resource_providers;
220-
ice::HashMap<ice::UniquePtr<ice::ResourceWriter>, ContainerLogic::Complex> _resource_writers;
231+
ice::HashMap<ice::ResourceWriter*> _resource_writers;
221232

222233
ice::UniquePtr<ice::DevUIWidget> _devui_widget;
223234
};

source/code/systems/resource_system/private/resource_writer_filesystem.cxx

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include "resource_writer_filesystem.hxx"
55
#include "resource_filesystem_writable.hxx"
6+
#include <ice/resource_filter.hxx>
67

78
namespace ice
89
{
@@ -48,6 +49,58 @@ namespace ice
4849
return ice::Scheme_File;
4950
}
5051

52+
auto FileSystemResourceWriter::filter_resource_uris(
53+
ice::ResourceFilter const& filter,
54+
ice::Array<ice::URI>& out_uris
55+
) noexcept -> ice::TaskExpected<ice::ucount>
56+
{
57+
ice::ucount collected = 0;
58+
for (ice::FileSystemResource const* resource : _resources)
59+
{
60+
if (filter.allows_resource(resource))
61+
{
62+
ice::Data metadata_data{};
63+
if (filter.requires_metadata())
64+
{
65+
metadata_data = co_await load_resource(resource, "meta");
66+
67+
if (filter.filter_thread() != nullptr)
68+
{
69+
co_await *filter.filter_thread();
70+
}
71+
72+
if (metadata_data.location == nullptr || metadata_data.size == 0_B)
73+
{
74+
continue;
75+
}
76+
77+
ice::Config metadata{};
78+
ice::Memory metadata_mem{};
79+
if (reinterpret_cast<char const*>(metadata_data.location)[0] == '{')
80+
{
81+
metadata = ice::config::from_json(_named_allocator, ice::string::from_data(metadata_data), metadata_mem);
82+
}
83+
else
84+
{
85+
metadata = ice::config::from_data(metadata_data);
86+
}
87+
88+
if (filter.allows_metadata(metadata) == false)
89+
{
90+
_named_allocator.deallocate(metadata_mem);
91+
continue;
92+
}
93+
94+
_named_allocator.deallocate(metadata_mem);
95+
}
96+
97+
ice::array::push_back(out_uris, resource->uri());
98+
collected += 1;
99+
}
100+
}
101+
co_return collected;
102+
}
103+
51104
auto FileSystemResourceWriter::collect(
52105
ice::Array<ice::Resource*>& out_changes
53106
) noexcept -> ice::ucount

source/code/systems/resource_system/private/resource_writer_filesystem.hxx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ namespace ice
4343

4444
auto hostname() const noexcept -> ice::String override { return _virtual_hostname; }
4545

46+
auto filter_resource_uris(
47+
ice::ResourceFilter const& filter,
48+
ice::Array<ice::URI>& out_uris
49+
) noexcept -> ice::TaskExpected<ice::ucount> override;
50+
4651
auto collect(
4752
ice::Array<ice::Resource*>& out_changes
4853
) noexcept -> ice::ucount override;

source/code/systems/resource_system/public/ice/resource.hxx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111
namespace ice
1212
{
1313

14-
struct Metadata;
15-
1614
class Resource
1715
{
1816
public:

0 commit comments

Comments
 (0)