17 entt::meta_factory<settings::app_settings>{}
18 .type(
"app_settings"_hs)
23 .data<&settings::app_settings::company>(
"company"_hs)
29 .data<&settings::app_settings::product>(
"product"_hs)
35 .data<&settings::app_settings::version>(
"version"_hs)
45 try_save(ar, ser20::make_nvp(
"company", obj.company));
46 try_save(ar, ser20::make_nvp(
"product", obj.product));
47 try_save(ar, ser20::make_nvp(
"version", obj.version));
52 try_load(ar, ser20::make_nvp(
"company", obj.company));
53 try_load(ar, ser20::make_nvp(
"product", obj.product));
54 try_load(ar, ser20::make_nvp(
"version", obj.version));
60 entt::meta_factory<settings::asset_settings::texture_importer_settings>{}
61 .type(
"texture_importer_settings"_hs)
66 .data<&settings::asset_settings::texture_importer_settings::default_max_size>(
"default_max_size"_hs)
72 .data<&settings::asset_settings::texture_importer_settings::default_compression>(
"default_compression"_hs)
82 try_save(ar, ser20::make_nvp(
"default_max_size", obj.default_max_size));
83 try_save(ar, ser20::make_nvp(
"default_compression", obj.default_compression));
88 try_load(ar, ser20::make_nvp(
"default_max_size", obj.default_max_size));
89 try_load(ar, ser20::make_nvp(
"default_compression", obj.default_compression));
94 try_save(ar, ser20::make_nvp(
"texture", obj.texture));
99 try_load(ar, ser20::make_nvp(
"texture", obj.texture));
105 entt::meta_factory<eviction_settings>{}
106 .type(
"eviction_settings"_hs)
111 .data<&eviction_settings::enabled>(
"enabled"_hs)
115 entt::attribute{
"tooltip",
"Evict GPU resources each frame to keep memory under the budget. "
116 "Evicted resources are restored automatically on next use."},
118 .data<&eviction_settings::auto_budget>(
"auto_budget"_hs)
122 entt::attribute{
"tooltip",
"Derive the budget from the backend's reported GPU memory. "
123 "Falls back to the manual budget when no limit is reported."},
125 .data<&eviction_settings::budget_fraction>(
"budget_fraction"_hs)
132 entt::attribute{
"tooltip",
"Start evicting once GPU usage exceeds this fraction of the maximum."},
134 .data<&eviction_settings::target_fraction>(
"target_fraction"_hs)
141 entt::attribute{
"tooltip",
"Evict down to this fraction of the maximum (hysteresis; keep < budget)."},
143 .data<&eviction_settings::manual_budget_mb>(
"manual_budget_mb"_hs)
149 entt::attribute{
"tooltip",
"Budget compared against evictable resident bytes when not using auto budget."},
151 .data<&eviction_settings::strategy>(
"strategy"_hs)
157 entt::attribute{
"tooltip",
"Victim selection policy: 0=LRU, 1=LFU, 2=Largest first, 3=Age TTL."},
159 .data<&eviction_settings::min_age_frames>(
"min_age_frames"_hs)
165 entt::attribute{
"tooltip",
"Resources used within this many frames are never evicted (anti-thrash)."},
167 .data<&eviction_settings::max_evictions>(
"max_evictions"_hs)
173 entt::attribute{
"tooltip",
"Caps how many resources may be evicted per frame (0 = unlimited)."},
179 try_save(ar, ser20::make_nvp(
"enabled", obj.enabled));
180 try_save(ar, ser20::make_nvp(
"auto_budget", obj.auto_budget));
181 try_save(ar, ser20::make_nvp(
"budget_fraction", obj.budget_fraction));
182 try_save(ar, ser20::make_nvp(
"target_fraction", obj.target_fraction));
183 try_save(ar, ser20::make_nvp(
"manual_budget_mb", obj.manual_budget_mb));
184 try_save(ar, ser20::make_nvp(
"strategy", obj.strategy));
185 try_save(ar, ser20::make_nvp(
"min_age_frames", obj.min_age_frames));
186 try_save(ar, ser20::make_nvp(
"max_evictions", obj.max_evictions));
191 try_load(ar, ser20::make_nvp(
"enabled", obj.enabled));
192 try_load(ar, ser20::make_nvp(
"auto_budget", obj.auto_budget));
193 try_load(ar, ser20::make_nvp(
"budget_fraction", obj.budget_fraction));
194 try_load(ar, ser20::make_nvp(
"target_fraction", obj.target_fraction));
195 try_load(ar, ser20::make_nvp(
"manual_budget_mb", obj.manual_budget_mb));
196 try_load(ar, ser20::make_nvp(
"strategy", obj.strategy));
197 try_load(ar, ser20::make_nvp(
"min_age_frames", obj.min_age_frames));
198 try_load(ar, ser20::make_nvp(
"max_evictions", obj.max_evictions));
203 entt::meta_factory<settings::graphics_settings>{}
204 .type(
"graphics_settings"_hs)
209 .data<&settings::graphics_settings::eviction>(
"eviction"_hs)
213 entt::attribute{
"tooltip",
"Controls automatic eviction/paging of GPU resources to stay under budget."},
219 try_save(ar, ser20::make_nvp(
"eviction", obj.eviction));
224 try_load(ar, ser20::make_nvp(
"eviction", obj.eviction));
229 entt::meta_factory<settings::splash_logo_entry>{}
230 .type(
"splash_logo_entry"_hs)
235 .data<&settings::splash_logo_entry::logo>(
"logo"_hs)
239 entt::attribute{
"tooltip",
"Texture asset displayed during the splash sequence."},
241 .data<&settings::splash_logo_entry::duration_sec>(
"duration_sec"_hs)
253 try_save(ar, ser20::make_nvp(
"logo", obj.logo));
254 try_save(ar, ser20::make_nvp(
"duration_sec", obj.duration_sec));
259 try_load(ar, ser20::make_nvp(
"logo", obj.logo));
260 try_load(ar, ser20::make_nvp(
"duration_sec", obj.duration_sec));
265 entt::meta_factory<settings::splash_settings>{}
266 .type(
"splash_settings"_hs)
271 .data<&settings::splash_settings::enabled>(
"enabled"_hs)
275 entt::attribute{
"tooltip",
"Display a splash screen when entering play mode before the game starts."},
277 .data<&settings::splash_settings::show_made_with>(
"show_made_with"_hs)
281 entt::attribute{
"tooltip",
"Append the engine branding logo to the splash sequence."},
283 .data<&settings::splash_settings::fade_in_sec>(
"fade_in_sec"_hs)
291 .data<&settings::splash_settings::fade_out_sec>(
"fade_out_sec"_hs)
299 .data<&settings::splash_settings::logos>(
"logos"_hs)
303 entt::attribute{
"tooltip",
"Project logos shown sequentially before play begins."},
309 try_save(ar, ser20::make_nvp(
"enabled", obj.enabled));
310 try_save(ar, ser20::make_nvp(
"show_made_with", obj.show_made_with));
311 try_save(ar, ser20::make_nvp(
"fade_in_sec", obj.fade_in_sec));
312 try_save(ar, ser20::make_nvp(
"fade_out_sec", obj.fade_out_sec));
313 try_save(ar, ser20::make_nvp(
"logos", obj.logos));
318 try_load(ar, ser20::make_nvp(
"enabled", obj.enabled));
319 try_load(ar, ser20::make_nvp(
"show_made_with", obj.show_made_with));
320 try_load(ar, ser20::make_nvp(
"fade_in_sec", obj.fade_in_sec));
321 try_load(ar, ser20::make_nvp(
"fade_out_sec", obj.fade_out_sec));
322 try_load(ar, ser20::make_nvp(
"logos", obj.logos));
328 entt::meta_factory<settings::standalone_settings>{}
329 .type(
"standalone_settings"_hs)
334 .data<&settings::standalone_settings::startup_scene>(
"startup_scene"_hs)
344 try_save(ar, ser20::make_nvp(
"startup_scene", obj.startup_scene));
349 try_load(ar, ser20::make_nvp(
"startup_scene", obj.startup_scene));
354 entt::meta_factory<settings::time_settings>{}
355 .type(
"time_settings"_hs)
360 .data<&settings::time_settings::fixed_timestep>(
"fixed_timestep"_hs)
365 entt::attribute{
"tooltip",
"A framerate-idependent interval which dictates when physics calculations and FixedUpdate events are performed."},
367 .data<&settings::time_settings::max_fixed_steps>(
"max_fixed_steps"_hs)
371 entt::attribute{
"tooltip",
"A cap for framerate-idependent worst case scenario. No more than this much fixed updates per frame."},
377 try_save(ar, ser20::make_nvp(
"fixed_timestep", obj.fixed_timestep));
378 try_save(ar, ser20::make_nvp(
"max_fixed_steps", obj.max_fixed_steps));
383 try_load(ar, ser20::make_nvp(
"fixed_timestep", obj.fixed_timestep));
384 try_load(ar, ser20::make_nvp(
"max_fixed_steps", obj.max_fixed_steps));
389 entt::meta_factory<settings::layer_settings>{}
390 .type(
"layer_settings"_hs)
395 .data<&settings::layer_settings::layers>(
"layers"_hs)
406 try_save(ar, ser20::make_nvp(
"layers", obj.layers));
411 try_load(ar, ser20::make_nvp(
"layers", obj.layers));
416 try_save(ar, ser20::make_nvp(
"actions", obj.actions));
421 try_load(ar, ser20::make_nvp(
"actions", obj.actions));
427 try_save(ar, ser20::make_nvp(
"name", obj.name));
428 try_save(ar, ser20::make_nvp(
"width", obj.width));
429 try_save(ar, ser20::make_nvp(
"height", obj.height));
430 try_save(ar, ser20::make_nvp(
"aspect", obj.aspect));
435 try_load(ar, ser20::make_nvp(
"name", obj.name));
436 try_load(ar, ser20::make_nvp(
"width", obj.width));
437 try_load(ar, ser20::make_nvp(
"height", obj.height));
438 try_load(ar, ser20::make_nvp(
"aspect", obj.aspect));
443 try_save(ar, ser20::make_nvp(
"resolutions", obj.resolutions));
444 try_save(ar, ser20::make_nvp(
"current_resolution", obj.current_resolution));
449 try_load(ar, ser20::make_nvp(
"resolutions", obj.resolutions));
450 try_load(ar, ser20::make_nvp(
"current_resolution", obj.current_resolution));
455 entt::meta_factory<settings::resolution_settings::resolution>{}
456 .type(
"resolution"_hs)
461 .data<&settings::resolution_settings::resolution::name>(
"name"_hs)
467 .data<&settings::resolution_settings::resolution::width>(
"width"_hs)
474 .data<&settings::resolution_settings::resolution::height>(
"height"_hs)
481 .data<&settings::resolution_settings::resolution::aspect>(
"aspect"_hs)
492 entt::meta_factory<settings::resolution_settings>{}
493 .type(
"resolution_settings"_hs)
498 .data<&settings::resolution_settings::resolutions>(
"resolutions"_hs)
504 .data<&settings::resolution_settings::current_resolution>(
"current_resolution"_hs)
515 entt::meta_factory<settings>{}
521 .data<&settings::app>(
"app"_hs)
527 .data<&settings::graphics>(
"graphics"_hs)
533 .data<&settings::splash>(
"splash"_hs)
537 entt::attribute{
"tooltip",
"Play mode splash screen shown before the game starts."},
539 .data<&settings::standalone>(
"standalone"_hs)
545 .data<&settings::resolution>(
"resolution"_hs)
555 try_save(ar, ser20::make_nvp(
"app", obj.app));
556 try_save(ar, ser20::make_nvp(
"assets", obj.assets));
557 try_save(ar, ser20::make_nvp(
"graphics", obj.graphics));
558 try_save(ar, ser20::make_nvp(
"splash", obj.splash));
559 try_save(ar, ser20::make_nvp(
"standalone", obj.standalone));
560 try_save(ar, ser20::make_nvp(
"layer", obj.layer));
561 try_save(ar, ser20::make_nvp(
"input", obj.input));
562 try_save(ar, ser20::make_nvp(
"time", obj.time));
563 try_save(ar, ser20::make_nvp(
"resolutions", obj.resolution));
570 try_load(ar, ser20::make_nvp(
"app", obj.app));
571 try_load(ar, ser20::make_nvp(
"assets", obj.assets));
572 try_load(ar, ser20::make_nvp(
"graphics", obj.graphics));
573 try_load(ar, ser20::make_nvp(
"splash", obj.splash));
574 try_load(ar, ser20::make_nvp(
"standalone", obj.standalone));
575 try_load(ar, ser20::make_nvp(
"layer", obj.layer));
576 try_load(ar, ser20::make_nvp(
"input", obj.input));
577 try_load(ar, ser20::make_nvp(
"time", obj.time));
578 try_load(ar, ser20::make_nvp(
"resolutions", obj.resolution));
585 std::ofstream stream(absolute_path);
589 try_save(ar, ser20::make_nvp(
"settings", obj));
595 std::ofstream stream(absolute_path, std::ios::binary);
599 try_save(ar, ser20::make_nvp(
"settings", obj));
605 std::ifstream stream(absolute_path);
609 return try_load(ar, ser20::make_nvp(
"settings", obj));
617 std::ifstream stream(absolute_path, std::ios::binary);
621 return try_load(ar, ser20::make_nvp(
"settings", obj));
attributes::value_type attribute
std::map< std::string, meta_any > attributes
auto create_oarchive_associative(std::ostream &stream)
BinaryInputArchive iarchive_binary_t
auto create_iarchive_associative(std::istream &stream)
simd::JSONOutputArchive oarchive_associative_t
BinaryOutputArchive oarchive_binary_t
simd::JSONInputArchive iarchive_associative_t
void save_to_file_bin(const std::string &absolute_path, const animation_clip &obj)
void load_from_file(const std::string &absolute_path, animation_clip &obj)
auto get_reserved_layers() -> const std::vector< std::string > &
void save_to_file(const std::string &absolute_path, const animation_clip &obj)
void load_from_file_bin(const std::string &absolute_path, animation_clip &obj)
#define REFLECT_INLINE(cls)
#define SAVE_INSTANTIATE(cls, Archive)
auto try_save(Archive &ar, ser20::NameValuePair< T > &&t, const hpp::source_location &loc=hpp::source_location::current()) -> bool
#define LOAD_INSTANTIATE(cls, Archive)
auto try_load(Archive &ar, ser20::NameValuePair< T > &&t, const hpp::source_location &loc=hpp::source_location::current()) -> bool