From 134bae6bc95c2a44df79fa248b731a1769ba8bca Mon Sep 17 00:00:00 2001 From: flowtron Date: Sun, 11 Jul 2021 11:49:20 +0200 Subject: [PATCH] edithideentmask hud improved --- source/src/clientgame.cpp | 2 +- source/src/editing.cpp | 70 ++++++++++++++++++++++++--------------- source/src/entities.cpp | 30 ++++++++++++++--- source/src/protos.h | 4 ++- source/src/renderhud.cpp | 9 ++--- 5 files changed, 79 insertions(+), 36 deletions(-) diff --git a/source/src/clientgame.cpp b/source/src/clientgame.cpp index f339adff..819cc1a4 100644 --- a/source/src/clientgame.cpp +++ b/source/src/clientgame.cpp @@ -1167,7 +1167,7 @@ void startmap(const char *name, bool reset, bool norespawn) // called just aft lasthit = 0; if(m_valid(gamemode) && !m_mp(gamemode)) respawnself(); else findplayerstart(player1); - editingsettingsshowminimal = true; + editingsettingsshowminimal = true; // 1st edittoggle shows edithideentmask(!=0); turned off health pickups last session 2 months ago? now you remember! if(!reset) return; diff --git a/source/src/editing.cpp b/source/src/editing.cpp index 46fce26c..3f077ac3 100644 --- a/source/src/editing.cpp +++ b/source/src/editing.cpp @@ -33,11 +33,12 @@ COMMANDF(editmeta, "d", (bool on) { editmetakeydown = on ? 1 : 0; } ); VAR(cleanedit, 0, 0, 1); // hides everything in edit mode you can't see in regular mode COMMANDF(togglecleanedit, "", () { cleanedit = !cleanedit; }); -bool editingsettingsshowminimal = false; +bool editingsettingsshowminimal = false; // minimal reminder you have bits set in edithideentmask int keepshowingeditingsettingsfrom = 0; int keepshowingeditingsettingstill = 0; -VARFP(editingsettingsvisibletime, 750, 7500, 75000, toucheditingsettings()); -VARFP(showeditingsettings, 0, 1, 3, toucheditingsettings()); // 0:almost entirely off, 1: all off after duration, 2: text off after duration, 3: permanent + +VARFP(editingsettingsvisibletime, 750, 7500, 75000, toucheditingsettings(true); ); // begin anew after any changes +VARFP(showeditingsettings, 0, 1, 3, { if(showeditingsettings){ toucheditingsettings(true); }else{ keepshowingeditingsettingsfrom = keepshowingeditingsettingstill = 0; }}); // 0:almost entirely off, 1: all off after duration, 2: text off after duration, 3: permanent void toggleedit(bool force) { @@ -61,8 +62,7 @@ void toggleedit(bool force) else { player1->attacking = false; - if(keepshowingeditingsettingsfrom==0) keepshowingeditingsettingsfrom = lastmillis; - keepshowingeditingsettingstill = lastmillis + editingsettingsvisibletime; + toucheditingsettings(true); } keyrepeat(editmode, KR_EDITMODE); editing = editmode ? 1 : 0; @@ -838,14 +838,15 @@ static struct partcolour{ float r, g, b; } partcolours[MAXENTTYPES] = void rendereditingsettings() { - if(showeditingsettings > 0 || (edithideentmask != 0 && editingsettingsshowminimal)) + if(!conopen && (showeditingsettings > 0 || (edithideentmask != 0 && editingsettingsshowminimal))) { bool showing = ((showeditingsettings >= 2) || (keepshowingeditingsettingstill > 0)); int deltax = 0; if(keepshowingeditingsettingstill > 0) { - int deltat = keepshowingeditingsettingstill - lastmillis; - if(deltat < 0) + int deltat_a = keepshowingeditingsettingstill - lastmillis; + int deltat_b = lastmillis - keepshowingeditingsettingsfrom; + if(deltat_a < 0) { keepshowingeditingsettingstill = 0; keepshowingeditingsettingsfrom = 0; @@ -853,15 +854,12 @@ void rendereditingsettings() showing = (showeditingsettings >= 2); }else{ int pulldist = VIRTW/4; - float edgedist = 0.2f; - deltat = deltat > keepshowingeditingsettingstill/2 ? deltat : ( lastmillis - keepshowingeditingsettingsfrom ); // "from" is only set once per slide, "till" may be pushed outward … - // … if someone takes a long(>(1-edgedist)) time to trigger the push it out some more .. there'll be a jump in the sliding. can't be helped. - float elapsedfrac = deltat/(1.0f * editingsettingsvisibletime); - bool slideout = elapsedfrac(1-edgedist); + int showfrac = editingsettingsvisibletime / 5; + bool slidein = (deltat_a <= showfrac); + bool slideout = (deltat_b <= showfrac); if(slidein||slideout) { - deltax = (slideout?pulldist:0) + (slideout?-1:+1) * (elapsedfrac-(slidein?(1-edgedist):0))/edgedist * pulldist; + deltax = (showfrac - (slidein ? deltat_a : deltat_b))/(1.0f * showfrac) * pulldist; } } } @@ -870,42 +868,62 @@ void rendereditingsettings() glDepthMask(GL_FALSE); glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); - int boxsize = VIRTW/32, boxline = 3*boxsize/2, x = FONTH/2 - (showeditingsettings==1?deltax:0), y = 3 * VIRTH/8, x2 = x + boxsize, border = 2; + int boxsize = VIRTW/32, boxline = 3*boxsize/2; + int border = 2; + int x1 = FONTH/2 - (showeditingsettings == 1 ? deltax : 0), y1 = 3 * VIRTH/8, x2 = x1 + boxsize; float prevlinew; glGetFloatv(GL_LINE_WIDTH, &prevlinew); glLineWidth(border); loopi(MAXENTTYPES) { if(i>NOTUSED && i<=DUMMYENT) { - y = 3 * VIRTH/8 + (i-1) * boxline; - int y2 = y + boxsize; + y1 = 3 * VIRTH/8 + (i-1) * boxline; + int y2 = y1 + boxsize; bool ishidden = (edithideentmask & (1 << (i - 1))); - // text first makes it slide in/out behind the boxes + // render text first – makes it slide in/out behind the boxes if(showeditingsettings==3||keepshowingeditingsettingsfrom) // 3:all,always || ( 2:text,at first, 1:all,at first ) { glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); defformatstring(entlabel)("\f%d%s", ishidden?4:5, entnames[i]); - draw_text(entlabel, x + boxline -(showeditingsettings==2?deltax:0), y ); + draw_text(entlabel, x1 + boxline -(showeditingsettings == 2 ? deltax : 0), y1 ); glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); } // now the box partcolour &pc = partcolours[i]; glColor3f(pc.r, pc.g, pc.b); glBegin(GL_TRIANGLE_STRIP); - glVertex2f(x , y ); - glVertex2f(x2, y ); - glVertex2f(x , y2); - glVertex2f(x2, y2); + glVertex2d(x1, y1); + glVertex2d(x2, y1); + glVertex2d(x1, y2); + glVertex2d(x2, y2); glEnd(); // and the border - box2d(x-border, y-border, x2+border, y2+border, ishidden?0:200); + box2d(x1-border, y1-border, x2+border, y2+border, ishidden?0:200); + // crossed-out like in menu + if(ishidden){ + glColor3d(0,0,0); + glBegin(GL_LINES); + glVertex2d(x1, y1); + glVertex2d(x2, y2); + glVertex2d(x1, y2); + glVertex2d(x2, y1); + glEnd(); + } } } glLineWidth(prevlinew); glEnable(GL_TEXTURE_2D); glDepthMask(GL_TRUE); } + glEnable(GL_BLEND); + } + else + { + if(conopen && edithideentmask != 0 && editingsettingsshowminimal){ + conoutf("\f3NOTICE\f4: you have \f1edithideentmask\f4 = \f2%d", edithideentmask); + editingsettingsshowminimal = false; + } + } - glEnable(GL_BLEND); } void edittexxy(int type, int t, block &sel) diff --git a/source/src/entities.cpp b/source/src/entities.cpp index 432474fe..35edd212 100644 --- a/source/src/entities.cpp +++ b/source/src/entities.cpp @@ -6,11 +6,33 @@ VARP(showclips, 0, 1, 1); VARP(showmodelclipping, 0, 0, 1); VARP(showladderentities, 0, 0, 1); VARP(showplayerstarts, 0, 0, 1); -void toucheditingsettings(){ - if(keepshowingeditingsettingsfrom == 0) keepshowingeditingsettingsfrom = lastmillis; - keepshowingeditingsettingstill = lastmillis + editingsettingsvisibletime; + +void toucheditingsettings(bool forcerestart){ + if(keepshowingeditingsettingsfrom == 0 || forcerestart) + { + keepshowingeditingsettingsfrom = lastmillis; + keepshowingeditingsettingstill = lastmillis + editingsettingsvisibletime; + } + else + { + int deltat_a = keepshowingeditingsettingstill - lastmillis; + int deltat_b = lastmillis - keepshowingeditingsettingsfrom; + int showfrac = editingsettingsvisibletime / 5; + if( deltat_b >= showfrac )// we ignore quick-changes inside the slide-in period + { + if( deltat_a <= showfrac )// changes in the slide-out period take that slide back and stay for almost the entire visibletime longer + { + keepshowingeditingsettingsfrom = lastmillis - deltat_a; + } + else // a touch during the regular showing duration + { + keepshowingeditingsettingsfrom = lastmillis - showfrac; + } + keepshowingeditingsettingstill = keepshowingeditingsettingsfrom + editingsettingsvisibletime; + } + } } -VARFP(edithideentmask, 0, 0, INT_MAX, toucheditingsettings()); +VARFP(edithideentmask, 0, 0, INT_MAX, toucheditingsettings(false) ); // this may occur a couple of times in short order, don't retrigger the slide-in (see above) vector ents; diff --git a/source/src/protos.h b/source/src/protos.h index c6f42fdd..74c4ae49 100644 --- a/source/src/protos.h +++ b/source/src/protos.h @@ -121,6 +121,7 @@ struct color }; // console +extern int conopen; extern stream *clientlogfile; extern vector *bootclientlog; @@ -930,8 +931,9 @@ extern void checkweaponstate(); extern int burstshotssettings[NUMGUNS]; // entities: -extern void toucheditingsettings(); +extern void toucheditingsettings(bool forcerestart = true); extern int edithideentmask; +extern int showeditingsettings; extern void pickupeffects(int n, playerent *d); extern void rendereditentities(); extern void renderentities(); diff --git a/source/src/renderhud.cpp b/source/src/renderhud.cpp index b5e57a9a..cad09ed5 100644 --- a/source/src/renderhud.cpp +++ b/source/src/renderhud.cpp @@ -824,9 +824,6 @@ void gl_drawhud(int w, int h, int curfps, int nquads, int curvert, bool underwat if(command) commandh -= rendercommand(-1, HUDPOS_Y_BOTTOMLEFT, VIRTW - FONTH); // dryrun to get height else if(infostr) { - // I wanted to make the very large pinned/closest/point-at entity text smaller .. now I see this .. isn't "cleanedit" supposed to *hide* everything usually seen in edit mode, not make stuff smaller? - // .. so .. this must be some "hide by obscurity during development" thing .. *grin*: go-go-gadgeto improvement - //if(cleanedit){}else draw_text(infostr, HUDPOS_X_BOTTOMLEFT, HUDPOS_Y_BOTTOMLEFT);// smaller text glPushMatrix(); glLoadIdentity(); glOrtho(0, VIRTW * 2, VIRTH * 2, 0, -1, 1); @@ -964,7 +961,11 @@ void gl_drawhud(int w, int h, int curfps, int nquads, int curvert, bool underwat //else draw_textf("%c%d here F1/F2 will be praised during a vote", 20*2, VIRTH+560, '\f', 0); // see position (left/top) setting in block above if(menu) rendermenu(); - else if(command) renderdoc(40, VIRTH, max(commandh*2 - VIRTH, 0)); + else if(command) + { + int offsetx = 40 + (editmode ? ((showeditingsettings == 3 || keepshowingeditingsettingstill) ? VIRTW/4 : (showeditingsettings == 2 ? 2*VIRTW/32 : 0)) : 0); + renderdoc(offsetx, VIRTH, max(commandh*2 - VIRTH, 0)); + } if(!hidespecthud && !menu && p->state==CS_DEAD && p->spectatemode<=SM_DEATHCAM) {