mirror of
				https://github.com/zenorogue/hyperrogue.git
				synced 2025-11-04 07:43:02 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			111 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "rogueviz.h"
 | 
						|
 | 
						|
namespace hr {
 | 
						|
 | 
						|
namespace recursive_house {
 | 
						|
 | 
						|
// log(2) / vid.plevel_factor == 1.78379
 | 
						|
// 0.38858115616745542
 | 
						|
 | 
						|
// commandline for Euclidean animation:
 | 
						|
// rogueviz -canvas 0 -geo beti -recursive-house -noplayer
 | 
						|
 | 
						|
// commandline for S2xE
 | 
						|
// rogueviz -geo 2 -7 -product -prodperiod 1 -canvas 0 -lands 6 -recursive-house -noplayer plevel_factor=0.38858*2
 | 
						|
 | 
						|
// (warning: it is quite slow)
 | 
						|
 | 
						|
bool draw_recursive_house_at(cell *c, const shiftmatrix& V) {
 | 
						|
  if(c != currentmap->gamestart()) return false;
 | 
						|
  for(int lv=-10; lv<=10; lv++) {
 | 
						|
    if(!euclid && lv) continue;
 | 
						|
    dynamicval<eGeometry> g(geometry, gCubeTiling);
 | 
						|
    check_cgi();
 | 
						|
    cgi.require_shapes();
 | 
						|
 | 
						|
    auto cube = [&] (ld x, ld y, ld z, color_t wal, ld s = 1) {
 | 
						|
      for(int i=0; i<6; i++) {
 | 
						|
        auto& p = cgi.shWall3D[i];
 | 
						|
        for(int j=p.s; j<p.e; j++) {
 | 
						|
          hyperpoint h = cgi.hpc[j];
 | 
						|
          h[0] *= s;
 | 
						|
          h[1] *= s;
 | 
						|
          h[2] *= s;
 | 
						|
          h[0] += x-3.5;
 | 
						|
          h[1] += y-3.5;
 | 
						|
          h[2] += z-3.5;
 | 
						|
          h *= exp(lv * log(4));
 | 
						|
          h[3] = 1;
 | 
						|
          curvepoint(h);
 | 
						|
          }
 | 
						|
        auto& c = queuecurve(V, 0, wal, PPR::WALL);
 | 
						|
        c.flags |= POLY_TRIANGLES;
 | 
						|
        c.tinf = &floor_texture_vertices[cgi.shStarFloor.id];
 | 
						|
        ensure_vertex_number(*c.tinf, c.cnt);
 | 
						|
        c.offset_texture = p.texture_offset;
 | 
						|
        }
 | 
						|
      };
 | 
						|
    
 | 
						|
    for(int x=0; x<=7; x++)
 | 
						|
    for(int y=0; y<=7; y++)
 | 
						|
      cube(x, y, 0, 0x103010FF);
 | 
						|
 | 
						|
    for(int z=1; z<=2; z++)
 | 
						|
      cube(3.5, 3.5, z, 0xC0C0C0FF);
 | 
						|
      
 | 
						|
    cube(5, 1, 1, 0x202080FF);
 | 
						|
    cube(5, 1, 2, 0x202060FF);
 | 
						|
    cube(5, 1, 2.75, 0x202080FF, 0.5);
 | 
						|
    cube(5, 1, 3.5, 0xC0C020FF);
 | 
						|
 | 
						|
    cube(2, 6, 1, 0x802080FF);
 | 
						|
    cube(2, 6, 2, 0x602060FF);
 | 
						|
    cube(2, 6, 2.75, 0x802080FF, 0.5);
 | 
						|
    cube(2, 6, 3.5, 0xC0C020FF);
 | 
						|
 | 
						|
    for(int x: {0, 7}) for(int y: {0, 7}) 
 | 
						|
      for(int z=1; z<=5; z++)
 | 
						|
        cube(x, y, z, 0xFFD500FF);
 | 
						|
 | 
						|
    for(int x=0; x<=7; x++)
 | 
						|
    for(int y=0; y<=7; y++)
 | 
						|
      cube(x, y, 6 + min(min(x,7-x), min(y, 7-y)), 0x703030FF);
 | 
						|
      
 | 
						|
    }
 | 
						|
  check_cgi();
 | 
						|
 | 
						|
  return false;
 | 
						|
  }
 | 
						|
 | 
						|
void enable() { 
 | 
						|
  rogueviz::rv_hook(hooks_drawcell, 100, draw_recursive_house_at);
 | 
						|
 | 
						|
  if(geometry == gCubeTiling)
 | 
						|
    rogueviz::rv_hook(anims::hooks_anim, 100, [] { 
 | 
						|
  
 | 
						|
      ld t = ticks * 1. / anims::period;
 | 
						|
      t = frac(t);
 | 
						|
      
 | 
						|
      hyperpoint at = point31(1, 0.5, 0.3);
 | 
						|
      hyperpoint fwd = point31(0, 0, 0);
 | 
						|
      hyperpoint up = point31(1, 0.5, 1);
 | 
						|
      
 | 
						|
      for(auto p: {&at, &fwd, &up})
 | 
						|
      for(int i: {0,1,2})
 | 
						|
        (*p)[i] *= exp(-t * log(4));
 | 
						|
        
 | 
						|
      set_view(at, fwd, up);
 | 
						|
      
 | 
						|
      sightranges[geometry] = exp(-t * log(4)) * 200;
 | 
						|
      vid.cells_drawn_limit = 50;
 | 
						|
      
 | 
						|
      centerover = currentmap->gamestart();
 | 
						|
      
 | 
						|
      anims::moved();
 | 
						|
      });        
 | 
						|
  }
 | 
						|
 | 
						|
auto house_hook = arg::add3("-recursive-house", enable);
 | 
						|
 | 
						|
}}
 |