From b2dad28fa03e3eb376b993fed6bee63725bd11eb Mon Sep 17 00:00:00 2001 From: Kai Blaschke Date: Wed, 1 Nov 2023 22:07:02 +0100 Subject: [PATCH] Pack transition shaders into a resource header. Also added a "sweep" transition. --- .../BuiltInTransitionsResources.hpp.in | 5 +++ src/libprojectM/Renderer/CMakeLists.txt | 31 +++++++++++++++++++ .../GenerateBuiltInTransitionsResources.cmake | 19 ++++++++++++ ...sitionShaderBuiltInSimpleBlendGlsl330.frag | 2 +- .../TransitionShaderBuiltInSweepGlsl330.frag | 22 +++++++++++++ 5 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 src/libprojectM/Renderer/BuiltInTransitionsResources.hpp.in create mode 100644 src/libprojectM/Renderer/GenerateBuiltInTransitionsResources.cmake create mode 100644 src/libprojectM/Renderer/TransitionShaders/TransitionShaderBuiltInSweepGlsl330.frag diff --git a/src/libprojectM/Renderer/BuiltInTransitionsResources.hpp.in b/src/libprojectM/Renderer/BuiltInTransitionsResources.hpp.in new file mode 100644 index 000000000..0097f66d9 --- /dev/null +++ b/src/libprojectM/Renderer/BuiltInTransitionsResources.hpp.in @@ -0,0 +1,5 @@ +#pragma once + +#include + +@STATIC_SHADER_CONTENTS@ diff --git a/src/libprojectM/Renderer/CMakeLists.txt b/src/libprojectM/Renderer/CMakeLists.txt index ad7f45217..35b94b1e5 100644 --- a/src/libprojectM/Renderer/CMakeLists.txt +++ b/src/libprojectM/Renderer/CMakeLists.txt @@ -1,4 +1,32 @@ +set(TRANSITION_SHADER_FILES + TransitionShaders/TransitionShaderBuiltInSimpleBlendGlsl330.frag + TransitionShaders/TransitionShaderBuiltInSweepGlsl330.frag + TransitionShaders/TransitionVertexShaderGlsl330.vert + TransitionShaders/TransitionShaderHeaderGlsl330.frag + TransitionShaders/TransitionShaderMainGlsl330.frag + ) + +string(REPLACE ";" "\\;" TRANSITION_SHADER_FILES_ARG "${TRANSITION_SHADER_FILES}") +add_custom_command(OUTPUT + ${CMAKE_CURRENT_BINARY_DIR}/BuiltInTransitionsResources.hpp + + COMMAND ${CMAKE_COMMAND} + + ARGS + -D SHADER_FILES="${TRANSITION_SHADER_FILES_ARG}" + -D OUTPUT_DIR=${CMAKE_CURRENT_BINARY_DIR} + -P ${CMAKE_CURRENT_SOURCE_DIR}/GenerateBuiltInTransitionsResources.cmake + + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DEPENDS # Files watched for changes: + ${TRANSITION_SHADER_FILES} + BuiltInTransitionsResources.hpp.in + GenerateBuiltInTransitionsResources.cmake + ) + add_library(Renderer OBJECT + ${CMAKE_CURRENT_BINARY_DIR}/BuiltInTransitionsResources.hpp + BuiltInTransitionsResources.hpp.in FileScanner.cpp FileScanner.hpp Framebuffer.cpp @@ -23,11 +51,14 @@ add_library(Renderer OBJECT TextureManager.hpp TextureSamplerDescriptor.cpp TextureSamplerDescriptor.hpp + TransitionShaderManager.cpp + TransitionShaderManager.hpp ) target_include_directories(Renderer PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/.." + "${CMAKE_CURRENT_BINARY_DIR}" PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}" ) diff --git a/src/libprojectM/Renderer/GenerateBuiltInTransitionsResources.cmake b/src/libprojectM/Renderer/GenerateBuiltInTransitionsResources.cmake new file mode 100644 index 000000000..208a884d2 --- /dev/null +++ b/src/libprojectM/Renderer/GenerateBuiltInTransitionsResources.cmake @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 3.20 FATAL_ERROR) + +# Run as custom command in script mode if any shader file has changed. +# Recreates the BuiltInTransitionsResources.hpp file accordingly. + +set(STATIC_SHADER_CONTENTS "") +foreach(shader_file IN LISTS SHADER_FILES) + cmake_path(GET shader_file FILENAME _shader_name) + cmake_path(GET shader_file EXTENSION _shader_type) + cmake_path(REMOVE_EXTENSION _shader_name) + file(READ "${shader_file}" _shader_contents) + + string(REGEX REPLACE "Glsl([0-9]+)" "" _accessor_name ${_shader_name}) + + string(APPEND STATIC_SHADER_CONTENTS "static std::string k${_shader_name} = R\"(\n${_shader_contents})\";\n\n") + +endforeach() + +configure_file(BuiltInTransitionsResources.hpp.in ${OUTPUT_DIR}/BuiltInTransitionsResources.hpp @ONLY) diff --git a/src/libprojectM/Renderer/TransitionShaders/TransitionShaderBuiltInSimpleBlendGlsl330.frag b/src/libprojectM/Renderer/TransitionShaders/TransitionShaderBuiltInSimpleBlendGlsl330.frag index cdea8fcd1..97e2f1469 100644 --- a/src/libprojectM/Renderer/TransitionShaders/TransitionShaderBuiltInSimpleBlendGlsl330.frag +++ b/src/libprojectM/Renderer/TransitionShaders/TransitionShaderBuiltInSimpleBlendGlsl330.frag @@ -1,4 +1,4 @@ - +// Simple crossfade effect from old to new void mainImage( out vec4 fragColor, in vec2 fragCoord ) { vec2 uv = fragCoord / iResolution.xy; diff --git a/src/libprojectM/Renderer/TransitionShaders/TransitionShaderBuiltInSweepGlsl330.frag b/src/libprojectM/Renderer/TransitionShaders/TransitionShaderBuiltInSweepGlsl330.frag new file mode 100644 index 000000000..9a28625c1 --- /dev/null +++ b/src/libprojectM/Renderer/TransitionShaders/TransitionShaderBuiltInSweepGlsl330.frag @@ -0,0 +1,22 @@ +// Side-to-side sweep with random angle and transition zone width +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 uv = fragCoord / iResolution.xy; + vec3 imgOld = texture(iChannel0, uv).xyz; + vec3 imgNew = texture(iChannel1, uv).xyz; + + // Blending + float currentAngle = mod(float(iRandStatic.x), 360.); + float blendWidth = mod(float(iRandStatic.y), .25) + .05; + + uv -= .5; + float angle = radians(90.0) - radians(currentAngle) + atan(uv.y, uv.x); + + float len = length(uv) / sqrt(2.); + uv = vec2(cos(angle) * len, sin(angle) * len) + .5; + + vec3 col = mix(imgOld, imgNew, smoothstep(prog, prog + blendWidth, (uv.x / (1.0 + 2. * blendWidth)) + blendWidth)); + + // Output to screen + fragColor = vec4(col, 1.0); +}