mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-05-06 00:53:52 +00:00
- paintAlongPath(): paints a texture along a line segment with configurable width and quadratic edge falloff - Road mode now automatically applies Elwynn cobblestone texture when flattening a road path (flatten + texture in one operation) - Quick distance check skips chunks far from the path for performance - Alpha blending uses max() so overlapping paths don't wash out
55 lines
2 KiB
C++
55 lines
2 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 a texture along a line (for roads/paths after flattening)
|
|
void paintAlongPath(const glm::vec3& start, const glm::vec3& end,
|
|
float width, const std::string& texturePath);
|
|
|
|
// 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
|