mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-02-02 12:19:18 +00:00
added a noniso honeycomb viz to the presentation, and noniso slides are now in a common folder
This commit is contained in:
parent
b0d34adf32
commit
38a5b4d1f8
@ -4091,3 +4091,8 @@ Geometries:
|
||||
2020-08-05 01:29 Update 11.3w:
|
||||
- fixed shmup in elliptic
|
||||
- fixed a crash with loading old save games
|
||||
|
||||
2020-08-08 16:10 Update 11.3x:
|
||||
- fixed raycaster in twisted geometries; weirdly twisted spherical geometry
|
||||
- draw crosshair even if nohud
|
||||
- an attempt to fix/debug the crash that some people are reporting on loading a saved game
|
||||
|
4
hyper.h
4
hyper.h
@ -13,8 +13,8 @@
|
||||
#define _HYPER_H_
|
||||
|
||||
// version numbers
|
||||
#define VER "11.3w"
|
||||
#define VERNUM_HEX 0xA837
|
||||
#define VER "11.3x"
|
||||
#define VERNUM_HEX 0xA838
|
||||
|
||||
#include "sysconfig.h"
|
||||
|
||||
|
@ -293,7 +293,7 @@ auto hchook = addHook(hooks_drawcell, 100, draw_ptriangle)
|
||||
+ addHook(rvtour::hooks_build_rvtour, 152, [] (vector<tour::slide>& v) {
|
||||
using namespace tour;
|
||||
v.push_back(
|
||||
tour::slide{"Impossible architecture in Nil/impossible ring", 18, LEGAL::NONE | QUICKGEO,
|
||||
tour::slide{"non-isotropic geometries/Impossible architecture in Nil/impossible ring", 18, LEGAL::NONE | QUICKGEO,
|
||||
"Ring with a square cross-section. Cut it in half. Rotate one of the two halves by 90°, "
|
||||
"keeping one of the two ends connected to the other half. Do this in Nil geometry, so the other pair of ends remains connected too.\n\n"
|
||||
"Move with mouse/arrows/PgUpDn. Press '5' to enable animation, 'o' to change ring size.\n\n",
|
||||
|
151
rogueviz/noniso-honeycombs.cpp
Normal file
151
rogueviz/noniso-honeycombs.cpp
Normal file
@ -0,0 +1,151 @@
|
||||
#include "rogueviz.h"
|
||||
|
||||
namespace rogueviz {
|
||||
|
||||
namespace honey {
|
||||
|
||||
bool alone = true;
|
||||
|
||||
bool in_special = false;
|
||||
|
||||
auto geoslide(eGeometry g, char canvas, int jhole, int jblock) {
|
||||
using namespace tour;
|
||||
return [=] (presmode mode) {
|
||||
if(mode == pmStart) {
|
||||
tour::slide_backup(mapeditor::drawplayer, false);
|
||||
tour::slide_backup(smooth_scrolling, true);
|
||||
stop_game();
|
||||
set_geometry(g);
|
||||
if(g == gSphere) {
|
||||
set_geometry(gProduct);
|
||||
}
|
||||
if(g == gNormal) {
|
||||
set_geometry(gRotSpace);
|
||||
}
|
||||
tour::slide_backup<ld>(sightranges[gProduct], 12);
|
||||
tour::slide_backup<ld>(sightranges[gNil], 7);
|
||||
tour::slide_backup<ld>(sightranges[gSol], 7);
|
||||
tour::slide_backup<ld>(sightranges[gSpace435], 7);
|
||||
vid.texture_step = 4;
|
||||
firstland = specialland = laCanvas;
|
||||
tour::slide_backup(patterns::jhole, jhole);
|
||||
tour::slide_backup(patterns::rwalls, jhole);
|
||||
tour::slide_backup(patterns::jblock, jblock);
|
||||
tour::slide_backup(patterns::whichCanvas, canvas);
|
||||
tour::slide_backup(vid.linewidth, vid.linewidth / 10);
|
||||
start_game();
|
||||
if(jblock < 0) {
|
||||
pmodel = mdDisk;
|
||||
sightranges[gSol] = 4;
|
||||
}
|
||||
}
|
||||
if(mode == pmStop && jblock < 0)
|
||||
pmodel = mdGeodesic;
|
||||
slidecommand = "switch raycaster";
|
||||
|
||||
if(in_special && among(mode, pmGeometrySpecial, pmStop)) {
|
||||
in_special = false;
|
||||
gamestack::pop();
|
||||
patterns::whichCanvas = canvas;
|
||||
vid.grid = false;
|
||||
fat_edges = false;
|
||||
sightranges[gSpace435] = 7;
|
||||
}
|
||||
|
||||
else if(mode == pmGeometrySpecial && !in_special) {
|
||||
in_special = true;
|
||||
gamestack::push();
|
||||
patterns::whichCanvas = 'g';
|
||||
vid.grid = true;
|
||||
stdgridcolor = 0xFFFF00FF;
|
||||
fat_edges = true;
|
||||
start_game();
|
||||
sightranges[gSpace435] = 3;
|
||||
}
|
||||
|
||||
if(mode == pmKey && jblock < 0) {
|
||||
sightranges[gSol] = 11 - sightranges[gSol];
|
||||
addMessage("Changed the sight range to ", sightranges[gSol]);
|
||||
}
|
||||
else if(mode == pmKey) {
|
||||
if(sl2) {
|
||||
addMessage("Raycaster not implemented here.");
|
||||
}
|
||||
else if(ray::want_use != 2) {
|
||||
ray::want_use = 2;
|
||||
ray::max_cells = 4096;
|
||||
addMessage("Using a raycaster.");
|
||||
}
|
||||
else {
|
||||
ray::want_use = 0;
|
||||
addMessage("Using primitives.");
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
string cap = "non-isotropic geometries/honeycombs/";
|
||||
|
||||
void honey(vector<tour::slide>& v) {
|
||||
using namespace tour;
|
||||
|
||||
v.emplace_back(
|
||||
slide{cap+"Tessellations in 3D geometries", 999, LEGAL::NONE | QUICKSKIP,
|
||||
"This series of slides presents the honeycombs we use. "
|
||||
"You can compare the output of primitive-based and raycaster-based rendering by pressing '5'.",
|
||||
[] (presmode mode) {}
|
||||
});
|
||||
|
||||
v.emplace_back(
|
||||
slide{cap+"Hyperbolic space", 999, LEGAL::SPECIAL,
|
||||
"Traditional visualizations of non-Euclidean honeycombs "
|
||||
"show the edges of all cells. In our visualizations, we fill some of the cells. "
|
||||
"The disadvantage of the traditional visualization is visible here, on the example of {4,3,5} hyperbolic honeycomb: "
|
||||
"our Euclidean brains tend to interpret this visualization incorrectly. (Press '2' to get the traditional visualization.)",
|
||||
geoslide(gSpace435, 'r', 50, 0)
|
||||
});
|
||||
v.emplace_back(
|
||||
slide{cap+"S2xE", 999, LEGAL::NONE,
|
||||
"This is the S2xE geometry.",
|
||||
geoslide(gSphere, 'r', 10, 0)
|
||||
});
|
||||
v.emplace_back(
|
||||
slide{cap+"Solv: random", 999, LEGAL::NONE,
|
||||
"Random blocks in Solv geometry.",
|
||||
geoslide(gSol, 'r', 20, 0)
|
||||
});
|
||||
v.emplace_back(
|
||||
slide{cap+"Solv: Poincaré ball", 999, LEGAL::NONE,
|
||||
"Surfaces of constant 'z' in Solv geometry, displayed in Poincaré ball-like model. "
|
||||
"Press '5' to change the sight range (this slide is not optimized, so it will be slow).",
|
||||
geoslide(gSol, 'j', 0, -1)
|
||||
});
|
||||
v.emplace_back(
|
||||
slide{cap+"Solv: horotori", 999, LEGAL::NONE,
|
||||
"Solv geometry. Colored torus-like surfaces are surfaces of constant 'z'. "
|
||||
"Press '5' to enable the raycaster",
|
||||
geoslide(gSol, 'j', 50, 0)
|
||||
});
|
||||
v.emplace_back(
|
||||
slide{cap+"Solv: difficult region", 999, LEGAL::NONE,
|
||||
"This slide focuses on the area in Solv geometry which is difficult to render using primitives. "
|
||||
"Press '5' to enable the raycaster.",
|
||||
geoslide(gSol, 'J', 0, 10)
|
||||
});
|
||||
v.emplace_back(
|
||||
slide{cap+"Nil geometry", 999, LEGAL::NONE,
|
||||
"Nil geometry. Colored surfaces are surfaces of constant 'x'. "
|
||||
"Press '5' to enable the raycaster",
|
||||
geoslide(gNil, 'j', 10, 10)
|
||||
});
|
||||
v.emplace_back(
|
||||
slide{cap+"SL(2,R) geometry", 999, LEGAL::NONE,
|
||||
"SL(2,R) geometry.",
|
||||
geoslide(gNormal, 'G', 90, 0)
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
auto hooks = addHook(rvtour::hooks_build_rvtour, 147, honey);
|
||||
|
||||
} }
|
@ -24,3 +24,4 @@
|
||||
#include "impossible-ring.cpp"
|
||||
#include "triangle.cpp"
|
||||
#include "sumotron.cpp"
|
||||
#include "noniso-honeycombs.cpp"
|
||||
|
@ -140,7 +140,7 @@ bool draw_snow(cell *c, const shiftmatrix& V) {
|
||||
|
||||
bool cylanim = false;
|
||||
|
||||
string cap = "non-Euclidean snowballs/";
|
||||
string cap = "non-isotropic geometries/non-Euclidean snowballs/";
|
||||
|
||||
void snow_slide(vector<tour::slide>& v, string title, string desc, reaction_t t) {
|
||||
using namespace tour;
|
||||
|
@ -524,6 +524,7 @@ void slide_itri(tour::presmode mode, int id) {
|
||||
}
|
||||
}
|
||||
|
||||
string cap = "non-isotropic geometries/Impossible architecture in Nil/";
|
||||
|
||||
auto hchook = addHook(hooks_drawcell, 100, draw_ptriangle)
|
||||
|
||||
@ -546,12 +547,11 @@ auto hchook = addHook(hooks_drawcell, 100, draw_ptriangle)
|
||||
return 0;
|
||||
})
|
||||
|
||||
|
||||
+ addHook(rvtour::hooks_build_rvtour, 151, [] (vector<tour::slide>& v) {
|
||||
using namespace tour;
|
||||
|
||||
v.push_back(
|
||||
tour::slide{"Impossible architecture in Nil/impossible triangle", 18, LEGAL::NONE | QUICKGEO,
|
||||
tour::slide{cap+"impossible triangle", 18, LEGAL::NONE | QUICKGEO,
|
||||
"This form of impossible triangle was first created by Oscar Reutersvärd. "
|
||||
"It was later independently discovered by Lionel Penrose and Roger Penrose, and popularized by M. C. Escher.\n\n"
|
||||
"Move with mouse/arrows/PgUpDn. Press '5' to enable animation, 'o' to change ring size.",
|
||||
@ -562,7 +562,7 @@ auto hchook = addHook(hooks_drawcell, 100, draw_ptriangle)
|
||||
}});
|
||||
|
||||
v.push_back(
|
||||
tour::slide{"Impossible architecture in Nil/impossible triangle chainmail", 18, LEGAL::NONE | QUICKGEO,
|
||||
tour::slide{cap+"impossible triangle chainmail", 18, LEGAL::NONE | QUICKGEO,
|
||||
"Here we try to link the impossible triangles into a construction reminiscent of a chainmail.",
|
||||
|
||||
[] (presmode mode) {
|
||||
@ -571,7 +571,7 @@ auto hchook = addHook(hooks_drawcell, 100, draw_ptriangle)
|
||||
}});
|
||||
|
||||
v.push_back(
|
||||
tour::slide{"Impossible architecture in Nil/impossible triangle network", 18, LEGAL::NONE | QUICKGEO,
|
||||
tour::slide{cap+"impossible triangle network", 18, LEGAL::NONE | QUICKGEO,
|
||||
"It is not possible to reconstruct Escher's Waterfall in Nil geometry, because one of the three triangles there "
|
||||
"has opposite orientation. For this reason, that one triangle would not connect correctly. Penrose triangles "
|
||||
"in Nil would not create a planar structure, but rather a three-dimensional one. This slide shows the picture. "
|
||||
|
Loading…
Reference in New Issue
Block a user