VERSIÓ 1.3

- [NEW] shader.init(), shader.enable i shader.disable
- [NEW] Deixe els shaders de Lynx i GBC de exemple.
- [NEW] file_getfilebuffer() ara soporta un tercer paràmetre opcional, per a 'zeroterminar' el buffer per si es un arxiu de text.
This commit is contained in:
2025-06-18 19:29:17 +02:00
parent 79781bbed1
commit e1d5eb051c
14 changed files with 213 additions and 67 deletions

View File

@@ -1,32 +0,0 @@
varying vec2 TEX0;
#if defined(VERTEX)
void main()
{
TEX0 = vec2(gl_MultiTexCoord0.x, 1.0-gl_MultiTexCoord0.y)*1.0001;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
#elif defined(FRAGMENT)
uniform sampler2D Texture;
void main()
{
vec2 winsize = vec2(640.0,480.0);
vec2 pixpos = TEX0 * winsize;
float y = floor(pixpos.y);
if (mod(y,4.0) == 0.0)
{
vec4 color = texture2D(Texture, TEX0);
vec4 blend = vec4(0.8, 0.8, 0.8, 1.0);
gl_FragColor = color * blend;
}
else
{
gl_FragColor = texture2D(Texture, TEX0);
}
}
#endif

View File

@@ -1,5 +1,5 @@
title=HOLA MINI title=PAKU SIMBEL PROFANATION
config=minitest config=paku
width=160 width=160
height=120 height=144
zoom=3 zoom=4

38
data/gbc.glsl Normal file
View File

@@ -0,0 +1,38 @@
varying vec2 tex_coord;
varying vec2 pix_coord;
#if defined(VERTEX)
void main()
{
pix_coord = vec2(gl_MultiTexCoord0.x, 1.0-gl_MultiTexCoord0.y)*1.0001;
tex_coord = vec2((gl_Vertex.x+1.0)*0.5, (-gl_Vertex.y+1.0)*0.5);
vec4 pos = vec4(gl_Vertex.x * 2.0, gl_Vertex.y * 2.0, gl_Vertex.z, gl_Vertex.w);
gl_Position = gl_Vertex; //(gl_Vertex*2)-vec3(1.0, 1.0, 1.0);//gl_ModelViewProjectionMatrix * gl_Vertex;
}
#elif defined(FRAGMENT)
uniform sampler2D Texture;
void main()
{
float x = sign(pix_coord.x)*floor(abs(pix_coord.x)+0.5);
float y = sign(pix_coord.y)*floor(abs(pix_coord.y)+0.5);
float column = mod(x,4.0);
float row = mod(y,4.0);
vec4 color = texture2D(Texture, tex_coord);
vec4 newcolor;
if ((column == 0.0) || (row == 0.0) ) {
newcolor = color * vec4(0.4, 0.4, 0.4, 1.0);
} else if ((column == 1.0) || (row == 1.0) ) {
newcolor = color * vec4(0.6, 0.7, 0.8, 1.0);
} else if ((column == 3.0) || (row == 3.0) ) {
newcolor = color * vec4(0.8, 0.7, 0.6, 1.0);
} else {
newcolor = color;
}
gl_FragColor = newcolor;
}
#endif

BIN
data/logo.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

37
data/lynx.glsl Normal file
View File

@@ -0,0 +1,37 @@
varying vec2 tex_coord;
varying vec2 pix_coord;
#if defined(VERTEX)
void main()
{
pix_coord = vec2(gl_MultiTexCoord0.x, 1.0-gl_MultiTexCoord0.y)*1.0001;
tex_coord = vec2((gl_Vertex.x+1.0)*0.5, (-gl_Vertex.y+1.0)*0.5);
vec4 pos = vec4(gl_Vertex.x * 2.0, gl_Vertex.y * 2.0, gl_Vertex.z, gl_Vertex.w);
gl_Position = gl_Vertex; //(gl_Vertex*2)-vec3(1.0, 1.0, 1.0);//gl_ModelViewProjectionMatrix * gl_Vertex;
}
#elif defined(FRAGMENT)
uniform sampler2D Texture;
void main()
{
float x = sign(pix_coord.x)*floor(abs(pix_coord.x)+0.5);
float column = mod(x,4.0);
vec4 color = texture2D(Texture, tex_coord);
color = color + vec4(0.5, 0.5, 0.5, 0.0) * (1.0-tex_coord.t);
vec4 newcolor;
if (column == 0.0) {
newcolor = color * vec4(1.0, 0.4, 0.6, 1.0);
} else if (column == 1.0) {
newcolor = color * vec4(0.4, 1.0, 0.4, 1.0);
} else if (column == 2.0) {
newcolor = color * vec4(0.6, 0.4, 1.0, 1.0);
} else {
newcolor = color * vec4(0.2, 0.2, 0.2, 1.0);
}
gl_FragColor = newcolor;
}
#endif

View File

@@ -3,16 +3,30 @@ other = require "other"
x=0 x=0
function mini.init() function mini.init()
s = surf.load("tiles01.gif") s = surf.load("logo.gif")
surf.source(s) surf.source(s)
p = pal.load("tiles01.gif") p = pal.load("logo.gif")
pal.set(p) pal.set(p)
pal.trans(255) pal.trans(255)
end end
function mini.update() function mini.update()
surf.cls(1) surf.cls(0)
draw.surf(0, 0, 64, 64, 10, 10) draw.surf(0, 0, 160, 144, 0, 0)
if key.down(key.ESCAPE) then sys.quit() end
draw.text(sys.fps(), 0, 0, 4) draw.text("PRESS START", 60, 110, 28)
if key.press(key.ESCAPE) then sys.quit() end
draw.text(sys.fps(), 1, 1, 28)
if key.press(key.N1) then
shader.init("lynx.glsl")
shader.enable()
end
if key.press(key.N2) then
shader.init("gbc.glsl")
shader.enable()
end
if key.press(key.N3) then
shader.disable()
end
end end

View File

@@ -130,10 +130,11 @@ FILE *file_getfilepointer(const char *resourcename, int& filesize, const bool bi
return f; return f;
} }
char *file_getfilebuffer(const char *resourcename, int& filesize) { char *file_getfilebuffer(const char *resourcename, int& filesize, const bool zero_terminate) {
FILE *f = file_getfilepointer(resourcename, filesize, true); FILE *f = file_getfilepointer(resourcename, filesize, true);
char* buffer = (char*)malloc(filesize); char* buffer = (char*)malloc(zero_terminate?filesize:filesize+1);
fread(buffer, filesize, 1, f); fread(buffer, filesize, 1, f);
if (zero_terminate) buffer[filesize]=0;
fclose(f); fclose(f);
return buffer; return buffer;
} }

