1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- /*
- * 2D Game Engine
- * Render.h:
- * Based on pikuma.com 2D game engine in C++ and Lua course
- * Copyright (c) 2021 986-Studio. All rights reserved.
- *
- * Created by Manoël Trapier on 12/02/2021.
- */
- #ifndef GAMEENGINE_RENDER_H
- #define GAMEENGINE_RENDER_H
- #include <SDL.h>
- #include <AssetStore.h>
- #include <ECS.h>
- #include <Components/Transform.h>
- #include <Components/Sprite.h>
- class RenderSystem: public System
- {
- public:
- RenderSystem()
- {
- this->requireComponent<TransformComponent>();
- this->requireComponent<SpriteComponent>();
- }
- void update(SDL_Renderer *renderer, std::unique_ptr<AssetStore> &assetStore, SDL_Rect &camera)
- {
- struct RenderableEntity
- {
- TransformComponent transformComponent;
- SpriteComponent spriteComponent;
- };
- std::vector<RenderableEntity> renderableEntities;
- for(auto entity: this->getSystemEntities())
- {
- RenderableEntity renderableEntity;
- renderableEntity.spriteComponent = entity.getComponent<SpriteComponent>();
- renderableEntity.transformComponent = entity.getComponent<TransformComponent>();
- bool isNotInCamera = ((renderableEntity.transformComponent.position.x + renderableEntity.spriteComponent.width * renderableEntity.transformComponent.scale.x)< (double)camera.x) ||
- ((renderableEntity.transformComponent.position.x )> (double)(camera.x + camera.w)) ||
- ((renderableEntity.transformComponent.position.y + renderableEntity.spriteComponent.height * renderableEntity.transformComponent.scale.y)< (double)camera.y) ||
- ((renderableEntity.transformComponent.position.y )> (double)(camera.y + camera.h));
- if (!isNotInCamera || renderableEntity.spriteComponent.isFixed)
- {
- renderableEntities.emplace_back(renderableEntity);
- }
- }
- std::sort(renderableEntities.begin(), renderableEntities.end(), [](const RenderableEntity &a, const RenderableEntity &b)
- {
- return a.spriteComponent.zIndex < b.spriteComponent.zIndex;
- });
- for(auto entity: renderableEntities)
- {
- const auto transform = entity.transformComponent;
- const auto sprite = entity.spriteComponent;
- SDL_Texture *texture = assetStore->getTexture(sprite.assetId);
- SDL_Rect destRect =
- {
- static_cast<int>(transform.position.x - (sprite.isFixed?0.:camera.x)),
- static_cast<int>(transform.position.y - (sprite.isFixed?0.:camera.y)),
- static_cast<int>(sprite.width * transform.scale.x),
- static_cast<int>(sprite.height * transform.scale.y)
- };
- SDL_RenderCopyEx(renderer, texture, &sprite.sourceRect, &destRect,
- transform.rotation, NULL, sprite.flip);
- }
- }
- };
- #endif /* GAMEENGINE_RENDER_H */
|