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>
61 lines
1.8 KiB
CMake
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()
|