From 7f12ef413106bb1f10b1c3bf29847eb4857d441b Mon Sep 17 00:00:00 2001 From: ac-stef Date: Wed, 29 Jan 2014 00:03:50 +0100 Subject: [PATCH] command to automatically convert all suitable clip entities into tag clips also: fix sparklies in heightfields --- source/src/editing.cpp | 39 ++++++++++++++++++++++++++++++++++ source/src/renderparticles.cpp | 7 +++--- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/source/src/editing.cpp b/source/src/editing.cpp index fd2dbf94..abcd58df 100644 --- a/source/src/editing.cpp +++ b/source/src/editing.cpp @@ -760,3 +760,42 @@ COMMANDF(selectionrotate, "i", (int *d) { selectionrotate(*d); }); COMMAND(selectionflip, "s"); COMMAND(countwalls, "i"); COMMANDF(settex, "ii", (int *texture, int *type) { settex(*texture, *type); }); + +void transformclipentities() // transforms all clip entities to tag clips, if they are big enough (so, that no player could be above or below them) +{ + EDITMP; + int entsdone = 0; + loopv(ents) + { + entity &e = ents[i]; + if((e.type == CLIP || e.type == PLCLIP) && e.attr2 && e.attr3 && e.attr4) + { + int allowedspace = e.type == CLIP ? 1 : 4; + int x1 = e.x - e.attr2, x2 = e.x + e.attr2 - 1, y1 = e.y - e.attr3, y2 = e.y + e.attr3 - 1; + int z1 = S(e.x, e.y)->floor + e.attr1, z2 = z1 + e.attr4; + bool bigenough = true; + for(int xx = x1; xx <= x2; xx++) for(int yy = y1; yy <= y2; yy++) + { + if(OUTBORD(xx,yy) || SOLID(S(xx,yy))) continue; + sqr *s[4] = { S(xx, yy), S(xx + 1, yy), S(xx, yy + 1), S(xx + 1, yy + 1) }; + int vdeltamax = 0; + loopj(4) if(s[j]->vdelta > vdeltamax) vdeltamax = s[j]->vdelta; + int floor = s[0]->floor - (s[0]->type == FHF ? (vdeltamax + 3) / 4 : 0), + ceil = s[0]->ceil - (s[0]->type == CHF ? (vdeltamax + 3) / 4 : 0); + if(z1 - floor > allowedspace || ceil - z2 > allowedspace) bigenough = false; + } + if(bigenough) + { + for(int xx = x1; xx <= x2; xx++) for(int yy = y1; yy <= y2; yy++) + { + if(!OUTBORD(xx,yy) && !SOLID(S(xx,yy))) S(xx, yy)->tag |= e.type == CLIP ? TAGCLIP : TAGPLCLIP; + } + e.type = NOTUSED; + entsdone++; + } + } + } + conoutf("changed %d clip entities to tagged clip areas", entsdone); +} + +COMMAND(transformclipentities, ""); diff --git a/source/src/renderparticles.cpp b/source/src/renderparticles.cpp index cca4a41b..ce617db6 100644 --- a/source/src/renderparticles.cpp +++ b/source/src/renderparticles.cpp @@ -258,7 +258,7 @@ static struct parttype { int type; float r, g, b; int gr, tex; float sz; } partt { PT_FIREBALL, 1.0f, 0.5f, 0.5f, 0, 2, 7.0f }, // explosion fireball { PT_SHOTLINE, 1.0f, 1.0f, 0.7f, 0, -1, 0.0f }, // yellow: shotline { PT_BULLETHOLE, 1.0f, 1.0f, 1.0f, 0, 3, 0.3f }, // hole decal - + { PT_STAIN, 0.5f, 0.0f, 0.0f, 0, 4, 0.6f }, // red: blood stain { PT_DECAL, 1.0f, 1.0f, 1.0f, 0, 5, 1.5f }, // scorch decal { PT_HUDFLASH, 1.0f, 1.0f, 1.0f, 0, 6, 0.7f }, // hudgun muzzle flash @@ -585,11 +585,12 @@ void particle_splash(int type, int num, int fade, const vec &p) void particle_cube(int type, int num, int fade, int x, int y) { sqr *s = S(x, y); - const int fc = s->ceil - s->floor; + const int fc = s->ceil - s->floor + (s->vdelta + 3) / 4; + const float floor = s->floor - (s->type == FHF ? float(s->vdelta) / 4 : 0); if(SOLID(s) || fc < 1) return; loopi(num * fc / 3) { - vec p(float(rnd(100)) / 100.0 + x, float(rnd(100)) / 100.0 + y, float(rnd(100) * fc) / 100 + s->floor), d(0, 0, 0); + vec p(float(rnd(100)) / 100.0 + x, float(rnd(100)) / 100.0 + y, float(rnd(100) * fc) / 100 + floor), d(0, 0, 0); newparticle(p, d, rnd(fade*3), type); } }