planetsim/CMakeLists.txt
Jonas Reith aa32e38dad Live World stage: clock, day/night, seasons, moons, tides & ocean currents
Adds the slow real-time "Live World" mode (key W on a settled world) that runs the
finished planet on an hours->weeks/months clock (liveTime/liveRate, [ / ] ramp the rate)
with geology frozen. Everything new is a derived per-cell field flowed over the fixed grid.

Day/night & seasons (PlanetLive.cpp): a raylib-free per-cell insolation field
(computeInsolation) drives a moving day/night terminator (N) from time-of-day rotation +
seasonal declination (axialTilt); a live seasonal temperature cycles the static summer/winter
fields over the year (computeLiveSeason); a moving snow/sea-ice line tracks it. Day/night +
snow are render overlays over any colour mode (3D + 2D). Save v8 stores the live clock.

Sky & tides (PlanetOcean.cpp): 1-3 random moons (separate RNG, saved v9) orbit on the
clock and, with the now small/distant sun, raise an equilibrium tide (computeTides -> sTide),
shown as a tide-coloured coastline (T, buildCoastline + tideColor). Moons render with sun-lit
phases, orbit rings and eclipses (solar shadow spot in the day/night overlay, lunar dimming).
The 2D map is left-aligned; the freed space holds a Live-World "Sky & tides" panel (per-moon
phase + a selected coastal tile's tidal phase).

Ocean currents + climate feedback (PlanetOcean.cpp): computeOceanCurrents builds a
per-ocean-cell tangent velocity from wind stress + Coriolis deflection + coast-following
(gyres); computeClimate feeds warm (poleward) / cold (equatorward) currents back into sTemp as
a bounded coastal anomaly (climateCurrentFactor) before seasons, so biomes shift. Rendered as
warm/cold current arrows (O).

Config: dayLengthHours/yearLengthDays/snowTemp/seaIceTemp/tideAmplitude/tideSunFactor/
climateCurrentFactor. Save header v7->v9 (version-gated; older saves load fine). Headless
test_live.cpp + test_ocean.cpp; test_logic/test_biota still pass; GUI build clean. Docs updated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 10:04:45 +02:00

61 lines
1.8 KiB
CMake

cmake_minimum_required(VERSION 3.16)
project(PlanetSim CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
include(FetchContent)
FetchContent_Declare(
raylib
GIT_REPOSITORY https://github.com/raysan5/raylib.git
GIT_TAG 5.5
)
# Build raylib as a static lib, no examples.
set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
set(BUILD_GAMES OFF CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(raylib)
add_executable(planetsim
src/main.cpp
# Engine (raylib-free, testable headless) -- src/sim
src/sim/IcoSphere.cpp
src/sim/Planet.cpp
src/sim/PlanetTectonics.cpp
src/sim/PlanetDrift.cpp
src/sim/PlanetErosion.cpp
src/sim/PlanetHydrology.cpp
src/sim/PlanetBiomes.cpp
src/sim/PlanetClimate.cpp
src/sim/PlanetLive.cpp
src/sim/PlanetOcean.cpp
src/sim/PlanetBiota.cpp
src/sim/PlanetFloraGen.cpp
src/sim/PlanetFaunaGen.cpp
src/sim/PlanetFungiGen.cpp
src/sim/PlanetIO.cpp
# Viewer (raylib) -- src/render
src/render/Colors.cpp
src/render/Map2D.cpp
src/render/Overlays.cpp
src/render/Picking.cpp
src/render/Panels.cpp
src/render/Viewer.cpp
src/render/ViewerInput.cpp
src/render/ViewerRender.cpp
)
# Flat includes ("Planet.hpp", "Viewer.hpp", ...) resolve across both folders.
target_include_directories(planetsim PRIVATE src/sim src/render)
target_link_libraries(planetsim PRIVATE raylib)
# OpenMP parallelizes the per-cell passes in Planet::step(). Optional: without
# it the #pragma omp lines are ignored and the sim runs (correctly) serial.
find_package(OpenMP)
if(OpenMP_CXX_FOUND)
target_link_libraries(planetsim PRIVATE OpenMP::OpenMP_CXX)
endif()
# Linux system libs raylib needs at link time.
if(UNIX AND NOT APPLE)
target_link_libraries(planetsim PRIVATE m pthread dl)
endif()