Files
2025-11-07 08:18:50 +01:00

159 lines
4.2 KiB
C++

#pragma once
class EditorComponent;
struct ModifierWindow : public wi::gui::Window
{
wi::terrain::Modifier* modifier = nullptr;
std::function<void()> generation_callback;
wi::gui::ComboBox blendCombo;
wi::gui::Slider weightSlider;
wi::gui::Slider scaleSlider;
virtual ~ModifierWindow() = default;
ModifierWindow(const std::string& name);
void Bind(wi::terrain::Modifier* ptr);
void From(wi::terrain::Modifier* ptr);
};
struct PerlinModifierWindow : public ModifierWindow
{
wi::gui::Slider octavesSlider;
PerlinModifierWindow();
void ResizeLayout() override;
void Bind(wi::terrain::PerlinModifier* ptr);
void From(wi::terrain::PerlinModifier* ptr);
};
struct VoronoiModifierWindow : public ModifierWindow
{
wi::gui::Slider fadeSlider;
wi::gui::Slider shapeSlider;
wi::gui::Slider falloffSlider;
wi::gui::Slider perturbationSlider;
VoronoiModifierWindow();
void ResizeLayout() override;
void Bind(wi::terrain::VoronoiModifier* ptr);
void From(wi::terrain::VoronoiModifier* ptr);
};
struct HeightmapModifierWindow : public ModifierWindow
{
wi::gui::Slider amountSlider;
wi::gui::Button loadButton;
HeightmapModifierWindow();
void ResizeLayout() override;
void Bind(wi::terrain::HeightmapModifier* ptr);
void From(wi::terrain::HeightmapModifier* ptr);
};
struct PropWindow : public wi::gui::Window
{
wi::gui::ComboBox meshCombo;
wi::gui::TextInputField minCountPerChunkInput;
wi::gui::TextInputField maxCountPerChunkInput;
wi::gui::ComboBox regionCombo;
wi::gui::Slider regionPowerSlider;
wi::gui::Slider noiseFrequencySlider;
wi::gui::Slider noisePowerSlider;
wi::gui::Slider thresholdSlider;
wi::gui::Slider minSizeSlider;
wi::gui::Slider maxSizeSlider;
wi::gui::TextInputField minYOffsetInput;
wi::gui::TextInputField maxYOffsetInput;
PropWindow(wi::terrain::Terrain* terrain, wi::terrain::Prop* prop, wi::scene::Scene* scene);
void ResizeLayout() override;
wi::terrain::Terrain* terrain = nullptr;
wi::terrain::Prop* prop = nullptr;
wi::scene::Scene* scene = nullptr;
std::function<void()> generation_callback;
};
struct PropsWindow : public wi::gui::Window
{
wi::gui::Button addButton;
wi::gui::Button reloadButton;
PropsWindow(EditorComponent* editor);
void Rebuild();
void AddWindow(wi::terrain::Prop& prop);
void Update(const wi::Canvas& canvas, float dt) override;
void ResizeLayout() override;
EditorComponent* editor = nullptr;
wi::terrain::Terrain* terrain = nullptr;
wi::vector<std::unique_ptr<PropWindow>> windows;
wi::vector<PropWindow*> windows_to_remove;
std::function<void()> generation_callback;
};
class TerrainWindow : public wi::gui::Window
{
public:
wi::gui::CheckBox centerToCamCheckBox;
wi::gui::CheckBox removalCheckBox;
wi::gui::CheckBox grassCheckBox;
wi::gui::CheckBox physicsCheckBox;
wi::gui::CheckBox tessellationCheckBox;
wi::gui::Slider lodSlider;
wi::gui::Slider generationSlider;
wi::gui::Slider propGenerationSlider;
wi::gui::Slider physicsGenerationSlider;
wi::gui::Slider propDensitySlider;
wi::gui::Slider grassDensitySlider;
wi::gui::Slider grassLengthSlider;
wi::gui::Slider grassDistanceSlider;
wi::gui::ComboBox presetCombo;
wi::gui::Slider scaleSlider;
wi::gui::Slider seedSlider;
wi::gui::Slider bottomLevelSlider;
wi::gui::Slider topLevelSlider;
wi::gui::Button saveHeightmapButton;
wi::gui::Button saveRegionButton;
wi::gui::ComboBox addModifierCombo;
wi::gui::Slider region1Slider;
wi::gui::Slider region2Slider;
wi::gui::Slider region3Slider;
wi::gui::ComboBox materialCombos[wi::terrain::MATERIAL_COUNT];
wi::gui::ComboBox materialCombo_GrassParticle;
std::unique_ptr<PropsWindow> propsWindow;
enum PRESET
{
PRESET_HILLS,
PRESET_ISLANDS,
PRESET_MOUNTAINS,
PRESET_ARCTIC,
PRESET_DESERT,
};
wi::vector<std::unique_ptr<ModifierWindow>> modifiers;
wi::vector<ModifierWindow*> modifiers_to_remove;
void Create(EditorComponent* editor);
EditorComponent* editor = nullptr;
wi::ecs::Entity entity = wi::ecs::INVALID_ENTITY;
wi::terrain::Terrain* terrain = nullptr;
void SetEntity(wi::ecs::Entity entity);
void AddModifier(ModifierWindow* modifier_window);
void SetupAssets();
void RefreshMaterialComboBoxes();
void Update(const wi::Canvas& canvas, float dt) override;
void ResizeLayout() override;
};