Kelsidavis-WoWee/tools/editor/texture_painter.hpp
Kelsi aa9a6a87a8 feat(editor): auto-paint terrain by height bands
- Auto-Paint by Height: automatically sets base texture per chunk based
  on average height — configurable thresholds for sand/grass/rock/snow
- Uses Tanaris sand, Elwynn grass, Barrens rock, Dragonblight snow
- One-click to texture an entire procedurally generated terrain
- Adjustable height thresholds via drag floats
- Workflow: noise → smooth → clamp → auto-paint for instant biome
2026-05-05 06:17:37 -07:00

48 lines
1.7 KiB
C++

#pragma once
#include "editor_brush.hpp"
#include "pipeline/adt_loader.hpp"
#include <string>
#include <vector>
#include <glm/glm.hpp>
namespace wowee {
namespace editor {
class TexturePainter {
public:
void setTerrain(pipeline::ADTTerrain* terrain) { terrain_ = terrain; }
void setActiveTexture(const std::string& texturePath);
const std::string& getActiveTexture() const { return activeTexture_; }
const std::vector<std::string>& getRecentTextures() const { return recentTextures_; }
// Auto-paint textures based on terrain height bands
struct HeightBand { float maxHeight; std::string texturePath; };
void autoPaintByHeight(const std::vector<HeightBand>& bands);
// Paint the active texture at the given world position
// Returns list of modified chunk indices
std::vector<int> paint(const glm::vec3& center, float radius, float strength, float falloff);
// Erase a texture layer at the given position
std::vector<int> erase(const glm::vec3& center, float radius, float strength, float falloff);
private:
uint32_t ensureTextureInList(const std::string& path);
int ensureLayerOnChunk(int chunkIdx, uint32_t textureId);
void modifyAlpha(int chunkIdx, int layerIdx, const glm::vec3& center,
float radius, float strength, float falloff, bool erasing);
glm::vec2 worldToChunkUV(int chunkIdx, const glm::vec3& worldPos) const;
pipeline::ADTTerrain* terrain_ = nullptr;
std::string activeTexture_;
std::vector<std::string> recentTextures_;
static constexpr float TILE_SIZE = 533.33333f;
static constexpr float CHUNK_SIZE = TILE_SIZE / 16.0f;
};
} // namespace editor
} // namespace wowee