Kelsidavis-WoWee/tools/editor/texture_painter.hpp
Kelsi 59c6dab2b3 feat(editor): auto-paint by slope for natural cliff texturing
- Auto-Paint by Slope: paints rock texture on steep terrain surfaces
  with configurable slope threshold (0.1 - 0.9)
- Uses per-vertex normal Z component to detect steepness
- Alpha blending based on slope gradient for smooth transitions
- Workflow: sculpt terrain → recalc normals → auto-paint slope → rock
  appears naturally on cliffs while flat areas keep their biome texture
2026-05-05 07:19:05 -07:00

51 lines
1.8 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);
// Auto-paint steep slopes with rock texture
void autoPaintBySlope(float slopeThreshold, const std::string& steepTexture);
// 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