载入中...
搜索中...
未找到
ColorRamp.cpp
浏览该文件的文档.
2
3#include <algorithm>
4#include <cmath>
5
6namespace eve::procgen {
7
8void ColorRamp::add(float t, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
9 stops.push_back({t, {r, g, b, a}});
10 std::sort(stops.begin(), stops.end(),
11 [](const Stop &a, const Stop &b) { return a.t < b.t; });
12}
13
14Rgba8 ColorRamp::sample(float t) const {
15 if (stops.empty()) return {};
16 t = std::clamp(t, 0.f, 1.f);
17 if (t <= stops.front().t) return stops.front().c;
18 if (t >= stops.back().t) return stops.back().c;
19 for (size_t i = 1; i < stops.size(); ++i) {
20 if (t <= stops[i].t) {
21 const Stop &a = stops[i - 1];
22 const Stop &b = stops[i];
23 const float u = (t - a.t) / std::max(1e-6f, b.t - a.t);
24 auto lerp8 = [&](uint8_t x, uint8_t y) {
25 return uint8_t(std::lround(float(x) + (float(y) - float(x)) * u));
26 };
27 return {lerp8(a.c.r, b.c.r), lerp8(a.c.g, b.c.g), lerp8(a.c.b, b.c.b),
28 lerp8(a.c.a, b.c.a)};
29 }
30 }
31 return stops.back().c;
32}
33
34Rgba8 ColorRamp::sampleBanded(float t, int bands) const {
35 bands = std::max(2, bands);
36 t = std::clamp(t, 0.f, 1.f);
37 const float step = 1.f / float(bands - 1);
38 const int idx = int(std::lround(t / step));
39 return sample(float(idx) * step);
40}
41
42} // namespace eve::procgen
int y
Definition Grass.cpp:135
float u
Definition Grass.cpp:234
int x
Definition Grass.cpp:135
uint32_t a
uint32_t b
int idx
float step
Definition TreeMesh.cpp:196
Rgba8 sampleBanded(float t, int bands) const
Quantize continuous t into bands steps then sample (pixel look).
Definition ColorRamp.cpp:34
std::vector< Stop > stops
Definition ColorRamp.h:19
Rgba8 sample(float t) const
Definition ColorRamp.cpp:14
void add(float t, uint8_t r, uint8_t g, uint8_t b, uint8_t a=255)
Definition ColorRamp.cpp:8