terrain_alignment_system.cpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #include "terrain_alignment_system.h"
  2. #include "../core/component.h"
  3. #include "../core/entity.h"
  4. #include "../core/world.h"
  5. #include "../map/terrain_service.h"
  6. #include "../units/troop_config.h"
  7. namespace Game::Systems {
  8. void TerrainAlignmentSystem::update(Engine::Core::World *world, float) {
  9. auto &terrain_service = Game::Map::TerrainService::instance();
  10. if (!terrain_service.isInitialized()) {
  11. return;
  12. }
  13. auto entities = world->getEntitiesWith<Engine::Core::TransformComponent>();
  14. for (auto *entity : entities) {
  15. alignEntityToTerrain(entity);
  16. }
  17. }
  18. void TerrainAlignmentSystem::alignEntityToTerrain(
  19. Engine::Core::Entity *entity) {
  20. auto *transform = entity->getComponent<Engine::Core::TransformComponent>();
  21. if (transform == nullptr) {
  22. return;
  23. }
  24. auto &terrain_service = Game::Map::TerrainService::instance();
  25. float const terrain_height = terrain_service.getTerrainHeight(
  26. transform->position.x, transform->position.z);
  27. float entity_base_offset = 0.0F;
  28. if (auto *unit = entity->getComponent<Engine::Core::UnitComponent>()) {
  29. entity_base_offset =
  30. Game::Units::TroopConfig::instance().getSelectionRingGroundOffset(
  31. unit->spawn_type);
  32. }
  33. transform->position.y =
  34. terrain_height + entity_base_offset * transform->scale.y;
  35. }
  36. } // namespace Game::Systems