58 lines
2.3 KiB
C++
58 lines
2.3 KiB
C++
#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<std::vector<StoneInstance>> allInstances;
|
||
|
||
// Очищает старую геометрию и генерирует новую для указанных индексов
|
||
std::vector<VertexRenderStruct> inflate(int count);
|
||
|
||
VertexRenderStruct inflateOne(int index, float scaleModifier);
|
||
VertexDataStruct inflateOneDataOnly(int index, float scaleModifier);
|
||
|
||
std::vector<ChunkStatus> statuses;
|
||
|
||
// Инициализация статусов при создании группы
|
||
void initStatuses() {
|
||
statuses.assign(allInstances.size(), ChunkStatus::Empty);
|
||
}
|
||
};
|
||
|
||
// Теперь возвращает заготовку со всеми параметрами, но без тяжелого меша
|
||
StoneGroup CreateStoneGroupData(uint64_t globalSeed, const LodLevel& lodLevel);
|
||
|
||
Triangle createLocalTriangle(const Triangle& sampleTri);
|
||
|
||
} // namespace ZL
|