#pragma once #include "render/Renderer.h" #include "PlanetData.h" namespace ZL { struct StoneParams { static const float BASE_SCALE; // Общий размер камня static const float MIN_AXIS_SCALE; // Минимальное растяжение/сжатие по оси static const float MAX_AXIS_SCALE; // Максимальное растяжение/сжатие по оси static const float MIN_PERTURBATION; // Минимальное радиальное возмущение вершины static const float MAX_PERTURBATION; // Максимальное радиальное возмущение вершины static const int STONES_PER_TRIANGLE; }; struct StoneInstance { uint64_t seed; Vector3f position; Vector3f scale; Eigen::Quaternionf rotation; }; enum class ChunkStatus { Empty, // Данных нет Generating, // Задача в TaskManager (CPU) ReadyToUpload, // Данные в памяти, ждут очереди в главный поток Live // Загружено в GPU и готово к отрисовке }; struct StoneGroup { // mesh.PositionData и прочие будут заполняться в inflate() VertexDataStruct mesh; std::vector> allInstances; // Очищает старую геометрию и генерирует новую для указанных индексов std::vector inflate(int count); VertexRenderStruct inflateOne(int index, float scaleModifier); VertexDataStruct inflateOneDataOnly(int index, float scaleModifier); std::vector statuses; // Инициализация статусов при создании группы void initStatuses() { statuses.assign(allInstances.size(), ChunkStatus::Empty); } }; // Теперь возвращает заготовку со всеми параметрами, но без тяжелого меша StoneGroup CreateStoneGroupData(uint64_t globalSeed, const LodLevel& lodLevel); Triangle createLocalTriangle(const Triangle& sampleTri); } // namespace ZL