added batch rendering

This commit is contained in:
Erris
2026-02-03 14:52:21 +01:00
parent 7b4950dda0
commit 01a8f03451
20 changed files with 331 additions and 175 deletions

View File

@@ -7,6 +7,7 @@ class ControlLayer : public OpenEngine::Layer
{
public:
ControlLayer(OpenEngine::Ref<OpenEngine::Layer> layer);
ControlLayer();
~ControlLayer() = default;
void OnUpdate() override;
@@ -17,6 +18,7 @@ class ControlLayer : public OpenEngine::Layer
private:
bool SwitchLayer(OpenEngine::KeyPressedEvent& event);
bool SwitchExistingLayer(OpenEngine::KeyPressedEvent& event);
bool StopRunning(OpenEngine::KeyPressedEvent& event);
OpenEngine::Ref<OpenEngine::Layer> active_layer;

View File

@@ -8,19 +8,18 @@
"""
*/
#include <glm/ext/matrix_clip_space.hpp>
#include <open_engine.hpp>
#include <glm/ext/matrix_clip_space.hpp>
#include "freetype/fttypes.h"
#include "open_engine/events/event.hpp"
#include "open_engine/logging.hpp"
#include "open_engine/renderer/shader.hpp"
#include "open_engine/ref_scope.hpp"
#include "shmup.hpp"
#include <freetype2/ft2build.h>
#include FT_FREETYPE_H
#include <glad/glad.h>
#include <map>
struct Character {
unsigned int texture_id; // ID handle of the glyph texture
glm::ivec2 size; // Size of glyph
@@ -31,7 +30,8 @@ struct Character {
class Overlay : public OpenEngine::Layer
{
public:
Overlay()
Overlay(OpenEngine::Ref<Shmup>& shmup)
: game_layer(shmup)
{};
~Overlay() {};
@@ -205,7 +205,36 @@ class Overlay : public OpenEngine::Layer
float x = height - 40;
float y = 0;
//RenderText("Test String", 0.0f, 0.0f, 1.0f, {0.8f, 0.3f, 0.2f});
switch (game_layer->GetGameState()) {
case GameState::GameOver:
{
auto& window = OpenEngine::Application::Get().GetWindow();
int width = window.GetWidth();
int height = window.GetHeight();
float x = width / 2.0f;
float y = height / 2.0f;
RenderTextCentered("Game Over!", x, y, 1.0f, glm::vec3(0.8f, 0.2f, 0.3f));
break;
}
case GameState::Paused:
RenderTextCentered("Paused", x, y, 1.0f, glm::vec3(0.8f, 0.2f, 0.3f));
break;
case GameState::Playing:
break;
}
std::string s_score = "Score: " + std::to_string(game_layer->GetScore());
std::string s_lives = std::to_string(game_layer->GetLives()) + " lives";
RenderText(s_score, 10, OpenEngine::Application::Get().GetWindow().GetHeight() - 50, 1.0f, {0.8f, 0.2f, 0.3f});
RenderText(
s_lives,
OpenEngine::Application::Get().GetWindow().GetWidth() - 220,
OpenEngine::Application::Get().GetWindow().GetHeight() - 50,
1.0f,
{0.8f, 0.2f, 0.3f});
};
void OnEvent(OpenEngine::Event& event) override
@@ -216,6 +245,7 @@ class Overlay : public OpenEngine::Layer
std::map<char, Character> characters;
OpenEngine::Ref<OpenEngine::Shader> text_shader;
glm::mat4 projection;
OpenEngine::Ref<Shmup> game_layer;
unsigned int VAO, VBO;
};

View File

@@ -1,13 +1,12 @@
#ifndef SANDBOX_HPP
#define SANDBOX_HPP
#include "open_engine/core/time.hpp"
#include <glm/fwd.hpp>
#include <open_engine.hpp>
#include "open_engine/core/time.hpp"
#include <glm/ext/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <glm/fwd.hpp>
#include <imgui.h>
#include <glad/glad.h>
#include <GLFW/glfw3.h>

View File

@@ -1,12 +1,8 @@
#ifndef SHMUP_HPP
#define SHMUP_HPP
#include <iostream>
#include <open_engine.hpp>
#include "imgui.h"
#include "overlay.hpp"
#include <fstream>
#include <dlfcn.h>
#include <glm/ext/matrix_transform.hpp>
@@ -16,12 +12,18 @@
#include <unistd.h>
#include <vector>
enum class GameState
{
Playing,
Paused,
GameOver
};
class Shmup : public OpenEngine::Layer
{
public:
Shmup(OpenEngine::Ref<Overlay>& overlay)
: OpenEngine::Layer("shmup"), overlay(overlay),
camera((float)OpenEngine::Application::Get().GetWindow().GetWidth() /
Shmup()
: camera((float)OpenEngine::Application::Get().GetWindow().GetWidth() /
OpenEngine::Application::Get().GetWindow().GetHeight(), 1.0f)
{
}
@@ -37,8 +39,6 @@ class Shmup : public OpenEngine::Layer
bullet_tx = OpenEngine::Texture2D::Create("assets/textures/shmup/bullet.png");
}
tr1 = {glm::vec3(0.0f, -0.9f, 1.0f), glm::vec3(0.1f), 0.0f};
LoadMap();
}
@@ -69,7 +69,7 @@ class Shmup : public OpenEngine::Layer
return overlapX && overlapY;
}
void MoveShip()
void MovePlayerShip()
{
double delta = OpenEngine::Time::DeltaTime();
if (OpenEngine::Input::IsKeyPressed(OpenEngine::KeyCode::Up)) {
@@ -95,30 +95,77 @@ class Shmup : public OpenEngine::Layer
tr1.position.x = 0.8;
}
bool MovePlayerShipDiscrete(OpenEngine::KeyPressedEvent& event)
{
if (state == GameState::Playing) {
double delta = OpenEngine::Time::DeltaTime();
if (event.GetKeyCode() == OpenEngine::KeyCode::Right) {
tr1.position.x += 0.1f;
}
if (event.GetKeyCode() == OpenEngine::KeyCode::Left) {
tr1.position.x -= 0.1f;
}
if (tr1.position.y <= -0.9)
tr1.position.y = -0.9;
if (tr1.position.y >= -0.3)
tr1.position.y = -0.3;
if (tr1.position.x <= -0.8)
tr1.position.x = -0.8;
if (tr1.position.x >= 0.8)
tr1.position.x = 0.8;
}
return true;
}
void MoveEntities(double time_step) {
double delta = time_step;
// Updating enemy positions
for (auto& enemy : enemies) {
enemy.position.y -= 0.3 * delta;
if (state == GameState::Playing && (enemy.position.y <= -1.1 || CheckCollision(
GetBounds(enemy.position, enemy.size),
GetBounds(tr1.position, tr1.size))))
lives--;
}
// Updating friendly bullets positions
for (auto& bullet : bullets) {
bullet.position.y += 1.1 * delta;
}
}
void UpdateEntity()
{
double delta = OpenEngine::Time::DeltaTime();
for (auto& enemy : enemies) {
enemy.position.y -= 0.3 * delta;
if (enemy.position.y <= -1.1 || CheckCollision(
GetBounds(enemy.position, enemy.size),
GetBounds(tr1.position, tr1.size))){
lives--;
}
}
for (auto& bullet : bullets) {
bullet.position.y += 1.1 * delta;
}
MoveEntities(delta);
// Deletes enemies offscreen
std::erase_if(enemies, [](const auto& enemy) {
return enemy.position.y <= -1.1f;
});
// Deletes bullets offscreen
std::erase_if(bullets, [](const auto& bullet) {
return bullet.position.y >= 1.2f;
});
// Lowers lives upon collision between player and enemy
for (auto& enemy : enemies) {
if (state == GameState::Playing) {
if (enemy.position.y <= -1.1)
lives--;
if (CheckCollision(
GetBounds(enemy.position, enemy.size),
GetBounds(tr1.position, tr1.size)))
lives = 0;
}
}
// Deletes enemy and bullet and increases score after collision
for (auto& bullet : bullets) {
for (auto& enemy : enemies) {
Bounds bullet_bounds = GetBounds(bullet.position, bullet.size);
@@ -135,33 +182,15 @@ class Shmup : public OpenEngine::Layer
}
}
}
}
void GameOver()
void Render()
{
paused = true;
auto& window = OpenEngine::Application::Get().GetWindow();
int width = window.GetWidth();
int height = window.GetHeight();
enemies.clear();
bullets.clear();
float x = width / 2.0f;
float y = height / 2.0f;
overlay->RenderTextCentered("Game Over!", x, y, 1.0f, glm::vec3(0.8f, 0.2f, 0.3f));
};
void OnUpdate() override
{
float delta = OpenEngine::Time::DeltaTime();
OE_PROFILE_FUNCTION()
{
OE_PROFILE_SCOPE("Setting up Rendering");
//OpenEngine::RenderCommand::SetClearColor({0.11f, 0.11f, 0.15f, 1.0f});
OpenEngine::RenderCommand::SetClearColor({1.0f, 1.0f, 1.0f, 1.0f});
OpenEngine::RenderCommand::SetClearColor({0.11f, 0.11f, 0.15f, 1.0f});
OpenEngine::RenderCommand::Clear();
OpenEngine::Renderer2D::BeginScene(camera.GetCamera());
}
@@ -177,75 +206,69 @@ class Shmup : public OpenEngine::Layer
OpenEngine::Renderer2D::EndScene();
if (!paused) {
}
void OnUpdate() override
{
float delta = OpenEngine::Time::DeltaTime();
Render();
UpdateEntity();
if (state == GameState::Playing) {
if (spawn_cooldown >= spawn_min_time) {
SpawnEnemyRandom();
//ReadMap();
//SpawnEnemyRandom();
ReadMap();
spawn_cooldown = 0;
if (spawn_min_time > 0.5)
spawn_min_time -= 0.01;
}
MoveShip();
UpdateEntity();
//MovePlayerShip();
if (shooting)
SpawnBullet();
for (auto& enemy : enemies) {
if (CheckCollision(GetBounds(enemy.position, enemy.size), GetBounds(tr1.position, tr1.size)))
game_over = true;
}
shot_cooldown += delta;
spawn_cooldown += delta;
}
if (lives <= 0)
game_over = true;
if (game_over)
GameOver();
std::string s_score = "Score: " + std::to_string(score);
std::string s_lives = std::to_string(lives) + " lives";
overlay->RenderText(s_score, 10, OpenEngine::Application::Get().GetWindow().GetHeight() - 50, 1.0f, {0.8f, 0.2f, 0.3f});
overlay->RenderText(
s_lives,
OpenEngine::Application::Get().GetWindow().GetWidth() - 220,
OpenEngine::Application::Get().GetWindow().GetHeight() - 50,
1.0f,
{0.8f, 0.2f, 0.3f});
state = GameState::GameOver;
}
void Reset()
{
tr1 = {glm::vec3(0.0f, -0.9f, 1.0f), glm::vec3(0.1f), 0.0f};
tr1 = {glm::vec3(0.0f, -0.9f, -0.1f), glm::vec3(0.1f), 0.0f};
score = 0;
lives = 5;
game_over = false;
paused = false;
bullets.clear();
enemies.clear();
state = GameState::Playing;
}
void SpawnEnemyRandom()
{
static std::uniform_int_distribution<int> dist{-8, 8};
OpenEngine::Transform enemy_tr({glm::vec3(dist(rd)/10.0f, 1.2f, -0.1f), glm::vec3(0.1f), 180.0f});
enemies.emplace_back(enemy_tr);
SpawnEnemy(dist(rd));
};
void SpawnEnemy(int x)
{
OpenEngine::Transform enemy_tr({{x/10.0f, 1.2f, 0.0f}, glm::vec3(0.1f), 180.0f});
OpenEngine::Transform enemy_tr({{x/10.0f, 1.2f, 0.1f}, glm::vec3(0.1f), 180.0f});
enemies.emplace_back(enemy_tr);
};
void LoadMap()
void LoadMap(const char* path = "assets/maps/lvl1.txt")
{
std::string buffer;
std::ifstream map_file("assets/maps/lvl1.txt");
std::ifstream map_file(path);
while (std::getline(map_file, buffer)) {
map.emplace_back(buffer);
@@ -289,7 +312,7 @@ class Shmup : public OpenEngine::Layer
if (event.GetKeyCode() == OpenEngine::KeyCode::Space) {
shooting = true;
}
if (game_over && event.GetKeyCode() == OpenEngine::KeyCode::Enter) {
if (state == GameState::GameOver && event.GetKeyCode() == OpenEngine::KeyCode::Enter) {
Reset();
}
@@ -310,6 +333,7 @@ class Shmup : public OpenEngine::Layer
OpenEngine::EventDispatcher dispatcher(event);
dispatcher.Dispatch<OpenEngine::KeyPressedEvent>(BIND_EVENT_FN(Shmup::ProcessKeyPressedEvents));
dispatcher.Dispatch<OpenEngine::KeyPressedEvent>(BIND_EVENT_FN(Shmup::MovePlayerShipDiscrete));
dispatcher.Dispatch<OpenEngine::KeyReleasedEvent>(BIND_EVENT_FN(Shmup::ProcessKeyReleased));
{
OE_PROFILE_SCOPE("Camera OnEvent");
@@ -317,26 +341,23 @@ class Shmup : public OpenEngine::Layer
}
}
void OnImGuiRender() override
{
ImGuiIO io = ImGui::GetIO();
static auto m_Font = io.Fonts->AddFontFromFileTTF("/usr/share/fonts/TTF/JetBrainsMono-Regular.ttf", 120.0f);
//void OnImGuiRender() override
//{
// ImGuiIO io = ImGui::GetIO();
// static auto m_Font = io.Fonts->AddFontFromFileTTF("/usr/share/fonts/TTF/JetBrainsMono-Regular.ttf", 120.0f);
ImGui::GetForegroundDrawList()->AddText(m_Font, 48.0f, {5.0f, 5.0f}, 0xffffffff, "test");
}
// ImGui::GetForegroundDrawList()->AddText(m_Font, 48.0f, {5.0f, 5.0f}, 0xffffffff, "test");
//}
GameState GetGameState() { return state; };
int GetScore() { return score; };
int GetLives() { return lives; };
private:
//glm::vec3 square_pos = glm::vec3(0.0f);
//glm::vec4 square_color = glm::vec4(1.0f);
bool paused = false;
bool game_over = false;
//float color[4] = {0.5f, 0.3f, 0.4f, 1.0f};
OpenEngine::Ref<OpenEngine::Texture2D> ship;
OpenEngine::Ref<OpenEngine::Texture2D> enemy_ship;
OpenEngine::Ref<OpenEngine::Texture2D> bullet_tx;
OpenEngine::Transform tr1;
OpenEngine::Transform tr1 = {glm::vec3(0.0f, -0.9f, -0.1f), glm::vec3(0.1f), 0.0f};
std::vector<OpenEngine::Transform> enemies, bullets;
int score = 0;
int lives = 5;
@@ -349,12 +370,10 @@ class Shmup : public OpenEngine::Layer
std::random_device rd;
std::mt19937 e{rd()}; // or std::default_random_engine e{rd()};
//std::unordered_map<std::string, unsigned int> bindings;
OpenEngine::OrthographicCameraController camera;
GameState state = GameState::Playing;
OpenEngine::Ref<Overlay> overlay;
//std::vector<OpenEngine::Time::ProfilingResult> profiling_results;
//OpenEngine::Ref<Overlay> overlay;
};
#endif // SHMUP_HPP