mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-05-06 09:03:52 +00:00
- 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
51 lines
1.8 KiB
C++
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
|