Nimbin2git.christianimmanuel.de / SDL & Graphics / blender_sdl / main.c

blender_sdl files

last change 2026-09-04 (2 hours ago)

wget https://git.christianimmanuel.de/sdl-graphics/blender_sdl/archive/blender_sdl.tar.gz
main.c 2.6 KB · 89 lines 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;
}