mirror of
				https://github.com/zenorogue/hyperrogue.git
				synced 2025-10-30 21:42:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			136 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // used in: https://twitter.com/ZenoRogue/status/1449021648137502721
 | |
| // other animations in this thread use the TES system (tessellations/sample/star-*.tes)
 | |
| // but hexagrams and horospheres are not supported in tes, so we do them manually
 | |
| // commandline: -canvas 0 -geo 44onh -PM 0 -horo63 -tstep 16 -noplayer -back ffffff
 | |
| // add to make a animation: -shot-1000 -animrot 1 90 -animvideo 300 name.mp4
 | |
| 
 | |
| #include "rogueviz.h"
 | |
| 
 | |
| namespace hr {
 | |
| 
 | |
| namespace horo63 {
 | |
| 
 | |
| map<pair<int, int>, color_t> mco;
 | |
| map<pair<int, int>, bool> sco;
 | |
| 
 | |
| bool draw_horo63(cell *c, const shiftmatrix& V) {
 | |
|   if(c != currentmap->gamestart()) return false;
 | |
|   
 | |
|   int mx = 30;
 | |
|   
 | |
|   for(int x=-mx; x<=mx; x++)
 | |
|   for(int y=-mx; y<=mx; y++) if(x*x+y*y <= mx*mx) {
 | |
|     array<hyperpoint, 6> c;
 | |
|     hyperpoint ctr;
 | |
|     for(int i=0; i<6; i++) {
 | |
|       hyperpoint h = spin(TAU*i/6) * point31(1,0,0);
 | |
|       h[0] += x;
 | |
|       h[0] += y/2.;
 | |
|       h[1] += sqrt(3)/2. * y;
 | |
|       //println(hlog, tie(x,i), h);
 | |
|       c[i] = parabolic13(h[0]*.5, h[1]*.5) * xpush0(-2);
 | |
|       ctr += c[i];
 | |
|       }
 | |
|     ctr = normalize(ctr);
 | |
|     color_t& col = mco[{y,x}];
 | |
|     if(col == 0) col = (hrand(0x1000000)<<8) | 0x808080FF; 
 | |
|     
 | |
|     for(int a=0; a<8; a++)
 | |
|     texture_order([&] (ld i, ld j) {
 | |
|       curvepoint(normalize(ctr*(1-j-i) + c[a]*i + c[(a+2)%6]*j));
 | |
|       });
 | |
|    
 | |
|     auto& cu = queuecurve(V, 0, col, PPR::WALL);
 | |
|     cu.flags |= POLY_TRIANGLES;
 | |
|     cu.tinf = &floor_texture_vertices[cgi.shStarFloor.id];
 | |
|     ensure_vertex_number(*cu.tinf, cu.cnt);
 | |
|     }
 | |
|   println(hlog, "drawn");
 | |
|   return false;
 | |
|   }
 | |
| 
 | |
| void enable63() { 
 | |
|   rogueviz::rv_hook(hooks_drawcell, 100, draw_horo63);
 | |
|   }
 | |
| 
 | |
| bool draw_horo44(cell *c, const shiftmatrix& V) {
 | |
|   if(c != currentmap->gamestart()) return false;
 | |
|   
 | |
|   int mx = 10;
 | |
|   
 | |
|   for(int x=-mx; x<=mx; x++)
 | |
|   for(int y=-mx; y<=mx; y++) if(x*x+y*y <= mx*mx) {
 | |
|     if(x < -4 || y < -4 || x > 3 || y > 3) continue;
 | |
|     array<hyperpoint, 8> c;
 | |
|     hyperpoint ctr;
 | |
|     array<double, 8> dx = {1, 3, 3, 1, -1, -3, -3, -1};
 | |
|     array<double, 8> dy = {3, 1, -1, -3, -3, -1, 1, 3};
 | |
|     for(int i=0; i<8; i++) {
 | |
|       ld ax = x + dx[i]/2. + .5;
 | |
|       ld ay = y + dy[i] / 2. + .5;
 | |
|       ax /= 2;
 | |
|       ay /= 2;
 | |
|       c[i] = parabolic13(ax, ay) * xpush0(-1);
 | |
|       ctr += c[i];
 | |
|       }
 | |
|     ctr = normalize(ctr);
 | |
|     color_t& col = mco[{y,x}];
 | |
|     
 | |
|     auto mod = [] () {
 | |
|       color_t col = 0;
 | |
|       for(int i=0; i<3; i++) part(col, i) = hrand(64);
 | |
|       return col << 8;
 | |
|       };
 | |
| 
 | |
|     bool& special = sco[{y,x}];
 | |
|     
 | |
|     if(col == 0) {
 | |
|      
 | |
|       if(x == 1 && y == 0)
 | |
|         col = 0x7F1010FF, special = true;
 | |
|       else if(x == -1 && y == 1)
 | |
|         col = 0x40FF40FF, special = true;
 | |
|       else if(x == -2 && y == -1)
 | |
|         col = 0x00007FFF, special = true;
 | |
|       else if(x == 0 && y == -2)
 | |
|         col = 0xFFD540FF, special = true;
 | |
|       else if((x+y)&1) {
 | |
|         col = mod() ^ 0xFF; 
 | |
|         // part(col, 1+hrand(3)) ^= 0x20;
 | |
|         }
 | |
|       else {
 | |
|         col = mod() ^ 0xFFFFFFFF;
 | |
|         // part(col, 1+hrand(3)) ^= 0x20;
 | |
|         }
 | |
|       }
 | |
|     
 | |
|     for(int a=0; a<8; a++)
 | |
|     texture_order([&] (ld i, ld j) {
 | |
|       curvepoint(normalize(ctr*(1-j-i) + c[a]*i + c[(a+2)%8]*j));
 | |
|       });
 | |
|    
 | |
|     if(false)
 | |
|     for(auto v1: c) 
 | |
|     for(auto v2: c) 
 | |
|     for(int i=0; i<5; i++)
 | |
|       hr::addaura(V*normalize(v1*i+v2*(4-i)), col >> 8, 0);
 | |
| 
 | |
|     auto& cu = queuecurve(V, 0, col, PPR::WALL);
 | |
|     cu.flags |= POLY_TRIANGLES;
 | |
|     cu.tinf = &floor_texture_vertices[cgi.shStarFloor.id];
 | |
|     ensure_vertex_number(*cu.tinf, cu.cnt);
 | |
|     }
 | |
|   return false;
 | |
|   }
 | |
| 
 | |
| void enable44() { 
 | |
|   rogueviz::rv_hook(hooks_drawcell, 100, draw_horo44);
 | |
|   }
 | |
| 
 | |
| auto frac_ah = arg::add3("-horo63", enable63) + arg::add3("-horo44", enable44);
 | |
| 
 | |
| }}
 | |
| 
 | |
| // 0 0
 | |
| // 1 2
 | 
