diff options
Diffstat (limited to 'src/engine/octarender.cpp')
| -rw-r--r-- | src/engine/octarender.cpp | 99 |
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); |