View File

@@ -12,7 +12,7 @@ void file_setresourcefolder(const char *str);
void file_setsource(const int src); void file_setsource(const int src);
FILE *file_getfilepointer(const char *resourcename, int& filesize, const bool binary=false); FILE *file_getfilepointer(const char *resourcename, int& filesize, const bool binary=false);
char *file_getfilebuffer(const char *resourcename, int& filesize); char *file_getfilebuffer(const char *resourcename, int& filesize, const bool zero_terminate=false);
const char* file_getconfigvalue(const char *key); const char* file_getconfigvalue(const char *key);
void file_setconfigvalue(const char* key, const char* value); void file_setconfigvalue(const char* key, const char* value);

View File

@@ -24,7 +24,8 @@ namespace shader
SDL_Texture* backBuffer = nullptr; SDL_Texture* backBuffer = nullptr;
SDL_Point win_size = {640, 480}; SDL_Point win_size = {640, 480};
SDL_FPoint tex_size = {320, 240}; SDL_FPoint tex_size = {320, 240};
bool usingOpenGL; bool can_use_opengl = false;
bool using_opengl = false;
GLuint texture_number; GLuint texture_number;
GLuint nose; GLuint nose;
@@ -40,11 +41,13 @@ namespace shader
PFNGLDELETESHADERPROC glDeleteShader; PFNGLDELETESHADERPROC glDeleteShader;
PFNGLATTACHSHADERPROC glAttachShader; PFNGLATTACHSHADERPROC glAttachShader;
PFNGLCREATEPROGRAMPROC glCreateProgram; PFNGLCREATEPROGRAMPROC glCreateProgram;
PFNGLDELETEPROGRAMPROC glDeleteProgram;
PFNGLLINKPROGRAMPROC glLinkProgram; PFNGLLINKPROGRAMPROC glLinkProgram;
PFNGLVALIDATEPROGRAMPROC glValidateProgram; PFNGLVALIDATEPROGRAMPROC glValidateProgram;
PFNGLGETPROGRAMIVPROC glGetProgramiv; PFNGLGETPROGRAMIVPROC glGetProgramiv;
PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog; PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog;
PFNGLUSEPROGRAMPROC glUseProgram; PFNGLUSEPROGRAMPROC glUseProgram;
PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation;
bool initGLExtensions() { bool initGLExtensions() {
glCreateShader = (PFNGLCREATESHADERPROC)SDL_GL_GetProcAddress("glCreateShader"); glCreateShader = (PFNGLCREATESHADERPROC)SDL_GL_GetProcAddress("glCreateShader");
@@ -55,16 +58,18 @@ namespace shader
glDeleteShader = (PFNGLDELETESHADERPROC)SDL_GL_GetProcAddress("glDeleteShader"); glDeleteShader = (PFNGLDELETESHADERPROC)SDL_GL_GetProcAddress("glDeleteShader");
glAttachShader = (PFNGLATTACHSHADERPROC)SDL_GL_GetProcAddress("glAttachShader"); glAttachShader = (PFNGLATTACHSHADERPROC)SDL_GL_GetProcAddress("glAttachShader");
glCreateProgram = (PFNGLCREATEPROGRAMPROC)SDL_GL_GetProcAddress("glCreateProgram"); glCreateProgram = (PFNGLCREATEPROGRAMPROC)SDL_GL_GetProcAddress("glCreateProgram");
glDeleteProgram = (PFNGLDELETEPROGRAMPROC)SDL_GL_GetProcAddress("glDeleteProgram");
glLinkProgram = (PFNGLLINKPROGRAMPROC)SDL_GL_GetProcAddress("glLinkProgram"); glLinkProgram = (PFNGLLINKPROGRAMPROC)SDL_GL_GetProcAddress("glLinkProgram");
glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)SDL_GL_GetProcAddress("glValidateProgram"); glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)SDL_GL_GetProcAddress("glValidateProgram");
glGetProgramiv = (PFNGLGETPROGRAMIVPROC)SDL_GL_GetProcAddress("glGetProgramiv"); glGetProgramiv = (PFNGLGETPROGRAMIVPROC)SDL_GL_GetProcAddress("glGetProgramiv");
glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)SDL_GL_GetProcAddress("glGetProgramInfoLog"); glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)SDL_GL_GetProcAddress("glGetProgramInfoLog");
glUseProgram = (PFNGLUSEPROGRAMPROC)SDL_GL_GetProcAddress("glUseProgram"); glUseProgram = (PFNGLUSEPROGRAMPROC)SDL_GL_GetProcAddress("glUseProgram");
glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)SDL_GL_GetProcAddress("glGetUniformLocation");
return glCreateShader && glShaderSource && glCompileShader && glGetShaderiv && return glCreateShader && glShaderSource && glCompileShader && glGetShaderiv &&
glGetShaderInfoLog && glDeleteShader && glAttachShader && glCreateProgram && glGetShaderInfoLog && glDeleteShader && glAttachShader && glCreateProgram &&
glLinkProgram && glValidateProgram && glGetProgramiv && glGetProgramInfoLog && glDeleteProgram && glLinkProgram && glValidateProgram && glGetProgramiv &&
glUseProgram; glGetProgramInfoLog && glUseProgram && glGetUniformLocation;
} }
#endif #endif
@@ -92,6 +97,7 @@ namespace shader
GLchar *log = (GLchar*)malloc(logLength); GLchar *log = (GLchar*)malloc(logLength);
glGetShaderInfoLog(result, logLength, &logLength, log); glGetShaderInfoLog(result, logLength, &logLength, log);
std::cout << "Shader compile log:" << log << std::endl; std::cout << "Shader compile log:" << log << std::endl;
//std::cout << source << std::endl;
free(log); free(log);
} }
glDeleteShader(result); glDeleteShader(result);
@@ -105,7 +111,9 @@ namespace shader
GLuint programId = 0; GLuint programId = 0;
GLuint vtxShaderId, fragShaderId; GLuint vtxShaderId, fragShaderId;
if (programId != 0) glDeleteProgram(programId);
programId = glCreateProgram(); programId = glCreateProgram();
vtxShaderId = compileShader(vertexShaderSource, GL_VERTEX_SHADER); vtxShaderId = compileShader(vertexShaderSource, GL_VERTEX_SHADER);
fragShaderId = compileShader(fragmentShaderSource?fragmentShaderSource:vertexShaderSource, GL_FRAGMENT_SHADER); fragShaderId = compileShader(fragmentShaderSource?fragmentShaderSource:vertexShaderSource, GL_FRAGMENT_SHADER);
@@ -161,25 +169,36 @@ namespace shader
if(!strncmp(renderer_name, "opengl", 6)) { if(!strncmp(renderer_name, "opengl", 6)) {
#ifndef __APPLE__ #ifndef __APPLE__
if (!initGLExtensions()) { static bool gl_extensions_initialized = false;
std::cout << "WARNING: No s'han pogut inicialitzar les extensions d'OpenGL!" << std::endl; if (!gl_extensions_initialized) {
usingOpenGL = false; if (!initGLExtensions()) {
return false; std::cout << "WARNING: No s'han pogut inicialitzar les extensions d'OpenGL!" << std::endl;
can_use_opengl = false;
return false;
}
gl_extensions_initialized = true;
} }
#endif #endif
// Compilar el shader y dejarlo listo para usar. // Compilar el shader y dejarlo listo para usar.
if (!vertexShader) {
can_use_opengl = false;
return false;
}
programId = compileProgram(vertexShader, fragmentShader); programId = compileProgram(vertexShader, fragmentShader);
} else { } else {
std::cout << "WARNING: El driver del renderer no es OpenGL." << std::endl; std::cout << "WARNING: El driver del renderer no es OpenGL." << std::endl;
usingOpenGL = false; can_use_opengl = false;
return false; return false;
} }
usingOpenGL = true; can_use_opengl = true;
return true; return true;
} }
unsigned char pixels[512*240*4]; unsigned char pixels[512*240*4];
void enable() { if (can_use_opengl) using_opengl = true; }
void disable() { using_opengl = false; }
void render() void render()
{ {
SDL_FlushRenderer(renderer); SDL_FlushRenderer(renderer);
@@ -188,7 +207,7 @@ namespace shader
SDL_RenderClear(renderer); SDL_RenderClear(renderer);
SDL_FlushRenderer(renderer); SDL_FlushRenderer(renderer);
if (usingOpenGL) if (using_opengl)
{ {
GLint oldProgramId; GLint oldProgramId;
if (programId != 0) if (programId != 0)
@@ -206,16 +225,16 @@ namespace shader
//glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &param); //glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &param);
//printf("tex width: %i\n", param); //printf("tex width: %i\n", param);
glViewport(0, 0, win_size.x, win_size.y); glViewport(0, 0, win_size.x, win_size.y);
glBegin(GL_TRIANGLE_STRIP); glBegin(GL_TRIANGLE_STRIP);
glTexCoord2f(0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f);
glVertex2f(0.0f, 0.0f); glVertex2f(-1.0f, -1.0f);
glTexCoord2f(1.0f, 0.0f); glTexCoord2f(tex_size.x, 0.0f);
glVertex2f(tex_size.x, 0.0f); glVertex2f(1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glTexCoord2f(0.0f, tex_size.y);
glVertex2f(0.0f, tex_size.y); glVertex2f(-1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glTexCoord2f(tex_size.x, tex_size.y);
glVertex2f(tex_size.x, tex_size.y); glVertex2f(1.0f, 1.0f);
glEnd(); glEnd();
SDL_GL_SwapWindow(win); SDL_GL_SwapWindow(win);

View File

@@ -40,5 +40,9 @@ namespace shader
const bool init(SDL_Window* win, SDL_Texture* backBuffer, const bool init(SDL_Window* win, SDL_Texture* backBuffer,
const char* vertexShader, const char* fragmentShader=nullptr); const char* vertexShader, const char* fragmentShader=nullptr);
void enable();
void disable();
void render(); void render();
} }

27
lua.cpp
View File

@@ -527,6 +527,27 @@ extern "C" {
} }
// shaders
// ===============================================
static int cpp_shader_init(lua_State *L) {
const char* vstr = luaL_optstring(L, 1, NULL);
const char* fstr = luaL_optstring(L, 2, NULL);
shader_init(vstr, fstr);
return 0;
}
static int cpp_shader_enable(lua_State *L) {
shader_enable();
return 0;
}
static int cpp_shader_disable(lua_State *L) {
shader_disable();
return 0;
}
// music // music
// =============================================== // ===============================================
@@ -875,6 +896,12 @@ void push_lua_funcs() {
lua_pushcfunction(L,cpp_draw_text); lua_setfield(L, -2, "text"); lua_pushcfunction(L,cpp_draw_text); lua_setfield(L, -2, "text");
lua_setglobal(L, "draw"); lua_setglobal(L, "draw");
lua_newtable(L);
lua_pushcfunction(L,cpp_shader_init); lua_setfield(L, -2, "init");
lua_pushcfunction(L,cpp_shader_enable); lua_setfield(L, -2, "enable");
lua_pushcfunction(L,cpp_shader_disable); lua_setfield(L, -2, "disable");
lua_setglobal(L, "shader");
lua_newtable(L); lua_newtable(L);
lua_pushcfunction(L,cpp_music_play); lua_setfield(L, -2, "play"); lua_pushcfunction(L,cpp_music_play); lua_setfield(L, -2, "play");
lua_pushcfunction(L,cpp_music_pause); lua_setfield(L, -2, "pause"); lua_pushcfunction(L,cpp_music_pause); lua_setfield(L, -2, "pause");

View File

@@ -298,11 +298,24 @@ uint8_t getmap()
return 0; return 0;
} }
void shader_init(const char* vshader, const char* fshader)
{
int filesize;
char *vshaderfile = file_getfilebuffer(vshader, filesize, true);
char *fshaderfile = nullptr;
if (fshader) { fshaderfile = file_getfilebuffer(fshader, filesize, true); }
shader::init(mini_win, mini_shadertex, vshaderfile, fshaderfile);
}
void shader_enable() { shader::enable(); }
void shader_disable() { shader::disable(); }
void createDisplay() { void createDisplay() {
if (screen_zoom <= 0) screen_zoom = 1; if (screen_zoom <= 0) screen_zoom = 1;
while (screen_width*screen_zoom > desktop_width || screen_height*screen_zoom > desktop_height) screen_zoom--; while (screen_width*screen_zoom > desktop_width || screen_height*screen_zoom > desktop_height) screen_zoom--;
mini_win = SDL_CreateWindow(window_title, screen_width*screen_zoom, screen_height*screen_zoom, SDL_WINDOW_OPENGL|(screen_fullscreen?SDL_WINDOW_FULLSCREEN:SDL_WINDOW_RESIZABLE)); mini_win = SDL_CreateWindow(window_title, screen_width*screen_zoom, screen_height*screen_zoom, SDL_WINDOW_OPENGL|(screen_fullscreen?SDL_WINDOW_FULLSCREEN:0));
windowID = SDL_GetWindowID(mini_win); windowID = SDL_GetWindowID(mini_win);
SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl"); SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl");
mini_ren = SDL_CreateRenderer(mini_win, NULL); mini_ren = SDL_CreateRenderer(mini_win, NULL);
@@ -320,9 +333,9 @@ void createDisplay() {
mini_shadertex = SDL_CreateTexture(mini_ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, screen_width*screen_zoom, screen_height*screen_zoom); mini_shadertex = SDL_CreateTexture(mini_ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, screen_width*screen_zoom, screen_height*screen_zoom);
SDL_SetTextureScaleMode(mini_shadertex, SDL_SCALEMODE_NEAREST); SDL_SetTextureScaleMode(mini_shadertex, SDL_SCALEMODE_NEAREST);
int filesize; //int filesize;
char *shaderfile = file_getfilebuffer("basic.glsl", filesize); //char *shaderfile = file_getfilebuffer("lynx.glsl", filesize);
shader::init(mini_win, mini_shadertex, shaderfile); shader::init(mini_win, mini_shadertex, nullptr);
//SDL_GetWindowPosition(mini_win, &windowpos_x, &windowpos_y); //SDL_GetWindowPosition(mini_win, &windowpos_x, &windowpos_y);
} }

4
mini.h
View File

@@ -129,6 +129,10 @@ void setsource(uint8_t surface);
void setmap(uint8_t surface); void setmap(uint8_t surface);
uint8_t getmap(); uint8_t getmap();
void shader_init(const char* vshader, const char* fshader);
void shader_enable();
void shader_disable();
void cls(uint8_t color=0); void cls(uint8_t color=0);
void color(uint8_t color=6); void color(uint8_t color=6);
void bcolor(uint8_t color=0); void bcolor(uint8_t color=0);

View File

@@ -268,6 +268,27 @@ function draw.surfrot(sx, sy, sw, sh, x, y, a) end
---Draw text to (x,y) using the specified color ---Draw text to (x,y) using the specified color
function draw.text(text, x, y, color) end function draw.text(text, x, y, color) end
---@class shader
shader = {}
---Initialize shaders subsystem, still non functional without shaders
function shader.init() end
---@param shader string
---Initialize shaders subsystem, specifying a file that contains both vertex and fragment shader
function shader.init(shader) end
---@param vshader string
---@param fshader string
---Initialize shaders subsystem, specifying both a vertex shader file and a fragment shader file
function shader.init(vshader, fshader) end
---Enable previously loaded shader
function shader.enable() end
---Disable shaders
function shader.disable() end
---@class music ---@class music
music = {} music = {}