unit_resource.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /*
  2. * Copyright (c) 2012-2024 Daniele Bartolini et al.
  3. * SPDX-License-Identifier: MIT
  4. */
  5. #include "config.h"
  6. #include "core/containers/array.inl"
  7. #include "core/memory/globals.h"
  8. #include "core/memory/memory.inl"
  9. #include "resource/compile_options.inl"
  10. #include "resource/unit_compiler.h"
  11. #include "resource/unit_resource.h"
  12. namespace crown
  13. {
  14. #if CROWN_CAN_COMPILE
  15. namespace unit_resource_internal
  16. {
  17. s32 compile(CompileOptions &opts)
  18. {
  19. UnitCompiler uc(default_allocator(), opts);
  20. s32 err = unit_compiler::parse_unit(uc, opts.source_path());
  21. DATA_COMPILER_ENSURE(err == 0, opts);
  22. Buffer blob = unit_compiler::blob(uc);
  23. DATA_COMPILER_ENSURE(array::size(blob) > 0, opts);
  24. opts.write(blob);
  25. return 0;
  26. }
  27. } // namespace unit_resource_internal
  28. #endif
  29. namespace unit_resource
  30. {
  31. const u32 *parents(const UnitResource *ur)
  32. {
  33. return (u32 *)&ur[1];
  34. }
  35. const ComponentData *component_type_data(const UnitResource *ur, const ComponentData *component)
  36. {
  37. if (component == NULL)
  38. return (ComponentData *)(parents(ur) + ur->num_units);
  39. else
  40. return (ComponentData *)memory::align_top(component_payload(component) + component->data_size, alignof(ComponentData));
  41. }
  42. const u32 *component_unit_index(const ComponentData *component)
  43. {
  44. return (u32 *)(&component[1]);
  45. }
  46. const char *component_payload(const ComponentData *component)
  47. {
  48. const u32 *unit_index = component_unit_index(component);
  49. return (char *)memory::align_top(unit_index + component->num_instances, 16);
  50. }
  51. } // namespace unit_resource
  52. } // namespace crown