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
config=minitest
title=PAKU SIMBEL PROFANATION
config=paku
width=160
height=120
zoom=3
height=144
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
function mini.init()
s = surf.load("tiles01.gif")
s = surf.load("logo.gif")
surf.source(s)
p = pal.load("tiles01.gif")
p = pal.load("logo.gif")
pal.set(p)
pal.trans(255)
end
function mini.update()
surf.cls(1)
draw.surf(0, 0, 64, 64, 10, 10)
if key.down(key.ESCAPE) then sys.quit() end
draw.text(sys.fps(), 0, 0, 4)
surf.cls(0)
draw.surf(0, 0, 160, 144, 0, 0)
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

View File

@@ -130,10 +130,11 @@ FILE *file_getfilepointer(const char *resourcename, int& filesize, const bool bi
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);
char* buffer = (char*)malloc(filesize);
char* buffer = (char*)malloc(zero_terminate?filesize:filesize+1);
fread(buffer, filesize, 1, f);
if (zero_terminate) buffer[filesize]=0;
fclose(f);
return buffer;
}

View File

@@ -12,7 +12,7 @@ void file_setresourcefolder(const char *str);
void file_setsource(const int src);
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);
void file_setconfigvalue(const char* key, const char* value);

View File

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

View File

@@ -40,5 +40,9 @@ namespace shader
const bool init(SDL_Window* win, SDL_Texture* backBuffer,
const char* vertexShader, const char* fragmentShader=nullptr);
void enable();
void disable();
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
// ===============================================
@@ -875,6 +896,12 @@ void push_lua_funcs() {
lua_pushcfunction(L,cpp_draw_text); lua_setfield(L, -2, "text");
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_pushcfunction(L,cpp_music_play); lua_setfield(L, -2, "play");
lua_pushcfunction(L,cpp_music_pause); lua_setfield(L, -2, "pause");

View File

@@ -298,11 +298,24 @@ uint8_t getmap()
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() {
if (screen_zoom <= 0) screen_zoom = 1;
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);
SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl");
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);
SDL_SetTextureScaleMode(mini_shadertex, SDL_SCALEMODE_NEAREST);
int filesize;
char *shaderfile = file_getfilebuffer("basic.glsl", filesize);
shader::init(mini_win, mini_shadertex, shaderfile);
//int filesize;
//char *shaderfile = file_getfilebuffer("lynx.glsl", filesize);
shader::init(mini_win, mini_shadertex, nullptr);
//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);
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 color(uint8_t color=6);
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
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
music = {}