Improves renderer and adds shader support
Adds shader class to core and modifies the renderer to use it, while also adding profiling macros and fixing resize issues. The changes ensure the render target is resized only when the requested size is different from the current size and also clears the screen to a dark gray color.
This commit is contained in:
parent
4194764d7a
commit
f7e0882597
@ -99,6 +99,7 @@ add_library(Core STATIC
|
||||
src/core/systems/Asset.h
|
||||
src/core/systems/assets/Texture2D.cpp
|
||||
src/core/systems/assets/Texture2D.h
|
||||
src/core/systems/Shader.cpp
|
||||
)
|
||||
|
||||
target_include_directories(Core PUBLIC src/core)
|
||||
|
@ -3,17 +3,29 @@
|
||||
#include <glm/gtc/matrix_transform.hpp>
|
||||
#include <iostream>
|
||||
|
||||
namespace OX {
|
||||
|
||||
namespace OX
|
||||
{
|
||||
// ——— Camera2D implementation (unchanged) ———
|
||||
Camera2D::Camera2D(float left, float right, float bottom, float top)
|
||||
: _left(left), _right(right), _bottom(bottom), _top(top)
|
||||
{ Recalculate(); }
|
||||
{
|
||||
Recalculate();
|
||||
}
|
||||
|
||||
void Camera2D::SetPosition(const glm::vec2& pos) { _position = pos; Recalculate(); }
|
||||
void Camera2D::SetZoom(float z) { _zoom = z; Recalculate(); }
|
||||
void Camera2D::SetPosition(const glm::vec2 &pos)
|
||||
{
|
||||
_position = pos;
|
||||
Recalculate();
|
||||
}
|
||||
|
||||
void Camera2D::Recalculate() {
|
||||
void Camera2D::SetZoom(float z)
|
||||
{
|
||||
_zoom = z;
|
||||
Recalculate();
|
||||
}
|
||||
|
||||
void Camera2D::Recalculate()
|
||||
{
|
||||
float halfW = (_right - _left) * 0.5f / _zoom;
|
||||
float halfH = (_top - _bottom) * 0.5f / _zoom;
|
||||
glm::mat4 proj = glm::ortho(-halfW, halfW, -halfH, halfH, -1.0f, 1.0f);
|
||||
@ -24,15 +36,21 @@ void Camera2D::Recalculate() {
|
||||
const glm::mat4 &Camera2D::GetViewProjection() const { return _viewProj; }
|
||||
|
||||
// ——— Renderer ———
|
||||
Renderer::~Renderer() {
|
||||
if (m_quadVAO) glDeleteVertexArrays(1, &m_quadVAO);
|
||||
if (m_quadVBO) glDeleteBuffers(1, &m_quadVBO);
|
||||
if (m_fbo) glDeleteFramebuffers(1, &m_fbo);
|
||||
Renderer::~Renderer()
|
||||
{
|
||||
if (m_quadVAO)
|
||||
glDeleteVertexArrays(1, &m_quadVAO);
|
||||
if (m_quadVBO)
|
||||
glDeleteBuffers(1, &m_quadVBO);
|
||||
if (m_fbo)
|
||||
glDeleteFramebuffers(1, &m_fbo);
|
||||
if (m_colorTex) glDeleteTextures(1, &m_colorTex);
|
||||
if (m_depthRBO) glDeleteRenderbuffers(1, &m_depthRBO);
|
||||
if (m_depthRBO)
|
||||
glDeleteRenderbuffers(1, &m_depthRBO);
|
||||
}
|
||||
|
||||
void Renderer::Init(int targetWidth, int targetHeight) {
|
||||
void Renderer::Init(int targetWidth, int targetHeight)
|
||||
{
|
||||
// create offscreen FBO & attachments
|
||||
CreateFramebuffer(targetWidth, targetHeight);
|
||||
|
||||
@ -66,11 +84,16 @@ void Renderer::Init(int targetWidth, int targetHeight) {
|
||||
CreateQuad();
|
||||
}
|
||||
|
||||
void Renderer::CreateFramebuffer(int width, int height) {
|
||||
void Renderer::CreateFramebuffer(int width, int height)
|
||||
{
|
||||
size = {width, height};
|
||||
|
||||
// cleanup old
|
||||
if (m_fbo) glDeleteFramebuffers(1, &m_fbo);
|
||||
if (m_fbo)
|
||||
glDeleteFramebuffers(1, &m_fbo);
|
||||
if (m_colorTex) glDeleteTextures(1, &m_colorTex);
|
||||
if (m_depthRBO) glDeleteRenderbuffers(1, &m_depthRBO);
|
||||
if (m_depthRBO)
|
||||
glDeleteRenderbuffers(1, &m_depthRBO);
|
||||
|
||||
// color texture
|
||||
glGenTextures(1, &m_colorTex);
|
||||
@ -100,16 +123,23 @@ void Renderer::CreateFramebuffer(int width, int height) {
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
}
|
||||
|
||||
void Renderer::ResizeTarget(int width, int height) {
|
||||
void Renderer::ResizeTarget(int width, int height)
|
||||
{
|
||||
OX_PROFILE_FUNCTION();
|
||||
if (size == Vec2i{width, height}) {
|
||||
return;
|
||||
}
|
||||
CreateFramebuffer(width, height);
|
||||
}
|
||||
|
||||
void Renderer::BeginScene(const Camera2D& camera) {
|
||||
void Renderer::BeginScene(const Camera2D &camera)
|
||||
{
|
||||
OX_PROFILE_FUNCTION();
|
||||
// bind offscreen
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
|
||||
// clear
|
||||
glViewport(0, 0, /*width*/0, /*height*/0); // you may want to track size
|
||||
glClearColor(0,0,0,1);
|
||||
glViewport(0, 0, size.x, size.y);
|
||||
glClearColor(0.1f, 0.1f, 0.1f, 1);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
// setup shader & camera
|
||||
@ -119,7 +149,8 @@ void Renderer::BeginScene(const Camera2D& camera) {
|
||||
m_shader.SetInt("u_Texture", 0);
|
||||
}
|
||||
|
||||
void Renderer::DrawSprite(const Sprite& s) {
|
||||
void Renderer::DrawSprite(const Sprite &s)
|
||||
{
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, s.textureID);
|
||||
|
||||
@ -130,12 +161,14 @@ void Renderer::DrawSprite(const Sprite& s) {
|
||||
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr);
|
||||
}
|
||||
|
||||
void Renderer::EndScene() {
|
||||
void Renderer::EndScene()
|
||||
{
|
||||
// unbind FBO → subsequent draws go to default framebuffer
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
}
|
||||
|
||||
void Renderer::CreateQuad() {
|
||||
void Renderer::CreateQuad()
|
||||
{
|
||||
float verts[] = {
|
||||
-0.5f, -0.5f, 0, 0,
|
||||
0.5f, -0.5f, 1, 0,
|
||||
@ -158,5 +191,4 @@ void Renderer::CreateQuad() {
|
||||
|
||||
glBindVertexArray(0);
|
||||
}
|
||||
|
||||
} // namespace OX
|
||||
|
@ -4,7 +4,7 @@
|
||||
#include "glm/glm.hpp"
|
||||
#include "systems/Shader.h"
|
||||
#include <gl/glew.h>
|
||||
|
||||
#include "types/vec2.h"
|
||||
namespace OX {
|
||||
|
||||
struct Sprite {
|
||||
@ -54,6 +54,7 @@ namespace OX {
|
||||
|
||||
private:
|
||||
// offscreen
|
||||
Vec2i size;
|
||||
GLuint m_fbo = 0;
|
||||
GLuint m_colorTex = 0;
|
||||
GLuint m_depthRBO = 0;
|
||||
|
@ -24,7 +24,7 @@ namespace OX
|
||||
|
||||
void Use() const;
|
||||
|
||||
void CheckHotReload(); // 🔥
|
||||
void CheckHotReload();
|
||||
|
||||
GLuint GetID() const { return m_programID; }
|
||||
|
||||
|
@ -146,7 +146,7 @@ namespace OX
|
||||
|
||||
// --- Render ImGui onto FBO 0 ---
|
||||
{
|
||||
OX_PROFILE_LABEL("VSYNC Wait");
|
||||
|
||||
|
||||
ImGui::EndFrame();
|
||||
ImGui::Render();
|
||||
|
@ -1,6 +1,7 @@
|
||||
// File: src/FileBrowser.cpp
|
||||
#include "FileBrowser.h"
|
||||
#include <filesystem>
|
||||
#include "systems/Profiler.h"
|
||||
|
||||
namespace OX
|
||||
{
|
||||
@ -13,6 +14,7 @@ namespace OX
|
||||
|
||||
void FileBrowser::Draw(const char *title)
|
||||
{
|
||||
OX_PROFILE_FUNCTION();
|
||||
ImGui::Begin(title);
|
||||
|
||||
// --- toolbar now contains back button, inline path, filter & view toggle all on one row ---
|
||||
@ -86,6 +88,7 @@ namespace OX
|
||||
// ——— Polished grid view ———
|
||||
void FileBrowser::DrawGridView(const std::shared_ptr<ResourceTreeNode> &node)
|
||||
{
|
||||
OX_PROFILE_FUNCTION();
|
||||
const float cellW = _cfg.thumbnailSize + _cfg.padding * 2;
|
||||
ImVec2 avail = ImGui::GetContentRegionAvail();
|
||||
int cols = std::max(1, int(avail.x / cellW));
|
||||
@ -93,9 +96,7 @@ namespace OX
|
||||
ImGui::BeginChild("GridRegion", ImVec2(0, 0), false, ImGuiWindowFlags_AlwaysUseWindowPadding);
|
||||
ImGui::Columns(cols, nullptr, false);
|
||||
|
||||
std::vector<std::shared_ptr<ResourceTreeNode> > children;
|
||||
|
||||
{
|
||||
std::vector<std::shared_ptr<ResourceTreeNode> > children; {
|
||||
std::lock_guard<std::mutex> lock(AssetManager::s_TreeMutex); // assume you add this mutex
|
||||
children = node->children;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user