higher resolution for waterlevel

Interpret the waterlevel value as tenths of a cube.

This makes the waterlevel variable a float value to the user, while the
map file still stores an integer value - but now it is interpreted
differently - for example, a waterlevel value of 123 now means 12.3 cubes
instead of 123. Old map files are converted during loading.

Note: the values of waterlevel and hdr.waterlevel need to be in sync.

DOCREF waterlevel
This commit is contained in:
ac-stef
2015-05-18 14:59:41 +02:00
parent b1b789eefc
commit ea480a7b0c
15 changed files with 39 additions and 32 deletions
+5 -10
View File
@@ -331,15 +331,10 @@ void audiomanager::updateplayerfootsteps(playerent *p)
{
// play footsteps
int grounddist;
if( ((int)p->o.x) >= 0 && ((int)p->o.y) >= 0 && ((int)p->o.x) < ssize && ((int)p->o.y) < ssize) { // sam's fix to the sound crash
grounddist = hdr.waterlevel-S((int)p->o.x, (int)p->o.y)->floor;
}else{
grounddist = 0;
}
// int grounddist = hdr.waterlevel-S((int)p->o.x, (int)p->o.y)->floor;
bool water = p->o.z-p->eyeheight+0.25f<hdr.waterlevel;
if(water && grounddist>p->eyeheight) return; // don't play step sound when jumping into water
float grounddist = 0;
if(!((int(p->o.x) | int(p->o.y)) & ~(ssize - 1))) grounddist = waterlevel - S((int)p->o.x, (int)p->o.y)->floor;
bool water = p->o.z - p->eyeheight+0.25f < waterlevel;
if(water && grounddist > p->eyeheight) return; // don't play step sound when jumping into water
int stepsound;
if(p->crouching) stepsound = water ? S_WATERFOOTSTEPSCROUCH : S_FOOTSTEPSCROUCH; // crouch
@@ -573,7 +568,7 @@ void audiomanager::updateaudio()
}
// water
bool underwater = /*alive &&*/ firstperson && hdr.waterlevel>player1->o.z+player1->aboveeye;
bool underwater = /*alive &&*/ firstperson && waterlevel > player1->o.z + player1->aboveeye;
updateloopsound(S_UNDERWATER, underwater);
// tinnitus
+1 -1
View File
@@ -1744,7 +1744,7 @@ bool CBot::WaterNav()
if (UnderWater(v)) continue; // Skip, cube is underwater
if (hdr.waterlevel < (v.z - 2.0f)) continue; // Cube is too high
if (waterlevel < (v.z - 2.0f)) continue; // Cube is too high
// Check if the bot 'can fit' on the cube(no near obstacles)
bool small_ = false;
+2 -2
View File
@@ -17,8 +17,8 @@ bool FileIsOlder(const char *szFileName1, const char *szFileName2);
vec PredictPos(vec pos, vec vel, float Time);
vec Normalize(vec v);
inline void makevec(vec *v, float x, float y, float z) { v->x=x; v->y=y; v->z=z; }
inline bool UnderWater(const vec &o) { return hdr.waterlevel>o.z-0.5f; }
inline bool InWater(const vec &o) { return hdr.waterlevel>=o.z; }
inline bool UnderWater(const vec &o) { return waterlevel > o.z - 0.5f; }
inline bool InWater(const vec &o) { return waterlevel >= o.z; }
float GetYawDiff(float curyaw, vec v1, vec v2);
vec CrossProduct(const vec &a, const vec &b);
int GetDirection(const vec &angles, const vec &v1, const vec &v2);
+1
View File
@@ -60,6 +60,7 @@ extern hashtable<char *, enet_uint32> mapinfo;
extern int hwtexsize, hwmaxaniso;
extern int numspawn[3], maploaded, numflagspawn[2];
extern int verbose;
extern float waterlevel;
#define AC_VERSION 1202
#define AC_MASTER_URI "ms.cubers.net"
+1 -1
View File
@@ -898,7 +898,7 @@ void movemap(int xo, int yo, int zo) // move whole map
S(x,y)->floor = max(-128, S(x,y)->floor + zo);
S(x,y)->ceil = min(127, S(x,y)->ceil + zo);
}
setvar("waterlevel", (hdr.waterlevel += zo));
setfvar("waterlevel", waterlevel + zo, true);
}
loopv(ents)
{
+1 -1
View File
@@ -588,7 +588,7 @@ void flagdropped(int flag, float x, float y, float z)
f.pos.x = round(p.o.x);
f.pos.y = round(p.o.y);
f.pos.z = round(p.o.z);
if(f.pos.z < hdr.waterlevel) f.pos.z = (short) hdr.waterlevel;
if(f.pos.z < waterlevel) f.pos.z = waterlevel;
f.flagent->spawned = true;
f.ack = true;
}
+3 -3
View File
@@ -328,7 +328,7 @@ void resizephysent(physent *pl, int moveres, int curtime, float min, float max)
{
if(pl->eyeheightvel==0.0f) return;
const bool water = hdr.waterlevel>pl->o.z;
const bool water = waterlevel > pl->o.z;
const float speed = curtime*pl->maxspeed/(water ? 2000.0f : 1000.0f);
float h = pl->eyeheightvel * speed / moveres;
@@ -391,7 +391,7 @@ void moveplayer(physent *pl, int moveres, bool local, int curtime)
if(pl->type==ENT_BOUNCE)
{
bounceent* bounce = (bounceent *) pl;
water = hdr.waterlevel>pl->o.z;
water = waterlevel > pl->o.z;
const float speed = curtime*pl->maxspeed/(water ? 2000.0f : 1000.0f);
const float friction = water ? 20.0f : (pl->onfloor || isfly ? 6.0f : 30.0f);
@@ -423,7 +423,7 @@ void moveplayer(physent *pl, int moveres, bool local, int curtime)
{
const int timeinair = pl->timeinair;
int move = pl->onladder && !pl->onfloor && pl->move == -1 ? 0 : pl->move; // movement on ladder
if(!editfly) water = hdr.waterlevel>pl->o.z-0.5f;
if(!editfly) water = waterlevel > pl->o.z - 0.5f;
float chspeed = 0.4f;
if(!(pl->onfloor || pl->onladder)) chspeed = 1.0f;
+2 -2
View File
@@ -840,7 +840,7 @@ void drawminimap(int w, int h)
renderzones(mapdims.maxceil);
//renderentities();// IMHO better done by radar itself, if at all
resettmu(0);
float hf = hdr.waterlevel-0.3f;
float hf = waterlevel - 0.3f;
renderwater(hf, 0, 0);
//draw a black border to prevent the minimap texture edges from bleeding in radarview
@@ -1001,7 +1001,7 @@ void gl_drawframe(int w, int h, float changelod, float curfps)
aspect = float(w)/h;
fovy = 2*atan2(tan(float(dynfov())/2*RAD), aspect)/RAD;
float hf = hdr.waterlevel-0.3f;
float hf = waterlevel - 0.3f;
bool underwater = camera1->o.z<hf;
glFogi(GL_FOG_START, (fog+64)/8);
+2 -2
View File
@@ -390,7 +390,7 @@ void render_particles(int time, int typemask)
bool inside = p->o.dist(camera1->o) <= sz*1.25f; //1.25 is max wobble scale
vec oc(p->o);
oc.sub(camera1->o);
if(reflecting && !refracting) oc.z = p->o.z - (hdr.waterlevel-0.3f);
if(reflecting && !refracting) oc.z = p->o.z - (waterlevel - 0.3f);
glRotatef(inside ? camera1->yaw - 180 : atan2(oc.y, oc.x)/RAD - 90, 0, 0, 1);
glRotatef((inside ? camera1->pitch : asin(oc.z/oc.magnitude())/RAD) - 90, 1, 0, 0);
@@ -641,7 +641,7 @@ bool addbullethole(dynent *d, const vec &from, const vec &to, float radius, bool
//newparticle(o, surface, bulletholettl, 7);
if(noisy && bulletbouncesound && bulletbouncesoundrad && d!=player1 && o.dist(camera1->o) <= bulletbouncesoundrad)
{
audiomgr.playsound(o.z<hdr.waterlevel ? S_BULLETWATERHIT : S_BULLETHIT, &o, SP_LOW);
audiomgr.playsound(o.z < waterlevel ? S_BULLETWATERHIT : S_BULLETHIT, &o, SP_LOW);
}
return true;
}
+10 -2
View File
@@ -4,7 +4,15 @@ int wx1, wy1, wx2, wy2;
float wsx1, wsy1, wsx2, wsy2;
VARP(watersubdiv, 1, 4, 64);
VARF(waterlevel, -128, -128, 127, if(!noteditmode("waterlevel")) { hdr.waterlevel = waterlevel; unsavededits++; });
FVARF(waterlevel, -10000, -10000, 127,
{
if(!noteditmode("waterlevel"))
{
hdr.waterlevel = waterlevel * WATERLEVELSCALING;
unsavededits++;
}
waterlevel = float(hdr.waterlevel) / WATERLEVELSCALING; // waterlevel and hdr.waterlevel need to be kept in sync
});
void setwatercolor(const char *r, const char *g, const char *b, const char *a)
{
@@ -274,7 +282,7 @@ void calcwaterscissor()
loopi(4)
{
vec4 &p = v[i];
mvpmatrix.transform(vec(i&1 ? wx2 : wx1, i&2 ? wy2 : wy1, hdr.waterlevel-0.3f), p);
mvpmatrix.transform(vec(i&1 ? wx2 : wx1, i&2 ? wy2 : wy1, waterlevel - 0.3f), p);
if(p.z >= 0)
{
float x = p.x / p.w, y = p.y / p.w;
+3 -3
View File
@@ -567,7 +567,7 @@ void addgib(playerent *d)
p->o = d->o;
p->o.z -= d->aboveeye;
p->inwater = hdr.waterlevel>p->o.z;
p->inwater = waterlevel > p->o.z;
p->yaw = (float)rnd(360);
p->pitch = (float)rnd(360);
@@ -1037,7 +1037,7 @@ void grenadeent::_throw(const vec &from, const vec &vel)
this->vel = vel;
this->o = from;
this->resetinterp();
inwater = hdr.waterlevel>o.z;
inwater = waterlevel > o.z;
if(local)
{
addmsg(SV_THROWNADE, "ri7", int(o.x*DMF), int(o.y*DMF), int(o.z*DMF), int(vel.x*DMF), int(vel.y*DMF), int(vel.z*DMF), lastmillis-millis);
@@ -1050,7 +1050,7 @@ void grenadeent::moveoutsidebbox(const vec &direction, playerent *boundingbox)
{
vel = direction;
o = boundingbox->o;
inwater = hdr.waterlevel>o.z;
inwater = waterlevel > o.z;
boundingbox->cancollide = false;
loopi(10) moveplayer(this, 10, true, 10);
+2 -1
View File
@@ -613,7 +613,8 @@ bool empty_world(int factor, bool force) // main empty world creation routine
memset(&hdr, 0, sizeof(header));
mapconfigdata.clear();
formatstring(hdr.maptitle)("Untitled Map by %s", player1->name);
setvar("waterlevel", (hdr.waterlevel = -100000));
setfvar("waterlevel", -10000);
hdr.waterlevel = waterlevel * WATERLEVELSCALING;
setwatercolor();
loopk(3) loopi(256) hdr.texlists[k][i] = i;
ents.shrink(0);
+1
View File
@@ -115,6 +115,7 @@ struct mapdim
#define MAXMAREA 10000
#define MAXHHITS 50000 // was 6000, which denied my fav. maps - jamz, 2012-06-12; 15000 denies sane map too - lucas
#define MINFF 2500
#define WATERLEVELSCALING 10
struct block { int x, y, xs, ys, h; short p[5]; };
+3 -2
View File
@@ -691,7 +691,8 @@ bool load_world(char *mname) // still supports all map formats that have
hdr.waterlevel = -100000;
hdr.ambient = 0;
}
setvar("waterlevel", hdr.waterlevel);
if(hdr.version < 10) hdr.waterlevel *= WATERLEVELSCALING;
setfvar("waterlevel", float(hdr.waterlevel) / WATERLEVELSCALING);
ents.shrink(0);
loopi(3) numspawn[i] = 0;
loopi(2) numflagspawn[i] = 0;
@@ -945,7 +946,7 @@ struct xmap
clearheaderextras();
resetmap(true);
curmaprevision = hdr.maprevision;
setvar("waterlevel", hdr.waterlevel);
setfvar("waterlevel", float(hdr.waterlevel) / WATERLEVELSCALING);
::ents.shrink(0);
loopv(ents) restoreent(i);
delete[] ::world;
+2 -2
View File
@@ -165,14 +165,14 @@ void render_seg_new(float vx, float vy, float vh, int mip, int x, int y, int xs,
{
sqr *v = SWS(s,0,1,mfactor);
render_flat(s->ftex, xx<<mip, yy<<mip, 1<<mip, s->floor, s, s + 1, v + 1, v, false);
if(s->floor<hdr.waterlevel && !reflecting) addwaterquad(xx<<mip, yy<<mip, 1<<mip);
if(s->floor < waterlevel && !reflecting) addwaterquad(xx<<mip, yy<<mip, 1<<mip);
}
break;
case FHF:
{
LOOPD
render_flatdelta(s->ftex, xx<<mip, yy<<mip, 1<<mip, df(s), df(t), df(u), df(v), s, t, u, v, false);
if(s->floor-s->vdelta/4.0f<hdr.waterlevel && !reflecting) addwaterquad(xx<<mip, yy<<mip, 1<<mip);
if(s->floor - s->vdelta/4.0f < waterlevel && !reflecting) addwaterquad(xx<<mip, yy<<mip, 1<<mip);
break;
}
}