Program Listing for File SDL2.cpp

Return to documentation for file (gui/Demeter/Renderer/SDL2.cpp)

#include "imgui.h"
#include "imgui_impl_opengl3.h"
#include "imgui_impl_sdl2.h"

#include "logging/Logger.hpp"

#include "SDL2.hpp"

bool SDL2::Init(size_t width, size_t height)
{
  _width = width;
  _height = height;

  if (SDL_Init(SDL_INIT_VIDEO) < 0) {
    Log::failed << "SDL initialization failed! SDL_Error: " << GetError();
    return false;
  }
  _isSDLInit = true;
  SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
  SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
  SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);

  _window = SDL_CreateWindow(
    "SDL2 OpenGL Cube",
    SDL_WINDOWPOS_CENTERED,
    SDL_WINDOWPOS_CENTERED,
    _width,
    _height,
    SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
  if (_window == nullptr) {
    Log::failed << "SDL_CreateWindow failed! SDL_Error: " << GetError();
    return false;
  }

  _context = SDL_GL_CreateContext(_window);
  if (_context == nullptr) {
    Log::failed << "SDL_GL_CreateContext failed! SDL_Error: " << GetError();
    return false;
  }
  glewExperimental = GL_TRUE;
  if (glewInit() != GLEW_OK) {
    Log::failed << "GLEW initialization failed!";
    return false;
  }

  // Initial viewport setup
  SetWindowSize(_width, _height);

  // Enable depth testing
  glEnable(GL_DEPTH_TEST);
  glDepthFunc(GL_LESS);

  // enable face culling, eg: triangles facing away from the camera
  glEnable(GL_CULL_FACE);
  glCullFace(GL_BACK);  // cull back-facing polygons
  glFrontFace(GL_CCW);  // winding order, eg: determines front-facing polygons

  // Enable alpha blending
  glEnable(GL_BLEND);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

  if (IMG_Init(IMG_INIT_PNG | IMG_INIT_JPG) == 0) {
    Log::failed << "SDL_image initialization failed: " << GetIMGError();
    return false;
  }
  _isIMGInit = true;

  IMGUI_CHECKVERSION();
  ImGui::CreateContext();
  ImGuiIO &io = ImGui::GetIO();
  io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
  io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad;

  ImGui_ImplSDL2_InitForOpenGL(_window, _context);
  ImGui_ImplOpenGL3_Init();
  return true;
}

SDL2::~SDL2()
{
  if (ImGui::GetCurrentContext()) {
    ImGui_ImplOpenGL3_Shutdown();
    ImGui_ImplSDL2_Shutdown();
    ImGui::DestroyContext();
  }

  if (_isIMGInit)
    IMG_Quit();
  if (_context)
    SDL_GL_DeleteContext(_context);
  if (_window)
    SDL_DestroyWindow(_window);
  if (_isSDLInit)
    SDL_Quit();
}