2014-11-11 08:11:12 -05:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
|
|
class GradientColor {
|
|
|
|
|
public:
|
|
|
|
|
float r,g,b;
|
|
|
|
|
float w;
|
|
|
|
|
|
|
|
|
|
GradientColor(float r_in, float g_in, float b_in) : r(r_in), g(g_in), b(b_in) {
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class Gradient {
|
|
|
|
|
public:
|
|
|
|
|
Gradient() {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void addColor(GradientColor c) {
|
|
|
|
|
colors.push_back(c);
|
|
|
|
|
}
|
|
|
|
|
|
2014-11-11 20:25:16 -05:00
|
|
|
std::vector<float> &getRed() {
|
|
|
|
|
return r_val;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::vector<float> &getGreen() {
|
|
|
|
|
return g_val;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::vector<float> &getBlue() {
|
|
|
|
|
return b_val;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void generate(unsigned int len) {
|
|
|
|
|
int chunk_size = len/(colors.size()-1);
|
2014-11-11 08:11:12 -05:00
|
|
|
|
|
|
|
|
int p = 0;
|
2014-11-11 20:25:16 -05:00
|
|
|
r_val.resize(len);
|
|
|
|
|
g_val.resize(len);
|
|
|
|
|
b_val.resize(len);
|
2014-11-11 08:11:12 -05:00
|
|
|
|
|
|
|
|
for (unsigned int j = 0, jMax = colors.size()-1; j < jMax; j++) {
|
2014-11-11 20:25:16 -05:00
|
|
|
if (chunk_size*(jMax+1) < len && j == jMax-1) {
|
|
|
|
|
chunk_size += len-chunk_size*(jMax+1);
|
2014-11-11 08:11:12 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (unsigned int i = 0; i < chunk_size; i++) {
|
2014-11-11 20:25:16 -05:00
|
|
|
float idx = (float)(i)/(float)chunk_size;
|
2014-11-11 08:11:12 -05:00
|
|
|
|
|
|
|
|
float r1 = colors[j].r;
|
|
|
|
|
float g1 = colors[j].g;
|
|
|
|
|
float b1 = colors[j].b;
|
|
|
|
|
|
|
|
|
|
float r2 = colors[j+1].r;
|
|
|
|
|
float g2 = colors[j+1].g;
|
|
|
|
|
float b2 = colors[j+1].b;
|
|
|
|
|
|
|
|
|
|
float r = r1 + (r2-r1) * idx;
|
|
|
|
|
float g = g1 + (g2-g1) * idx;
|
|
|
|
|
float b = b1 + (b2-b1) * idx;
|
|
|
|
|
|
2014-11-11 20:25:16 -05:00
|
|
|
if (r<0.0) r = 0.0;
|
|
|
|
|
if (r>1.0) r = 1.0;
|
|
|
|
|
if (g<0.0) g = 0.0;
|
|
|
|
|
if (g>1.0) g = 1.0;
|
|
|
|
|
if (b<0.0) b = 0.0;
|
|
|
|
|
if (b>1.0) b = 1.0;
|
|
|
|
|
|
|
|
|
|
r_val[p] = r;
|
|
|
|
|
g_val[p] = g;
|
|
|
|
|
b_val[p] = b;
|
2014-11-11 08:11:12 -05:00
|
|
|
|
|
|
|
|
p++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
~Gradient() {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
private:
|
|
|
|
|
std::vector<GradientColor> colors;
|
2014-11-11 20:25:16 -05:00
|
|
|
std::vector<float> r_val;
|
|
|
|
|
std::vector<float> g_val;
|
|
|
|
|
std::vector<float> b_val;
|
|
|
|
|
};
|