Reestructura carpetes: src->source, third_party->source/external, shaders->data/shaders
This commit is contained in:
26
CLAUDE.md
26
CLAUDE.md
@@ -51,9 +51,9 @@ Requires `glslc` (Debian/Ubuntu: `apt install glslang-tools`; macOS: `brew insta
|
||||
./shadertoy [SHADER_NAME_OR_PATH] [-F|--fullscreen] [--backend=auto|gpu|opengl]
|
||||
|
||||
# Examples:
|
||||
./shadertoy test # auto backend, shaders/test/
|
||||
./shadertoy test # auto backend, data/shaders/test/
|
||||
./shadertoy --backend=gpu seascape # force SDL3 GPU (Vulkan/Metal)
|
||||
./shadertoy -F shaders/fractal_pyramid # explicit folder path, fullscreen
|
||||
./shadertoy -F data/shaders/fractal_pyramid # explicit folder path, fullscreen
|
||||
```
|
||||
|
||||
**Runtime Controls:**
|
||||
@@ -64,22 +64,22 @@ Requires `glslc` (Debian/Ubuntu: `apt install glslang-tools`; macOS: `brew insta
|
||||
## Architecture
|
||||
|
||||
### Layered design
|
||||
- `src/main.cpp` — SDL3 window, event loop, shader-list scanning, dispatch to a backend.
|
||||
- `src/rendering/shader_backend.hpp` — abstract `IShaderBackend` interface + `ShaderMetadata` / `ShaderUniforms` / `ShaderProgramSpec` shared types. Two factories: `makeOpenGLBackend()`, `makeSdl3GpuBackend()`.
|
||||
- `src/rendering/opengl_shader_backend.{hpp,cpp}` — OpenGL 3.3 implementation. Loads `<folder>/<name>.gl.glsl` at runtime.
|
||||
- `src/rendering/sdl3gpu/sdl3gpu_shader_backend.{hpp,cpp}` — SDL3 GPU implementation. Loads `<folder>/<name>.frag.spv` (Linux/Windows) or `<folder>/<name>.frag.msl` (macOS); shares one passthrough vertex shader from `shaders/_common/passthrough.vert.{spv,msl}`.
|
||||
- `src/rendering/sdl3gpu/shader_factory.hpp` — small helper that loads a shader binary/source from disk and creates an `SDL_GPUShader`.
|
||||
- `source/main.cpp` — SDL3 window, event loop, shader-list scanning, dispatch to a backend.
|
||||
- `source/rendering/shader_backend.hpp` — abstract `IShaderBackend` interface + `ShaderMetadata` / `ShaderUniforms` / `ShaderProgramSpec` shared types. Two factories: `makeOpenGLBackend()`, `makeSdl3GpuBackend()`.
|
||||
- `source/rendering/opengl_shader_backend.{hpp,cpp}` — OpenGL 3.3 implementation. Loads `<folder>/<name>.gl.glsl` at runtime.
|
||||
- `source/rendering/sdl3gpu/sdl3gpu_shader_backend.{hpp,cpp}` — SDL3 GPU implementation. Loads `<folder>/<name>.frag.spv` (Linux/Windows) or `<folder>/<name>.frag.msl` (macOS); shares one passthrough vertex shader from `shaders/_common/passthrough.vert.{spv,msl}`.
|
||||
- `source/rendering/sdl3gpu/shader_factory.hpp` — small helper that loads a shader binary/source from disk and creates an `SDL_GPUShader`.
|
||||
|
||||
### Shader folder layout
|
||||
One folder per shader, under `shaders/`:
|
||||
One folder per shader, under `data/shaders/`:
|
||||
```
|
||||
shaders/<name>/
|
||||
data/shaders/<name>/
|
||||
<name>.gl.glsl # OpenGL GLSL 3.30 (handwritten)
|
||||
<name>.vk.glsl # Vulkan GLSL 4.50 (handwritten)
|
||||
<name>.frag.msl # Metal Shading Language (handwritten)
|
||||
<name>.frag.spv # generated by `make compile_shaders` from .vk.glsl
|
||||
meta.txt # Name / Author / iChannelN
|
||||
shaders/_common/
|
||||
data/shaders/_common/
|
||||
passthrough.vk.glsl # shared fullscreen-triangle vertex (Vulkan)
|
||||
passthrough.vert.spv # generated
|
||||
passthrough.vert.msl # handwritten Metal
|
||||
@@ -103,7 +103,7 @@ shaders_directory_ // Shaders root path (resolved at startup)
|
||||
|
||||
### Dependencies
|
||||
- **SDL3** ≥ 3.2 — windowing, events, GPU API (`SDL_gpu.h`)
|
||||
- **GLAD** — OpenGL 3.3 loader (used only by the OpenGL backend, statically linked via `third_party/glad/`)
|
||||
- **GLAD** — OpenGL 3.3 loader (used only by the OpenGL backend, statically linked via `source/external/glad/`)
|
||||
- **C++17 stdlib** — filesystem, fstream, vector, algorithms
|
||||
- Build-time tool: `glslc` (only required to regenerate `.frag.spv`)
|
||||
|
||||
@@ -116,7 +116,7 @@ Uses preprocessor defines (`WINDOWS_BUILD`, `MACOS_BUILD`, `LINUX_BUILD`) for:
|
||||
## Shader System
|
||||
|
||||
### Authoring a shader (manual steps)
|
||||
For each new shader, three handwritten files live in `shaders/<name>/`:
|
||||
For each new shader, three handwritten files live in `data/shaders/<name>/`:
|
||||
1. **`<name>.gl.glsl`** — OpenGL GLSL 3.30 (the original Shadertoy-style format described below).
|
||||
2. **`<name>.vk.glsl`** — Vulkan GLSL 4.50 with explicit `layout(set=3, binding=0) uniform ShadertoyUBO { float iTime; vec2 iResolution; } u;` and `layout(set=2, binding=N) uniform sampler2D` for any texture channel.
|
||||
3. **`<name>.frag.msl`** — Metal Shading Language. Entry point must be named `<name>_fs`. Uniforms come in via `[[buffer(0)]]`; samplers via `[[texture(N)]] [[sampler(N)]]`.
|
||||
@@ -159,7 +159,7 @@ void main() {
|
||||
```
|
||||
|
||||
### Adding New Shaders
|
||||
1. Create `.glsl` file in `shaders/` directory (use `.frag.glsl` convention)
|
||||
1. Create `.glsl` file in `data/shaders/<name>/` directory (use `.frag.glsl` convention)
|
||||
2. Follow required format above
|
||||
3. File automatically appears in runtime shader rotation (arrow keys to navigate)
|
||||
4. **No code changes required** - directory is scanned at startup
|
||||
|
||||
@@ -16,17 +16,17 @@ set(OpenGL_GL_PREFERENCE GLVND)
|
||||
|
||||
# --- LISTA EXPLÍCITA DE FUENTES ---
|
||||
set(APP_SOURCES
|
||||
src/main.cpp
|
||||
src/rendering/shader_backend.cpp
|
||||
src/rendering/opengl_shader_backend.cpp
|
||||
src/rendering/sdl3gpu/sdl3gpu_shader_backend.cpp
|
||||
src/audio/jail_audio.cpp
|
||||
source/main.cpp
|
||||
source/rendering/shader_backend.cpp
|
||||
source/rendering/opengl_shader_backend.cpp
|
||||
source/rendering/sdl3gpu/sdl3gpu_shader_backend.cpp
|
||||
source/audio/jail_audio.cpp
|
||||
)
|
||||
|
||||
# Fuentes de librerías de terceros
|
||||
set(EXTERNAL_SOURCES
|
||||
third_party/glad/src/glad.c
|
||||
third_party/stb_vorbis_impl.cpp
|
||||
source/external/glad/src/glad.c
|
||||
source/external/stb_vorbis_impl.cpp
|
||||
)
|
||||
|
||||
# Configuración de SDL3
|
||||
@@ -40,7 +40,7 @@ if(GLSLC_EXE)
|
||||
add_custom_target(compile_shaders
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
-D GLSLC=${GLSLC_EXE}
|
||||
-D SHADERS_DIR=${CMAKE_SOURCE_DIR}/shaders
|
||||
-D SHADERS_DIR=${CMAKE_SOURCE_DIR}/data/shaders
|
||||
-P ${CMAKE_SOURCE_DIR}/tools/shaders/compile_shaders.cmake
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
COMMENT "Compiling .vk.glsl shaders to SPIR-V")
|
||||
@@ -53,9 +53,9 @@ add_executable(${PROJECT_NAME} ${APP_SOURCES} ${EXTERNAL_SOURCES})
|
||||
|
||||
# --- DIRECTORIOS DE INCLUSIÓN ---
|
||||
target_include_directories(${PROJECT_NAME} PUBLIC
|
||||
"${CMAKE_SOURCE_DIR}/src"
|
||||
"${CMAKE_SOURCE_DIR}/third_party/glad/include"
|
||||
"${CMAKE_SOURCE_DIR}/third_party"
|
||||
"${CMAKE_SOURCE_DIR}/source"
|
||||
"${CMAKE_SOURCE_DIR}/source/external/glad/include"
|
||||
"${CMAKE_SOURCE_DIR}/source/external"
|
||||
)
|
||||
|
||||
# Enlazar la librería SDL3
|
||||
|
||||
23
Makefile
23
Makefile
@@ -1,6 +1,6 @@
|
||||
# Directorios
|
||||
DIR_ROOT := $(dir $(abspath $(MAKEFILE_LIST)))
|
||||
DIR_SOURCES := $(addsuffix /, $(DIR_ROOT)src)
|
||||
DIR_SOURCES := $(addsuffix /, $(DIR_ROOT)source)
|
||||
DIR_BIN := $(addsuffix /, $(DIR_ROOT))
|
||||
DIR_BUILD := $(addsuffix /, $(DIR_ROOT)build)
|
||||
|
||||
@@ -35,16 +35,16 @@ LINUX_RELEASE := $(TARGET_NAME)-$(VERSION)-linux.tar.gz
|
||||
|
||||
# Lista completa de archivos fuente
|
||||
APP_SOURCES := \
|
||||
src/main.cpp \
|
||||
src/rendering/shader_backend.cpp \
|
||||
src/rendering/opengl_shader_backend.cpp \
|
||||
src/rendering/sdl3gpu/sdl3gpu_shader_backend.cpp \
|
||||
src/audio/jail_audio.cpp \
|
||||
third_party/glad/src/glad.c \
|
||||
third_party/stb_vorbis_impl.cpp
|
||||
source/main.cpp \
|
||||
source/rendering/shader_backend.cpp \
|
||||
source/rendering/opengl_shader_backend.cpp \
|
||||
source/rendering/sdl3gpu/sdl3gpu_shader_backend.cpp \
|
||||
source/audio/jail_audio.cpp \
|
||||
source/external/glad/src/glad.c \
|
||||
source/external/stb_vorbis_impl.cpp
|
||||
|
||||
# Includes
|
||||
INCLUDES := -Isrc -Ithird_party/glad/include -Ithird_party
|
||||
INCLUDES := -Isource -Isource/external/glad/include -Isource/external
|
||||
|
||||
# Variables según el sistema operativo
|
||||
ifeq ($(OS),Windows_NT)
|
||||
@@ -98,8 +98,7 @@ windows_release:
|
||||
powershell if (Test-Path "$(RELEASE_FOLDER)") {Remove-Item "$(RELEASE_FOLDER)" -Recurse -Force}
|
||||
powershell if (-not (Test-Path "$(RELEASE_FOLDER)")) {New-Item "$(RELEASE_FOLDER)" -ItemType Directory}
|
||||
|
||||
# Copia la carpeta 'shaders'
|
||||
powershell Copy-Item -Path "shaders" -Destination "$(RELEASE_FOLDER)" -recurse -Force
|
||||
# Copia la carpeta 'data' (que ahora contiene shaders y music)
|
||||
powershell Copy-Item -Path "data" -Destination "$(RELEASE_FOLDER)" -recurse -Force
|
||||
|
||||
# Copia los ficheros que están en la raíz del proyecto
|
||||
@@ -167,7 +166,6 @@ macos_release:
|
||||
$(MKDIR) "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources"
|
||||
|
||||
# Copia carpetas y ficheros
|
||||
cp -R shaders "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources"
|
||||
cp -R data "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources"
|
||||
cp -R release/frameworks/SDL3.xcframework "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Frameworks"
|
||||
cp release/icon.icns "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources"
|
||||
@@ -225,7 +223,6 @@ linux_release:
|
||||
$(MKDIR) "$(RELEASE_FOLDER)"
|
||||
|
||||
# Copia ficheros
|
||||
cp -R shaders "$(RELEASE_FOLDER)"
|
||||
cp -R data "$(RELEASE_FOLDER)"
|
||||
cp LICENSE "$(RELEASE_FOLDER)"
|
||||
cp README.md "$(RELEASE_FOLDER)"
|
||||
|
||||
@@ -398,7 +398,7 @@ int main(int argc, char** argv) {
|
||||
target_folder = arg_path;
|
||||
shaders_directory_ = arg_path.parent_path();
|
||||
} else {
|
||||
shaders_directory_ = std::filesystem::path(resources_dir) / "shaders";
|
||||
shaders_directory_ = std::filesystem::path(resources_dir) / "data" / "shaders";
|
||||
target_folder = shaders_directory_ / shaderPath;
|
||||
}
|
||||
|
||||
@@ -423,7 +423,7 @@ int main(int argc, char** argv) {
|
||||
}
|
||||
|
||||
if (!found_shader) {
|
||||
const std::filesystem::path default_folder = std::filesystem::path(resources_dir) / "shaders" / "test";
|
||||
const std::filesystem::path default_folder = std::filesystem::path(resources_dir) / "data" / "shaders" / "test";
|
||||
for (size_t i = 0; i < shader_list_.size(); ++i) {
|
||||
if (shader_list_[i].folder == default_folder) {
|
||||
initial_index = i;
|
||||
Reference in New Issue
Block a user