From f9affee522f93e3e54514b39467257ee6b8abf9d Mon Sep 17 00:00:00 2001 From: Dominic Masters Date: Tue, 12 Aug 2025 20:01:54 -0500 Subject: [PATCH] PSP rendering --- CMakeLists.txt | 4 +- src/dusksdl2/display/render.c | 137 ++++++++++------------------------ 2 files changed, 40 insertions(+), 101 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ef97795..261b240 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,8 +10,8 @@ set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules) if(NOT DEFINED DUSK_TARGET_SYSTEM) - # set(DUSK_TARGET_SYSTEM "linux") - set(DUSK_TARGET_SYSTEM "psp") + set(DUSK_TARGET_SYSTEM "linux") + # set(DUSK_TARGET_SYSTEM "psp") endif() # Prep cache diff --git a/src/dusksdl2/display/render.c b/src/dusksdl2/display/render.c index a69d864..72cecfa 100644 --- a/src/dusksdl2/display/render.c +++ b/src/dusksdl2/display/render.c @@ -19,33 +19,20 @@ SDL_Renderer *RENDER_RENDERER; SDL_GLContext RENDER_GL_CONTEXT; bool_t RENDER_RUNNING; -// Add VAO and VBO handles -static GLuint TRIANGLE_VAO = 0; -static GLuint TRIANGLE_VBO = 0; +GLuint TRIANGLE_VAO = 0; +GLuint TRIANGLE_VBO = 0; -// Shader handles -static GLuint TRIANGLE_SHADER_PROGRAM = 0; -static GLuint TRIANGLE_VERTEX_SHADER = 0; -static GLuint TRIANGLE_FRAGMENT_SHADER = 0; +typedef struct { + GLubyte color[4]; // GL_COLOR_ARRAY: 4 x GL_UNSIGNED_BYTE (RGBA) + GLfloat pos[3]; // GL_VERTEX_ARRAY: 3 x GL_FLOAT (XYZ) +} VertexCV; -// Vertex and Fragment shader sources -static const char* TRIANGLE_VERTEX_SHADER_SRC = - "#version 130\n" - "in vec2 position;\n" - "in vec3 color;\n" - "out vec3 vColor;\n" - "void main() {\n" - " vColor = color;\n" - " gl_Position = vec4(position, 0.0, 1.0);\n" - "}\n"; - -static const char* TRIANGLE_FRAGMENT_SHADER_SRC = - "#version 130\n" - "in vec3 vColor;\n" - "out vec4 fragColor;\n" - "void main() {\n" - " fragColor = vec4(vColor, 1.0);\n" - "}\n"; +// Interleaved in native order: COLOR -> VERTEX +static const VertexCV tri[3] = { + {{255, 0, 0, 255}, { -0.6f, -0.4f, 0.0f }}, // Red + {{ 0, 255, 0, 255}, { 0.6f, -0.4f, 0.0f }}, // Green + {{ 0, 0, 255, 255}, { 0.0f, 0.6f, 0.0f }} // Blue +}; errorret_t renderInit(void) { // Init SDL @@ -63,9 +50,9 @@ errorret_t renderInit(void) { } // Set OpenGL attributes (optional, adjust as needed) - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY); + // SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); + // SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); + // SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); // Create window with OpenGL flag. @@ -98,67 +85,12 @@ errorret_t renderInit(void) { glDisable(GL_CULL_FACE); glDisable(GL_BLEND); glDisable(GL_LIGHTING);// PSP defaults this on? + glShadeModel(GL_SMOOTH); - // --- Compile and link shaders --- - GLint success; - char infoLog[512]; - // Vertex shader - TRIANGLE_VERTEX_SHADER = glCreateShader(GL_VERTEX_SHADER); - glShaderSource(TRIANGLE_VERTEX_SHADER, 1, &TRIANGLE_VERTEX_SHADER_SRC, NULL); - glCompileShader(TRIANGLE_VERTEX_SHADER); - glGetShaderiv(TRIANGLE_VERTEX_SHADER, GL_COMPILE_STATUS, &success); - if(!success) { - glGetShaderInfoLog(TRIANGLE_VERTEX_SHADER, 512, NULL, infoLog); - errorThrow("Vertex shader compilation failed: %s", infoLog); - } - // Fragment shader - TRIANGLE_FRAGMENT_SHADER = glCreateShader(GL_FRAGMENT_SHADER); - glShaderSource(TRIANGLE_FRAGMENT_SHADER, 1, &TRIANGLE_FRAGMENT_SHADER_SRC, NULL); - glCompileShader(TRIANGLE_FRAGMENT_SHADER); - glGetShaderiv(TRIANGLE_FRAGMENT_SHADER, GL_COMPILE_STATUS, &success); - if(!success) { - glGetShaderInfoLog(TRIANGLE_FRAGMENT_SHADER, 512, NULL, infoLog); - errorThrow("Fragment shader compilation failed: %s", infoLog); - } - // Shader program - TRIANGLE_SHADER_PROGRAM = glCreateProgram(); - glAttachShader(TRIANGLE_SHADER_PROGRAM, TRIANGLE_VERTEX_SHADER); - glAttachShader(TRIANGLE_SHADER_PROGRAM, TRIANGLE_FRAGMENT_SHADER); - glBindAttribLocation(TRIANGLE_SHADER_PROGRAM, 0, "position"); - glBindAttribLocation(TRIANGLE_SHADER_PROGRAM, 1, "color"); - glLinkProgram(TRIANGLE_SHADER_PROGRAM); - glGetProgramiv(TRIANGLE_SHADER_PROGRAM, GL_LINK_STATUS, &success); - if(!success) { - glGetProgramInfoLog(TRIANGLE_SHADER_PROGRAM, 512, NULL, infoLog); - errorThrow("Shader program linking failed: %s", infoLog); - } - // --- VAO/VBO Setup for Triangle --- - GLfloat triangleVertices[] = { - // Positions // Colors - -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, // Red - 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, // Green - 0.0f, 0.5f, 0.0f, 0.0f, 1.0f // Blue - }; - - glGenVertexArrays(1, &TRIANGLE_VAO); - glGenBuffers(1, &TRIANGLE_VBO); - - glBindVertexArray(TRIANGLE_VAO); - glBindBuffer(GL_ARRAY_BUFFER, TRIANGLE_VBO); - glBufferData(GL_ARRAY_BUFFER, sizeof(triangleVertices), triangleVertices, GL_STATIC_DRAW); - - // Attribute pointers - glEnableVertexAttribArray(0); // position - glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)0); - glEnableVertexAttribArray(1); // color - glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)(2 * sizeof(GLfloat))); - - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindVertexArray(0); // Create back buffer. // renderBackBufferInit(); @@ -200,12 +132,28 @@ errorret_t renderDraw(void) { glClearColor(0.392f, 0.584f, 0.929f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - // --- Draw Triangle using VAO/VBO and shader --- - glUseProgram(TRIANGLE_SHADER_PROGRAM); - glBindVertexArray(TRIANGLE_VAO); - glDrawArrays(GL_TRIANGLES, 0, 3); - glBindVertexArray(0); - glUseProgram(0); + + + + + + glEnableClientState(GL_COLOR_ARRAY); + glEnableClientState(GL_VERTEX_ARRAY); + + // Stride is the size of one interleaved record. + GLsizei stride = (GLsizei)sizeof(VertexCV); + + // Pointers into the interleaved struct + glColorPointer (4, GL_UNSIGNED_BYTE, stride, (const GLvoid*)&tri[0].color[0]); + glVertexPointer(3, GL_FLOAT, stride, (const GLvoid*)&tri[0].pos[0]); + + + glDrawArrays(GL_TRIANGLES, 0, 3); + + + + + // Present the renderer (swap OpenGL buffers) SDL_GL_SwapWindow(RENDER_WINDOW); @@ -218,15 +166,6 @@ errorret_t renderDispose(void) { // renderSceneDispose(); // renderBackBufferDispose(); - // Delete shader program and shaders - if(TRIANGLE_SHADER_PROGRAM) glDeleteProgram(TRIANGLE_SHADER_PROGRAM); - if(TRIANGLE_VERTEX_SHADER) glDeleteShader(TRIANGLE_VERTEX_SHADER); - if(TRIANGLE_FRAGMENT_SHADER) glDeleteShader(TRIANGLE_FRAGMENT_SHADER); - - // Delete VAO and VBO - if(TRIANGLE_VBO) glDeleteBuffers(1, &TRIANGLE_VBO); - if(TRIANGLE_VAO) glDeleteVertexArrays(1, &TRIANGLE_VAO); - // Destroy OpenGL context SDL_GL_DeleteContext(RENDER_GL_CONTEXT); SDL_DestroyWindow(RENDER_WINDOW);