opengl-cpp/src/sdl.cpp

142 lines
3.4 KiB
C++
Raw Normal View History

2025-01-05 01:30:18 +00:00
#include "sdl.hpp"
#include <iostream>
SdlWindow::SdlWindow(const char* title, int width, int height)
: m_window(nullptr),
m_renderer(nullptr),
m_isRunning(false),
m_isFullscreen(false),
m_width(width),
2025-01-05 02:27:36 +00:00
m_height(height),
2025-01-05 02:41:40 +00:00
m_glContext(nullptr)
2025-01-05 01:30:18 +00:00
{
2025-01-05 02:27:36 +00:00
// 1. Set attributes
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
2025-01-05 01:30:18 +00:00
2025-01-05 02:41:40 +00:00
// 2. Create the window with OpenGL flag
m_window = SDL_CreateWindow(title,
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
width,
height,
SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
2025-01-05 01:30:18 +00:00
if (!m_window) {
std::cerr << "Failed to create window: " << SDL_GetError() << std::endl;
return;
}
2025-01-05 02:41:40 +00:00
// 3. Create OpenGL context
m_glContext = SDL_GL_CreateContext(m_window);
if (!m_glContext) {
std::cerr << "Failed to create GL context: " << SDL_GetError() << std::endl;
return;
}
// 4. Optionally init GLEW (if not on macOS core profile)
#ifndef __APPLE__
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK) {
std::cerr << "Failed to init GLEW" << std::endl;
return;
2025-01-05 01:30:18 +00:00
}
2025-01-05 02:41:40 +00:00
#endif
2025-01-05 01:30:18 +00:00
2025-01-05 02:41:40 +00:00
// 5. Set vsync (optional)
SDL_GL_SetSwapInterval(1);
// 6. Mark as running
m_isRunning = true;
2025-01-05 01:30:18 +00:00
m_isRunning = true;
}
SdlWindow::~SdlWindow() {
2025-01-05 02:41:40 +00:00
// If using SDL Renderer, destroy it. But if youre purely using OpenGL, you might remove it.
2025-01-05 01:30:18 +00:00
if (m_renderer) {
2025-01-05 02:41:40 +00:00
SDL_DestroyRenderer(m_renderer);
m_renderer = nullptr;
2025-01-05 01:30:18 +00:00
}
2025-01-05 02:41:40 +00:00
// Delete the OpenGL context
if (m_glContext) {
SDL_GL_DeleteContext(m_glContext);
m_glContext = nullptr;
}
2025-01-05 01:30:18 +00:00
if (m_window) {
2025-01-05 02:41:40 +00:00
SDL_DestroyWindow(m_window);
m_window = nullptr;
2025-01-05 01:30:18 +00:00
}
2025-01-05 02:41:40 +00:00
2025-01-05 01:30:18 +00:00
SDL_Quit();
}
2025-01-05 02:41:40 +00:00
2025-01-05 01:30:18 +00:00
void SdlWindow::run() {
while (m_isRunning) {
processEvents();
update();
render();
}
}
void SdlWindow::processEvents() {
SDL_Event event;
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
m_isRunning = false;
}
// Handle other events (keyboard, mouse, etc.) here if needed
else if (event.type == SDL_KEYDOWN) {
// Check if the key pressed is Enter/Return
if (event.key.keysym.sym == SDLK_RETURN) {
std::cout << "input detected" << std::endl;
}
if (event.key.keysym.sym == SDLK_SPACE) {
std::cout << "Full screen togled!" << std::endl;
setFullscreen(!m_isFullscreen);
}
if (event.key.keysym.sym == SDLK_ESCAPE) {
std::cout << "Bye!" << std::endl;
m_isRunning = false; //exit application
}
}
}
}
void SdlWindow::update() {
// Update game/application logic here
}
void SdlWindow::render() {
2025-01-05 02:41:40 +00:00
// Use GL calls instead of SDLs renderer
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
2025-01-05 01:30:18 +00:00
2025-01-05 02:41:40 +00:00
// TODO: Draw with OpenGL here (shaders, triangles, etc.)
2025-01-05 01:30:18 +00:00
2025-01-05 02:41:40 +00:00
// Swap buffers
SDL_GL_SwapWindow(m_window);
2025-01-05 01:30:18 +00:00
}
void SdlWindow::change_res(int newWidth, int newHeight)
{
// Just call SDL_SetWindowSize
if (m_window) {
SDL_SetWindowSize(m_window, newWidth, newHeight);
}
}
void SdlWindow::setFullscreen(bool fullscreen) {
if (m_window) {
m_isFullscreen = fullscreen;
if (m_isFullscreen) {
SDL_SetWindowFullscreen(m_window, SDL_WINDOW_FULLSCREEN_DESKTOP);
} else {
SDL_SetWindowFullscreen(m_window, 0); // return to windowed
change_res(m_width, m_height);
}
}
}