cleaned up invis_point -> point_behind and invalid_point(transmatrix), also implemented for Solv

This commit is contained in:
Zeno Rogue 2019-07-31 16:14:01 +02:00
parent 4a8ec3b3c4
commit 44b9968ff8
4 changed files with 38 additions and 39 deletions

View File

@ -1636,44 +1636,44 @@ void getcoord0(const hyperpoint& h, int& xc, int &yc, int &sc) {
// EYETODO sc = vid.eye * current_display->radius * hscr[2];
}
void queuechr(const hyperpoint& h, int size, char chr, color_t col, int frame) {
if(invalid_point(h)) return;
if(DIM == 3 && invis_point(h)) return;
int xc, yc, sc; getcoord0(h, xc, yc, sc);
queuechr(xc, yc, sc, size, chr, col, frame);
}
ld scale_in_pixels(const transmatrix& V) {
return scale_at(V) * cgi.scalefactor * current_display->radius / 2.5;
}
bool getcoord0_checked(const hyperpoint& h, int& xc, int &yc, int &zc) {
if(invalid_point(h)) return false;
if(point_behind(h)) return false;
getcoord0(h, xc, yc, zc);
return true;
}
void queuechr(const hyperpoint& h, int size, char chr, color_t col, int frame) {
int xc, yc, sc;
if(getcoord0_checked(h, xc, yc, sc))
queuechr(xc, yc, sc, size, chr, col, frame);
}
void queuechr(const transmatrix& V, double size, char chr, color_t col, int frame) {
if(invalid_point(V)) return;
if(DIM == 3 && invis_point(tC0(V))) return;
int xc, yc, sc; getcoord0(tC0(V), xc, yc, sc);
queuechr(xc, yc, sc, scale_in_pixels(V) * size, chr, col, frame);
int xc, yc, sc;
if(getcoord0_checked(tC0(V), xc, yc, sc))
queuechr(xc, yc, sc, scale_in_pixels(V) * size, chr, col, frame);
}
void queuestr(const hyperpoint& h, int size, const string& chr, color_t col, int frame) {
if(invalid_point(h)) return;
if(DIM == 3 && invis_point(h)) return;
int xc, yc, sc; getcoord0(h, xc, yc, sc);
queuestr(xc, yc, sc, size, chr, col, frame);
int xc, yc, sc;
if(getcoord0_checked(h, xc, yc, sc))
queuestr(xc, yc, sc, size, chr, col, frame);
}
void queuestr(const transmatrix& V, double size, const string& chr, color_t col, int frame, int align) {
if(invalid_point(V)) return;
if(DIM == 3 && invis_point(tC0(V))) return;
int xc, yc, sc; getcoord0(tC0(V), xc, yc, sc);
// int xs, ys, ss; getcoord0(V * xpush0(.01), xs, ys, ss);
queuestr(xc, yc, sc, scale_in_pixels(V) * size, chr, col, frame, align);
int xc, yc, sc;
if(getcoord0_checked(tC0(V), xc, yc, sc))
queuestr(xc, yc, sc, scale_in_pixels(V) * size, chr, col, frame, align);
}
void queuecircle(const transmatrix& V, double size, color_t col) {
if(invalid_point(V)) return;
if(DIM == 3 && invis_point(tC0(V))) return;
int xc, yc, sc; getcoord0(tC0(V), xc, yc, sc);
int xc, yc, sc;
if(!getcoord0_checked(tC0(V), xc, yc, sc)) return;
int xs, ys, ss; getcoord0(V * xpush0(.01), xs, ys, ss);
queuecircle(xc, yc, scale_in_pixels(V) * size, col);
}

View File

@ -4476,12 +4476,12 @@ void shmup_gravity_floor(cell *c) {
ld mousedist(transmatrix T) {
if(GDIM == 2) return intval(mouseh, tC0(T));
hyperpoint T1 = tC0(mscale(T, cgi.FLOOR));
if(mouseaim_sensitivity) return sqhypot_d(2, T1) + (invis_point(T1) ? 1e10 : 0);
if(mouseaim_sensitivity) return sqhypot_d(2, T1) + (point_behind(T1) ? 1e10 : 0);
hyperpoint h1;
applymodel(T1, h1);
using namespace hyperpoint_vec;
h1 = h1 - hpxy((mousex - current_display->xcenter) / current_display->radius, (mousey - current_display->ycenter) / current_display->radius);
return sqhypot_d(2, h1) + (invis_point(T1) ? 1e10 : 0);
return sqhypot_d(2, h1) + (point_behind(T1) ? 1e10 : 0);
}
vector<hyperpoint> clipping_planes;

View File

@ -5359,7 +5359,7 @@ extern int cells_drawn;
void menuitem_sightrange(char c = 'r');
bool invis_point(const hyperpoint h);
bool point_behind(const hyperpoint h);
bool invalid_point(const hyperpoint h);
bool invalid_point(const transmatrix T);
bool in_smart_range(const transmatrix& T);

View File

@ -879,8 +879,11 @@ transmatrix actualV(const heptspin& hs, const transmatrix& V) {
return (hs.spin || !BITRUNCATED) ? V * spin(hs.spin*2*M_PI/S7 + master_to_c7_angle()) : V;
}
bool invis_point(const hyperpoint h) {
if(DIM == 2 || sphere || pmodel != mdPerspective) return false;
bool point_behind(hyperpoint h) {
if(sphere) return false;
if(!in_perspective()) return false;
if(pmodel == mdSolPerspective) h = solv::inverse_exp(h, true);
if(solv::local_perspective_used()) h = solv::local_perspective * h;
return h[2] < 0;
}
@ -900,17 +903,13 @@ bool invalid_point(const hyperpoint h) {
return std::isnan(h[DIM]) || h[DIM] > 1e8 || std::isinf(h[DIM]);
}
bool invalid_point(const transmatrix T) {
return std::isnan(T[DIM][DIM]) || T[DIM][DIM] > 1e8 || std::isinf(T[DIM][DIM]);
}
bool in_smart_range(const transmatrix& T) {
if(invalid_point(T)) return false;
if(pmodel == mdSolPerspective) return solv::in_table_range(tC0(T));
hyperpoint h = tC0(T);
if(invalid_point(h)) return false;
if(pmodel == mdSolPerspective) return solv::in_table_range(h);
hyperpoint h1;
applymodel(tC0(T), h1);
for(int i=0; i<DIM; i++)
if(std::isnan(h1[i]) || std::isinf(h1[i])) return false;
applymodel(h, h1);
if(invalid_point(h1)) return false;
ld x = current_display->xcenter + current_display->radius * h1[0];
ld y = current_display->ycenter + current_display->radius * h1[1] * vid.stretch;