diff --git a/cmake/macros/AutoScribeShader.cmake b/cmake/macros/AutoScribeShader.cmake new file mode 100755 index 0000000000..5584afe5e9 --- /dev/null +++ b/cmake/macros/AutoScribeShader.cmake @@ -0,0 +1,83 @@ +# +# AutoScribeShader.cmake +# +# Created by Sam Gateau on 12/17/14. +# Copyright 2014 High Fidelity, Inc. +# +# Distributed under the Apache License, Version 2.0. +# See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +# + +function(AUTOSCRIBE_SHADER SHADER_FILE) + + # Grab include files + foreach(includeFile ${ARGN}) + list(APPEND SHADER_INCLUDE_FILES ${includeFile}) + endforeach() + + #Extract the unique include shader paths + foreach(SHADER_INCLUDE ${SHADER_INCLUDE_FILES}) + get_filename_component(INCLUDE_DIR ${SHADER_INCLUDE} PATH) + list(APPEND SHADER_INCLUDES_PATHS ${INCLUDE_DIR}) + endforeach() + list(REMOVE_DUPLICATES SHADER_INCLUDES_PATHS) + + # make the scribe include arguments + set(SCRIBE_INCLUDES) + foreach(INCLUDE_PATH ${SHADER_INCLUDES_PATHS}) + set(SCRIBE_INCLUDES ${SCRIBE_INCLUDES} -I ${INCLUDE_PATH}/) + endforeach() + + # Define the final name of the generated shader file + get_filename_component(SHADER_TARGET ${SHADER_FILE} NAME_WE) + get_filename_component(SHADER_EXT ${SHADER_FILE} EXT) + if(SHADER_EXT STREQUAL .slv) + set(SHADER_TARGET ${SHADER_TARGET}_vert.h) + elseif(${SHADER_EXT} STREQUAL .slf) + set(SHADER_TARGET ${SHADER_TARGET}_frag.h) + endif() + + # Target dependant Custom rule on the SHADER_FILE + if (APPLE) + set(GLPROFILE MAC_GL) + set(SCRIBE_ARGS -c++ -D GLPROFILE ${GLPROFILE} ${SCRIBE_INCLUDES} -o ${SHADER_TARGET} ${SHADER_FILE}) + + add_custom_command(OUTPUT ${SHADER_TARGET} COMMAND scribe ${SCRIBE_ARGS} DEPENDS scribe ${SHADER_INCLUDE_FILES} ${SHADER_FILE}) + else (APPLE) + set(GLPROFILE PC_GL) + set(SCRIBE_ARGS -c++ -D GLPROFILE ${GLPROFILE} ${SCRIBE_INCLUDES} -o ${SHADER_TARGET} ${SHADER_FILE}) + + add_custom_command(OUTPUT ${SHADER_TARGET} COMMAND scribe ${SCRIBE_ARGS} DEPENDS scribe ${SHADER_INCLUDE_FILES} ${SHADER_FILE}) + endif() + + #output the generated file name + set(AUTOSCRIBE_SHADER_RETURN ${SHADER_TARGET} PARENT_SCOPE) + + file(GLOB INCLUDE_FILES ${SHADER_TARGET}) + +endfunction() + + +macro(AUTOSCRIBE_SHADER_LIB) + + file(GLOB_RECURSE SHADER_INCLUDE_FILES src/*.slh) + file(GLOB_RECURSE SHADER_SOURCE_FILES src/*.slv src/*.slf) + + #message(${SHADER_INCLUDE_FILES}) + foreach(SHADER_FILE ${SHADER_SOURCE_FILES}) + AUTOSCRIBE_SHADER(${SHADER_FILE} ${SHADER_INCLUDE_FILES}) + list(APPEND AUTOSCRIBE_SHADER_SRC ${AUTOSCRIBE_SHADER_RETURN}) + endforeach() + #message(${AUTOSCRIBE_SHADER_SRC}) + + if (WIN32) + source_group("Shaders" FILES ${SHADER_INCLUDE_FILES}) + source_group("Shaders" FILES ${SHADER_SOURCE_FILES}) + source_group("Shaders" FILES ${AUTOSCRIBE_SHADER_SRC}) + endif() + + list(APPEND AUTOSCRIBE_SHADER_LIB_SRC ${SHADER_INCLUDE_FILES}) + list(APPEND AUTOSCRIBE_SHADER_LIB_SRC ${SHADER_SOURCE_FILES}) + list(APPEND AUTOSCRIBE_SHADER_LIB_SRC ${AUTOSCRIBE_SHADER_SRC}) + +endmacro() diff --git a/cmake/macros/SetupHifiLibrary.cmake b/cmake/macros/SetupHifiLibrary.cmake index 362a833862..e76e1112e3 100644 --- a/cmake/macros/SetupHifiLibrary.cmake +++ b/cmake/macros/SetupHifiLibrary.cmake @@ -16,7 +16,7 @@ macro(SETUP_HIFI_LIBRARY) set(LIB_SRCS ${LIB_SRCS}) # create a library and set the property so it can be referenced later - add_library(${TARGET_NAME} ${LIB_SRCS} ${AUTOMTC_SRC}) + add_library(${TARGET_NAME} ${LIB_SRCS} ${AUTOMTC_SRC} ${AUTOSCRIBE_SHADER_LIB_SRC}) set(${TARGET_NAME}_DEPENDENCY_QT_MODULES ${ARGN}) list(APPEND ${TARGET_NAME}_DEPENDENCY_QT_MODULES Core) diff --git a/libraries/render-utils/CMakeLists.txt b/libraries/render-utils/CMakeLists.txt index 97dc9c7bc8..f84bd97c13 100644 --- a/libraries/render-utils/CMakeLists.txt +++ b/libraries/render-utils/CMakeLists.txt @@ -1,11 +1,13 @@ -set(TARGET_NAME render-utils) - -# use setup_hifi_library macro to setup our project and link appropriate Qt modules -setup_hifi_library(Widgets OpenGL Network Script) - -include_glm() - -link_hifi_libraries(animation fbx shared gpu) - -# call macro to include our dependency includes and bubble them up via a property on our target -include_dependency_includes() +set(TARGET_NAME render-utils) + +AUTOSCRIBE_SHADER_LIB() + +# use setup_hifi_library macro to setup our project and link appropriate Qt modules +setup_hifi_library(Widgets OpenGL Network Script) + +include_glm() + +link_hifi_libraries(animation fbx shared gpu) + +# call macro to include our dependency includes and bubble them up via a property on our target +include_dependency_includes() \ No newline at end of file diff --git a/libraries/render-utils/src/Config.slh b/libraries/render-utils/src/Config.slh new file mode 100755 index 0000000000..b431b671a6 --- /dev/null +++ b/libraries/render-utils/src/Config.slh @@ -0,0 +1,22 @@ + +<@if not CONFIG_SLH@> +<@def CONFIG_SLH@> + +<@if GLPROFILE == PC_GL @> + <@def VERSION_HEADER #version 330 compatibility@> +<@elif GLPROFILE == MAC_GL @> + <@def VERSION_HEADER #version 120@> +<@else@> + <@def VERSION_HEADER #version 120@> +<@endif@> + +<@endif@> diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 6d313bc7aa..680d193aa3 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -35,6 +35,8 @@ #include "GlowEffect.h" #include "Model.h" +#include "model_vert.h" +#include "model_frag.h" #define GLBATCH( call ) batch._##call //#define GLBATCH( call ) call @@ -233,8 +235,8 @@ void Model::initJointTransforms() { void Model::init() { if (!_program.isLinked()) { - _program.addShaderFromSourceFile(QGLShader::Vertex, PathUtils::resourcesPath() + "shaders/model.vert"); - _program.addShaderFromSourceFile(QGLShader::Fragment, PathUtils::resourcesPath() + "shaders/model.frag"); + _program.addShaderFromSourceCode(QGLShader::Vertex, model_vert); + _program.addShaderFromSourceCode(QGLShader::Fragment, model_frag); initProgram(_program, _locations); @@ -245,8 +247,7 @@ void Model::init() { initProgram(_normalMapProgram, _normalMapLocations); - _specularMapProgram.addShaderFromSourceFile(QGLShader::Vertex, - PathUtils::resourcesPath() + "shaders/model.vert"); + _specularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_vert); _specularMapProgram.addShaderFromSourceFile(QGLShader::Fragment, PathUtils::resourcesPath() + "shaders/model_specular_map.frag"); @@ -259,8 +260,7 @@ void Model::init() { initProgram(_normalSpecularMapProgram, _normalSpecularMapLocations); - _translucentProgram.addShaderFromSourceFile(QGLShader::Vertex, - PathUtils::resourcesPath() + "shaders/model.vert"); + _translucentProgram.addShaderFromSourceCode(QGLShader::Vertex, model_vert); _translucentProgram.addShaderFromSourceFile(QGLShader::Fragment, PathUtils::resourcesPath() + "shaders/model_translucent.frag"); @@ -300,7 +300,7 @@ void Model::init() { PathUtils::resourcesPath() + "shaders/model_shadow.frag"); _skinProgram.addShaderFromSourceFile(QGLShader::Vertex, PathUtils::resourcesPath() + "shaders/skin_model.vert"); - _skinProgram.addShaderFromSourceFile(QGLShader::Fragment, PathUtils::resourcesPath() + "shaders/model.frag"); + _skinProgram.addShaderFromSourceCode(QGLShader::Fragment, model_frag); initSkinProgram(_skinProgram, _skinLocations); diff --git a/interface/resources/shaders/model.frag b/libraries/render-utils/src/model.slf old mode 100644 new mode 100755 similarity index 91% rename from interface/resources/shaders/model.frag rename to libraries/render-utils/src/model.slf index 82bc70ec46..42421c71a2 --- a/interface/resources/shaders/model.frag +++ b/libraries/render-utils/src/model.slf @@ -1,6 +1,6 @@ -#version 120 - -// +<@include Config.slh@> +<$VERSION_HEADER$> +// Generated on <$_SCRIBE_DATE$> // model.frag // fragment shader // diff --git a/interface/resources/shaders/model.vert b/libraries/render-utils/src/model.slv old mode 100644 new mode 100755 similarity index 91% rename from interface/resources/shaders/model.vert rename to libraries/render-utils/src/model.slv index bb0cb32d05..496667a062 --- a/interface/resources/shaders/model.vert +++ b/libraries/render-utils/src/model.slv @@ -1,6 +1,6 @@ -#version 120 - -// +<@include Config.slh@> +<$VERSION_HEADER$> +// Generated on <$_SCRIBE_DATE$> // model.vert // vertex shader // diff --git a/tools/scribe/src/main.cpp b/tools/scribe/src/main.cpp index 55f23f8c55..d36c82a85b 100755 --- a/tools/scribe/src/main.cpp +++ b/tools/scribe/src/main.cpp @@ -192,16 +192,9 @@ int main (int argc, char** argv) { targetStringStream << "#ifndef scribe_" << targetName << "_h" << std::endl; targetStringStream << "#define scribe_" << targetName << "_h" << std::endl << std::endl; - targetStringStream << "const char " << targetName << "[] = {\n\""; - - std::stringstream destStringStreamAgain(destStringStream.str()); - while (!destStringStreamAgain.eof()) { - std::string line; - std::getline(destStringStreamAgain, line); - targetStringStream << line << " \\n\\\n"; - } - targetStringStream << "\"};" << std::endl << std::endl; + targetStringStream << "const char " << targetName << "[] = R\"XXXX(" << destStringStream.str() << ")XXXX\";"; + targetStringStream << std::endl << std::endl; targetStringStream << "#endif" << std::endl; } else { targetStringStream << destStringStream.str();