cmake_minimum_required(VERSION 3.13.0) project(world2) set(CMAKE_CXX_STANDARD 14) set(BLENDER "${CMAKE_SOURCE_DIR}/../../blender-bin/bin/blender" CACHE STRING "Blender path") set(CREATE_DIRECTORIES ${CMAKE_BINARY_DIR}/assets/blender/shapes/male ${CMAKE_BINARY_DIR}/assets/blender/shapes/female ${CMAKE_BINARY_DIR}/assets/blender/scripts ${CMAKE_BINARY_DIR}/characters/shapes/male/chibi ${CMAKE_BINARY_DIR}/characters/shapes/female/chibi ${CMAKE_BINARY_DIR}/characters/male ${CMAKE_BINARY_DIR}/characters/female) #set(CREATE_SCENES # ${CMAKE_SOURCE_DIR}/characters/female/vroid-normal-female.scene # ${CMAKE_SOURCE_DIR}/characters/male/vroid-normal-male.scene # ) # workaround horribly broken assimp cmake, fixed with assimp 5.1 #add_library(assimp INTERFACE IMPORTED) #set_target_properties(assimp PROPERTIES # INTERFACE_LINK_LIBRARIES "assimp;pugixml" # # INTERFACE_LINK_DIRECTORIES "${ASSIMP_LIBRARY_DIRS}" # INTERFACE_LINK_DIRECTORIES "${CMAKE_PREFIX_PATH}/lib" #) file(GLOB WATER_SRC ${CMAKE_SOURCE_DIR}/water/*.cpp) # The COMPONENTS part checks that OGRE was built the way we need it # The CONFIG flag makes sure we get OGRE instead of OGRE-next find_package(OGRE REQUIRED COMPONENTS Bites Bullet Paging Terrain CONFIG) find_package(ZLIB) find_package(SDL2) find_package(assimp REQUIRED CONFIG) find_package(Bullet) find_package(OgreProcedural REQUIRED CONFIG) find_package(pugixml REQUIRED CONFIG) find_package(flecs REQUIRED CONFIG) add_library(fix::assimp INTERFACE IMPORTED) set_target_properties(fix::assimp PROPERTIES INTERFACE_LINK_LIBRARIES "${ASSIMP_LIBRARIES};pugixml" INTERFACE_LINK_DIRECTORIES "${ASSIMP_LIBRARY_DIRS}" # INTERFACE_LINK_DIRECTORIES "${CMAKE_PREFIX_PATH}/lib" ) add_library(fix::OgreProcedural INTERFACE IMPORTED) set_target_properties(fix::OgreProcedural PROPERTIES INTERFACE_LINK_LIBRARIES "OgreProcedural" INTERFACE_LINK_DIRECTORIES "${CMAKE_PREFIX_PATH}/lib" ) if(OGRE_STATIC) add_library(OgreGLSupportStatic INTERFACE IMPORTED) set_target_properties(OgreGLSupportStatic PROPERTIES INTERFACE_LINK_LIBRARIES "OgreGLSupportStatic" INTERFACE_LINK_DIRECTORIES "${CMAKE_PREFIX_PATH}/lib" ) endif() add_library(fix::pugixml INTERFACE IMPORTED) set_target_properties(fix::pugixml PROPERTIES INTERFACE_LINK_LIBRARIES "pugixml" INTERFACE_LINK_DIRECTORIES "${CMAKE_PREFIX_PATH}/lib" ) add_subdirectory(src/lua) add_subdirectory(src/characters) add_subdirectory(src/gamedata) add_subdirectory(src/miniaudio) add_subdirectory(src/sound) add_subdirectory(audio/gui) # add the source files as usual add_executable(0_Bootstrap Bootstrap.cpp) # this also sets the includes and pulls third party dependencies target_link_libraries(0_Bootstrap OgreBites OgreBullet OgrePaging ${BULLET_DYNAMICS_LIBRARY} ${BULLET_COLLISION_LIBRARY} ${BULLET_MATH_LIBRARY} ${ASSIMP_LIBRARIES} -Wl,--as-needed ) if(OGRE_STATIC) target_link_options(0_Bootstrap PRIVATE -static-libstdc++ -static-libgcc) endif() add_dependencies(0_Bootstrap stage_files import_vrm) add_executable(Editor Editor.cpp ${WATER_SRC}) target_link_libraries(Editor OgreBites OgreBullet OgrePaging OgreTerrain OgreMeshLodGenerator OgreProcedural::OgreProcedural ${BULLET_DYNAMICS_LIBRARY} ${BULLET_COLLISION_LIBRARY} ${BULLET_MATH_LIBRARY} -Wl,--as-needed ) if(OGRE_STATIC) target_link_options(Editor PRIVATE -static-libstdc++ -static-libgcc) endif() add_dependencies(Editor stage_files import_buildings import_water_stuff import_vehicles import_vrm) add_executable(Game Game.cpp ${WATER_SRC}) target_include_directories(Game PRIVATE src/gamedata) target_link_libraries(Game OgreBites OgreBullet OgrePaging OgreTerrain OgreMeshLodGenerator OgreProcedural::OgreProcedural ${BULLET_DYNAMICS_LIBRARY} ${BULLET_COLLISION_LIBRARY} ${BULLET_MATH_LIBRARY} GameData sound flecs::flecs_static -Wl,--as-needed ) if(OGRE_STATIC) target_link_options(Game PRIVATE -static-libstdc++ -static-libgcc) endif() add_dependencies(Game stage_files import_buildings import_water_stuff import_vehicles import_vrm audio_data_gui) add_executable(Procedural Procedural.cpp) target_link_libraries(Procedural OgreBites OgreBullet OgrePaging OgreTerrain OgreProcedural::OgreProcedural ${BULLET_DYNAMICS_LIBRARY} ${BULLET_COLLISION_LIBRARY} ${BULLET_MATH_LIBRARY} -Wl,--as-needed ) if(OGRE_STATIC) target_link_options(Procedural PRIVATE -static-libstdc++ -static-libgcc) endif() add_dependencies(Procedural stage_files import_buildings) file(GLOB BUILDINGS_SRC ${CMAKE_SOURCE_DIR}/assets/blender/buildings/*.blend) set(BUILDING_OUTPUT_FILES) foreach(BUILDING_FILE ${BUILDINGS_SRC}) get_filename_component(FILE_NAME ${BUILDING_FILE} NAME_WE) set(BUILDING_OUTPUT_FILE ${CMAKE_BINARY_DIR}/resources/buildings/${FILE_NAME}.gltf) add_custom_command( OUTPUT ${BUILDING_OUTPUT_FILE} COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/resources/buildings COMMAND ${BLENDER} ${BUILDING_FILE} -b -Y -P ${CMAKE_SOURCE_DIR}/assets/blender/scripts/export_buildings.py -- ${BUILDING_OUTPUT_FILE} COMMAND touch ${BUILDING_OUTPUT_FILE} DEPENDS ${BUILDING_FILE}) list(APPEND BUILDING_OUTPUT_FILES ${BUILDING_OUTPUT_FILE}) endforeach() add_custom_target(import_buildings ALL DEPENDS ${BUILDING_OUTPUT_FILES}) file(GLOB VEHICLES_SRC ${CMAKE_SOURCE_DIR}/assets/blender/vehicles/*.blend) set(VEHICLE_OUTPUT_FILES) foreach(VEHICLE_FILE ${VEHICLES_SRC}) get_filename_component(FILE_NAME ${VEHICLE_FILE} NAME_WE) set(VEHICLE_OUTPUT_FILE ${CMAKE_BINARY_DIR}/resources/vehicles/${FILE_NAME}.glb) add_custom_command( OUTPUT ${VEHICLE_OUTPUT_FILE} COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/resources/vehicles COMMAND ${BLENDER} ${VEHICLE_FILE} -b -Y -P ${CMAKE_SOURCE_DIR}/assets/blender/scripts/export_buildings.py -- ${VEHICLE_OUTPUT_FILE} COMMAND touch ${VEHICLE_OUTPUT_FILE} DEPENDS ${VEHICLE_FILE}) list(APPEND VEHICLE_OUTPUT_FILES ${VEHICLE_OUTPUT_FILE}) endforeach() add_custom_target(import_vehicles ALL DEPENDS ${VEHICLE_OUTPUT_FILES}) set(WATER_STUFF) add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/water/sea.glb COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/water COMMAND ${BLENDER} ${CMAKE_SOURCE_DIR}/assets/blender/sea.blend -b -Y -P ${CMAKE_SOURCE_DIR}/assets/blender/scripts/export_buildings.py -- ${CMAKE_BINARY_DIR}/water/sea.glb COMMAND touch ${CMAKE_BINARY_DIR}/water/sea.glb DEPENDS ${CMAKE_SOURCE_DIR}/assets/blender/sea.blend) list(APPEND WATER_STUFF ${CMAKE_BINARY_DIR}/water/sea.glb) add_custom_target(import_water_stuff ALL DEPENDS ${WATER_STUFF}) add_executable(TerrainTest terrain.cpp) target_link_libraries(TerrainTest OgreBites OgreBullet OgrePaging OgreTerrain lua ${BULLET_DYNAMICS_LIBRARY} ${BULLET_COLLISION_LIBRARY} ${BULLET_MATH_LIBRARY} -Wl,--as-needed ) target_include_directories(TerrainTest PRIVATE . src/terrain src/lua src/lua/lua-5.4.8/src) if(OGRE_STATIC) target_link_libraries(TerrainTest fix::assimp pugixml) target_link_options(TerrainTest PRIVATE -static-libstdc++ -static-libgcc) target_link_libraries(Procedural fix::assimp pugixml) target_link_libraries(0_Bootstrap fix::assimp pugixml) target_link_libraries(Editor fix::assimp pugixml) endif() file(GLOB LUA_SCRIPTS_SRC ${CMAKE_SOURCE_DIR}/lua-scripts/*.lua) set(LUA_SCRIPTS_OUTPUT) foreach(LUA_SCRIPT_FILE ${LUA_SCRIPTS_SRC}) get_filename_component(FILE_NAME ${LUA_SCRIPT_FILE} NAME_WE) set(LUA_SCRIPT_OUTPUT_FILE ${CMAKE_BINARY_DIR}/lua-scripts/${FILE_NAME}.lua) add_custom_command(OUTPUT ${LUA_SCRIPT_OUTPUT_FILE} COMMAND ${CMAKE_COMMAND} -E copy ${LUA_SCRIPT_FILE} ${LUA_SCRIPT_OUTPUT_FILE} DEPENDS ${LUA_SCRIPT_FILE}) list(APPEND LUA_SCRIPTS_OUTPUT ${LUA_SCRIPT_OUTPUT_FILE}) endforeach() add_custom_target(stage_lua_scripts ALL DEPENDS ${LUA_SCRIPTS_OUTPUT}) add_dependencies(TerrainTest stage_lua_scripts stage_files) add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/resources.cfg COMMAND cp ${CMAKE_SOURCE_DIR}/resources.cfg ${CMAKE_BINARY_DIR}/resources.cfg COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/resources/main ${CMAKE_BINARY_DIR}/resources/main COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/resources/shaderlib ${CMAKE_BINARY_DIR}/resources/shaderlib COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/resources/terrain ${CMAKE_BINARY_DIR}/resources/terrain # COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/lua-scripts # ${CMAKE_BINARY_DIR}/lua-scripts # COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/skybox # ${CMAKE_BINARY_DIR}/skybox # COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/resources/debug # ${CMAKE_BINARY_DIR}/resources/debug DEPENDS ${CMAKE_SOURCE_DIR}/resources.cfg) add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/resources/terrain/world_map.png COMMAND unzip -o ${CMAKE_SOURCE_DIR}/world_map.kra mergedimage.png -d ${CMAKE_BINARY_DIR}/world_map COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/world_map/mergedimage.png ${CMAKE_BINARY_DIR}/resources/terrain/world_map.png COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_BINARY_DIR}/world_map DEPENDS ${CMAKE_SOURCE_DIR}/world_map.kra) add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/resources/terrain/brushes.png COMMAND unzip -o ${CMAKE_SOURCE_DIR}/brushes.kra mergedimage.png -d ${CMAKE_BINARY_DIR}/brushes COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/brushes/mergedimage.png ${CMAKE_BINARY_DIR}/resources/terrain/brushes.png COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_BINARY_DIR}/brushes DEPENDS ${CMAKE_SOURCE_DIR}/brushes.kra) set(SKYBOX_SRC early_morning_bk.jpg early_morning_dn.jpg early_morning_fr.jpg early_morning_lf.jpg early_morning_rt.jpg early_morning_up.jpg skybox.material ) set(DEBUG_MATERIAL_SRC debug.frag debug.material debug.program debug.vert ) set(WATER_SRC water.material water.program water.frag water.vert depth.frag depth.vert water.compositor waves2.png ) set(MATERIAL_FILES) foreach(MATERIAL_FILE ${SKYBOX_SRC}) list(APPEND MATERIAL_FILES skybox/${MATERIAL_FILE}) endforeach() foreach(MATERIAL_FILE ${DEBUG_MATERIAL_SRC}) list(APPEND MATERIAL_FILES resources/debug/${MATERIAL_FILE}) endforeach() foreach(MATERIAL_FILE ${WATER_SRC}) list(APPEND MATERIAL_FILES water/${MATERIAL_FILE}) endforeach() set(MATERIALS_OUTPUT) foreach(MATERIAL_FILE ${MATERIAL_FILES}) set(OUTPUT_FILE ${CMAKE_BINARY_DIR}/${MATERIAL_FILE}) set(INPUT_FILE ${CMAKE_SOURCE_DIR}/${MATERIAL_FILE}) add_custom_command(OUTPUT ${OUTPUT_FILE} COMMAND ${CMAKE_COMMAND} -E copy ${INPUT_FILE} ${OUTPUT_FILE} DEPENDS ${INPUT_FILE}) list(APPEND MATERIALS_OUTPUT ${OUTPUT_FILE}) endforeach() file(GLOB VRM_FILES RELATIVE ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/assets/vroid/*.vrm) file(GLOB MIXAMO_FILES RELATIVE ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/assets/blender/mixamo/**/*.fbx) file(GLOB EDITED_BLENDS RELATIVE ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/assets/blender/edited-*.blend) set(VRM_SOURCE) foreach(VRM_FILE ${VRM_FILES} ${MIXAMO_FILES} ${EDITED_BLENDS}) set(OUTPUT_FILE "${CMAKE_BINARY_DIR}/${VRM_FILE}") set(INPUT_FILE "${CMAKE_SOURCE_DIR}/${VRM_FILE}") add_custom_command(OUTPUT "${OUTPUT_FILE}" COMMAND ${CMAKE_COMMAND} -E copy "${INPUT_FILE}" "${OUTPUT_FILE}" DEPENDS "${INPUT_FILE}" VERBATIM) list(APPEND VRM_SOURCE "${OUTPUT_FILE}") endforeach() set(VRM_IMPORTED_BLENDS ${CMAKE_BINARY_DIR}/assets/blender/vrm-vroid-normal-female.blend ${CMAKE_BINARY_DIR}/assets/blender/vrm-vroid-normal-male.blend ${CMAKE_BINARY_DIR}/assets/blender/shapes/male/vrm-vroid-normal-male-chibi.blend ) add_custom_command(OUTPUT ${VRM_IMPORTED_BLENDS} COMMAND ${CMAKE_COMMAND} -E make_directory ${CREATE_DIRECTORIES} COMMAND ${BLENDER} -b -Y -P ${CMAKE_SOURCE_DIR}/assets/blender/scripts/import_vrm.py COMMAND ${CMAKE_COMMAND} -E touch_nocreate ${VRM_IMPORTED_BLENDS} DEPENDS ${CMAKE_SOURCE_DIR}/assets/blender/scripts/import_vrm.py ${VRM_SOURCE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) set(CHARACTER_GLBS ${CMAKE_BINARY_DIR}/characters/male/normal-male.glb) add_custom_command( OUTPUT ${CHARACTER_GLBS} COMMAND ${CMAKE_COMMAND} -E make_directory ${CREATE_DIRECTORIES} COMMAND ${BLENDER} -b -Y -P ${CMAKE_SOURCE_DIR}/assets/blender/scripts/export_models.py COMMAND ${CMAKE_COMMAND} -E touch ${CHARACTER_GLBS} DEPENDS ${CMAKE_SOURCE_DIR}/assets/blender/scripts/export_models.py ${VRM_IMPORTED_BLENDS} ${EDITED_BLENDS} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) #add_custom_command( # OUTPUT ${CMAKE_SOURCE_DIR}/characters/female/vroid-normal-female.scene # ${CMAKE_SOURCE_DIR}/characters/male/vroid-normal-male.scene # ${CMAKE_SOURCE_DIR}/assets/blender/vrm-vroid-normal-female.blend # ${CMAKE_SOURCE_DIR}/assets/blender/vrm-vroid-normal-male.blend # ${CMAKE_SOURCE_DIR}/assets/blender/shapes/male/vrm-vroid-normal-male-chibi.blend # COMMAND mkdir -p ${CREATE_DIRECTORIES} # COMMAND ${BLENDER} -b -Y -P ${CMAKE_SOURCE_DIR}/assets/blender/scripts/import_vrm.py # COMMAND ${BLENDER} -b -Y -P ${CMAKE_SOURCE_DIR}/assets/blender/scripts/export_models.py ## COMMAND ${BLENDER} -b -Y -P ${CMAKE_SOURCE_DIR}/assets/blender/scripts/export_ogre_scene.py # COMMAND echo rm -Rf ${CMAKE_SOURCE_DIR}/characters/male/*.material ${CMAKE_SOURCE_DIR}/characters/female/*.material # COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/characters # ${CMAKE_BINARY_DIR}/characters # DEPENDS ${CMAKE_SOURCE_DIR}/assets/blender/scripts/export_models.py ${CMAKE_SOURCE_DIR}/assets/blender/scripts/import_vrm.py # ${CMAKE_SOURCE_DIR}/assets/vroid/buch1.vrm # ${CMAKE_SOURCE_DIR}/assets/vroid/buch1-chibi.vrm # ${CMAKE_SOURCE_DIR}/assets/vroid/jane2-dress.vrm # WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) add_custom_target(stage_files ALL DEPENDS ${CMAKE_BINARY_DIR}/resources.cfg ${MATERIALS_OUTPUT} ${CMAKE_BINARY_DIR}/resources/terrain/world_map.png ${CMAKE_BINARY_DIR}/resources/terrain/brushes.png) add_custom_target(remove_scenes COMMAND rm -f ${VRM_SOURCE} ${VRM_IMPORTED_BLENDS} ${CHARACTER_GLBS}) add_custom_target(import_vrm DEPENDS ${CHARACTER_GLBS}) install(TARGETS Editor DESTINATION bin)