summaryrefslogtreecommitdiff
path: root/src/engine/octarender.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/octarender.cpp')
-rw-r--r--src/engine/octarender.cpp99
1 files changed, 5 insertions, 94 deletions
diff --git a/src/engine/octarender.cpp b/src/engine/octarender.cpp
index 53547a7..217a49a 100644
--- a/src/engine/octarender.cpp
+++ b/src/engine/octarender.cpp
@@ -208,7 +208,6 @@ struct vacollect : verthash
int size;
hashtable<sortkey, sortval> indices;
vector<sortkey> texs;
- vector<grasstri> grasstris;
vector<materialsurface> matsurfs;
vector<octaentities *> mapmodels;
vector<ushort> skyindices, explicitskyindices;
@@ -227,7 +226,6 @@ struct vacollect : verthash
explicitskyindices.setsize(0);
matsurfs.setsize(0);
mapmodels.setsize(0);
- grasstris.setsize(0);
texs.setsize(0);
loopi(6) skyfaces[i].setsize(0);
}
@@ -497,18 +495,12 @@ struct vacollect : verthash
va->alphatris = va->alphabacktris + va->alphafronttris;
- if(grasstris.length())
- {
- va->grasstris.move(grasstris);
- useshaderbyname("grass");
- }
-
if(mapmodels.length()) va->mapmodels.put(mapmodels.getbuf(), mapmodels.length());
}
bool emptyva()
{
- return verts.empty() && matsurfs.empty() && skyindices.empty() && explicitskyindices.empty() && grasstris.empty() && mapmodels.empty();
+ return verts.empty() && matsurfs.empty() && skyindices.empty() && explicitskyindices.empty() && mapmodels.empty();
}
} vc;
@@ -674,70 +666,6 @@ void addtris(const sortkey &key, int orient, vertex *verts, int *index, int numv
}
}
-void addgrasstri(int face, vertex *verts, int numv, ushort texture, ushort lmid)
-{
- grasstri &g = vc.grasstris.add();
- int i1, i2, i3, i4;
- if(numv <= 3 && face%2) { i1 = face+1; i2 = face+2; i3 = i4 = 0; }
- else { i1 = 0; i2 = face+1; i3 = face+2; i4 = numv > 3 ? face+3 : i3; }
- g.v[0] = verts[i1].pos;
- g.v[1] = verts[i2].pos;
- g.v[2] = verts[i3].pos;
- g.v[3] = verts[i4].pos;
- g.numv = numv;
-
- g.surface.toplane(g.v[0], g.v[1], g.v[2]);
- if(g.surface.z <= 0) { vc.grasstris.pop(); return; }
-
- g.minz = min(min(g.v[0].z, g.v[1].z), min(g.v[2].z, g.v[3].z));
- g.maxz = max(max(g.v[0].z, g.v[1].z), max(g.v[2].z, g.v[3].z));
-
- g.center = vec(0, 0, 0);
- loopk(numv) g.center.add(g.v[k]);
- g.center.div(numv);
- g.radius = 0;
- loopk(numv) g.radius = max(g.radius, g.v[k].dist(g.center));
-
- vec area, bx, by;
- area.cross(vec(g.v[1]).sub(g.v[0]), vec(g.v[2]).sub(g.v[0]));
- float scale;
- int px, py;
-
- if(fabs(area.x) >= fabs(area.y) && fabs(area.x) >= fabs(area.z))
- scale = 1/area.x, px = 1, py = 2;
- else if(fabs(area.y) >= fabs(area.x) && fabs(area.y) >= fabs(area.z))
- scale = -1/area.y, px = 0, py = 2;
- else
- scale = 1/area.z, px = 0, py = 1;
-
- bx.x = (g.v[2][py] - g.v[0][py])*scale;
- bx.y = (g.v[2][px] - g.v[0][px])*scale;
- bx.z = bx.x*g.v[2][px] - bx.y*g.v[2][py];
-
- by.x = (g.v[2][py] - g.v[1][py])*scale;
- by.y = (g.v[2][px] - g.v[1][px])*scale;
- by.z = by.x*g.v[1][px] - by.y*g.v[1][py] - 1;
- by.sub(bx);
-
- float tc1u = verts[i1].lm.x,
- tc1v = verts[i1].lm.y,
- tc2u = verts[i2].lm.x - verts[i1].lm.x,
- tc2v = verts[i2].lm.y - verts[i1].lm.y,
- tc3u = verts[i3].lm.x - verts[i1].lm.x,
- tc3v = verts[i3].lm.y - verts[i1].lm.y;
-
- g.tcu = vec4(0, 0, 0, tc1u - (bx.z*tc2u + by.z*tc3u));
- g.tcu[px] = bx.x*tc2u + by.x*tc3u;
- g.tcu[py] = -(bx.y*tc2u + by.y*tc3u);
-
- g.tcv = vec4(0, 0, 0, tc1v - (bx.z*tc2v + by.z*tc3v));
- g.tcv[px] = bx.x*tc2v + by.x*tc3v;
- g.tcv[py] = -(bx.y*tc2v + by.y*tc3v);
-
- g.texture = texture;
- g.lmid = lmid;
-}
-
static inline void calctexgen(VSlot &vslot, int dim, vec4 &sgen, vec4 &tgen)
{
Texture *tex = vslot.slot->sts.empty() ? notexture : vslot.slot->sts[0].t;
@@ -812,6 +740,7 @@ void guessnormals(const vec *pos, int numverts, vec *normals)
void addcubeverts(VSlot &vslot, int orient, int size, vec *pos, int convex, ushort texture, ushort lmid, vertinfo *vinfo, int numverts, int tj = -1, ushort envmap = EMID_NONE, int grassy = 0, bool alpha = false, int layer = LAYER_TOP)
{
+ (void) grassy;
int dim = dimension(orient);
int shadowmask = texture==DEFAULT_SKY || alpha ? 0 : calcshadowmask(pos, numverts);
@@ -869,22 +798,6 @@ void addcubeverts(VSlot &vslot, int orient, int size, vec *pos, int convex, usho
sortkey key(texture, lmid, !vslot.scroll.iszero() ? dim : 3, layer == LAYER_BLEND ? LAYER_BLEND : LAYER_TOP, envmap, alpha ? (vslot.alphaback ? ALPHA_BACK : (vslot.alphafront ? ALPHA_FRONT : NO_ALPHA)) : NO_ALPHA);
addtris(key, orient, verts, index, numverts, convex, shadowmask, tj);
-
- if(grassy)
- {
- for(int i = 0; i < numverts-2; i += 2)
- {
- int faces = 0;
- if(index[0]!=index[i+1] && index[i+1]!=index[i+2] && index[i+2]!=index[0]) faces |= 1;
- if(i+3 < numverts && index[0]!=index[i+2] && index[i+2]!=index[i+3] && index[i+3]!=index[0]) faces |= 2;
- if(grassy > 1 && faces==3) addgrasstri(i, verts, 4, texture, lmid);
- else
- {
- if(faces&1) addgrasstri(i, verts, 3, texture, lmid);
- if(faces&2) addgrasstri(i+1, verts, 3, texture, lmid);
- }
- }
- }
}
struct edgegroup
@@ -1077,14 +990,13 @@ void gencubeverts(cube &c, const ivec &co, int size, int csi)
envmap2 = layer && layer->slot->shader->type&SHADER_ENVMAP ? (int) (layer->slot->texmask&(1<<TEX_ENVMAP) ? (int) EMID_CUSTOM : (int) closestenvmap(i, co, size)) : (int) EMID_NONE;
while(tj >= 0 && tjoints[tj].edge < i*(MAXFACEVERTS+1)) tj = tjoints[tj].next;
int hastj = tj >= 0 && tjoints[tj].edge < (i+1)*(MAXFACEVERTS+1) ? tj : -1;
- int grassy = vslot.slot->autograss && i!=O_BOTTOM ? (vis!=3 || convex ? 1 : 2) : 0;
if(!c.ext)
- addcubeverts(vslot, i, size, pos, convex, c.texture[i], LMID_AMBIENT, NULL, numverts, hastj, envmap, grassy, (c.material&MAT_ALPHA)!=0);
+ addcubeverts(vslot, i, size, pos, convex, c.texture[i], LMID_AMBIENT, NULL, numverts, hastj, envmap, 0, (c.material&MAT_ALPHA)!=0);
else
{
const surfaceinfo &surf = c.ext->surfaces[i];
if(!surf.numverts || surf.numverts&LAYER_TOP)
- addcubeverts(vslot, i, size, pos, convex, c.texture[i], surf.lmid[0], verts, numverts, hastj, envmap, grassy, (c.material&MAT_ALPHA)!=0, LAYER_TOP|(surf.numverts&LAYER_BLEND));
+ addcubeverts(vslot, i, size, pos, convex, c.texture[i], surf.lmid[0], verts, numverts, hastj, envmap, 0, (c.material&MAT_ALPHA)!=0, LAYER_TOP|(surf.numverts&LAYER_BLEND));
if(surf.numverts&LAYER_BOTTOM)
addcubeverts(layer ? *layer : vslot, i, size, pos, convex, vslot.layer, surf.lmid[1], surf.numverts&LAYER_DUP ? verts + numverts : verts, numverts, hastj, envmap2);
}
@@ -1417,8 +1329,7 @@ void addmergedverts(int level, const ivec &o)
pos[i] = vec(v.x, v.y, v.z).mul(1.0f/8).add(vo);
}
VSlot &vslot = lookupvslot(mf.tex, true);
- int grassy = vslot.slot->autograss && mf.orient!=O_BOTTOM && mf.numverts&LAYER_TOP ? 2 : 0;
- addcubeverts(vslot, mf.orient, 1<<level, pos, 0, mf.tex, mf.lmid, mf.verts, numverts, mf.tjoints, mf.envmap, grassy, (mf.mat&MAT_ALPHA)!=0, mf.numverts&LAYER_BLEND);
+ addcubeverts(vslot, mf.orient, 1<<level, pos, 0, mf.tex, mf.lmid, mf.verts, numverts, mf.tjoints, mf.envmap, 0, (mf.mat&MAT_ALPHA)!=0, mf.numverts&LAYER_BLEND);
vahasmerges |= MERGE_USE;
}
mfl.setsize(0);