mirror of
https://github.com/JoeyDeVries/LearnOpenGL.git
synced 2026-01-02 04:37:54 +08:00
Just silence the warning. Yes, the Right Thing to do would be to use the newer and safer ways instead of getenv, but silencing it is simpler and suffices for this project's needs :)
238 lines
7.5 KiB
CMake
238 lines
7.5 KiB
CMake
cmake_minimum_required (VERSION 3.0)
|
|
cmake_policy(VERSION 3.0)
|
|
|
|
project (LearnOpenGL)
|
|
|
|
set(CMAKE_CXX_STANDARD 11)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
set(CMAKE_CXX_EXTENSIONS ON)
|
|
|
|
IF(NOT CMAKE_BUILD_TYPE)
|
|
SET(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build (Debug or Release)" FORCE)
|
|
ENDIF(NOT CMAKE_BUILD_TYPE)
|
|
|
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/")
|
|
|
|
if(WIN32)
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
|
|
endif(WIN32)
|
|
|
|
link_directories(${CMAKE_SOURCE_DIR}/lib)
|
|
|
|
# find the required packages
|
|
find_package(GLM REQUIRED)
|
|
message(STATUS "GLM included at ${GLM_INCLUDE_DIR}")
|
|
find_package(GLFW3 REQUIRED)
|
|
message(STATUS "Found GLFW3 in ${GLFW3_INCLUDE_DIR}")
|
|
find_package(ASSIMP REQUIRED)
|
|
message(STATUS "Found ASSIMP in ${ASSIMP_INCLUDE_DIR}")
|
|
# find_package(SOIL REQUIRED)
|
|
# message(STATUS "Found SOIL in ${SOIL_INCLUDE_DIR}")
|
|
# find_package(GLEW REQUIRED)
|
|
# message(STATUS "Found GLEW in ${GLEW_INCLUDE_DIR}")
|
|
|
|
if(WIN32)
|
|
set(LIBS glfw3 opengl32 assimp freetype irrKlang)
|
|
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
|
|
elseif(UNIX AND NOT APPLE)
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall")
|
|
find_package(OpenGL REQUIRED)
|
|
add_definitions(${OPENGL_DEFINITIONS})
|
|
find_package(X11 REQUIRED)
|
|
# note that the order is important for setting the libs
|
|
# use pkg-config --libs $(pkg-config --print-requires --print-requires-private glfw3) in a terminal to confirm
|
|
set(LIBS ${GLFW3_LIBRARY} X11 Xrandr Xinerama Xi Xxf86vm Xcursor GL dl pthread freetype ${ASSIMP_LIBRARY})
|
|
set (CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} -ldl")
|
|
elseif(APPLE)
|
|
INCLUDE_DIRECTORIES(/System/Library/Frameworks)
|
|
FIND_LIBRARY(COCOA_LIBRARY Cocoa)
|
|
FIND_LIBRARY(OpenGL_LIBRARY OpenGL)
|
|
FIND_LIBRARY(IOKit_LIBRARY IOKit)
|
|
FIND_LIBRARY(CoreVideo_LIBRARY CoreVideo)
|
|
MARK_AS_ADVANCED(COCOA_LIBRARY OpenGL_LIBRARY)
|
|
SET(APPLE_LIBS ${COCOA_LIBRARY} ${IOKit_LIBRARY} ${OpenGL_LIBRARY} ${CoreVideo_LIBRARY})
|
|
SET(APPLE_LIBS ${APPLE_LIBS} ${GLFW3_LIBRARY} ${ASSIMP_LIBRARY})
|
|
set(LIBS ${LIBS} ${APPLE_LIBS})
|
|
else()
|
|
set(LIBS )
|
|
endif(WIN32)
|
|
|
|
set(CHAPTERS
|
|
1.getting_started
|
|
2.lighting
|
|
3.model_loading
|
|
4.advanced_opengl
|
|
5.advanced_lighting
|
|
6.pbr
|
|
7.in_practice
|
|
)
|
|
|
|
set(1.getting_started
|
|
1.1.hello_window
|
|
1.2.hello_window_clear
|
|
2.1.hello_triangle
|
|
2.2.hello_triangle_indexed
|
|
2.3.hello_triangle_exercise1
|
|
2.4.hello_triangle_exercise2
|
|
2.5.hello_triangle_exercise3
|
|
3.1.shaders_uniform
|
|
3.2.shaders_interpolation
|
|
3.3.shaders_class
|
|
4.1.textures
|
|
4.2.textures_combined
|
|
4.4.textures_exercise2
|
|
4.5.textures_exercise3
|
|
4.6.textures_exercise4
|
|
5.1.transformations
|
|
5.2.transformations_exercise2
|
|
6.1.coordinate_systems
|
|
6.2.coordinate_systems_depth
|
|
6.3.coordinate_systems_multiple
|
|
7.1.camera_circle
|
|
7.2.camera_keyboard_dt
|
|
7.3.camera_mouse_zoom
|
|
7.4.camera_class
|
|
)
|
|
|
|
set(2.lighting
|
|
1.colors
|
|
2.1.basic_lighting_diffuse
|
|
2.2.basic_lighting_specular
|
|
3.1.materials
|
|
3.2.materials_exercise1
|
|
4.1.lighting_maps_diffuse_map
|
|
4.2.lighting_maps_specular_map
|
|
4.4.lighting_maps_exercise4
|
|
5.1.light_casters_directional
|
|
5.2.light_casters_point
|
|
5.3.light_casters_spot
|
|
5.4.light_casters_spot_soft
|
|
6.multiple_lights
|
|
)
|
|
|
|
set(3.model_loading
|
|
1.model_loading
|
|
)
|
|
|
|
set(4.advanced_opengl
|
|
1.1.depth_testing
|
|
1.2.depth_testing_view
|
|
2.stencil_testing
|
|
3.1.blending_discard
|
|
3.2.blending_sort
|
|
5.1.framebuffers
|
|
5.2.framebuffers_exercise1
|
|
6.1.cubemaps_skybox
|
|
6.2.cubemaps_environment_mapping
|
|
8.advanced_glsl_ubo
|
|
9.1.geometry_shader_houses
|
|
9.2.geometry_shader_exploding
|
|
9.3.geometry_shader_normals
|
|
10.1.instancing_quads
|
|
10.2.asteroids
|
|
10.3.asteroids_instanced
|
|
11.1.anti_aliasing_msaa
|
|
11.2.anti_aliasing_offscreen
|
|
)
|
|
|
|
set(5.advanced_lighting
|
|
1.advanced_lighting
|
|
2.gamma_correction
|
|
3.1.1.shadow_mapping_depth
|
|
3.1.2.shadow_mapping_base
|
|
3.1.3.shadow_mapping
|
|
3.2.1.point_shadows
|
|
3.2.2.point_shadows_soft
|
|
4.normal_mapping
|
|
5.1.parallax_mapping
|
|
5.2.steep_parallax_mapping
|
|
5.3.parallax_occlusion_mapping
|
|
6.hdr
|
|
7.bloom
|
|
8.1.deferred_shading
|
|
8.2.deferred_shading_volumes
|
|
9.ssao
|
|
)
|
|
|
|
set(6.pbr
|
|
1.1.lighting
|
|
1.2.lighting_textured
|
|
2.1.1.ibl_irradiance_conversion
|
|
2.1.2.ibl_irradiance
|
|
2.2.1.ibl_specular
|
|
2.2.2.ibl_specular_textured
|
|
)
|
|
|
|
set(7.in_practice
|
|
1.debugging
|
|
2.text_rendering
|
|
#3.2d_game
|
|
)
|
|
|
|
|
|
|
|
configure_file(configuration/root_directory.h.in configuration/root_directory.h)
|
|
include_directories(${CMAKE_BINARY_DIR}/configuration)
|
|
|
|
# first create relevant static libraries requried for other projects
|
|
add_library(STB_IMAGE "src/stb_image.cpp")
|
|
set(LIBS ${LIBS} STB_IMAGE)
|
|
|
|
add_library(GLAD "src/glad.c")
|
|
set(LIBS ${LIBS} GLAD)
|
|
|
|
macro(makeLink src dest target)
|
|
add_custom_command(TARGET ${target} POST_BUILD COMMAND ${CMAKE_COMMAND} -E create_symlink ${src} ${dest} DEPENDS ${dest} COMMENT "mklink ${src} -> ${dest}")
|
|
endmacro()
|
|
|
|
# then create a project file per tutorial
|
|
foreach(CHAPTER ${CHAPTERS})
|
|
foreach(DEMO ${${CHAPTER}})
|
|
file(GLOB SOURCE
|
|
"src/${CHAPTER}/${DEMO}/*.h"
|
|
"src/${CHAPTER}/${DEMO}/*.cpp"
|
|
"src/${CHAPTER}/${DEMO}/*.vs"
|
|
"src/${CHAPTER}/${DEMO}/*.fs"
|
|
"src/${CHAPTER}/${DEMO}/*.gs"
|
|
)
|
|
set(NAME "${CHAPTER}__${DEMO}")
|
|
add_executable(${NAME} ${SOURCE})
|
|
target_link_libraries(${NAME} ${LIBS})
|
|
if(WIN32)
|
|
set_target_properties(${NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/bin/${CHAPTER}")
|
|
set_target_properties(${NAME} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/bin/${CHAPTER}/Debug")
|
|
elseif(UNIX AND NOT APPLE)
|
|
set_target_properties(${NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/bin/${CHAPTER}")
|
|
elseif(APPLE)
|
|
set_target_properties(${NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/bin/${CHAPTER}")
|
|
set_target_properties(${NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_SOURCE_DIR}/bin/${CHAPTER}")
|
|
set_target_properties(${NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_SOURCE_DIR}/bin/${CHAPTER}")
|
|
endif(WIN32)
|
|
# copy shader files to build directory
|
|
file(GLOB SHADERS
|
|
"src/${CHAPTER}/${DEMO}/*.vs"
|
|
# "src/${CHAPTER}/${DEMO}/*.frag"
|
|
"src/${CHAPTER}/${DEMO}/*.fs"
|
|
"src/${CHAPTER}/${DEMO}/*.gs"
|
|
)
|
|
foreach(SHADER ${SHADERS})
|
|
if(WIN32)
|
|
# configure_file(${SHADER} "test")
|
|
add_custom_command(TARGET ${NAME} PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${SHADER} $<TARGET_FILE_DIR:${NAME}>)
|
|
elseif(UNIX AND NOT APPLE)
|
|
file(COPY ${SHADER} DESTINATION ${CMAKE_SOURCE_DIR}/bin/${CHAPTER})
|
|
elseif(APPLE)
|
|
# create symbolic link for *.vs *.fs *.gs
|
|
get_filename_component(SHADERNAME ${SHADER} NAME)
|
|
makeLink(${SHADER} ${CMAKE_SOURCE_DIR}/bin/${CHAPTER}/${SHADERNAME} ${NAME})
|
|
endif(WIN32)
|
|
endforeach(SHADER)
|
|
# if compiling for visual studio, also use configure file for each project (specifically to set up working directory)
|
|
if(MSVC)
|
|
configure_file(${CMAKE_SOURCE_DIR}/configuration/visualstudio.vcxproj.user.in ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.vcxproj.user @ONLY)
|
|
endif(MSVC)
|
|
endforeach(DEMO)
|
|
endforeach(CHAPTER)
|
|
|
|
include_directories(${CMAKE_SOURCE_DIR}/includes)
|