- Actualizar nombre del proyecto en CMakeLists.txt a vibe4_shaders - Cambiar título de ventana en defines.h a vibe4_shaders - Reescribir completamente README.md enfocado en tecnología de shaders: * Renderizado multi-backend (OpenGL, Vulkan, Metal) * Efectos de shader CRT (scanlines, curvatura, bloom) * Documentación del pipeline de post-procesado * Nuevos controles específicos de shaders (R, C, S, B, U) * Estructura del proyecto actualizada con directorios de shaders - Mantener todos los controles y funcionalidad existente - Reposicionar proyecto como demo de tecnología de renderizado - Añadir .gitignore básico para C++ 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
78 lines
5.4 KiB
C
78 lines
5.4 KiB
C
#pragma once
|
|
|
|
namespace {
|
|
SDL_Texture* dbg_tex = nullptr;
|
|
SDL_Renderer* dbg_ren = nullptr;
|
|
} // namespace
|
|
|
|
inline void dbg_init(SDL_Renderer* renderer) {
|
|
dbg_ren = renderer;
|
|
Uint8 font[448] = {0x42, 0x4D, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x01, 0x00, 0x00, 0x12, 0x0B, 0x00, 0x00, 0x12, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x18, 0xF3, 0x83, 0x83, 0xCF, 0x83, 0x87, 0x00, 0x00, 0xF3, 0x39, 0x39, 0xCF, 0x79, 0xF3, 0x00, 0x00, 0x01, 0xF9, 0x39, 0xCF, 0x61, 0xF9, 0x00, 0x00, 0x33, 0xF9, 0x03, 0xE7, 0x87, 0x81, 0x00, 0x00, 0x93, 0x03, 0x3F, 0xF3, 0x1B, 0x39, 0x00, 0x00, 0xC3, 0x3F, 0x9F, 0x39, 0x3B, 0x39, 0x00, 0x41, 0xE3, 0x03, 0xC3, 0x01, 0x87, 0x83, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xE7, 0x01, 0xC7, 0x81, 0x01, 0x83, 0x00, 0x00, 0xE7, 0x1F, 0x9B, 0xE7, 0x1F, 0x39, 0x00, 0x00, 0xE7, 0x8F, 0x39, 0xE7, 0x87, 0xF9, 0x00, 0x00, 0xC3, 0xC7, 0x39, 0xE7, 0xC3, 0xC3, 0x00, 0x00, 0x99, 0xE3, 0x39, 0xE7, 0xF1, 0xE7, 0x00, 0x00, 0x99, 0xF1, 0xB3, 0xC7, 0x39, 0xF3, 0x00, 0x00, 0x99, 0x01, 0xC7, 0xE7, 0x83, 0x81, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x83, 0xE7, 0x83, 0xEF, 0x39, 0x39, 0x00, 0x00, 0x39, 0xE7, 0x39, 0xC7, 0x11, 0x11, 0x00, 0x00, 0xF9, 0xE7, 0x39, 0x83, 0x01, 0x83, 0x00, 0x00, 0x83, 0xE7, 0x39, 0x11, 0x01, 0xC7, 0x00, 0x00, 0x3F, 0xE7, 0x39, 0x39, 0x29, 0x83, 0x00, 0x00, 0x33, 0xE7, 0x39, 0x39, 0x39, 0x11, 0x00, 0x00, 0x87, 0x81, 0x39, 0x39, 0x39, 0x39, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x39, 0x39, 0x83, 0x3F, 0x85, 0x31, 0x00, 0x00, 0x39, 0x31, 0x39, 0x3F, 0x33, 0x23, 0x00, 0x00, 0x29, 0x21, 0x39, 0x03, 0x21, 0x07, 0x00, 0x00, 0x01, 0x01, 0x39, 0x39, 0x39, 0x31, 0x00, 0x00, 0x01, 0x09, 0x39, 0x39, 0x39, 0x39, 0x00, 0x00, 0x11, 0x19, 0x39, 0x39, 0x39, 0x39, 0x00, 0x00, 0x39, 0x39, 0x83, 0x03, 0x83, 0x03, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xC1, 0x39, 0x81, 0x83, 0x31, 0x01, 0x00, 0x00, 0x99, 0x39, 0xE7, 0x39, 0x23, 0x3F, 0x00, 0x00, 0x39, 0x39, 0xE7, 0xF9, 0x07, 0x3F, 0x00, 0x00, 0x31, 0x01, 0xE7, 0xF9, 0x0F, 0x3F, 0x00, 0x00, 0x3F, 0x39, 0xE7, 0xF9, 0x27, 0x3F, 0x00, 0x00, 0x9F, 0x39, 0xE7, 0xF9, 0x33, 0x3F, 0x00, 0x00, 0xC1, 0x39, 0x81, 0xF9, 0x39, 0x3F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x39, 0x03, 0xC3, 0x07, 0x01, 0x3F, 0x00, 0x00, 0x39, 0x39, 0x99, 0x33, 0x3F, 0x3F, 0x00, 0x00, 0x01, 0x39, 0x3F, 0x39, 0x3F, 0x3F, 0x00, 0x00, 0x39, 0x03, 0x3F, 0x39, 0x03, 0x03, 0x00, 0x00, 0x39, 0x39, 0x3F, 0x39, 0x3F, 0x3F, 0x00, 0x00, 0x93, 0x39, 0x99, 0x33, 0x3F, 0x3F, 0x00, 0x00, 0xC7, 0x03, 0xC3, 0x07, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00};
|
|
|
|
// Cargar surface del bitmap font
|
|
SDL_Surface* font_surface = SDL_LoadBMP_IO(SDL_IOFromMem(font, 448), 1);
|
|
if (font_surface != nullptr) {
|
|
// Crear una nueva surface de 32 bits con canal alpha
|
|
SDL_Surface* rgba_surface = SDL_CreateSurface(font_surface->w, font_surface->h, SDL_PIXELFORMAT_RGBA8888);
|
|
if (rgba_surface != nullptr) {
|
|
// Obtener píxeles de ambas surfaces
|
|
Uint8* src_pixels = (Uint8*)font_surface->pixels;
|
|
Uint32* dst_pixels = (Uint32*)rgba_surface->pixels;
|
|
|
|
int width = font_surface->w;
|
|
int height = font_surface->h;
|
|
|
|
// Procesar cada píxel
|
|
for (int y = 0; y < height; y++) {
|
|
for (int x = 0; x < width; x++) {
|
|
int byte_index = y * font_surface->pitch + (x / 8);
|
|
int bit_index = 7 - (x % 8);
|
|
|
|
// Extraer bit del bitmap monocromo
|
|
bool is_white = (src_pixels[byte_index] >> bit_index) & 1;
|
|
|
|
if (is_white) // Fondo blanco original -> transparente
|
|
{
|
|
dst_pixels[y * width + x] = 0x00000000; // Transparente
|
|
} else // Texto negro original -> blanco opaco
|
|
{
|
|
dst_pixels[y * width + x] = 0xFFFFFFFF; // Blanco opaco
|
|
}
|
|
}
|
|
}
|
|
|
|
dbg_tex = SDL_CreateTextureFromSurface(dbg_ren, rgba_surface);
|
|
SDL_DestroySurface(rgba_surface);
|
|
}
|
|
SDL_DestroySurface(font_surface);
|
|
}
|
|
|
|
// Configurar filtro nearest neighbor para píxel perfect del texto
|
|
if (dbg_tex != nullptr) {
|
|
SDL_SetTextureScaleMode(dbg_tex, SDL_SCALEMODE_NEAREST);
|
|
// Configurar blend mode para transparencia normal
|
|
SDL_SetTextureBlendMode(dbg_tex, SDL_BLENDMODE_BLEND);
|
|
}
|
|
}
|
|
|
|
inline void dbg_print(int x, int y, const char* text, Uint8 r, Uint8 g, Uint8 b) {
|
|
int cc = 0;
|
|
SDL_SetTextureColorMod(dbg_tex, r, g, b);
|
|
SDL_FRect src = {0, 0, 8, 8};
|
|
SDL_FRect dst = {static_cast<float>(x), static_cast<float>(y), 8, 8};
|
|
while (text[cc] != 0) {
|
|
if (text[cc] != 32) {
|
|
if (text[cc] >= 65) {
|
|
src.x = ((text[cc] - 65) % 6) * 8;
|
|
src.y = ((text[cc] - 65) / 6) * 8;
|
|
} else {
|
|
src.x = ((text[cc] - 22) % 6) * 8;
|
|
src.y = ((text[cc] - 22) / 6) * 8;
|
|
}
|
|
|
|
SDL_RenderTexture(dbg_ren, dbg_tex, &src, &dst);
|
|
}
|
|
cc++;
|
|
dst.x += 8;
|
|
}
|
|
} |