/* * 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 #include #include #include #include class RenderSystem: public System { public: RenderSystem() { this->requireComponent(); this->requireComponent(); } void update(SDL_Renderer *renderer, std::unique_ptr &assetStore, SDL_Rect &camera) { struct RenderableEntity { TransformComponent transformComponent; SpriteComponent spriteComponent; }; std::vector renderableEntities; for(auto entity: this->getSystemEntities()) { RenderableEntity renderableEntity; renderableEntity.spriteComponent = entity.getComponent(); renderableEntity.transformComponent = entity.getComponent(); 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(transform.position.x - (sprite.isFixed?0.:camera.x)), static_cast(transform.position.y - (sprite.isFixed?0.:camera.y)), static_cast(sprite.width * transform.scale.x), static_cast(sprite.height * transform.scale.y) }; SDL_RenderCopyEx(renderer, texture, &sprite.sourceRect, &destRect, transform.rotation, NULL, sprite.flip); } } }; #endif /* GAMEENGINE_RENDER_H */