On entering Live World a one-time pass places volcanoes by tectonic context (very high prob on young spreading-ridge/"new-plate" cells, medium on plate borders, low elsewhere). Over the live clock they erupt; submarine vents build up and breach sea level into new volcanic islands, land vents grow cones, and each eruption injects a drifting ash cloud + local cooling into the weather. Design: eruption state (built height + intensity) is a PURE FUNCTION of liveTime (like insolation/tides/seasons), so the live stepper rewinds islands & eruptions for free -- no per-cell snapshot, no volcano undo history. The only integrated side-effect is the ash plume into sCloud (reverts via the weather snapshot). - src/sim/PlanetVolcano.cpp (new): placeVolcanoes (separate RNG, reservoir- sampled to volcanoMaxCount; tectonic determinism intact) + stepVolcanoes (reassert elevation = baseElev + built(liveTime); breach/un-breach; ash). - Volcano struct + volcano* config knobs (PlanetTypes.hpp); Planet members + decls; readState gains hasVolcanoes; CONFIG_FIELDS + validateConfig. - Save bumped to v14: flag-gated volcano block (set + sVolRng) in writeState/ readState; pre-v14 saves load with none and place on next Live World entry. - Render: 3D cone + eruption glow/ash-plume (DrawCylinderEx) and 2D triangle markers, key V toggle, HUD line, cell-info volcano line. Lazy placement on W entry and on loading a live-world save with no volcanoes. - test_volcano.cpp (new, registered in CMake): determinism, RNG isolation, context classification + probability ordering, monotonic build + sea-level breach + step-back recede (pure function of liveTime), ash->cloud, v14 round-trip. All six headless suites pass; GUI build clean. Docs updated. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
78 lines
2.2 KiB
CMake
78 lines
2.2 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)
|
|
|
|
set(SIM_SOURCES
|
|
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/PlanetWeather.cpp
|
|
src/sim/PlanetVolcano.cpp
|
|
src/sim/PlanetBiota.cpp
|
|
src/sim/PlanetFloraGen.cpp
|
|
src/sim/PlanetFaunaGen.cpp
|
|
src/sim/PlanetFungiGen.cpp
|
|
src/sim/PlanetIO.cpp
|
|
)
|
|
|
|
set(RENDER_SOURCES
|
|
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
|
|
)
|
|
|
|
add_library(planetsim_sim STATIC ${SIM_SOURCES})
|
|
target_include_directories(planetsim_sim PUBLIC src/sim)
|
|
|
|
add_executable(planetsim
|
|
src/main.cpp
|
|
${RENDER_SOURCES}
|
|
)
|
|
# Flat includes ("Planet.hpp", "Viewer.hpp", ...) resolve across both folders.
|
|
target_include_directories(planetsim PRIVATE src/sim src/render)
|
|
target_link_libraries(planetsim PRIVATE planetsim_sim 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_sim PUBLIC 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()
|
|
|
|
enable_testing()
|
|
foreach(test_name logic biota ocean live weather volcano)
|
|
add_executable(test_${test_name} test_${test_name}.cpp)
|
|
target_link_libraries(test_${test_name} PRIVATE planetsim_sim)
|
|
add_test(NAME ${test_name} COMMAND test_${test_name})
|
|
endforeach()
|