/** * Copyright (c) 2026 Dominic Masters * * This software is released under the MIT License. * https://opensource.org/licenses/MIT */ #pragma once #include "error/errorgl.h" typedef struct { #ifdef DUSK_OPENGL_LEGACY void *nothing; #else GLuint shaderProgramId; GLuint vertexShaderId; GLuint fragmentShaderId; #endif #if DUSK_OPENGL_LEGACY mat4 view; mat4 proj; mat4 model; #endif } shadergl_t; typedef struct { #ifdef DUSK_OPENGL_LEGACY void *nothing; #else const char_t *vert; const char_t *frag; #endif } shaderdefinitiongl_t; #if DUSK_OPENGL_LEGACY typedef struct { shadergl_t *boundShader; uint_fast8_t dirty; } shaderlegacygl_t; extern shaderlegacygl_t SHADER_LEGACY; #define SHADER_LEGACY_DIRTY_PROJ (1 << 0) #define SHADER_LEGACY_DIRTY_VIEW (1 << 1) #define SHADER_LEGACY_DIRTY_MODEL (1 << 2) #endif /** * Initializes a shader. * * @param shader The shader to initialize. * @param def The definition of the shader to initialize with. * @return An errorret_t indicating success or failure. */ errorret_t shaderInitGL(shadergl_t *shader, const shaderdefinitiongl_t *def); /** * Binds a shader for use in rendering. * * @param shader The shader to bind. * @return An errorret_t indicating success or failure. */ errorret_t shaderBindGL(shadergl_t *shader); /** * Retrieves the location of a shader uniform parameter. * * @param shader The shader to query. * @param name The name of the uniform parameter. * @param location Output parameter to receive the location of the uniform. * @return An errorret_t indicating success or failure. */ errorret_t shaderParamGetLocationGL( shadergl_t *shader, const char_t *name, GLint *location ); /** * Sets a mat4 uniform parameter in the shader. * * @param shader The shader to update. * @param name The name of the uniform parameter. * @param mat The 4x4 matrix data to set. * @return An errorret_t indicating success or failure. */ errorret_t shaderSetMatrixGL( shadergl_t *shader, const char_t *name, mat4 matrix ); /** * Disposes of a shader, freeing any associated resources. * * @param shader The shader to dispose. */ errorret_t shaderDisposeGL(shadergl_t *shader); #ifdef DUSK_OPENGL_LEGACY /** * During mesh rendering, this is requesting the legacy system to push all * shaders necessary to render the currently bound shader's matrices. * * @return Any error state. */ errorret_t shaderLegacyMatrixUpdate(); #endif