mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-12-20 15:40:26 +00:00
more accurate portal movement
This commit is contained in:
parent
8d0059a760
commit
0966d5e36c
@ -2904,13 +2904,8 @@ EX void shift_view(hyperpoint H) {
|
|||||||
if(callhandlers(false, hooks_shift_view, H)) return;
|
if(callhandlers(false, hooks_shift_view, H)) return;
|
||||||
static bool recursive = false;
|
static bool recursive = false;
|
||||||
if(!recursive && intra::in) {
|
if(!recursive && intra::in) {
|
||||||
H /= 10;
|
dynamicval<bool> r(recursive, true);
|
||||||
recursive = true;
|
intra::shift_view_portal(H);
|
||||||
for(int i=0; i<10; i++) {
|
|
||||||
shift_view(H);
|
|
||||||
intra::check_portal_movement();
|
|
||||||
}
|
|
||||||
recursive = false;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto oView = View;
|
auto oView = View;
|
||||||
|
26
intra.cpp
26
intra.cpp
@ -329,7 +329,25 @@ EX int full_wall_offset(cell *c) {
|
|||||||
return wo;
|
return wo;
|
||||||
}
|
}
|
||||||
|
|
||||||
EX void check_portal_movement() {
|
EX void shift_view_portal(hyperpoint H) {
|
||||||
|
shift_view(H);
|
||||||
|
if(!through_portal()) return;
|
||||||
|
shift_view(-H);
|
||||||
|
ld minv = 0, maxv = 1;
|
||||||
|
for(int i=0; i<30; i++) {
|
||||||
|
ld t = (minv + maxv) / 2;
|
||||||
|
shift_view(H * t);
|
||||||
|
bool b = through_portal();
|
||||||
|
if(b) maxv = t; else minv = t;
|
||||||
|
shift_view(H * -t);
|
||||||
|
}
|
||||||
|
println(hlog, "maxv = ", maxv);
|
||||||
|
shift_view(H * maxv);
|
||||||
|
check_portal_movement();
|
||||||
|
shift_view(H * (1 - maxv));
|
||||||
|
}
|
||||||
|
|
||||||
|
EX const connection_data* through_portal() {
|
||||||
transmatrix iView = view_inverse(View);
|
transmatrix iView = view_inverse(View);
|
||||||
ld dist = hdist0(iView * C0);
|
ld dist = hdist0(iView * C0);
|
||||||
int nei = -1;
|
int nei = -1;
|
||||||
@ -339,8 +357,12 @@ EX void check_portal_movement() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto cw1 = cellwalker(centerover, nei);
|
auto cw1 = cellwalker(centerover, nei);
|
||||||
|
return at_or_null(connections, cw1);
|
||||||
|
}
|
||||||
|
|
||||||
|
EX void check_portal_movement() {
|
||||||
|
auto p = through_portal();
|
||||||
ld c = camera_speed;
|
ld c = camera_speed;
|
||||||
auto p = at_or_null(connections, cw1);
|
|
||||||
if(p) {
|
if(p) {
|
||||||
ld eps = 1e-3;
|
ld eps = 1e-3;
|
||||||
c /= p->id1.scale;
|
c /= p->id1.scale;
|
||||||
|
Loading…
Reference in New Issue
Block a user