mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-10-29 02:17:28 +01:00
fix(cab): the line contactors lamp goes out with the pressure switch (eu07/maszyna#470) The lamp of the open line contactors, which tells the start can be made, went out at 1 bar in the brake cylinders, while the pressure switch cuts the start off only at 2 bar (or below 3.6 bar in the main pipe), so with the brakes partly applied the start could be made with the lamp out. With a pressure switch fitted the lamp now follows it; without one it goes out at 1 bar as before. The same holds for the lamp of the second unit, which used to keep its last state between 1 bar and the cut-off. The condition is TMoverParameters::LineContactorsLampLit(). Tests: tests/unit/test_line_contactors.cpp. refactor: Sonar findings of PR 217 - horn_supply::pneumatic shadowed the pneumatic enumerator of the sound flags (cpp:S1117), it's horn_supply::air; the supplies read with using enum (S6177), - CouplerForce(): the automatic coupling refused or caught without another level of nested ifs (S134), the same outcome: too fast, the coupling is locked; caught, coupled and locked; otherwise left to try again, - CompressorCheck(): the power the compressor doesn't draw yet noted without a TODO (S1135), - tests: the previous crash damage setting in an in-class initializer (S3230), the loops which stop early with break rather than in their conditions (S886), the stand-ins of test::pair in a std::vector rather than an array (S5945), units in the comments of the example without /* */ (S1103). test: the cases the changes of the branch left without a test - Cntrl.: BDelay1 to BDelay4 reach the brake delays (now through std::format), the default start types of the ground and converter overload relays of a multiple unit and of other vehicles (out of the nested conditionals), - the compressor: fed from the low voltage it waits from the low voltage coming on; the pressure switch stops it above the cut-out pressure, without one the excess air is vented (the vented fraction rewritten), - the horns: a vehicle without any air sounds as before, the threshold pressure, an electric horn on 110 V, - the positions of a cab control below zero, and a control without position sounds. refactor(cab): the kind of the train heating switch as a flag Read once with the vehicle definition, rather than compared as text in each of the switch commands. feat(cab): train heating switch springing back (MaSzyna-EU07/maszyna#85) TrainHeating=[toggle]|impulse in the Switches: section of the vehicle definition makes the train heating switch an unstable one: it goes up to switch the heating on, down to switch it off, and back to the middle once let go, instead of staying where it was put. The position of such a switch isn't set from the heating state when the cab is entered. Tests: tests/unit/test_switches.cpp. feat(sound): mirror sounds (MaSzyna-EU07/maszyna#84, eu07/maszyna#322) The sound definitions of a vehicle (.mmd) take mirroropen: and mirrorclose:, played as a mirror sets off unfolding or folding, and the locations section mirrors: <offset>... end, the offsets along the vehicle of the mirror pairs, as for the doors (negative ahead of the centre), each pair at the sides of the vehicle. As the animation, only the mirrors at the occupied cab sound. The start of a move is mirror_moves::motion in vehicle/mirrors.h. Tests: tests/unit/test_mirrors.cpp. feat(cab): joint oil and fuel pump switch (MaSzyna-EU07/maszyna#81) A cab control oilfuelpump_sw: switches both the oil and the fuel pump at once, with the new command oilfuelpumptoggle (no key by default). As a two-state switch it turns both pumps off when both are on and both on otherwise; as an impulse switch it's held to start them, like the separate pump switches. Its position follows the pumps when the cab is entered. refactor(editor): text fields filled without strncpy (MaSzyna-EU07/maszyna#112) The last three strncpy calls Sonar flags (cpp:S5816), in the road and track editors, copy the text into the ImGui field buffers with std::string::copy and terminate it right after; the text gets cut to the buffer as before. fix: automatic coupler crashes, horns, compressor start delay, radio and cab lever sounds - automatic couplers don't catch above the safe collision speed (#86): with crash damage on they couple at a closing speed of 15 km/h at most, a faster hit locks the coupling until the vehicles part and the collision runs its course. On the way: CollisionVelocity() read a head-on 10 + 10 km/h as 14.1 km/h (quaternions turn by half the angle), it's now taken from the touching ends; CollisionDetect() took the other vehicle's speed the wrong way round for vehicles facing each other. Head-on hits now derail sooner, at the intended limit, - a single horn lever can't sound both tones at once (eu07/maszyna#392), - a skid ends once the vehicle stops on locked wheels (eu07/maszyna#479), - electronic destination signs are blanked at the end of the timetable (eu07/maszyna#446), - horns need the air or the voltage to sound (eu07/maszyna#290, #76): HornType=[Pneumatic]|Electric and Horn3Type in Cntrl.; a pneumatic horn needs 0.2 MPa in the main reservoir (or the main pipe without one), an electric one the low voltage; the lever stays where it was put, - compressor start delay (#67): CompressorStartDelay [s] in Brake., counted from the compressor getting its power, after the engine starts say; none by default, - the channel and volume buttons of a radio without power do nothing (eu07/maszyna#429); the power check of the radio is TMoverParameters::RadioPowered(), - a lever moved smoothly sounds the positions it passes (#83). Sonar findings in the functions changed: nesting, nested conditionals, commented-out code, std::format, references to const. Unit tests: test::pair for two vehicles running into each other, test_couplers, test_horn, test_wheelslip, test_compressor, test_radio, test_gauge_positions.
739 lines
24 KiB
CMake
739 lines
24 KiB
CMake
cmake_minimum_required(VERSION 3.26)
|
|
if(POLICY CMP0058)
|
|
cmake_policy(SET CMP0058 NEW)
|
|
endif()
|
|
if(POLICY CMP0074)
|
|
cmake_policy(SET CMP0074 NEW)
|
|
endif()
|
|
if(POLICY CMP0069)
|
|
cmake_policy(SET CMP0069 NEW)
|
|
endif()
|
|
|
|
include(CheckCXXSymbolExists)
|
|
|
|
set(CMAKE_FIND_PACKAGE_PREFER_CONFIG TRUE)
|
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/CMake_modules/")
|
|
|
|
set(DEPS_DIR ${DEPS_DIR} "${CMAKE_CURRENT_SOURCE_DIR}/ref")
|
|
project("eu07")
|
|
|
|
#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fsanitize=undefined")
|
|
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fsanitize=undefined -Wformat")
|
|
#set(CMAKE_LD_FLAGS "${CMAKE_LD_FLAGS} -fsanitize=address -fsanitize=undefined")
|
|
|
|
string(TIMESTAMP VERSION_YEAR "%y")
|
|
string(TIMESTAMP VERSION_MONTH "%m")
|
|
string(TIMESTAMP VERSION_DAY "%d")
|
|
|
|
# Use these as version numbers
|
|
set(VERSION_MAJOR ${VERSION_YEAR})
|
|
set(VERSION_MINOR ${VERSION_MONTH})
|
|
set(VERSION_PATCH ${VERSION_DAY})
|
|
|
|
set(VERSION_STRING "${VERSION_YEAR}.${VERSION_MONTH}.${VERSION_DAY}")
|
|
|
|
|
|
set(CMAKE_CXX_STANDARD 20)
|
|
|
|
file(GLOB HEADERS "*.h"
|
|
"Console/*.h"
|
|
"McZapkie/*.h"
|
|
"gl/*.h"
|
|
"network/*.h"
|
|
"vr/*.h"
|
|
"network/backend/*.h"
|
|
"widgets/*.h"
|
|
"launcher/*.h"
|
|
"extras/*.h"
|
|
"global_include/*.h"
|
|
"simulation/*.h"
|
|
"scene/*.h"
|
|
"rendering/*.h"
|
|
"audio/*.h"
|
|
"environment/*.h"
|
|
"application/*.h"
|
|
"input/*.h"
|
|
"scripting/*.h"
|
|
"model/*.h"
|
|
"utilities/*.h"
|
|
"world/*.h"
|
|
"vehicle/*.h")
|
|
|
|
set(GLOBAL_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
|
|
set(GLOBAL_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/global_include")
|
|
set(IMGUI_DIR "${CMAKE_CURRENT_SOURCE_DIR}/imgui")
|
|
|
|
if (APPLE)
|
|
set (CMAKE_FIND_FRAMEWORK LAST)
|
|
endif()
|
|
|
|
option(WITH_OPENGL_MODERN "Compile with OpenGL modern renderer" ON)
|
|
option(WITH_OPENGL_LEGACY "Compile with OpenGL legacy renderer" ON)
|
|
option(WITH_PYTHON "Python 3.14 embedded scripting" ON)
|
|
option(WITH_UART "Compile with libserialport" ON)
|
|
option(WITH_LUA "Compile with lua scripting support" ON)
|
|
option(WITH_OPENVR "Compile with OpenVR" OFF)
|
|
option(WITH_ZMQ "Compile with cppzmq" OFF)
|
|
option(WITH_CRASHPAD "Compile with crashpad" OFF)
|
|
option(WITH_DISCORD_RPC "Compile with DISCORD RICH PRESENCE" ON)
|
|
option(USE_LTO "Use link-time optimization" OFF)
|
|
option(WITH_TESTS "Build and run the unit tests with the game, a failing test fails the build" ON)
|
|
option(WITH_BETTER_RENDERER "Experimental multi-backend renderer based on NVRHI" OFF)
|
|
option(GENERATE_PDB "Generate executable with program debugging symbols" ON)
|
|
option(ENABLE_MCC "Enable multicore compilation" ON)
|
|
option(WITHDUMPGEN "Enable generating DMP files on crash" ON)
|
|
option(ENABLE_AVX2 "Enable AVX2 instruction set (requires AVX2-capable CPU, Haswell/2013 or newer)" ON)
|
|
option(ADD_VERSION_SUFFIX "Add date and commit hash to the executable name" ON)
|
|
set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
|
|
|
|
# vcpkg init
|
|
set(VCPKG_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/ref/vcpkg")
|
|
set(VCPKG_INSTALLED_PATH "${VCPKG_ROOT}/installed/x64-windows")
|
|
list(APPEND CMAKE_PREFIX_PATH "${VCPKG_INSTALLED_PATH}")
|
|
list(APPEND CMAKE_MODULE_PATH "${VCPKG_INSTALLED_PATH}/share")
|
|
|
|
set(SOURCES
|
|
"model/Texture.cpp"
|
|
"utilities/Timer.cpp"
|
|
"world/Track.cpp"
|
|
"world/Road.cpp"
|
|
"world/Sweep.cpp"
|
|
"world/RoadPoint.cpp"
|
|
"world/Traction.cpp"
|
|
"world/TractionPower.cpp"
|
|
"vehicle/Train.cpp"
|
|
"world/TrkFoll.cpp"
|
|
"vehicle/AirCoupler.cpp"
|
|
"model/AnimModel.cpp"
|
|
"vehicle/Button.cpp"
|
|
"vehicle/Camera.cpp"
|
|
"vehicle/Driver.cpp"
|
|
"application/driverhints.cpp"
|
|
"vehicle/DynObj.cpp"
|
|
"EU07.cpp"
|
|
"export_e3d_standalone.cpp"
|
|
"export_btf_standalone.cpp"
|
|
"nodebank_previews_standalone.cpp"
|
|
"world/Event.cpp"
|
|
"world/EvLaunch.cpp"
|
|
"utilities/Float3d.cpp"
|
|
"vehicle/Gauge.cpp"
|
|
"utilities/Globals.cpp"
|
|
"utilities/Logs.cpp"
|
|
"model/MdlMngr.cpp"
|
|
"world/MemCell.cpp"
|
|
"model/Model3d.cpp"
|
|
"world/mtable.cpp"
|
|
"rendering/nullrenderer.cpp"
|
|
"rendering/renderer.cpp"
|
|
"model/ResourceManager.cpp"
|
|
"scene/sn_utils.cpp"
|
|
"world/Segment.cpp"
|
|
"environment/sky.cpp"
|
|
"environment/sun.cpp"
|
|
"environment/stars.cpp"
|
|
"rendering/lightarray.cpp"
|
|
"environment/skydome.cpp"
|
|
"audio/sound.cpp"
|
|
"world/Spring.cpp"
|
|
"rendering/frustum.cpp"
|
|
"application/uilayer.cpp"
|
|
"rendering/openglmatrixstack.cpp"
|
|
"environment/moon.cpp"
|
|
"input/command.cpp"
|
|
"input/keyboardinput.cpp"
|
|
"input/gamepadinput.cpp"
|
|
"input/drivermouseinput.cpp"
|
|
"utilities/translation.cpp"
|
|
"model/material.cpp"
|
|
"stdafx.cpp"
|
|
"input/messaging.cpp"
|
|
"scene/scene.cpp"
|
|
"scene/scenenode.cpp"
|
|
"simulation/simulation.cpp"
|
|
"model/vertex.cpp"
|
|
"audio/audio.cpp"
|
|
"audio/audiorenderer.cpp"
|
|
"utilities/motiontelemetry.cpp"
|
|
"application/uitranscripts.cpp"
|
|
"world/station.cpp"
|
|
"application/application.cpp"
|
|
"simulation/simulationtime.cpp"
|
|
"scene/sceneeditor.cpp"
|
|
"rendering/screenshot.cpp"
|
|
"input/driverkeyboardinput.cpp"
|
|
"application/drivermode.cpp"
|
|
"application/driveruilayer.cpp"
|
|
"application/driveruipanels.cpp"
|
|
"input/editorkeyboardinput.cpp"
|
|
"editor/editorSettings.cpp"
|
|
"editor/editorModelSets.cpp"
|
|
"editor/editorIncludeInfo.cpp"
|
|
"editor/editorTerrain.cpp"
|
|
"editor/editorTrack.cpp"
|
|
"editor/editorRoad.cpp"
|
|
"editor/editorAlignment.cpp"
|
|
"editor/editorSpeed.cpp"
|
|
"editor/editorProfile.cpp"
|
|
"editor/editorGauge.cpp"
|
|
"editor/editorInfra.cpp"
|
|
"editor/editorTerrainStreamer.cpp"
|
|
"editor/editorOrthophoto.cpp"
|
|
"editor/editorPreviews.cpp"
|
|
"editor/editorIcons.cpp"
|
|
"application/editormode.cpp"
|
|
"application/editormodetrack.cpp"
|
|
"application/editormodetrackux.cpp"
|
|
"application/editormoderoad.cpp"
|
|
"application/editormodeprofile.cpp"
|
|
"application/editormodetextures.cpp"
|
|
"application/editormodegauge.cpp"
|
|
"application/editormodeinfra.cpp"
|
|
"application/editormodespeed.cpp"
|
|
"application/editormodejoints.cpp"
|
|
"application/editormodeparallel.cpp"
|
|
"application/editormodelineside.cpp"
|
|
"application/editormodevehicle.cpp"
|
|
"application/editormodeselection.cpp"
|
|
"application/editormodeviewport.cpp"
|
|
"application/editormodesignal.cpp"
|
|
"application/editormodesweep.cpp"
|
|
"application/editormodeturntable.cpp"
|
|
"application/editormodeselftest.cpp"
|
|
"input/editormouseinput.cpp"
|
|
"application/editoruilayer.cpp"
|
|
"application/editoruipanels.cpp"
|
|
"application/scenarioloadermode.cpp"
|
|
"application/scenarioloaderuilayer.cpp"
|
|
"scene/scenenodegroups.cpp"
|
|
"scene/scenelayers.cpp"
|
|
"scene/scenelayerssave.cpp"
|
|
"scene/sceneterrain.cpp"
|
|
"scene/heightmapterrain.cpp"
|
|
"scene/scenemodelentries.cpp"
|
|
"simulation/simulationenvironment.cpp"
|
|
"simulation/simulationstateserializer.cpp"
|
|
"rendering/precipitation.cpp"
|
|
"scripting/pythonscreenviewer.cpp"
|
|
"utilities/dictionary.cpp"
|
|
"rendering/particles.cpp"
|
|
"utilities/headtrack.cpp"
|
|
"rendering/geometrybank.cpp"
|
|
"rendering/openglcolor.cpp"
|
|
"simulation/simulationsounds.cpp"
|
|
"rendering/openglcamera.cpp"
|
|
|
|
"network/network.cpp"
|
|
"network/message.cpp"
|
|
"network/manager.cpp"
|
|
"network/backend/asio.cpp"
|
|
|
|
"widgets/vehiclelist.cpp"
|
|
"widgets/map.cpp"
|
|
"widgets/map_objects.cpp"
|
|
"widgets/popup.cpp"
|
|
"widgets/time.cpp"
|
|
"widgets/vehicleparams.cpp"
|
|
"widgets/trainingcard.cpp"
|
|
"widgets/perfgraphs.cpp"
|
|
|
|
"${DEPS_DIR}/glad/src/glad.c"
|
|
"${DEPS_DIR}/dds-ktx/src/dds-ktx.c"
|
|
"${DEPS_DIR}/zstd/zstd.c"
|
|
|
|
"gl/shader.cpp"
|
|
"gl/vao.cpp"
|
|
"gl/ubo.cpp"
|
|
"gl/framebuffer.cpp"
|
|
"gl/renderbuffer.cpp"
|
|
"gl/postfx.cpp"
|
|
"gl/cubemap.cpp"
|
|
"gl/glsl_common.cpp"
|
|
"gl/buffer.cpp"
|
|
"gl/fence.cpp"
|
|
"gl/pbo.cpp"
|
|
"gl/query.cpp"
|
|
|
|
"imgui/imgui.cpp"
|
|
"imgui/imgui_demo.cpp"
|
|
"imgui/imgui_draw.cpp"
|
|
"imgui/imgui_widgets.cpp"
|
|
"imgui/imgui_tables.cpp"
|
|
"imgui/imgui_impl_glfw.cpp"
|
|
"imgui/ImGuizmo.cpp"
|
|
|
|
"stb/stb_image.c"
|
|
|
|
"launcher/launchermode.cpp"
|
|
"launcher/scenery_list.cpp"
|
|
"launcher/launcheruilayer.cpp"
|
|
"launcher/vehicle_picker.cpp"
|
|
"launcher/keymapper.cpp"
|
|
"launcher/textures_scanner.cpp"
|
|
"launcher/scenery_scanner.cpp"
|
|
"launcher/scenery_wizard.cpp"
|
|
|
|
"vr/vr_interface.cpp"
|
|
)
|
|
|
|
set(DEFINITIONS)
|
|
set(SOURCES ${SOURCES} "imgui/imgui_impl_opengl3.cpp")
|
|
set(SOURCES ${SOURCES} "imgui/imgui_impl_opengl2.cpp")
|
|
set_source_files_properties("imgui/imgui_impl_opengl3.cpp" PROPERTIES SKIP_PRECOMPILE_HEADERS TRUE)
|
|
set_source_files_properties("imgui/imgui_impl_opengl2.cpp" PROPERTIES SKIP_PRECOMPILE_HEADERS TRUE)
|
|
|
|
if (WITH_CRASHPAD)
|
|
set(DEFINITIONS ${DEFINITIONS} "WITH_CRASHPAD")
|
|
set(SOURCES ${SOURCES} "utilities/crashreporter.cpp")
|
|
if (WIN32)
|
|
include_directories("${DEPS_DIR}/crashpad/include" "${DEPS_DIR}/crashpad/include/mini_chromium")
|
|
else()
|
|
include_directories("${DEPS_DIR}/crashpad/crashpad" "${DEPS_DIR}/crashpad/crashpad/third_party/mini_chromium/mini_chromium")
|
|
endif()
|
|
endif()
|
|
|
|
if(WITH_PYTHON)
|
|
set(DEFINITIONS ${DEFINITIONS} "WITH_PYTHON")
|
|
set(SOURCES ${SOURCES} "scripting/PyInt.cpp")
|
|
else()
|
|
set(SOURCES ${SOURCES} "scripting/PyIntStub.cpp")
|
|
endif()
|
|
|
|
if (WITH_UART)
|
|
set(DEFINITIONS ${DEFINITIONS} "WITH_UART")
|
|
set(SOURCES ${SOURCES} "utilities/uart.cpp")
|
|
endif()
|
|
|
|
if (WITH_ZMQ)
|
|
set(DEFINITIONS ${DEFINITIONS} "WITH_ZMQ")
|
|
set(SOURCES ${SOURCES} "input/zmq_input.cpp")
|
|
endif()
|
|
|
|
if (WITH_OPENVR)
|
|
set(DEFINITIONS ${DEFINITIONS} "WITH_OPENVR")
|
|
set(SOURCES ${SOURCES} "vr/openvr_imp.cpp")
|
|
endif()
|
|
|
|
if (WITH_LUA)
|
|
set(DEFINITIONS ${DEFINITIONS} "WITH_LUA")
|
|
set(SOURCES ${SOURCES} "scripting/lua.cpp")
|
|
endif()
|
|
|
|
if (WITHDUMPGEN)
|
|
set(DEFINITIONS ${DEFINITIONS} "WITHDUMPGEN")
|
|
endif()
|
|
|
|
if (WITH_OPENGL_MODERN)
|
|
set(SOURCES ${SOURCES}
|
|
"rendering/opengl33geometrybank.cpp"
|
|
"rendering/opengl33light.cpp"
|
|
"rendering/opengl33skydome.cpp"
|
|
"rendering/opengl33precipitation.cpp"
|
|
"rendering/opengl33particles.cpp"
|
|
"rendering/opengl33terrain.cpp"
|
|
"rendering/opengl33renderer.cpp")
|
|
set(DEFINITIONS ${DEFINITIONS} "WITH_OPENGL_MODERN")
|
|
endif()
|
|
|
|
if (WITH_OPENGL_LEGACY)
|
|
set(SOURCES ${SOURCES}
|
|
"rendering/openglgeometrybank.cpp"
|
|
"rendering/opengllight.cpp"
|
|
"rendering/openglskydome.cpp"
|
|
"rendering/openglprecipitation.cpp"
|
|
"rendering/openglparticles.cpp"
|
|
"rendering/openglrenderer.cpp")
|
|
set(DEFINITIONS ${DEFINITIONS} "WITH_OPENGL_LEGACY")
|
|
endif()
|
|
|
|
add_subdirectory("${DEPS_DIR}/glfw/" EXCLUDE_FROM_ALL)
|
|
|
|
set(SOURCES ${SOURCES} "extras/piped_proc.cpp" "widgets/cameraview_extcam.cpp")
|
|
|
|
find_package(Git)
|
|
|
|
if (GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git")
|
|
execute_process(
|
|
COMMAND ${GIT_EXECUTABLE} describe --match=DUMMY --always --dirty
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
OUTPUT_VARIABLE GIT_HASH
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
)
|
|
|
|
execute_process(
|
|
COMMAND ${GIT_EXECUTABLE} show -s --format=%ci
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
OUTPUT_VARIABLE SRC_DATE
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
)
|
|
|
|
execute_process(
|
|
COMMAND ${GIT_EXECUTABLE} show -s --format=%cs
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
OUTPUT_VARIABLE SRC_SHORT_DATE
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
)
|
|
else()
|
|
string(TIMESTAMP SRC_SHORT_DATE %Y-%m-%d UTC)
|
|
string(TIMESTAMP SRC_DATE UTC)
|
|
set(GIT_HASH "(unknown)")
|
|
endif()
|
|
|
|
configure_file("${CMAKE_SOURCE_DIR}/version_info.h.in" "${CMAKE_BINARY_DIR}/geninc/version_info.h")
|
|
|
|
# the icons of the editor are built into the executable: the png is written out as the bytes of an array, see editor/editorIcons.cpp
|
|
set(EDITOR_ICONS "${CMAKE_SOURCE_DIR}/editor/icons/editor_icons.png")
|
|
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${EDITOR_ICONS}")
|
|
file(READ "${EDITOR_ICONS}" EDITOR_ICONS_HEX HEX)
|
|
string(REGEX REPLACE "(................................)" "\\1\n" EDITOR_ICONS_HEX "${EDITOR_ICONS_HEX}")
|
|
string(REGEX REPLACE "([0-9a-f][0-9a-f])" "0x\\1," EDITOR_ICONS_HEX "${EDITOR_ICONS_HEX}")
|
|
file(CONFIGURE OUTPUT "${CMAKE_BINARY_DIR}/geninc/editor_icons_png.inc" CONTENT "${EDITOR_ICONS_HEX}\n")
|
|
|
|
set (PREFIX "")
|
|
set (SUFFIX "")
|
|
|
|
if (ADD_VERSION_SUFFIX)
|
|
set (SUFFIX "_${SRC_SHORT_DATE}_${GIT_HASH}")
|
|
endif()
|
|
|
|
set(OPENVR_LIBRARY "openvr_api")
|
|
set(OPENVR_INCLUDE_DIR "")
|
|
|
|
if (WIN32)
|
|
set(DEFINITIONS ${DEFINITIONS} "HAVE_ROUND") # to make pymath to not redefine round
|
|
# set(DEFINITIONS ${DEFINITIONS} "GLFW_DLL")
|
|
|
|
set(SOURCES ${SOURCES} "windows.cpp" "Console.cpp" "Console/LPT.cpp" "Console/PoKeys55.cpp")
|
|
#set(GLFW3_INCLUDE_DIR ${GLFW3_INCLUDE_DIR} "${DEPS_DIR}/glfw/include/")
|
|
set(PNG_INCLUDE_DIRS ${PNG_INCLUDE_DIRS} "${DEPS_DIR}/libpng/include/")
|
|
#set(ZLIB_INCLUDE_DIR ${ZLIB_INCLUDE_DIR} "${DEPS_DIR}/zlib/")
|
|
set(OPENAL_INCLUDE_DIR ${OPENAL_INCLUDE_DIR} "${DEPS_DIR}/openal/include")
|
|
set(LIBSNDFILE_INCLUDE_DIR ${LIBSNDFILE_INCLUDE_DIR} "${DEPS_DIR}/libsndfile/include")
|
|
set(LUAJIT_INCLUDE_DIR ${LUAJIT_INCLUDE_DIR} "${DEPS_DIR}/luajit/include")
|
|
set(libserialport_INCLUDE_DIR ${LIBSERIALPORT_INCLUDE_DIR} "${DEPS_DIR}/libserialport/include")
|
|
set(OPENVR_INCLUDE_DIR "${DEPS_DIR}/openvr/include")
|
|
|
|
#if(${CMAKE_EXE_LINKER_FLAGS} STREQUAL "/machine:x64")
|
|
# set (ARCH "x64")
|
|
#else()
|
|
# set (ARCH "x86")
|
|
#endif()
|
|
|
|
set(ARCH "x64")
|
|
set (PREFIX "-${ARCH}")
|
|
|
|
#set(GLFW3_LIBRARIES ${GLFW3_LIBRARIES} "${DEPS_DIR}/glfw/lib/${ARCH}/glfw3dll.lib")
|
|
set(PNG_LIBRARIES ${PNG_LIBRARIES} "${DEPS_DIR}/libpng/lib/${ARCH}/libpng16.lib")
|
|
set(OPENAL_LIBRARY ${OPENAL_LIBRARY} "${DEPS_DIR}/openal/lib/${ARCH}/OpenAL32.lib")
|
|
set(LIBSNDFILE_LIBRARY ${LIBSNDFILE_LIBRARY} "${DEPS_DIR}/libsndfile/lib/${ARCH}/libsndfile-1.lib")
|
|
set(LUAJIT_LIBRARIES ${LUAJIT_LIBRARIES} "${DEPS_DIR}/luajit/lib/${ARCH}/lua51.lib")
|
|
set(libserialport_LIBRARY ${LIBSERIALPORT_LIBRARY} "${DEPS_DIR}/libserialport/lib/${ARCH}/libserialport-0.lib")
|
|
set(cppzmq_LIBRARY ${cppzmq_LIBRARY} "${DEPS_DIR}/cppzmq/lib/${ARCH}/libzmq.lib")
|
|
set(OPENVR_LIBRARY "${DEPS_DIR}/openvr/lib/${ARCH}/openvr_api.lib")
|
|
endif()
|
|
|
|
set(cppzmq_INCLUDE_DIR ${cppzmq_INCLUDE_DIR} "${DEPS_DIR}/cppzmq/include")
|
|
set(GLM_INCLUDE_DIR ${GLM_INCLUDE_DIR} "${DEPS_DIR}/glm/")
|
|
|
|
# Process version.rc.in into version.rc
|
|
configure_file(${CMAKE_SOURCE_DIR}/eu07.rc.in
|
|
${CMAKE_BINARY_DIR}/eu07.rc @ONLY)
|
|
|
|
if (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
|
|
set(SOURCES ${SOURCES} ${CMAKE_BINARY_DIR}/eu07.rc)
|
|
set(SOURCES ${SOURCES} eu07.ico)
|
|
set(SOURCES ${SOURCES} eu07.ico
|
|
editor/editorSettings.hpp)
|
|
add_compile_options("/utf-8")
|
|
endif()
|
|
|
|
# the build settings of the game: include dirs, definitions, compile options and libraries. the game,
|
|
# its core library and the unit tests all build with the same ones
|
|
add_library(eu07_settings INTERFACE)
|
|
|
|
# the parts of the simulation the game shares with the unit tests: the vehicle physics, the vehicle
|
|
# definition parser and the helpers they use. built once, and tested as the game uses them
|
|
set(CORE_SOURCES
|
|
"McZapkie/friction.cpp"
|
|
"McZapkie/hamulce.cpp"
|
|
"McZapkie/Mover.cpp"
|
|
"McZapkie/Oerlikon_ESt.cpp"
|
|
"utilities/parser.cpp"
|
|
"utilities/utilities.cpp"
|
|
"scripting/ladderlogic.cpp"
|
|
"vehicle/handover.cpp"
|
|
"vehicle/horn.cpp"
|
|
)
|
|
add_library(eu07_core STATIC ${CORE_SOURCES})
|
|
target_link_libraries(eu07_core PUBLIC eu07_settings)
|
|
set_target_properties(eu07_core PROPERTIES
|
|
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
|
|
FOLDER "libraries")
|
|
|
|
add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS})
|
|
target_link_libraries(${PROJECT_NAME} eu07_core)
|
|
|
|
target_compile_definitions(eu07_settings INTERFACE ${DEFINITIONS})
|
|
|
|
target_include_directories(eu07_settings INTERFACE
|
|
"."
|
|
"Console"
|
|
"McZapkie"
|
|
"gl"
|
|
"${DEPS_DIR}/glad/include"
|
|
"${DEPS_DIR}/dds-ktx/include"
|
|
"${DEPS_DIR}/zstd"
|
|
"${CMAKE_BINARY_DIR}/geninc"
|
|
"${GLOBAL_INCLUDE_DIR}")
|
|
|
|
if (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
|
|
# override cmake defaults
|
|
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO " /MD /Zi /O2 /DNDEBUG")
|
|
set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO " /DEBUG /INCREMENTAL:NO /OPT:REF /OPT:ICF")
|
|
|
|
target_link_options(${PROJECT_NAME} PRIVATE "/MAP")
|
|
|
|
# /wd4996: disable "deprecation" warnings
|
|
# /wd4244: disable warnings for conversion with possible loss of data
|
|
# /wd5033: disable because it is all over Python headers
|
|
target_compile_options(eu07_settings INTERFACE /wd4996 /wd4244 /wd5033)
|
|
set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "/LARGEADDRESSAWARE")
|
|
endif()
|
|
|
|
set_target_properties( ${PROJECT_NAME}
|
|
PROPERTIES
|
|
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
|
|
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
|
|
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
|
|
PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/pdb"
|
|
OUTPUT_NAME "${PROJECT_NAME}${PREFIX}${SUFFIX}"
|
|
DEBUG_POSTFIX "_d"
|
|
)
|
|
|
|
check_cxx_symbol_exists(__GNUC__ "" COMPILER_HAVE_GNUC)
|
|
if (COMPILER_HAVE_GNUC)
|
|
target_compile_options(eu07_settings INTERFACE -fvisibility=hidden)
|
|
endif()
|
|
|
|
if(NOT ${CMAKE_VERSION} VERSION_LESS "3.16.0")
|
|
option(USE_PCH "Use precompiled header" ON)
|
|
|
|
if (USE_PCH)
|
|
target_precompile_headers(${PROJECT_NAME} PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/stdafx.h>")
|
|
target_precompile_headers(eu07_core PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/stdafx.h>")
|
|
set_source_files_properties("/glad/src/glad.c" "ref/dds-ktx/src/dds-ktx.c" "ref/zstd/zstd.c" "stb/stb_image.c"
|
|
"imgui/imgui.cpp" "imgui/imgui_demo.cpp" "imgui/imgui_draw.cpp" "imgui/imgui_widgets.cpp" "imgui/imgui_tables.cpp" "imgui/imgui_impl_glfw.cpp" "imgui/ImGuizmo.cpp"
|
|
PROPERTIES SKIP_PRECOMPILE_HEADERS TRUE)
|
|
endif()
|
|
endif()
|
|
|
|
if (USE_LTO)
|
|
set_property(TARGET ${PROJECT_NAME} eu07_core PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
|
|
endif()
|
|
|
|
if (WITH_OPENVR)
|
|
target_include_directories(eu07_settings INTERFACE ${OPENVR_INCLUDE_DIR})
|
|
target_link_libraries(eu07_settings INTERFACE ${OPENVR_LIBRARY})
|
|
endif()
|
|
|
|
if (WITH_CRASHPAD)
|
|
if (WIN32)
|
|
target_link_libraries(${PROJECT_NAME} "${DEPS_DIR}/crashpad/lib_md/base.lib")
|
|
target_link_libraries(${PROJECT_NAME} "${DEPS_DIR}/crashpad/lib_md/client.lib")
|
|
target_link_libraries(${PROJECT_NAME} "${DEPS_DIR}/crashpad/lib_md/util.lib")
|
|
else()
|
|
target_link_libraries(${PROJECT_NAME} "${DEPS_DIR}/crashpad/crashpad/out/Default/obj/client/libclient.a")
|
|
target_link_libraries(${PROJECT_NAME} "${DEPS_DIR}/crashpad/crashpad/out/Default/obj/util/libutil.a")
|
|
target_link_libraries(${PROJECT_NAME} "${DEPS_DIR}/crashpad/crashpad/out/Default/obj/third_party/mini_chromium/mini_chromium/base/libbase.a")
|
|
endif()
|
|
endif()
|
|
|
|
target_link_libraries(eu07_settings INTERFACE glfw)
|
|
|
|
if(WITH_PYTHON)
|
|
find_package(Python3 3.14 REQUIRED COMPONENTS Development)
|
|
target_include_directories(eu07_settings INTERFACE ${Python3_INCLUDE_DIRS})
|
|
target_link_libraries(eu07_settings INTERFACE ${Python3_LIBRARIES})
|
|
|
|
if(WIN32)
|
|
# Python3_ROOT_DIR is only an input hint and is not populated by
|
|
# find_package(... COMPONENTS Development). Derive the install root from
|
|
# the include dir (parent of <root>/include) when it was not provided.
|
|
if(NOT Python3_ROOT_DIR)
|
|
get_filename_component(Python3_ROOT_DIR "${Python3_INCLUDE_DIRS}" DIRECTORY)
|
|
endif()
|
|
set(EU07_PY_DLL "${Python3_ROOT_DIR}/python314.dll")
|
|
set(EU07_PY_ZLIB "${Python3_ROOT_DIR}/DLLs/zlib1.dll")
|
|
set(EU07_PY_LIBDIR "${Python3_ROOT_DIR}/Lib")
|
|
set(EU07_PY_DLLSDIR "${Python3_ROOT_DIR}/DLLs")
|
|
endif()
|
|
endif()
|
|
|
|
if (NOT WIN32)
|
|
find_package(PNG 1.6 REQUIRED)
|
|
target_link_libraries(eu07_settings INTERFACE PNG::PNG)
|
|
else()
|
|
include_directories(${PNG_INCLUDE_DIRS})
|
|
target_link_libraries(eu07_settings INTERFACE ${PNG_LIBRARIES})
|
|
endif()
|
|
|
|
find_package(Threads REQUIRED)
|
|
target_link_libraries(eu07_settings INTERFACE Threads::Threads)
|
|
|
|
find_package(GLM REQUIRED)
|
|
target_include_directories(eu07_settings INTERFACE ${GLM_INCLUDE_DIR})
|
|
|
|
# JSON lib
|
|
add_subdirectory(ref/json)
|
|
target_link_libraries(eu07_settings INTERFACE nlohmann_json::nlohmann_json)
|
|
target_include_directories(eu07_settings INTERFACE ${NLOHMANN_JSON_INCLUDE_INSTALL_DIR})
|
|
|
|
|
|
|
|
if (WITH_DISCORD_RPC)
|
|
add_subdirectory(ref/discord-rpc)
|
|
set_target_properties(discord-rpc PROPERTIES FOLDER "libraries")
|
|
target_link_libraries(eu07_settings INTERFACE discord-rpc)
|
|
|
|
# Add the include directory so the compiler can find discord_rpc.h
|
|
target_include_directories(eu07_settings INTERFACE
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/ref/discord-rpc/include"
|
|
)
|
|
|
|
target_compile_definitions(eu07_settings INTERFACE WITH_DISCORD_RPC=1)
|
|
else()
|
|
target_compile_definitions(eu07_settings INTERFACE WITH_DISCORD_RPC=0)
|
|
endif()
|
|
|
|
find_package(OpenAL REQUIRED)
|
|
if (TARGET OpenAL::OpenAL)
|
|
target_link_libraries(eu07_settings INTERFACE OpenAL::OpenAL)
|
|
else()
|
|
target_include_directories(eu07_settings INTERFACE ${OPENAL_INCLUDE_DIR})
|
|
target_link_libraries(eu07_settings INTERFACE ${OPENAL_LIBRARY})
|
|
endif()
|
|
|
|
find_package(SndFile REQUIRED)
|
|
target_link_libraries(eu07_settings INTERFACE SndFile::sndfile)
|
|
|
|
if (WITH_LUA)
|
|
find_package(LuaJIT REQUIRED)
|
|
target_include_directories(eu07_settings INTERFACE ${LUAJIT_INCLUDE_DIR})
|
|
target_link_libraries(eu07_settings INTERFACE ${LUAJIT_LIBRARIES})
|
|
endif()
|
|
|
|
if (WITH_UART)
|
|
find_package(libserialport REQUIRED)
|
|
target_include_directories(eu07_settings INTERFACE ${libserialport_INCLUDE_DIR})
|
|
target_link_libraries(eu07_settings INTERFACE ${libserialport_LIBRARY})
|
|
endif()
|
|
|
|
find_package(ASIO REQUIRED)
|
|
target_link_libraries(eu07_settings INTERFACE asio::asio)
|
|
|
|
if (WIN32)
|
|
target_link_libraries(eu07_settings INTERFACE ws2_32)
|
|
endif()
|
|
|
|
# http client of the editor's geoportal orthophoto layer: WinHTTP on Windows, libcurl elsewhere when available
|
|
if (WIN32)
|
|
target_link_libraries(eu07_settings INTERFACE winhttp)
|
|
else()
|
|
find_package(CURL QUIET)
|
|
if (CURL_FOUND)
|
|
target_link_libraries(eu07_settings INTERFACE CURL::libcurl)
|
|
target_compile_definitions(eu07_settings INTERFACE EU07_WITH_CURL)
|
|
else()
|
|
message(STATUS "libcurl not found: the editor's orthophoto layer will only show cached tiles")
|
|
endif()
|
|
endif()
|
|
|
|
if (WITH_ZMQ)
|
|
find_package(cppzmq REQUIRED)
|
|
target_include_directories(eu07_settings INTERFACE ${cppzmq_INCLUDE_DIR})
|
|
target_link_libraries(eu07_settings INTERFACE ${cppzmq_LIBRARY})
|
|
endif()
|
|
|
|
if (WIN32)
|
|
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E copy -t $<TARGET_FILE_DIR:${PROJECT_NAME}> $<TARGET_RUNTIME_DLLS:${PROJECT_NAME}>
|
|
COMMAND_EXPAND_LISTS
|
|
)
|
|
endif ()
|
|
|
|
if(WIN32 AND WITH_PYTHON)
|
|
add_custom_command(
|
|
TARGET ${PROJECT_NAME} POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${EU07_PY_DLL}" "$<TARGET_FILE_DIR:${PROJECT_NAME}>"
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${EU07_PY_ZLIB}" "$<TARGET_FILE_DIR:${PROJECT_NAME}>"
|
|
COMMAND ${CMAKE_COMMAND} -E copy_directory "${EU07_PY_LIBDIR}" "$<TARGET_FILE_DIR:${PROJECT_NAME}>/python64/Lib"
|
|
COMMAND ${CMAKE_COMMAND} -E copy_directory "${EU07_PY_DLLSDIR}" "$<TARGET_FILE_DIR:${PROJECT_NAME}>/python64/DLLs"
|
|
)
|
|
endif()
|
|
|
|
if (WITH_BETTER_RENDERER)
|
|
add_subdirectory("betterRenderer")
|
|
set_target_properties(betterRenderer betterRenderer_fsr2 betterRenderer_shaders PROPERTIES FOLDER "renderers")
|
|
target_link_libraries(${PROJECT_NAME} "betterRenderer")
|
|
endif ()
|
|
|
|
# yaml-cpp, for the descriptions of scenery templates edited in the scenery editor.
|
|
# the experimental renderer brings in the same copy on its own, when enabled
|
|
if (NOT TARGET yaml-cpp)
|
|
add_subdirectory("betterRenderer/thirdparty/yaml-cpp" "${CMAKE_CURRENT_BINARY_DIR}/yaml-cpp" EXCLUDE_FROM_ALL)
|
|
endif ()
|
|
target_link_libraries(eu07_settings INTERFACE yaml-cpp)
|
|
|
|
|
|
# Enable compiling with debug symbols
|
|
if(GENERATE_PDB)
|
|
if (MSVC)
|
|
# Ensure Debug and Release configurations use appropriate runtime libraries
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Zi /MDd")
|
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi /MD")
|
|
|
|
# Add compile options for debugging
|
|
add_compile_options(/Zi) # Always enable debug symbols
|
|
add_link_options(/DEBUG /MAP)
|
|
|
|
# Ensure that the PCH is built with the correct runtime library for each configuration
|
|
set_target_properties(${PROJECT_NAME} eu07_core PROPERTIES
|
|
COMPILE_OPTIONS "$<$<CONFIG:Debug>:/MDd>$<$<CONFIG:Release>:/MD>")
|
|
else()
|
|
# GCC/Clang (ensure -g is set for all configurations)
|
|
add_compile_options(-g)
|
|
endif()
|
|
endif()
|
|
|
|
if(ENABLE_MCC AND MSVC)
|
|
message(STATUS "Enabling multi-processor compilation for MSVC.")
|
|
add_compile_options(/MP)
|
|
endif()
|
|
|
|
if(ENABLE_AVX2)
|
|
message(STATUS "Enabling AVX2 instruction set.")
|
|
if (MSVC)
|
|
target_compile_options(eu07_settings INTERFACE /arch:AVX2)
|
|
else()
|
|
target_compile_options(eu07_settings INTERFACE -mavx2)
|
|
endif()
|
|
endif()
|
|
|
|
if(WITH_TESTS)
|
|
enable_testing()
|
|
add_subdirectory(tests/unit)
|
|
# the unit tests run at the end of building the game, once it's linked: a failing one fails the build
|
|
# (and removes the game binary, so the next build links it again and reruns them)
|
|
add_dependencies(${PROJECT_NAME} eu07_unit_tests)
|
|
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND}
|
|
-DTESTS=$<TARGET_FILE:eu07_unit_tests>
|
|
-DGAME=$<TARGET_FILE:${PROJECT_NAME}>
|
|
-P "${CMAKE_CURRENT_SOURCE_DIR}/tests/unit/run_tests.cmake"
|
|
COMMENT "Running the unit tests"
|
|
VERBATIM)
|
|
# a change of the tests alone links the game again, so they run (Ninja and Makefile generators;
|
|
# Visual Studio builds rerun them with the next change of the game)
|
|
set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY LINK_DEPENDS
|
|
$<TARGET_FILE:eu07_unit_tests> ${UNIT_TEST_DATA} "${CMAKE_CURRENT_SOURCE_DIR}/tests/unit/run_tests.cmake")
|
|
endif()
|