dusk/tools/glsltool/glsltool.cmake
2025-02-20 22:09:21 -06:00

37 lines
1.5 KiB
CMake

file(READ ${GLSL_FILE_ABSOLUTE} GLSL_FILE_CONTENTS)
set(INCLUDED_FILES)
function(resolve_includes CONTENTS OUTPUT)
string(REGEX MATCHALL "#include \"([^\"]+)\"" INCLUDES "${CONTENTS}")
foreach(INCLUDE ${INCLUDES})
string(REGEX REPLACE "#include \"([^\"]+)\"" "\\1" INCLUDE_FILE ${INCLUDE})
get_filename_component(INCLUDE_FILE_ABSOLUTE ${GLSL_SOURCE_DIRECTORY}/${INCLUDE_FILE} ABSOLUTE)
list(FIND INCLUDED_FILES ${INCLUDE_FILE_ABSOLUTE} INCLUDE_FILE_INDEX)
if(INCLUDE_FILE_INDEX EQUAL -1)
list(APPEND INCLUDED_FILES ${INCLUDE_FILE_ABSOLUTE})
file(READ ${INCLUDE_FILE_ABSOLUTE} INCLUDED_FILE_CONTENTS)
resolve_includes("${INCLUDED_FILE_CONTENTS}" RESOLVED_CONTENTS)
string(REPLACE "${INCLUDE}" "${RESOLVED_CONTENTS}" CONTENTS "${CONTENTS}")
else()
string(REPLACE "${INCLUDE}" "" CONTENTS "${CONTENTS}")
endif()
endforeach()
set(${OUTPUT} "${CONTENTS}" PARENT_SCOPE)
set(INCLUDED_FILES ${INCLUDED_FILES} PARENT_SCOPE)
endfunction()
list(APPEND INCLUDED_FILES ${GLSL_FILE_ABSOLUTE})
resolve_includes("${GLSL_FILE_CONTENTS}" RESOLVED_GLSL_FILE_CONTENTS)
# Convert to C string
string(REPLACE "\"" "\\\"" RESOLVED_GLSL_FILE_CONTENTS "${RESOLVED_GLSL_FILE_CONTENTS}")
string(REPLACE "\n" "\\n\"\n\"" RESOLVED_GLSL_FILE_CONTENTS "${RESOLVED_GLSL_FILE_CONTENTS}")
set(RESOLVED_GLSL_FILE_CONTENTS "\"${RESOLVED_GLSL_FILE_CONTENTS}\\n\"")
# Write to header file
file(WRITE ${GLSL_FILE_HEADER} "const char* ${GLSL_FILE_NAME_WE}ShaderSource = ${RESOLVED_GLSL_FILE_CONTENTS};")