PSP rendering
This commit is contained in:
@@ -10,8 +10,8 @@ set(CMAKE_C_STANDARD_REQUIRED ON)
|
|||||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules)
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules)
|
||||||
|
|
||||||
if(NOT DEFINED DUSK_TARGET_SYSTEM)
|
if(NOT DEFINED DUSK_TARGET_SYSTEM)
|
||||||
# set(DUSK_TARGET_SYSTEM "linux")
|
set(DUSK_TARGET_SYSTEM "linux")
|
||||||
set(DUSK_TARGET_SYSTEM "psp")
|
# set(DUSK_TARGET_SYSTEM "psp")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Prep cache
|
# Prep cache
|
||||||
|
@@ -19,33 +19,20 @@ SDL_Renderer *RENDER_RENDERER;
|
|||||||
SDL_GLContext RENDER_GL_CONTEXT;
|
SDL_GLContext RENDER_GL_CONTEXT;
|
||||||
bool_t RENDER_RUNNING;
|
bool_t RENDER_RUNNING;
|
||||||
|
|
||||||
// Add VAO and VBO handles
|
GLuint TRIANGLE_VAO = 0;
|
||||||
static GLuint TRIANGLE_VAO = 0;
|
GLuint TRIANGLE_VBO = 0;
|
||||||
static GLuint TRIANGLE_VBO = 0;
|
|
||||||
|
|
||||||
// Shader handles
|
typedef struct {
|
||||||
static GLuint TRIANGLE_SHADER_PROGRAM = 0;
|
GLubyte color[4]; // GL_COLOR_ARRAY: 4 x GL_UNSIGNED_BYTE (RGBA)
|
||||||
static GLuint TRIANGLE_VERTEX_SHADER = 0;
|
GLfloat pos[3]; // GL_VERTEX_ARRAY: 3 x GL_FLOAT (XYZ)
|
||||||
static GLuint TRIANGLE_FRAGMENT_SHADER = 0;
|
} VertexCV;
|
||||||
|
|
||||||
// Vertex and Fragment shader sources
|
// Interleaved in native order: COLOR -> VERTEX
|
||||||
static const char* TRIANGLE_VERTEX_SHADER_SRC =
|
static const VertexCV tri[3] = {
|
||||||
"#version 130\n"
|
{{255, 0, 0, 255}, { -0.6f, -0.4f, 0.0f }}, // Red
|
||||||
"in vec2 position;\n"
|
{{ 0, 255, 0, 255}, { 0.6f, -0.4f, 0.0f }}, // Green
|
||||||
"in vec3 color;\n"
|
{{ 0, 0, 255, 255}, { 0.0f, 0.6f, 0.0f }} // Blue
|
||||||
"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";
|
|
||||||
|
|
||||||
errorret_t renderInit(void) {
|
errorret_t renderInit(void) {
|
||||||
// Init SDL
|
// Init SDL
|
||||||
@@ -63,9 +50,9 @@ errorret_t renderInit(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set OpenGL attributes (optional, adjust as needed)
|
// Set OpenGL attributes (optional, adjust as needed)
|
||||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
|
// SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
|
||||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
|
// 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_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY);
|
||||||
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
||||||
|
|
||||||
// Create window with OpenGL flag.
|
// Create window with OpenGL flag.
|
||||||
@@ -98,67 +85,12 @@ errorret_t renderInit(void) {
|
|||||||
glDisable(GL_CULL_FACE);
|
glDisable(GL_CULL_FACE);
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
glDisable(GL_LIGHTING);// PSP defaults this on?
|
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.
|
// Create back buffer.
|
||||||
// renderBackBufferInit();
|
// renderBackBufferInit();
|
||||||
@@ -200,12 +132,28 @@ errorret_t renderDraw(void) {
|
|||||||
glClearColor(0.392f, 0.584f, 0.929f, 1.0f);
|
glClearColor(0.392f, 0.584f, 0.929f, 1.0f);
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
// --- Draw Triangle using VAO/VBO and shader ---
|
|
||||||
glUseProgram(TRIANGLE_SHADER_PROGRAM);
|
|
||||||
glBindVertexArray(TRIANGLE_VAO);
|
|
||||||
|
|
||||||
|
|
||||||
|
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);
|
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||||
glBindVertexArray(0);
|
|
||||||
glUseProgram(0);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Present the renderer (swap OpenGL buffers)
|
// Present the renderer (swap OpenGL buffers)
|
||||||
SDL_GL_SwapWindow(RENDER_WINDOW);
|
SDL_GL_SwapWindow(RENDER_WINDOW);
|
||||||
@@ -218,15 +166,6 @@ errorret_t renderDispose(void) {
|
|||||||
// renderSceneDispose();
|
// renderSceneDispose();
|
||||||
// renderBackBufferDispose();
|
// 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
|
// Destroy OpenGL context
|
||||||
SDL_GL_DeleteContext(RENDER_GL_CONTEXT);
|
SDL_GL_DeleteContext(RENDER_GL_CONTEXT);
|
||||||
SDL_DestroyWindow(RENDER_WINDOW);
|
SDL_DestroyWindow(RENDER_WINDOW);
|
||||||
|
Reference in New Issue
Block a user