Rename main.c to sdl2-sdlrenderer.c and implement sdl2-opengl3 example

This commit is contained in:
Abdelrahman Said 2024-09-10 00:23:10 +01:00
parent 0658fcf39d
commit eef16a695e
5 changed files with 167 additions and 4 deletions

3
.gitignore vendored
View File

@ -1,5 +1,6 @@
.cache
compile_commands.json
main
sdl2-sdlrenderer
sdl2-opengl3
extern
imgui.ini

View File

@ -3,7 +3,10 @@
CC=clang
CFLAGS="-g -Wall $(pkg-config --cflags sdl2) -Wl,-rpath,\$ORIGIN/lib -Ivendor"
LIBS="$(pkg-config --libs sdl2) -Llib -lcimgui"
SRC=src/*.c
OUT=main
SDL2_SDLRENDERER=src/sdl2-sdlrenderer.c
SDLRENDERER_OUT=sdl2-sdlrenderer
SDL2_OPENGL3=src/sdl2-opengl3.c
OPENGL3_OUT=sdl2-opengl3
(set -x ; $CC $CFLAGS $LIBS $SRC -o $OUT)
(set -x ; $CC $CFLAGS $LIBS $SDL2_SDLRENDERER -o $SDLRENDERER_OUT)
(set -x ; $CC $CFLAGS $LIBS -lGL -ldl $SDL2_OPENGL3 -o $OPENGL3_OUT)

Binary file not shown.

159
src/sdl2-opengl3.c Normal file
View File

@ -0,0 +1,159 @@
#include "SDL_rect.h"
#include <SDL2/SDL.h>
#include <SDL2/SDL_events.h>
#include <SDL2/SDL_opengl.h>
#include <SDL2/SDL_render.h>
#include <SDL2/SDL_video.h>
#include <stdint.h>
#include <stdio.h>
#define CIMGUI_DEFINE_ENUMS_AND_STRUCTS
#include "cimgui/cimgui.h"
#define CIMGUI_USE_OPENGL3
#define CIMGUI_USE_SDL2
#include "cimgui/cimgui_impl.h"
#include <GL/gl.h>
#include <GL/glu.h>
#include <stdbool.h>
#define WINDOW_WIDTH 1280
#define WINDOW_HEIGHT 720
int main(void) {
SDL_Init(SDL_INIT_EVERYTHING);
const char *glsl_version = "#version 130";
SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
// Create window with graphics context
SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl");
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
SDL_DisplayMode current;
SDL_GetCurrentDisplayMode(0, &current);
SDL_WindowFlags window_flags =
(SDL_WindowFlags)(SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL |
SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI);
SDL_Window *window =
SDL_CreateWindow("Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
WINDOW_WIDTH, WINDOW_HEIGHT, window_flags);
SDL_GLContext gl_context = SDL_GL_CreateContext(window);
SDL_GL_MakeCurrent(window, gl_context);
SDL_GL_SetSwapInterval(1); // Enable vsync
igCreateContext(NULL);
ImGuiIO *io = igGetIO();
// Enable Keyboard Controls
io->ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
// Enable Gamepad Controls
io->ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad;
io->ConfigFlags |= ImGuiConfigFlags_DockingEnable;
io->ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;
igStyleColorsDark(NULL);
ImGuiStyle *style = igGetStyle();
if (io->ConfigFlags & ImGuiConfigFlags_ViewportsEnable) {
style->WindowRounding = 0.0f;
style->Colors[ImGuiCol_WindowBg].w = 1.0f;
}
if (!ImGui_ImplSDL2_InitForOpenGL(window, gl_context) ||
!ImGui_ImplOpenGL3_Init(glsl_version)) {
goto IMGUI_FAILED;
}
bool running = true;
bool show_demo_window = true;
ImVec4 clear_color = {0.45f, 0.55f, 0.60f, 1.00f};
SDL_Event event = {0};
while (running) {
while (SDL_PollEvent(&event)) {
ImGui_ImplSDL2_ProcessEvent(&event);
switch (event.type) {
case SDL_QUIT:
running = false;
break;
case SDL_WINDOWEVENT:
if (event.window.event == SDL_WINDOWEVENT_CLOSE &&
event.window.windowID == SDL_GetWindowID(window)) {
running = false;
}
break;
}
}
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplSDL2_NewFrame();
igNewFrame();
if (show_demo_window) {
igShowDemoWindow(&show_demo_window);
}
{
static float f = 0.0f;
static int counter = 0;
igBegin("Hello, world!", NULL, 0);
igText("This is some useful text.");
igCheckbox("Demo Window", &show_demo_window);
igSliderFloat("float", &f, 0.0f, 1.0f, "0.3f", 0);
igColorEdit3("clear color", (float *)&clear_color, 0);
if (igButton("Button", (ImVec2){0, 0})) {
counter++;
}
igSameLine(0.0f, -1.0f);
igText("counter = %d", counter);
igText("Application average %.3f ms/frame (%.1f FPS)",
1000.0f / io->Framerate, io->Framerate);
igEnd();
}
igRender();
glViewport(0, 0, (int)io->DisplaySize.x, (int)io->DisplaySize.y);
glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w,
clear_color.z * clear_color.w, clear_color.w);
glClear(GL_COLOR_BUFFER_BIT);
ImGui_ImplOpenGL3_RenderDrawData(igGetDrawData());
if (io->ConfigFlags & ImGuiConfigFlags_ViewportsEnable) {
SDL_Window *backup_current_window = SDL_GL_GetCurrentWindow();
SDL_GLContext backup_current_context = SDL_GL_GetCurrentContext();
igUpdatePlatformWindows();
igRenderPlatformWindowsDefault(NULL, NULL);
SDL_GL_MakeCurrent(backup_current_window, backup_current_context);
}
SDL_GL_SwapWindow(window);
}
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplSDL2_Shutdown();
igDestroyContext(NULL);
IMGUI_FAILED:
SDL_GL_DeleteContext(gl_context);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}