blender_sdl files
wget https://git.christianimmanuel.de/sdl-graphics/blender_sdl/archive/blender_sdl.tar.gzmain.c raw
#include <SDL3/SDL.h>
#include <GL/glew.h>
#include <math.h>
GLuint makeShader(const char* vs_src, const char* fs_src) {
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &vs_src, NULL);
glCompileShader(vs);
GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fs, 1, &fs_src, NULL);
glCompileShader(fs);
GLuint prog = glCreateProgram();
glAttachShader(prog, vs);
glAttachShader(prog, fs);
glLinkProgram(prog);
glDeleteShader(vs);
glDeleteShader(fs);
return prog;
}
int main() {
SDL_Init(SDL_INIT_VIDEO);
SDL_Window* win = SDL_CreateWindow("Rotating Circle", 800, 600, SDL_WINDOW_OPENGL);
SDL_GLContext ctx = SDL_GL_CreateContext(win);
glewInit();
// Circle + marker
const int segments = 64;
float vertices[(segments+3)*2]; // center + perimeter + marker
vertices[0] = 0.0f; vertices[1] = 0.0f; // center
for (int i=0; i<=segments; i++) {
float angle = (float)i / segments * 2.0f * M_PI;
vertices[(i+1)*2+0] = cosf(angle) * 0.5f;
vertices[(i+1)*2+1] = sinf(angle) * 0.5f;
}
vertices[(segments+2)*2+0] = 0.5f; // marker X
vertices[(segments+2)*2+1] = 0.0f; // marker Y
GLuint vao, vbo;
glGenVertexArrays(1, &vao);
glGenBuffers(1, &vbo);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2*sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
const char* vs =
"#version 330 core\n"
"layout(location=0) in vec2 aPos;"
"uniform float angle;"
"void main(){"
" float c=cos(angle), s=sin(angle);"
" mat2 rot = mat2(c,-s,s,c);"
" gl_Position = vec4(rot*aPos,0.0,1.0);"
"}";
const char* fs =
"#version 330 core\n"
"out vec4 FragColor;"
"void main(){ FragColor = vec4(0.3,0.8,1.0,1.0); }";
GLuint prog = makeShader(vs, fs);
glUseProgram(prog);
int running = 1;
float angle = 0.0f;
while (running) {
SDL_Event e;
while (SDL_PollEvent(&e)) {
if (e.type == SDL_EVENT_QUIT) running = 0;
}
glClear(GL_COLOR_BUFFER_BIT);
angle += 0.02f;
GLint loc = glGetUniformLocation(prog, "angle");
glUniform1f(loc, angle);
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLE_FAN, 0, segments+2); // circle
glDrawArrays(GL_POINTS, segments+2, 1); // marker
SDL_GL_SwapWindow(win);
}
SDL_Quit();
return 0;
}