Render.h 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /*
  2. * 2D Game Engine
  3. * Render.h:
  4. * Based on pikuma.com 2D game engine in C++ and Lua course
  5. * Copyright (c) 2021 986-Studio. All rights reserved.
  6. *
  7. * Created by Manoël Trapier on 12/02/2021.
  8. */
  9. #ifndef GAMEENGINE_RENDER_H
  10. #define GAMEENGINE_RENDER_H
  11. #include <SDL.h>
  12. #include <AssetStore.h>
  13. #include <ECS.h>
  14. #include <Components/Transform.h>
  15. #include <Components/Sprite.h>
  16. class RenderSystem: public System
  17. {
  18. public:
  19. RenderSystem()
  20. {
  21. this->requireComponent<TransformComponent>();
  22. this->requireComponent<SpriteComponent>();
  23. }
  24. void update(SDL_Renderer *renderer, std::unique_ptr<AssetStore> &assetStore, SDL_Rect &camera)
  25. {
  26. struct RenderableEntity
  27. {
  28. TransformComponent transformComponent;
  29. SpriteComponent spriteComponent;
  30. };
  31. std::vector<RenderableEntity> renderableEntities;
  32. for(auto entity: this->getSystemEntities())
  33. {
  34. RenderableEntity renderableEntity;
  35. renderableEntity.spriteComponent = entity.getComponent<SpriteComponent>();
  36. renderableEntity.transformComponent = entity.getComponent<TransformComponent>();
  37. bool isNotInCamera = ((renderableEntity.transformComponent.position.x + renderableEntity.spriteComponent.width * renderableEntity.transformComponent.scale.x)< (double)camera.x) ||
  38. ((renderableEntity.transformComponent.position.x )> (double)(camera.x + camera.w)) ||
  39. ((renderableEntity.transformComponent.position.y + renderableEntity.spriteComponent.height * renderableEntity.transformComponent.scale.y)< (double)camera.y) ||
  40. ((renderableEntity.transformComponent.position.y )> (double)(camera.y + camera.h));
  41. if (!isNotInCamera || renderableEntity.spriteComponent.isFixed)
  42. {
  43. renderableEntities.emplace_back(renderableEntity);
  44. }
  45. }
  46. std::sort(renderableEntities.begin(), renderableEntities.end(), [](const RenderableEntity &a, const RenderableEntity &b)
  47. {
  48. return a.spriteComponent.zIndex < b.spriteComponent.zIndex;
  49. });
  50. for(auto entity: renderableEntities)
  51. {
  52. const auto transform = entity.transformComponent;
  53. const auto sprite = entity.spriteComponent;
  54. SDL_Texture *texture = assetStore->getTexture(sprite.assetId);
  55. SDL_Rect destRect =
  56. {
  57. static_cast<int>(transform.position.x - (sprite.isFixed?0.:camera.x)),
  58. static_cast<int>(transform.position.y - (sprite.isFixed?0.:camera.y)),
  59. static_cast<int>(sprite.width * transform.scale.x),
  60. static_cast<int>(sprite.height * transform.scale.y)
  61. };
  62. SDL_RenderCopyEx(renderer, texture, &sprite.sourceRect, &destRect,
  63. transform.rotation, NULL, sprite.flip);
  64. }
  65. }
  66. };
  67. #endif /* GAMEENGINE_RENDER_H */