From d632d96333b43879f7c37300d62ba2b4aa8e7f91 Mon Sep 17 00:00:00 2001 From: Lee Salzman Date: Wed, 4 Apr 2007 07:30:51 +0000 Subject: [PATCH] *** empty log message *** git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@915 e016b1c5-ed68-44aa-a2f7-31cac88cffde --- packages/misc/hole.png | Bin 6518 -> 6380 bytes source/src/geom.h | 2 ++ source/src/physics.cpp | 53 ++++++++++++++++++++++++++++ source/src/protos.h | 2 ++ source/src/rendergl.cpp | 8 ++--- source/src/renderparticles.cpp | 61 +++++++++++++++++++++++++++------ source/src/weapon.cpp | 7 ++++ 7 files changed, 116 insertions(+), 17 deletions(-) diff --git a/packages/misc/hole.png b/packages/misc/hole.png index 6f662deac5544527de672a3bcf3d80644d1b7d72..aaf8c8202504f2ed79d8745044043283c723eff4 100644 GIT binary patch literal 6380 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 MO{|Tp4GFRT2UnS_Y5)KL diff --git a/source/src/geom.h b/source/src/geom.h index 665592a6..56cf99b0 100644 --- a/source/src/geom.h +++ b/source/src/geom.h @@ -13,6 +13,8 @@ struct vec float &operator[](int i) { return v[i]; } float operator[](int i) const { return v[i]; } + bool iszero() const { return x==0 && y==0 && z==0; } + bool operator==(const vec &o) const { return x == o.x && y == o.y && z == o.z; } bool operator!=(const vec &o) const { return x != o.x || y != o.y || z != o.z; } diff --git a/source/src/physics.cpp b/source/src/physics.cpp index 8cb96870..99638621 100644 --- a/source/src/physics.cpp +++ b/source/src/physics.cpp @@ -5,6 +5,59 @@ #include "cube.h" +float raycube(const vec &o, const vec &ray, vec &surface) +{ + surface = vec(0, 0, 0); + + if(ray.iszero()) return -1; + + vec v = o; + float dist = 0, dx = 0, dy = 0, dz = 0; + + for(;;) + { + int x = int(v.x), y = int(v.y); + if(x < 0 || y < 0 || x >= ssize || y >= ssize) return -1; + sqr *s = S(x, y); + float floor = s->floor, ceil = s->ceil; + if(s->type==FHF) floor -= s->vdelta/4.0f; + if(s->type==CHF) ceil += s->vdelta/4.0f; + if(SOLID(s) || v.z < floor || v.z > ceil) + { + if((!dx && !dy) || s->wtex==DEFAULT_SKY || (!SOLID(s) && v.z > ceil && s->ctex==DEFAULT_SKY)) return -1; + if(s->type!=CORNER)// && s->type!=FHF && s->type!=CHF) + { + if(dx0 ? -1 : 1; + else surface.y = ray.y>0 ? -1 : 1; + sqr *n = S(x+(int)surface.x, y+(int)surface.y); + if(SOLID(n) || (v.z < floor && v.z < n->floor) || (v.z > ceil && v.z > n->ceil)) + { + surface = dx0 ? -1 : 1, 0) : vec(ray.x>0 ? -1 : 1, 0, 0); + n = S(x+(int)surface.x, y+(int)surface.y); + if(SOLID(n) || (v.z < floor && v.z < n->floor) || (v.z > ceil && v.z > n->ceil)) + surface = vec(0, 0, ray.z>0 ? -1 : 1); + } + } + dist = max(dist-0.1f, 0); + break; + } + dx = ray.x ? (x + (ray.x > 0 ? 1 : 0) - v.x)/ray.x : 1e16f; + dy = ray.y ? (y + (ray.y > 0 ? 1 : 0) - v.y)/ray.y : 1e16f; + dz = ray.z ? ((ray.z > 0 ? ceil : floor) - v.z)/ray.z : 1e16f; + if(dz < dx && dz < dy) + { + if(ray.z>0 && s->ctex==DEFAULT_SKY) return -1; + if(s->type!=FHF && s->type!=CHF) surface.z = ray.z>0 ? -1 : 1; + dist += dz; + break; + } + float disttonext = 0.1f + min(dx, dy); + v.add(vec(ray).mul(disttonext)); + dist += disttonext; + } + return dist; +} + bool plcollide(physent *d, physent *o, float &headspace, float &hi, float &lo) // collide with player or monster { if(o->state!=CS_ALIVE) return true; diff --git a/source/src/protos.h b/source/src/protos.h index b293b261..1ba79c00 100644 --- a/source/src/protos.h +++ b/source/src/protos.h @@ -207,6 +207,7 @@ extern void particle_splash(int type, int num, int fade, vec &p); extern void particle_trail(int type, int fade, vec &from, vec &to); extern void particle_fireball(int type, vec &o); extern void addshotline(dynent *d, vec &from, vec &to); +extern bool addbullethole(vec &from, vec &to, float radius = 1); extern void render_particles(int time); // worldio @@ -223,6 +224,7 @@ extern void demodamage(int damage, vec &o); extern void demoblend(int damage); // physics +extern float raycube(const vec &o, const vec &ray, vec &surface); extern void moveplayer(physent *pl, int moveres, bool local); extern void moveplayer(physent *pl, int moveres, bool local, int curtime); extern bool collide(physent *d, bool spawn, float drop, float rise); diff --git a/source/src/rendergl.cpp b/source/src/rendergl.cpp index 9bce1a3e..3c85e1c8 100644 --- a/source/src/rendergl.cpp +++ b/source/src/rendergl.cpp @@ -331,8 +331,6 @@ void drawhudgun(int w, int h, float aspect, int farplane) { if(scoped && player1->gunselect==GUN_SNIPER) return; - glEnable(GL_CULL_FACE); - glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective((float)100.0f*h/w, aspect, 0.3f, farplane); // fov fixed at 100° @@ -345,8 +343,6 @@ void drawhudgun(int w, int h, float aspect, int farplane) glLoadIdentity(); gluPerspective((float)fov*h/w, aspect, 0.15f, farplane); glMatrixMode(GL_MODELVIEW); - - glDisable(GL_CULL_FACE); } bool outsidemap(physent *pl) @@ -368,8 +364,8 @@ void readmatrices() glGetIntegerv(GL_VIEWPORT, viewport); glGetDoublev(GL_MODELVIEW_MATRIX, mm); glGetDoublev(GL_PROJECTION_MATRIX, pm); - camright = vec(float(mm[0]), float(mm[4]), float(mm[8])); - camup = vec(float(mm[1]), float(mm[5]), float(mm[9])); + camright = vec(float(mm[0]), float(mm[8]), float(mm[4])); + camup = vec(float(mm[1]), float(mm[9]), float(mm[5])); } // stupid function to cater for stupid ATI linux drivers that return incorrect depth values diff --git a/source/src/renderparticles.cpp b/source/src/renderparticles.cpp index 19bdbe72..c4c1e44f 100644 --- a/source/src/renderparticles.cpp +++ b/source/src/renderparticles.cpp @@ -2,12 +2,12 @@ #include "cube.h" -#define MAXPARTYPES 7 +#define MAXPARTYPES 8 struct particle { vec o, d; int fade, type; int millis; particle *next; }; particle *parlist[MAXPARTYPES], *parempty = NULL; -static Texture *parttex[3]; +static Texture *parttex[4]; void particleinit() { @@ -16,7 +16,8 @@ void particleinit() parttex[0] = textureload("packages/misc/base.png"); parttex[1] = textureload("packages/misc/smoke.png"); parttex[2] = textureload("packages/misc/explosion.jpg"); - + parttex[3] = textureload("packages/misc/hole.png"); + GLUquadricObj *qsphere = gluNewQuadric(); if(!qsphere) fatal("glu sphere"); gluQuadricDrawStyle(qsphere, GLU_FILL); @@ -69,7 +70,8 @@ enum { PT_PART = 0, PT_FIREBALL, - PT_SHOTLINE + PT_SHOTLINE, + PT_DECAL }; static struct parttype { int type; float r, g, b; int gr, tex; float sz; } parttypes[] = @@ -80,7 +82,8 @@ static struct parttype { int type; float r, g, b; int gr, tex; float sz; } partt { 0, 1.0f, 0.1f, 0.1f, 1, 1, 0.06f }, // red: blood spats { 0, 1.0f, 0.1f, 0.1f, 0, 1, 0.2f }, // red: demotrack { PT_FIREBALL, 1.0f, 1.0f, 1.0f, 0, 2, 7.0f }, // explosion fireball - { PT_SHOTLINE, 1.0f, 1.0f, 0.7f, 0, -1, 0.0f } // yellow: shotline + { PT_SHOTLINE, 1.0f, 1.0f, 0.7f, 0, -1, 0.0f }, // yellow: shotline + { PT_DECAL, 1.0f, 1.0f, 1.0f, 0, 3, 0.07f }, // hole decal }; VAR(demotracking, 0, 0, 1); @@ -127,6 +130,11 @@ void render_particles(int time) glColor4f(pt.r, pt.g, pt.b, 0.5f); glBegin(GL_LINES); break; + + case PT_DECAL: + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBegin(GL_QUADS); + break; } for(particle *p, **pp = &parlist[i]; (p = *pp);) @@ -134,10 +142,10 @@ void render_particles(int time) switch(pt.type) { case PT_PART: - glTexCoord2i(0, 1); glVertex3f(p->o.x+(-camright.x+camup.x)*sz, p->o.z+(-camright.y+camup.y)*sz, p->o.y+(-camright.z+camup.z)*sz); - glTexCoord2i(1, 1); glVertex3f(p->o.x+( camright.x+camup.x)*sz, p->o.z+( camright.y+camup.y)*sz, p->o.y+( camright.z+camup.z)*sz); - glTexCoord2i(1, 0); glVertex3f(p->o.x+( camright.x-camup.x)*sz, p->o.z+( camright.y-camup.y)*sz, p->o.y+( camright.z-camup.z)*sz); - glTexCoord2i(0, 0); glVertex3f(p->o.x+(-camright.x-camup.x)*sz, p->o.z+(-camright.y-camup.y)*sz, p->o.y+(-camright.z-camup.z)*sz); + glTexCoord2i(0, 1); glVertex3f(p->o.x+(-camright.x+camup.x)*sz, p->o.z+(-camright.z+camup.z)*sz, p->o.y+(-camright.y+camup.y)*sz); + glTexCoord2i(1, 1); glVertex3f(p->o.x+( camright.x+camup.x)*sz, p->o.z+( camright.z+camup.z)*sz, p->o.y+( camright.y+camup.y)*sz); + glTexCoord2i(1, 0); glVertex3f(p->o.x+( camright.x-camup.x)*sz, p->o.z+( camright.z-camup.z)*sz, p->o.y+( camright.y-camup.y)*sz); + glTexCoord2i(0, 0); glVertex3f(p->o.x+(-camright.x-camup.x)*sz, p->o.z+(-camright.z-camup.z)*sz, p->o.y+(-camright.y-camup.y)*sz); xtraverts += 4; break; @@ -160,6 +168,20 @@ void render_particles(int time) glVertex3f(p->d.x, p->d.z, p->d.y); xtraverts += 2; break; + + case PT_DECAL: + { + sqr *s = S((int)p->o.x, (int)p->o.y); + glColor4f(s->r/127.5f, s->g/127.5f, s->b/127.5, max(0, min((p->millis+p->fade - lastmillis)/1000.0f, 0.7f))); + vec dx(0, 0, 0), dy(0, 0, 0); + loopk(3) if(p->d[k]) { dx[(k+1)%3] = -1; dy[(k+2)%3] = p->d[k]; break; } + glTexCoord2i(0, 1); glVertex3f(p->o.x+(-dx.x+dy.x)*pt.sz, p->o.z+(-dx.z+dy.z)*pt.sz, p->o.y+(-dx.y+dy.y)*pt.sz); + glTexCoord2i(1, 1); glVertex3f(p->o.x+( dx.x+dy.x)*pt.sz, p->o.z+( dx.z+dy.z)*pt.sz, p->o.y+( dx.y+dy.y)*pt.sz); + glTexCoord2i(1, 0); glVertex3f(p->o.x+( dx.x-dy.x)*pt.sz, p->o.z+( dx.z-dy.z)*pt.sz, p->o.y+( dx.y-dy.y)*pt.sz); + glTexCoord2i(0, 0); glVertex3f(p->o.x+(-dx.x-dy.x)*pt.sz, p->o.z+(-dx.z-dy.z)*pt.sz, p->o.y+(-dx.y-dy.y)*pt.sz); + xtraverts += 4; + break; + } } if(lastmillis-p->millis>p->fade) @@ -171,12 +193,12 @@ void render_particles(int time) else { if(pt.gr) p->o.z -= ((lastmillis-p->millis)/3.0f)*time/(pt.gr*10000); - if(pt.type!=PT_SHOTLINE) p->o.add(vec(p->d).mul(time/20000.0f)); + if(pt.type==PT_PART) p->o.add(vec(p->d).mul(time/20000.0f)); pp = &p->next; } } - if(pt.type==PT_PART || pt.type==PT_SHOTLINE) glEnd(); + if(pt.type==PT_PART || pt.type==PT_SHOTLINE || pt.type==PT_DECAL) glEnd(); if(pt.tex<0) glEnable(GL_TEXTURE_2D); } @@ -226,6 +248,23 @@ void particle_fireball(int type, vec &o) newparticle(o, vec(0, 0, 0), (int)((parttypes[type].sz-1.0f)*100.0f), type); } +VARP(holettl, 0, 10000, 30000); + +bool addbullethole(vec &from, vec &to, float radius) +{ + if(!holettl) return false; + vec surface, ray(to); + ray.sub(from); + ray.normalize(); + float dist = raycube(from, ray, surface), mag = to.dist(from); + if(surface.iszero() || (radius>0 && (dist < mag-radius || dist > mag+radius))) return false; + vec o(from); + o.add(ray.mul(dist)); + o.add(vec(surface).mul(0.005f)); + newparticle(o, surface, holettl, 7); + return true; +} + void addshotline(dynent *pl, vec &from, vec &to) { if(pl == player1) return; diff --git a/source/src/weapon.cpp b/source/src/weapon.cpp index c575921f..2bac5e76 100644 --- a/source/src/weapon.cpp +++ b/source/src/weapon.cpp @@ -522,6 +522,11 @@ void shootv(int gun, vec &from, vec &to, playerent *d, bool local, int nademilli case GUN_SHOTGUN: { loopi(SGRAYS) particle_splash(0, 5, 200, sg[i]); + if(addbullethole(from, to)) + { + int holes = 3+rnd(5); + loopi(holes) addbullethole(from, sg[i], 0); + } break; } @@ -529,6 +534,7 @@ void shootv(int gun, vec &from, vec &to, playerent *d, bool local, int nademilli case GUN_SUBGUN: case GUN_ASSAULT: { + addbullethole(from, to); addshotline(d, from, to); particle_splash(0, 5, 250, to); break; @@ -546,6 +552,7 @@ void shootv(int gun, vec &from, vec &to, playerent *d, bool local, int nademilli case GUN_SNIPER: { + addbullethole(from, to); addshotline(d, from, to); particle_splash(0, 50, 200, to); particle_trail(1, 500, from, to);