From 13f3f49db9d8403e91de274018019fd6c47d67e8 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Fri, 10 May 2019 01:03:53 +0200 Subject: [PATCH] 2d3d:: fixed the placement of monsters (including PC view) on rock levels etc. --- graph.cpp | 16 ++++++++++------ hypgraph.cpp | 15 +++++++++------ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/graph.cpp b/graph.cpp index c472824a..f7a22012 100644 --- a/graph.cpp +++ b/graph.cpp @@ -4470,11 +4470,12 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) { transmatrix Vd0, Vboat0; const transmatrix *Vdp = - (!wmspatial) ? &V : - sl ? &(Vd0= mscale(V, geom3::SLEV[sl])) : - highwall(c) ? &(Vd0= mscale(V, (1+geom3::WALL)/2)) : + WDIM == 3 ? &V: + !wmspatial ? &V : + sl ? &(Vd0= mscale(V, geom3::SLEV[sl] - geom3::FLOOR)) : + (highwall(c) && GDIM == 2) ? &(Vd0= mscale(V, (1+geom3::WALL)/2)) : #if CAP_SHAPES - (chasmg==1) ? &(Vd0 = mscale(V, geom3::LAKE)) : + (chasmg==1) ? &(Vd0 = mscale(V, geom3::LAKE - geom3::FLOOR)) : #endif &V; @@ -5502,9 +5503,12 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) { #endif error |= drawMonster(V, ctype, c, moncol); #if CAP_SHAPES - if(Vboat != &V && Vboat != &Vboat0 && q != isize(ptds)) - pushdown(c, q, V, -geom3::factor_to_lev(zlevel(tC0((*Vboat)))), + if(Vboat != &V && Vboat != &Vboat0 && q != isize(ptds)) { + if(WDIM == 2) + pushdown(c, q, V, geom3::SLEV[sl] - geom3::FLOOR, false, false); + else pushdown(c, q, V, -geom3::factor_to_lev(zlevel(tC0((*Vboat)))), !isMultitile(c->monst), false); + } #endif } diff --git a/hypgraph.cpp b/hypgraph.cpp index 2091c657..3b5aa742 100644 --- a/hypgraph.cpp +++ b/hypgraph.cpp @@ -1094,11 +1094,11 @@ void centerpc(ld aspd) { if(shmup::on && vid.sspeed > -5 && DIM == 3) { int id = subscreens::in ? subscreens::current_player : 0; viewctr = shmup::pc[id]->base->master; - transmatrix& T = shmup::pc[id]->at; - if(WDIM == 2) - View = inverse(master_relative(shmup::pc[id]->base) * T); - else - View = inverse(T); + transmatrix T = shmup::pc[id]->at; + if(WDIM == 2) T = master_relative(shmup::pc[id]->base) * T; + int sl = snakelevel(cwt.at); + if(sl) T = T * zpush(geom3::SLEV[sl] - geom3::FLOOR); + View = inverse(T); if(vid.yshift) View = cpush(2, wall_radar(viewctr.at->c7, T)) * View; if(WDIM == 2) View = cspin(0, 1, M_PI) * cspin(2, 1, M_PI/2 + shmup::playerturny[id]) * spin(-M_PI/2) * View; @@ -1121,7 +1121,10 @@ void centerpc(ld aspd) { ors::unrotate(cwtV); ors::unrotate(View); - hyperpoint H = inverse(actual_view_transform) * tC0(cwtV); + transmatrix T = cwtV; + int sl = snakelevel(cwt.at); + if(sl) T = T * zpush(geom3::SLEV[sl] - geom3::FLOOR); + hyperpoint H = inverse(actual_view_transform) * tC0(T); ld R = zero_d(DIM, H) ? 0 : hdist0(H); if(R < 1e-9) { // either already centered or direction unknown