37 lines
1.5 KiB
CMake
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};")
|