cmake_minimum_required (VERSION 2.8)

if (NOT WIN32)
	message (FATAL_ERROR "Only Win32 supported")
endif()

set (CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Reset the configurations to what we need" FORCE)
	
set (PROJECT_NAME GpuRaymarchDistanceFields)
project (${PROJECT_NAME})

if (NOT MSVC)
	message (FATAL_ERROR "Only Microsoft Visual Studio supported")
endif()

if (CMAKE_CL_64)
	set (PLATFORM_NAME "x64")
else()
	set (PLATFORM_NAME "Win32")
endif()

cmake_policy (SET CMP0015 NEW)

add_subdirectory (libs/common libs/common/lib)
add_subdirectory (libs/math libs/math/lib)
add_subdirectory (libs/opengldriver libs/opengldriver/lib)
add_subdirectory (libs/realtimeapp libs/realtimeapp/lib)

file (GLOB RSRC src/*.rc)
file (GLOB SHADERS src/*.glsl)
file (GLOB SRCS src/*.cpp)

# Right now msvc its the only platform supported 
# but I want to be explicit here just in case
# in the future I want to support another compiler
if (MSVC)
	file (GLOB HDRS src/*.h)
	set (SRCS ${SRCS} ${HDRS} ${SHADERS} ${RSRC})
				
	source_group("Shader Files" FILES ${SHADERS})

	if (CMAKE_CL_64)
		set (CMAKE_CXX_FLAGS_DEBUG "/Zi /nologo /W4 /WX /Od -DWIN64 -D_DEBUG -D_WINDOWS -DGLEW_STATIC -D_UNICODE -DUNICODE /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /wd4127 /wd4244 /wd4512 /errorReport:queue")
		set (CMAKE_CXX_FLAGS_RELEASE "/Zi /nologo /W4 /WX /O2 /Oi /GL -DWIN64 -DNDEBUG -D_WINDOWS -DGLEW_STATIC -D_UNICODE -DUNICODE /Gm- /EHsc /MD /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Gd /wd4127 /wd4244 /wd4512 /errorReport:queue")
	else()
		set (CMAKE_CXX_FLAGS_DEBUG "/ZI /nologo /W4 /WX /Od /Oy- -DWIN32 -D_DEBUG -D_WINDOWS -DGLEW_STATIC -D_UNICODE -DUNICODE /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /wd4127 /wd4244 /wd4512 /analyze- /errorReport:queue")
		set (CMAKE_CXX_FLAGS_RELEASE "/Zi /nologo /W4 /WX /O2 /Oi /Oy- /GL -DWIN32 -DNDEBUG -D_WINDOWS -DGLEW_STATIC -D_UNICODE -DUNICODE /Gm- /EHsc /MD /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Gd /wd4127 /wd4244 /wd4512 /analyze- /errorReport:queue")
	endif()	
endif()

source_group("Shader Files" FILES ${SHADERS})
source_group("Resource Files" FILES ${RSRC})

set (BOOST_LIB_DIR "" CACHE PATH "Boost lib folder")
if (NOT EXISTS ${BOOST_LIB_DIR})
	message (SEND_ERROR "${BOOST_LIB_DIR} doesn't exist")
endif()

set (GLEW_LIB_DIR "" CACHE PATH "Glew lib folder")
if (NOT EXISTS ${GLEW_LIB_DIR})
	message (SEND_ERROR "${GLEW_LIB_DIR} doesn't exist")
endif()

set (GLEW_LIBRARY_FILE_NAME "glew64s.lib" CACHE PATH "Glew lib filename")


set (COMMON_INCLUDE_DIR "libs/Common/include")
set (MATH_INCLUDE_DIR "libs/Math/include")
set (OPENGLDRIVER_INCLUDE_DIR "libs/OpenglDriver/include")
set (REALTIMEAPP_INCLUDE_DIR "libs/RealTimeApp/include/")

set (COMMON_LIB_DIR "libs/Common/lib/${PLATFORM_NAME}")
set (MATH_LIB_DIR "libs/Math/lib/${PLATFORM_NAME}")
set (OPENGLDRIVER_LIB_DIR "libs/OpenglDriver/lib/${PLATFORM_NAME}")
set (REALTIMEAPP_LIB_DIR "libs/RealTimeApp/lib/${PLATFORM_NAME}")

set (EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/bin/${PLATFORM_NAME} CACHE INTERNAL "" FORCE)

# This will copy shaders to projects folder so the test can be debugged from visual studio
make_directory(${CMAKE_CURRENT_BINARY_DIR}/glsl/)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/pixelShader.glsl ${CMAKE_CURRENT_BINARY_DIR}/glsl/pixelShader.glsl COPYONLY)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/vertexShader.glsl ${CMAKE_CURRENT_BINARY_DIR}/glsl/vertexShader.glsl COPYONLY)
  
include_directories ("src" ${BOOST_INCLUDE_DIR} ${GLEW_INCLUDE_DIR} ${COMMON_INCLUDE_DIR} ${MATH_INCLUDE_DIR} ${OPENGLDRIVER_INCLUDE_DIR} ${REALTIMEAPP_INCLUDE_DIR})
link_directories (${BOOST_LIB_DIR} ${GLEW_LIB_DIR})

add_executable (${PROJECT_NAME} WIN32 ${SRCS})
target_link_libraries (${PROJECT_NAME} comctl32 ${GLEW_LIBRARY_FILE_NAME} OpenGL32 Common Math OpenglDriver RealTimeApp)
add_dependencies(${PROJECT_NAME} Common Math OpenglDriver RealTimeApp)

add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/src/vertexShader.glsl $(OutDir)glsl/vertexShader.glsl)
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/src/pixelShader.glsl $(OutDir)glsl/pixelShader.glsl)




