mirror of
				https://github.com/zenorogue/hyperrogue.git
				synced 2025-10-31 14:02:59 +00:00 
			
		
		
		
	added colors.cpp for all color-related functions
This commit is contained in:
		
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @@ -153,7 +153,7 @@ makeh$(EXE_EXTENSION): makeh.cpp | |||||||
| 	$(CXX) -O2 makeh.cpp -o $@ | 	$(CXX) -O2 makeh.cpp -o $@ | ||||||
|  |  | ||||||
| autohdr.h: makeh$(EXE_EXTENSION) language-data.cpp *.cpp | autohdr.h: makeh$(EXE_EXTENSION) language-data.cpp *.cpp | ||||||
| 	./makeh classes.cpp locations.cpp hyperpoint.cpp geometry.cpp goldberg.cpp init.cpp floorshapes.cpp cell.cpp multi.cpp shmup.cpp pattern2.cpp mapeditor.cpp graph.cpp textures.cpp hprint.cpp language.cpp util.cpp complex.cpp *.cpp > autohdr.h | 	./makeh classes.cpp locations.cpp colors.cpp hyperpoint.cpp geometry.cpp goldberg.cpp init.cpp floorshapes.cpp cell.cpp multi.cpp shmup.cpp pattern2.cpp mapeditor.cpp graph.cpp textures.cpp hprint.cpp language.cpp util.cpp complex.cpp *.cpp > autohdr.h | ||||||
|  |  | ||||||
| language-data.cpp: langen$(EXE_EXTENSION) | language-data.cpp: langen$(EXE_EXTENSION) | ||||||
| 	./langen > language-data.cpp | 	./langen > language-data.cpp | ||||||
|   | |||||||
| @@ -235,39 +235,6 @@ int textwidth(int siz, const string &str) { | |||||||
|   } |   } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| EX int darkenedby(int c, int lev) { |  | ||||||
|   for(int i=0; i<lev; i++) |  | ||||||
|     c = ((c & 0xFEFEFE) >> 1); |  | ||||||
|   return c; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| bool fading = false; |  | ||||||
|  |  | ||||||
| ld fadeout = 1; |  | ||||||
|  |  | ||||||
| EX color_t darkened(color_t c) { |  | ||||||
|   if(inmirrorcount&1) |  | ||||||
|     c = gradient(c, winf[waMirror].color, 0, 0.5, 1); |  | ||||||
|   else if(inmirrorcount) |  | ||||||
|     c = gradient(c, winf[waCloud].color, 0, 0.5, 1); |  | ||||||
|   if(fading) c = gradient(backcolor, c, 0, fadeout, 1); |  | ||||||
|   if(vid.desaturate) { |  | ||||||
|     ld luminance = 0.2125 * part(c,2) + 0.7154 * part(c,1) + 0.0721 * part(c, 0); |  | ||||||
|     c = gradient(c, int(luminance+.5) * 0x10101, 0, vid.desaturate, 100); |  | ||||||
|     } |  | ||||||
|   for(int i=0; i<darken; i++) |  | ||||||
|     c = ((c & 0xFEFEFE) >> 1) + ((backcolor & 0xFEFEFE) >> 1); |  | ||||||
|   return c; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| EX color_t darkena3(color_t c, int lev, int a) { |  | ||||||
|   return (darkenedby(c, lev) << 8) + a; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| EX color_t darkena(color_t c, int lev, int a) { |  | ||||||
|   return darkena3(c, lev, GDIM == 3 ? 255 : a); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| #if !CAP_GL | #if !CAP_GL | ||||||
| EX void setcameraangle(bool b) { } | EX void setcameraangle(bool b) { } | ||||||
| #endif | #endif | ||||||
| @@ -1008,17 +975,6 @@ EX void drawmessages() { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| EX color_t gradient(color_t c0, color_t c1, ld v0, ld v, ld v1) { |  | ||||||
|   int vv = int(256 * ((v-v0) / (v1-v0))); |  | ||||||
|   color_t c = 0; |  | ||||||
|   for(int a=0; a<4; a++) { |  | ||||||
|     int p0 = part(c0, a); |  | ||||||
|     int p1 = part(c1, a); |  | ||||||
|     part(c, a) = (p0*(256-vv) + p1*vv + 127) >> 8; |  | ||||||
|     } |  | ||||||
|   return c; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| EX void drawCircle(int x, int y, int size, color_t color, color_t fillcolor IS(0)) { | EX void drawCircle(int x, int y, int size, color_t color, color_t fillcolor IS(0)) { | ||||||
|   if(size < 0) size = -size; |   if(size < 0) size = -size; | ||||||
|   #if CAP_GL && CAP_POLY |   #if CAP_GL && CAP_POLY | ||||||
|   | |||||||
							
								
								
									
										273
									
								
								colors.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										273
									
								
								colors.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,273 @@ | |||||||
|  | // Hyperbolic Rogue -- color routines | ||||||
|  | // Copyright (C) 2011-2020 Zeno Rogue, see 'hyper.cpp' for details | ||||||
|  |  | ||||||
|  | /** \file colors.cpp  | ||||||
|  |  *  \brief This file implements routines related to colors | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "hyper.h" | ||||||
|  | namespace hr { | ||||||
|  |  | ||||||
|  | /** \brief Return a reference to i-th component of col.  | ||||||
|  |  *  \arg i For colors with alpha, A=0, R=1, G=2, B=3. For colors without alpha, R=0, G=1, B=2. | ||||||
|  |  */ | ||||||
|  | EX unsigned char& part(color_t& col, int i) { | ||||||
|  |   unsigned char* c = (unsigned char*) &col; | ||||||
|  | #if ISMOBILE | ||||||
|  |   return c[i]; | ||||||
|  | #else | ||||||
|  | #if SDL_BYTEORDER == SDL_BIG_ENDIAN | ||||||
|  |   return c[sizeof(col) - 1 - i]; | ||||||
|  | #else | ||||||
|  |   return c[i]; | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | #if HDR | ||||||
|  | static const color_t NOCOLOR = 0; | ||||||
|  |  | ||||||
|  | struct colortable: vector<color_t> { | ||||||
|  |   color_t& operator [] (int i) { i %= size(); if(i<0) i += size(); return ((vector<color_t>&)(*this)) [i]; } | ||||||
|  |   const color_t& operator [] (int i) const { i %= size(); if(i<0) i += size(); return ((vector<color_t>&)(*this)) [i]; } | ||||||
|  |   colortable(std::initializer_list<color_t> v) : vector(v) {} | ||||||
|  |   colortable() : vector({0}) {} | ||||||
|  |   }; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* darkening routines */ | ||||||
|  |  | ||||||
|  | EX color_t darkena3(color_t c, int lev, int a) { | ||||||
|  |   return (darkenedby(c, lev) << 8) + a; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | EX color_t darkena(color_t c, int lev, int a) { | ||||||
|  |   return darkena3(c, lev, GDIM == 3 ? 255 : a); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | EX int darkenedby(int c, int lev) { | ||||||
|  |   for(int i=0; i<lev; i++) | ||||||
|  |     c = ((c & 0xFEFEFE) >> 1); | ||||||
|  |   return c; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | bool fading = false; | ||||||
|  |  | ||||||
|  | ld fadeout = 1; | ||||||
|  |  | ||||||
|  | EX color_t darkened(color_t c) { | ||||||
|  |   if(inmirrorcount&1) | ||||||
|  |     c = gradient(c, winf[waMirror].color, 0, 0.5, 1); | ||||||
|  |   else if(inmirrorcount) | ||||||
|  |     c = gradient(c, winf[waCloud].color, 0, 0.5, 1); | ||||||
|  |   if(fading) c = gradient(backcolor, c, 0, fadeout, 1); | ||||||
|  |   if(vid.desaturate) { | ||||||
|  |     ld luminance = 0.2125 * part(c,2) + 0.7154 * part(c,1) + 0.0721 * part(c, 0); | ||||||
|  |     c = gradient(c, int(luminance+.5) * 0x10101, 0, vid.desaturate, 100); | ||||||
|  |     } | ||||||
|  |   for(int i=0; i<darken; i++) | ||||||
|  |     c = ((c & 0xFEFEFE) >> 1) + ((backcolor & 0xFEFEFE) >> 1); | ||||||
|  |   return c; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | /* gradient interpolation */ | ||||||
|  |  | ||||||
|  | EX color_t gradient(color_t c0, color_t c1, ld v0, ld v, ld v1) { | ||||||
|  |   int vv = int(256 * ((v-v0) / (v1-v0))); | ||||||
|  |   color_t c = 0; | ||||||
|  |   for(int a=0; a<4; a++) { | ||||||
|  |     int p0 = part(c0, a); | ||||||
|  |     int p1 = part(c1, a); | ||||||
|  |     part(c, a) = (p0*(256-vv) + p1*vv + 127) >> 8; | ||||||
|  |     } | ||||||
|  |   return c; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | color_t rcolor() { | ||||||
|  |   color_t res; | ||||||
|  |   part(res, 0) = hrand(0x80); | ||||||
|  |   part(res, 1) = hrand(256); | ||||||
|  |   part(res, 2) = hrand(0x80) + 128; | ||||||
|  |   swap(part(res, 1), part(res, rand() % 2)); | ||||||
|  |   swap(part(res, 2), part(res, rand() % 3)); | ||||||
|  |   return res; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | color_t rainbow_color(ld sat, ld hue) { | ||||||
|  |   hue = frac(hue); | ||||||
|  |    | ||||||
|  |   if(hue < 0) hue++; | ||||||
|  |    | ||||||
|  |   hue *= 6; | ||||||
|  |    | ||||||
|  |   color_t res = 0; | ||||||
|  |    | ||||||
|  |   if(hue<1) res = gradient(0xFF0000, 0xFFFF00, 0, hue, 1); | ||||||
|  |   else if(hue<2) res = gradient(0x00FF00, 0xFFFF00, 2, hue, 1); | ||||||
|  |   else if(hue<3) res = gradient(0x00FF00, 0x00FFFF, 2, hue, 3); | ||||||
|  |   else if(hue<4) res = gradient(0x0000FF, 0x00FFFF, 4, hue, 3); | ||||||
|  |   else if(hue<5) res = gradient(0x0000FF, 0xFF00FF, 4, hue, 5); | ||||||
|  |   else if(hue<6) res = gradient(0xFF0000, 0xFF00FF, 6, hue, 5); | ||||||
|  |    | ||||||
|  |   return gradient(0xFFFFFF, res, 0, sat, 1); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | /** Adjust col to SDL_gfx functions. No adjustment is needed in SDL 1.2, but it is needed in SDL2 */ | ||||||
|  | EX color_t align(color_t col) { | ||||||
|  |   #if CAP_SDL2 | ||||||
|  |   swap(part(col, 0), part(col, 3)); | ||||||
|  |   swap(part(col, 1), part(col, 2)); | ||||||
|  |   #endif | ||||||
|  |   return col; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | #if HDR | ||||||
|  | enum class eNeon { none, neon, no_boundary, neon2, illustration}; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | EX eNeon neon_mode; | ||||||
|  | EX bool neon_nofill; | ||||||
|  |  | ||||||
|  | EX void apply_neon(color_t& col, int& r) { | ||||||
|  |   switch(neon_mode) { | ||||||
|  |     case eNeon::none:  | ||||||
|  |     case eNeon::illustration: | ||||||
|  |       break; | ||||||
|  |     case eNeon::neon:  | ||||||
|  |       poly_outline = col << 8; col = 0;  | ||||||
|  |       break;       | ||||||
|  |     case eNeon::no_boundary:  | ||||||
|  |       r = 0; | ||||||
|  |       break; | ||||||
|  |     case eNeon::neon2: | ||||||
|  |       poly_outline = col << 8; col &= 0xFEFEFE; col >>= 1;  | ||||||
|  |       break; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | /** used when neon_mode is eNeon::illustration */ | ||||||
|  | EX color_t magentize(color_t x) { | ||||||
|  |   if(neon_mode != eNeon::illustration) return x; | ||||||
|  |   int green = part(x,2); | ||||||
|  |   int magenta = (part(x, 1) + part(x, 3)) / 2; | ||||||
|  |   int nm = max(magenta, green); | ||||||
|  |   int gm = (magenta + green)/2; | ||||||
|  |   nm = (nm + 255) / 2; | ||||||
|  |   gm = gm / 2; | ||||||
|  |    | ||||||
|  |   return (nm * 0x1000100) | (gm * 0x10000) | (part(x, 0)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | EX color_t monochromatize(color_t x) { | ||||||
|  |   int c = part(x,2) + part(x,1) + part(x, 3); | ||||||
|  |   c ++; | ||||||
|  |   c /= 3; | ||||||
|  |   return c * 0x1010100 | (part(x, 0)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | /** colorblind mode */ | ||||||
|  | EX bool cblind; | ||||||
|  |  | ||||||
|  | /** apply neon_mode and cblind */ | ||||||
|  | EX void apply_neon_color(color_t col, color_t& pcolor, color_t& poutline, flagtype flags) { | ||||||
|  |   if(cblind) { | ||||||
|  |     // protanopia | ||||||
|  |     /* int r = (56 * part(col,3) + 43 * part(col,2)) / 100; | ||||||
|  |     int g = (58 * part(col,3) + 42 * part(col,2)) / 100; | ||||||
|  |     int b = (24 * part(col,2) + 75 * part(col,1)) / 100; */ | ||||||
|  |     // deuteranopia | ||||||
|  |     /* int r = (625 * part(col,3) + 375 * part(col,2)) / 1000; | ||||||
|  |     int g = (700 * part(col,3) + 300 * part(col,2)) / 1000; | ||||||
|  |     int b = (300 * part(col,2) + 700 * part(col,1)) / 1000;  | ||||||
|  |     part(col,3) = r; | ||||||
|  |     part(col,2) = g; | ||||||
|  |     part(col,1) = b; */ | ||||||
|  |     part(col,2) = part(col,3) = (part(col,2) * 2 + part(col,3) + 1)/3; | ||||||
|  |     } | ||||||
|  |   if(neon_mode == eNeon::none) { | ||||||
|  |     pcolor = (darkened(col >> 8) << 8) + (col & 0xFF); | ||||||
|  |     poutline = poly_outline; | ||||||
|  |     if(flags & POLY_TRIANGLES) poutline = 0; | ||||||
|  |     } | ||||||
|  |   else switch(neon_mode) { | ||||||
|  |     case eNeon::neon: | ||||||
|  |       pcolor = (poly_outline & 0xFFFFFF00) | (col & 0xFF); | ||||||
|  |       poutline = (darkened(col >> 8) << 8) | (col & 0xFF); | ||||||
|  |       if(col == 0xFF) poutline = 0xFFFFFFFF; | ||||||
|  |       if(neon_nofill && pcolor == 0xFF) pcolor = 0;  | ||||||
|  |       break; | ||||||
|  |     case eNeon::no_boundary: | ||||||
|  |       pcolor = (darkened(col >> 8) << 8) + (col & 0xFF); | ||||||
|  |       poutline = 0; | ||||||
|  |       break; | ||||||
|  |     case eNeon::neon2: | ||||||
|  |       pcolor = (darkened(col >> 8) << 8) + (col & 0xFF) + ((col & 0xFF) >> 2); | ||||||
|  |       poutline = (darkened(col >> 8) << 8) + (col & 0xFF); | ||||||
|  |       if(col == 0xFF) poutline = 0xFFFFFFFF; | ||||||
|  |       if(poly_outline != 0xFF) poutline = poly_outline; | ||||||
|  |       if(neon_nofill && pcolor == 0xFF) pcolor = 0;  | ||||||
|  |       break; | ||||||
|  |     case eNeon::illustration: { | ||||||
|  |       if(poly_outline && (poly_outline>>8) != bordcolor) { | ||||||
|  |         pcolor = magentize(col); | ||||||
|  |         poutline = 0xFF; | ||||||
|  |         } | ||||||
|  |       else { | ||||||
|  |         poutline = poly_outline; | ||||||
|  |         pcolor = monochromatize(col); | ||||||
|  |         } | ||||||
|  |       if(pcolor & 0xFF) pcolor |= 0xFF; | ||||||
|  |       if(poutline & 0xFF) poutline |= 0xFF; | ||||||
|  |       break; | ||||||
|  |       } | ||||||
|  |     case eNeon::none: ; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | /* color of various stuff */ | ||||||
|  |  | ||||||
|  | /** cloak color for the given table radius */ | ||||||
|  | EX int cloakcolor(int rtr) { | ||||||
|  |   rtr -= 28; | ||||||
|  |   rtr /= 2; | ||||||
|  |   rtr %= 10; | ||||||
|  |   if(rtr < 0) rtr += 10; | ||||||
|  |   // rtr = time(NULL) % 10; | ||||||
|  |   int cc[10] = { | ||||||
|  |     0x8080FF, 0x80FFFF, 0x80FF80, 0xFF8080, 0xFF80FF, 0xFFFF80,  | ||||||
|  |     0xFFFFC0, 0xFFD500, 0x421C52, 0 | ||||||
|  |     }; | ||||||
|  |   return cc[rtr]; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | EX int firegradient(double p) { | ||||||
|  |   return gradient(0xFFFF00, 0xFF0000, 0, p, 1); | ||||||
|  |   } | ||||||
|  |    | ||||||
|  | EX int firecolor(int phase IS(0), int mul IS(1)) { | ||||||
|  |   return gradient(0xFFFF00, 0xFF0000, -1, sintick(100*mul, phase/200./M_PI), 1); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | EX int watercolor(int phase) { | ||||||
|  |   return 0x0080C0FF + 256 * int(63 * sintick(50, phase/100./M_PI)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | EX int aircolor(int phase) { | ||||||
|  |   return 0x8080FF00 | int(32 + 32 * sintick(200, phase * 1. / cgi.S21)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | EX int fghostcolor(cell *c) { | ||||||
|  |   int phase = int(fractick(650, (int)(size_t)c) * 4000); | ||||||
|  |   if(phase < 1000)      return gradient(0xFFFF80, 0xA0C0FF,    0, phase, 1000); | ||||||
|  |   else if(phase < 2000) return gradient(0xA0C0FF, 0xFF80FF, 1000, phase, 2000); | ||||||
|  |   else if(phase < 3000) return gradient(0xFF80FF, 0xFF8080, 2000, phase, 3000); | ||||||
|  |   else if(phase < 4000) return gradient(0xFF8080, 0xFFFF80, 3000, phase, 4000); | ||||||
|  |   return 0xFFD500; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | EX int weakfirecolor(int phase) { | ||||||
|  |   return gradient(0xFF8000, 0xFF0000, -1, sintick(500, phase/1000./M_PI), 1); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
							
								
								
									
										126
									
								
								drawing.cpp
									
									
									
									
									
								
							
							
						
						
									
										126
									
								
								drawing.cpp
									
									
									
									
									
								
							| @@ -145,22 +145,6 @@ struct dqi_action : drawqueueitem { | |||||||
|   }; |   }; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /** \brief Return a reference to i-th component of col.  |  | ||||||
|  *  \arg i For colors with alpha, A=0, R=1, G=2, B=3. For colors without alpha, R=0, G=1, B=2. |  | ||||||
|  */ |  | ||||||
| EX unsigned char& part(color_t& col, int i) { |  | ||||||
|   unsigned char* c = (unsigned char*) &col; |  | ||||||
| #if ISMOBILE |  | ||||||
|   return c[i]; |  | ||||||
| #else |  | ||||||
| #if SDL_BYTEORDER == SDL_BIG_ENDIAN |  | ||||||
|   return c[sizeof(col) - 1 - i]; |  | ||||||
| #else |  | ||||||
|   return c[i]; |  | ||||||
| #endif |  | ||||||
| #endif |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| EX bool in_vr_sphere; | EX bool in_vr_sphere; | ||||||
| hyperpoint vr_sphere_center; | hyperpoint vr_sphere_center; | ||||||
|  |  | ||||||
| @@ -558,15 +542,6 @@ void addpoly(const shiftmatrix& V, const vector<glvertex> &tab, int ofs, int cnt | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| EX color_t align(color_t col) { |  | ||||||
|   #if CAP_SDL2 |  | ||||||
|   swap(part(col, 0), part(col, 3)); |  | ||||||
|   swap(part(col, 1), part(col, 2)); |  | ||||||
|   #endif |  | ||||||
|   return col; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #if CAP_SDLGFX | #if CAP_SDLGFX | ||||||
| void aapolylineColor(SDL_Renderer *s, int*x, int *y, int polyi, color_t col) { | void aapolylineColor(SDL_Renderer *s, int*x, int *y, int polyi, color_t col) { | ||||||
|   for(int i=1; i<polyi; i++) |   for(int i=1; i<polyi; i++) | ||||||
| @@ -2516,55 +2491,7 @@ template<class T, class... U> T& queuea(PPR prio, U... u) { | |||||||
|   } |   } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /** colorblind mode */ |  | ||||||
| EX bool cblind; |  | ||||||
|  |  | ||||||
| #if HDR |  | ||||||
| enum class eNeon { none, neon, no_boundary, neon2, illustration}; |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| EX eNeon neon_mode; |  | ||||||
| EX bool neon_nofill; |  | ||||||
|  |  | ||||||
| EX void apply_neon(color_t& col, int& r) { |  | ||||||
|   switch(neon_mode) { |  | ||||||
|     case eNeon::none:  |  | ||||||
|     case eNeon::illustration: |  | ||||||
|       break; |  | ||||||
|     case eNeon::neon:  |  | ||||||
|       poly_outline = col << 8; col = 0;  |  | ||||||
|       break;       |  | ||||||
|     case eNeon::no_boundary:  |  | ||||||
|       r = 0; |  | ||||||
|       break; |  | ||||||
|     case eNeon::neon2: |  | ||||||
|       poly_outline = col << 8; col &= 0xFEFEFE; col >>= 1;  |  | ||||||
|       break; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| #if CAP_SHAPES | #if CAP_SHAPES | ||||||
|  |  | ||||||
| /** used when neon_mode is eNeon::illustration */ |  | ||||||
| EX color_t magentize(color_t x) { |  | ||||||
|   if(neon_mode != eNeon::illustration) return x; |  | ||||||
|   int green = part(x,2); |  | ||||||
|   int magenta = (part(x, 1) + part(x, 3)) / 2; |  | ||||||
|   int nm = max(magenta, green); |  | ||||||
|   int gm = (magenta + green)/2; |  | ||||||
|   nm = (nm + 255) / 2; |  | ||||||
|   gm = gm / 2; |  | ||||||
|    |  | ||||||
|   return (nm * 0x1000100) | (gm * 0x10000) | (part(x, 0)); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| EX color_t monochromatize(color_t x) { |  | ||||||
|   int c = part(x,2) + part(x,1) + part(x, 3); |  | ||||||
|   c ++; |  | ||||||
|   c /= 3; |  | ||||||
|   return c * 0x1010100 | (part(x, 0)); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| EX dqi_poly& queuepolyat(const shiftmatrix& V, const hpcshape& h, color_t col, PPR prio) { | EX dqi_poly& queuepolyat(const shiftmatrix& V, const hpcshape& h, color_t col, PPR prio) { | ||||||
|   if(prio == PPR::DEFAULT) prio = h.prio; |   if(prio == PPR::DEFAULT) prio = h.prio; | ||||||
|  |  | ||||||
| @@ -2574,58 +2501,7 @@ EX dqi_poly& queuepolyat(const shiftmatrix& V, const hpcshape& h, color_t col, P | |||||||
|   ptd.offset = h.s; |   ptd.offset = h.s; | ||||||
|   ptd.cnt = h.e-h.s; |   ptd.cnt = h.e-h.s; | ||||||
|   ptd.tab = &cgi.ourshape; |   ptd.tab = &cgi.ourshape; | ||||||
|   if(cblind) { |   apply_neon_color(col, ptd.color, ptd.outline, h.flags); | ||||||
|     // protanopia |  | ||||||
|     /* int r = (56 * part(col,3) + 43 * part(col,2)) / 100; |  | ||||||
|     int g = (58 * part(col,3) + 42 * part(col,2)) / 100; |  | ||||||
|     int b = (24 * part(col,2) + 75 * part(col,1)) / 100; */ |  | ||||||
|     // deuteranopia |  | ||||||
|     /* int r = (625 * part(col,3) + 375 * part(col,2)) / 1000; |  | ||||||
|     int g = (700 * part(col,3) + 300 * part(col,2)) / 1000; |  | ||||||
|     int b = (300 * part(col,2) + 700 * part(col,1)) / 1000;  |  | ||||||
|     part(col,3) = r; |  | ||||||
|     part(col,2) = g; |  | ||||||
|     part(col,1) = b; */ |  | ||||||
|     part(col,2) = part(col,3) = (part(col,2) * 2 + part(col,3) + 1)/3; |  | ||||||
|     } |  | ||||||
|   if(neon_mode == eNeon::none) { |  | ||||||
|     ptd.color = (darkened(col >> 8) << 8) + (col & 0xFF); |  | ||||||
|     ptd.outline = poly_outline; |  | ||||||
|     if(h.flags & POLY_TRIANGLES) ptd.outline = 0; |  | ||||||
|     } |  | ||||||
|   else switch(neon_mode) { |  | ||||||
|     case eNeon::neon: |  | ||||||
|       ptd.color = (poly_outline & 0xFFFFFF00) | (col & 0xFF); |  | ||||||
|       ptd.outline = (darkened(col >> 8) << 8) | (col & 0xFF); |  | ||||||
|       if(col == 0xFF) ptd.outline = 0xFFFFFFFF; |  | ||||||
|       if(neon_nofill && ptd.color == 0xFF) ptd.color = 0;  |  | ||||||
|       break; |  | ||||||
|     case eNeon::no_boundary: |  | ||||||
|       ptd.color = (darkened(col >> 8) << 8) + (col & 0xFF); |  | ||||||
|       ptd.outline = 0; |  | ||||||
|       break; |  | ||||||
|     case eNeon::neon2: |  | ||||||
|       ptd.color = (darkened(col >> 8) << 8) + (col & 0xFF) + ((col & 0xFF) >> 2); |  | ||||||
|       ptd.outline = (darkened(col >> 8) << 8) + (col & 0xFF); |  | ||||||
|       if(col == 0xFF) ptd.outline = 0xFFFFFFFF; |  | ||||||
|       if(poly_outline != 0xFF) ptd.outline = poly_outline; |  | ||||||
|       if(neon_nofill && ptd.color == 0xFF) ptd.color = 0;  |  | ||||||
|       break; |  | ||||||
|     case eNeon::illustration: { |  | ||||||
|       if(poly_outline && (poly_outline>>8) != bordcolor) { |  | ||||||
|         ptd.color = magentize(col); |  | ||||||
|         ptd.outline = 0xFF; |  | ||||||
|         } |  | ||||||
|       else { |  | ||||||
|         ptd.outline = poly_outline; |  | ||||||
|         ptd.color = monochromatize(col); |  | ||||||
|         } |  | ||||||
|       if(ptd.color & 0xFF) ptd.color |= 0xFF; |  | ||||||
|       if(ptd.outline & 0xFF) ptd.outline |= 0xFF; |  | ||||||
|       break; |  | ||||||
|       } |  | ||||||
|     case eNeon::none: ; |  | ||||||
|     } |  | ||||||
|   ptd.linewidth = vid.linewidth; |   ptd.linewidth = vid.linewidth; | ||||||
|   ptd.flags = h.flags; |   ptd.flags = h.flags; | ||||||
|   ptd.tinf = h.tinf; |   ptd.tinf = h.tinf; | ||||||
|   | |||||||
							
								
								
									
										43
									
								
								graph.cpp
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								graph.cpp
									
									
									
									
									
								
							| @@ -122,49 +122,6 @@ ld spina(cell *c, int dir) { | |||||||
|   return 2 * M_PI * dir / c->type; |   return 2 * M_PI * dir / c->type; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| // cloak color  |  | ||||||
| EX int cloakcolor(int rtr) { |  | ||||||
|   rtr -= 28; |  | ||||||
|   rtr /= 2; |  | ||||||
|   rtr %= 10; |  | ||||||
|   if(rtr < 0) rtr += 10; |  | ||||||
|   // rtr = time(NULL) % 10; |  | ||||||
|   int cc[10] = { |  | ||||||
|     0x8080FF, 0x80FFFF, 0x80FF80, 0xFF8080, 0xFF80FF, 0xFFFF80,  |  | ||||||
|     0xFFFFC0, 0xFFD500, 0x421C52, 0 |  | ||||||
|     }; |  | ||||||
|   return cc[rtr]; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| int firegradient(double p) { |  | ||||||
|   return gradient(0xFFFF00, 0xFF0000, 0, p, 1); |  | ||||||
|   } |  | ||||||
|    |  | ||||||
| EX int firecolor(int phase IS(0), int mul IS(1)) { |  | ||||||
|   return gradient(0xFFFF00, 0xFF0000, -1, sintick(100*mul, phase/200./M_PI), 1); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| EX int watercolor(int phase) { |  | ||||||
|   return 0x0080C0FF + 256 * int(63 * sintick(50, phase/100./M_PI)); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| EX int aircolor(int phase) { |  | ||||||
|   return 0x8080FF00 | int(32 + 32 * sintick(200, phase * 1. / cgi.S21)); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| EX int fghostcolor(cell *c) { |  | ||||||
|   int phase = int(fractick(650, (int)(size_t)c) * 4000); |  | ||||||
|   if(phase < 1000)      return gradient(0xFFFF80, 0xA0C0FF,    0, phase, 1000); |  | ||||||
|   else if(phase < 2000) return gradient(0xA0C0FF, 0xFF80FF, 1000, phase, 2000); |  | ||||||
|   else if(phase < 3000) return gradient(0xFF80FF, 0xFF8080, 2000, phase, 3000); |  | ||||||
|   else if(phase < 4000) return gradient(0xFF8080, 0xFFFF80, 3000, phase, 4000); |  | ||||||
|   return 0xFFD500; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| EX int weakfirecolor(int phase) { |  | ||||||
|   return gradient(0xFF8000, 0xFF0000, -1, sintick(500, phase/1000./M_PI), 1); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| /** @brief used to alternate colors depending on distance to something. In chessboard-patterned geometries, also use a third step */ | /** @brief used to alternate colors depending on distance to something. In chessboard-patterned geometries, also use a third step */ | ||||||
|  |  | ||||||
| EX int flip_dark(int f, int a0, int a1) { | EX int flip_dark(int f, int a0, int a1) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Zeno Rogue
					Zeno Rogue