Code cleanup

This commit is contained in:
Attila Uygun 2021-10-28 22:20:53 +02:00
parent 0866349f58
commit 0bb653d985
7 changed files with 53 additions and 34 deletions

View File

@ -420,7 +420,7 @@ void Enemy::StopAllEnemyUnits(bool chromatic_aberration_effect) {
continue;
if (chromatic_aberration_effect) {
e.sprite.SetCustomShader(chromatic_aberration_);
e.sprite.SetCustomShader(chromatic_aberration_.get());
e.chromatic_aberration_active_ = true;
}

View File

@ -106,7 +106,7 @@ class Enemy {
eng::SoundPlayer hit;
};
std::shared_ptr<eng::Shader> chromatic_aberration_;
std::unique_ptr<eng::Shader> chromatic_aberration_;
float chromatic_aberration_offset_ = 0;
eng::ImageQuad boss_;

View File

@ -37,13 +37,10 @@ Engine::Engine(Platform* platform, Renderer* renderer, Audio* audio)
solid_shader_ = CreateRenderResource<Shader>();
stats_ = std::make_unique<ImageQuad>();
stats_->SetZOrder(std::numeric_limits<int>::max());
}
Engine::~Engine() {
game_.reset();
stats_.reset();
singleton = nullptr;
}
@ -91,6 +88,7 @@ bool Engine::Initialize() {
return false;
SetImageSource("stats_tex", std::bind(&Engine::PrintStats, this));
stats_->SetZOrder(std::numeric_limits<int>::max());
game_ = GameFactoryBase::CreateGame("");
if (!game_) {
@ -108,6 +106,9 @@ bool Engine::Initialize() {
void Engine::Shutdown() {
LOG << "Shutting down engine.";
game_.reset();
stats_->Destory();
textures_.clear();
}
void Engine::Update(float delta_time) {
@ -119,12 +120,6 @@ void Engine::Update(float delta_time) {
game_->Update(delta_time);
// Destroy unused textures.
for (auto& t : textures_) {
if (!t.second.persistent && t.second.texture.use_count() == 1)
t.second.texture->Destroy();
}
fps_seconds_ += delta_time;
if (fps_seconds_ >= 1) {
fps_ = renderer_->GetAndResetFPS();
@ -227,15 +222,16 @@ void Engine::SetImageSource(const std::string& asset_name,
void Engine::SetImageSource(const std::string& asset_name,
CreateImageCB create_image,
bool persistent) {
std::shared_ptr<Texture> texture;
Texture* texture;
auto it = textures_.find(asset_name);
if (it != textures_.end()) {
texture = it->second.texture;
texture = it->second.texture.get();
it->second.create_image = create_image;
it->second.persistent = persistent;
} else {
texture = CreateRenderResource<Texture>();
textures_[asset_name] = {texture, create_image, persistent};
auto& t = textures_[asset_name] = {CreateRenderResource<Texture>(),
create_image, persistent, 0};
texture = t.texture.get();
}
if (persistent) {
@ -259,18 +255,33 @@ void Engine::RefreshImage(const std::string& asset_name) {
it->second.texture->Destroy();
}
std::shared_ptr<Texture> Engine::GetTexture(const std::string& asset_name) {
Texture* Engine::AcquireTexture(const std::string& asset_name) {
auto it = textures_.find(asset_name);
if (it != textures_.end()) {
if (!it->second.texture->IsValid())
RefreshImage(it->first);
return it->second.texture;
it->second.use_count++;
return it->second.texture.get();
}
std::shared_ptr<Texture> texture = CreateRenderResource<Texture>();
textures_[asset_name] = {texture};
auto& t = textures_[asset_name] = {CreateRenderResource<Texture>(), nullptr,
false, 1};
return t.texture.get();
}
return texture;
void Engine::ReleaseTexture(const std::string& asset_name) {
auto it = textures_.find(asset_name);
if (it == textures_.end())
return;
if (it->second.use_count == 0) {
DCHECK(!it->second.texture->IsValid());
return;
}
it->second.use_count--;
if (!it->second.persistent && it->second.use_count == 0)
it->second.texture->Destroy();
}
void Engine::AddInputEvent(std::unique_ptr<InputEvent> event) {

View File

@ -76,7 +76,8 @@ class Engine {
void RefreshImage(const std::string& asset_name);
std::shared_ptr<Texture> GetTexture(const std::string& asset_name);
Texture* AcquireTexture(const std::string& asset_name);
void ReleaseTexture(const std::string& asset_name);
void AddInputEvent(std::unique_ptr<InputEvent> event);
std::unique_ptr<InputEvent> GetNextInputEvent();
@ -151,9 +152,10 @@ class Engine {
// Class holding information about texture resources managed by engine.
// Texture is created from the image returned by create_image callback.
struct TextureResource {
std::shared_ptr<Texture> texture;
std::unique_ptr<Texture> texture;
CreateImageCB create_image;
bool persistent = false;
size_t use_count = 0;
};
static Engine* singleton;

View File

@ -10,11 +10,17 @@ using namespace base;
namespace eng {
ImageQuad::ImageQuad() = default;
ImageQuad::~ImageQuad() {
Destory();
}
void ImageQuad::Create(const std::string& asset_name,
std::array<int, 2> num_frames,
int frame_width,
int frame_height) {
texture_ = Engine::Get().GetTexture(asset_name);
texture_ = Engine::Get().AcquireTexture(asset_name);
num_frames_ = std::move(num_frames);
frame_width_ = frame_width;
@ -27,7 +33,8 @@ void ImageQuad::Create(const std::string& asset_name,
}
void ImageQuad::Destory() {
texture_.reset();
Engine::Get().ReleaseTexture(asset_name_);
texture_ = nullptr;
}
void ImageQuad::AutoScale() {
@ -40,7 +47,7 @@ void ImageQuad::AutoScale() {
SetSize(size);
}
void ImageQuad::SetCustomShader(std::shared_ptr<Shader> shader) {
void ImageQuad::SetCustomShader(Shader* shader) {
custom_shader_ = shader;
custom_uniforms_.clear();
}
@ -66,8 +73,8 @@ void ImageQuad::Draw(float frame_frac) {
Vector2f tex_scale = {GetFrameWidth() / texture_->GetWidth(),
GetFrameHeight() / texture_->GetHeight()};
Shader* shader = custom_shader_ ? custom_shader_.get()
: Engine::Get().GetPassThroughShader();
Shader* shader =
custom_shader_ ? custom_shader_ : Engine::Get().GetPassThroughShader();
shader->Activate();
shader->SetUniform("offset", position_);

View File

@ -2,7 +2,6 @@
#define ENGINE_IMAGE_QUAD_H
#include <array>
#include <memory>
#include <string>
#include <unordered_map>
#include <variant>
@ -17,8 +16,8 @@ class Texture;
class ImageQuad : public Animatable {
public:
ImageQuad() = default;
~ImageQuad() override = default;
ImageQuad();
~ImageQuad() override;
void Create(const std::string& asset_name,
std::array<int, 2> num_frames = {1, 1},
@ -29,7 +28,7 @@ class ImageQuad : public Animatable {
void AutoScale();
void SetCustomShader(std::shared_ptr<Shader> shader);
void SetCustomShader(Shader* shader);
template <typename T>
void SetCustomUniform(const std::string& name, T value) {
@ -54,9 +53,9 @@ class ImageQuad : public Animatable {
float,
int>;
std::shared_ptr<Texture> texture_;
Texture* texture_ = nullptr;
std::shared_ptr<Shader> custom_shader_;
Shader* custom_shader_ = nullptr;
std::unordered_map<std::string, UniformValue> custom_uniforms_;
size_t current_frame_ = 0;

View File

@ -22,9 +22,9 @@ void Texture::Update(std::unique_ptr<Image> image) {
void Texture::Destroy() {
if (IsValid()) {
DLOG << "Texture destroyed. resource_id: " << resource_id_;
renderer_->DestroyTexture(resource_id_);
resource_id_ = 0;
DLOG << "Texture destroyed. resource_id: " << resource_id_;
}
}