mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-12-18 15:00:26 +00:00
rogueviz:: rainbow color specification
This commit is contained in:
parent
c40d7753d0
commit
4bc4f80bfc
103
rogueviz.cpp
103
rogueviz.cpp
@ -65,58 +65,48 @@ edgetype *add_edgetype(const string& name) {
|
|||||||
return &*e;
|
return &*e;
|
||||||
}
|
}
|
||||||
|
|
||||||
colorpair parse(const string& s) {
|
map<color_t, array<color_t, 16> > next_hue;
|
||||||
colorpair cp;
|
|
||||||
cp.shade = 0; cp.color2 = 0;
|
color_t parse1(const string& s) {
|
||||||
sscanf(s.c_str(), "%x:%c%x", &cp.color1, &cp.shade, &cp.color2);
|
// color can be given as RRGGBB
|
||||||
return cp;
|
// or as 'Rmax,min,alpha,step,start', for rainbow Collatz
|
||||||
|
if(s[0] == 'R') {
|
||||||
|
int mh = 192, minh = 0, alpha = 255, step = 50, start = 0;
|
||||||
|
sscanf(s.c_str(), "R%x,%x,%x,%d,%d", &mh, &minh, &alpha, &step, &start);
|
||||||
|
vector<color_t> hues;
|
||||||
|
color_t difh = mh - minh;
|
||||||
|
color_t base = alpha + minh * 0x1010100;
|
||||||
|
|
||||||
|
for(unsigned y=0; y<difh; y++)
|
||||||
|
hues.push_back(base + 0x1000000*mh + 0x10000 * y);
|
||||||
|
for(unsigned y=0; y<difh; y++)
|
||||||
|
hues.push_back(base + 0x1010000*mh - 0x1000000 * y);
|
||||||
|
for(unsigned y=0; y<difh; y++)
|
||||||
|
hues.push_back(base + 0x0010000*mh + 0x100 * y);
|
||||||
|
for(unsigned y=0; y<difh; y++)
|
||||||
|
hues.push_back(base + 0x0010100*mh - 0x10000 * y);
|
||||||
|
for(unsigned y=0; y<difh; y++)
|
||||||
|
hues.push_back(base + 0x0000100*mh + 0x1000000 * y);
|
||||||
|
for(unsigned y=0; y<difh; y++)
|
||||||
|
hues.push_back(base + 0x1000100*mh - 0x100 * y);
|
||||||
|
|
||||||
|
for(int t=0; t<isize(hues); t++)
|
||||||
|
for(int a=0; a<16; a++)
|
||||||
|
next_hue[hues[t]][a] = hues[gmod(t + rand() % step - rand() % step, isize(hues))];
|
||||||
|
|
||||||
|
return hues[gmod(start, isize(hues))];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
color_t res;
|
||||||
|
sscanf(s.c_str(), "%x", &res);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int nh = 0;
|
|
||||||
color_t hues[256*6];
|
|
||||||
|
|
||||||
void buildhue() {
|
|
||||||
color_t mh = 193;
|
|
||||||
for(unsigned y=0; y<=mh; y++)
|
|
||||||
hues[nh++] = (int) (0xFF + 0x1000000*mh + (unsigned) 0x10000 * y);
|
|
||||||
for(unsigned y=0; y<=mh; y++)
|
|
||||||
hues[nh++] = (int) (0xFF + 0x1010000*mh - 0x1000000 * y);
|
|
||||||
for(unsigned y=0; y<=mh; y++)
|
|
||||||
hues[nh++] = (int) (0xFF + 0x0010000*mh + 0x100 * y);
|
|
||||||
for(unsigned y=0; y<=mh; y++)
|
|
||||||
hues[nh++] = (int) (0xFF + 0x0010100*mh - 0x10000 * y);
|
|
||||||
for(unsigned y=0; y<=mh; y++)
|
|
||||||
hues[nh++] = (int) (0xFF + 0x0000100*mh + 0x1000000 * y);
|
|
||||||
for(unsigned y=0; y<=mh; y++)
|
|
||||||
hues[nh++] = (int) (0xFF + 0x1000100*mh - 0x100 * y);
|
|
||||||
}
|
|
||||||
|
|
||||||
color_t perturb(color_t c) {
|
color_t perturb(color_t c) {
|
||||||
if(nh == 0) buildhue();
|
if(!next_hue.count(c)) return c;
|
||||||
int hueid = -1;
|
return next_hue[c][rand() % 16];
|
||||||
for(int t=0; t<nh; t++) if(hues[t] == c) hueid = t;
|
|
||||||
if(hueid == -1) return c;
|
|
||||||
hueid += rand() % 50;
|
|
||||||
hueid -= rand() % 50;
|
|
||||||
if(hueid<0) hueid += nh;
|
|
||||||
hueid %= nh;
|
|
||||||
return hues[hueid];
|
|
||||||
/*
|
|
||||||
int part[4];
|
|
||||||
for(int u=0; u<=3; u++) {
|
|
||||||
part[u] = (c >> (8*u)) & 0xFF;
|
|
||||||
}
|
|
||||||
int
|
|
||||||
if(part[1] == 255 && part[2] == 0)
|
|
||||||
int k =
|
|
||||||
k += rand() % 16;
|
|
||||||
k -= rand() % 16;
|
|
||||||
if(k<0) k=-k;
|
|
||||||
if(k>255) k = 255-(k-255);
|
|
||||||
c &=~ (0xFF << (8*u));
|
|
||||||
c |= k << (8*u);
|
|
||||||
} */
|
|
||||||
return c;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
colorpair perturb(colorpair cp) {
|
colorpair perturb(colorpair cp) {
|
||||||
@ -125,6 +115,21 @@ colorpair perturb(colorpair cp) {
|
|||||||
return cp;
|
return cp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
colorpair parse(const string& s) {
|
||||||
|
colorpair cp;
|
||||||
|
auto pos = s.find(":");
|
||||||
|
if(pos != string::npos) {
|
||||||
|
cp.color1 = parse1(s.substr(0, pos));
|
||||||
|
cp.shade = s[pos+1];
|
||||||
|
cp.color2 = parse1(s.substr(pos+2));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
cp.shade = 0; cp.color2 = 0;
|
||||||
|
cp.color1 = parse1(s);
|
||||||
|
}
|
||||||
|
return cp;
|
||||||
|
}
|
||||||
|
|
||||||
vector<vertexdata> vdata;
|
vector<vertexdata> vdata;
|
||||||
|
|
||||||
transmatrix cspin(int i, int ch) {
|
transmatrix cspin(int i, int ch) {
|
||||||
@ -293,7 +298,7 @@ namespace collatz {
|
|||||||
vertexdata& vd = vdata[0];
|
vertexdata& vd = vdata[0];
|
||||||
createViz(0, cwt.at, xpush(cshift));
|
createViz(0, cwt.at, xpush(cshift));
|
||||||
virtualRebase(vd.m, true);
|
virtualRebase(vd.m, true);
|
||||||
vd.cp = perturb(dftcolor);
|
vd.cp = dftcolor;
|
||||||
vd.data = 0;
|
vd.data = 0;
|
||||||
addedge(0, 0, 1, false, collatz::collatz1);
|
addedge(0, 0, 1, false, collatz::collatz1);
|
||||||
vd.name = "1";
|
vd.name = "1";
|
||||||
|
Loading…
Reference in New Issue
Block a user