350
359
case TRIGGER_RESETTING: anim = ANIM_TRIGGER|ANIM_REVERSE; basetime = e.lasttrigger; break;
352
361
mapmodelinfo &mmi = getmminfo(e.attr2);
353
if(&mmi) rendermodel(e.color, e.dir, mmi.name, anim, 0, mmi.tex, e.o.x, e.o.y, e.o.z, (float)((e.attr1+7)-(e.attr1+7)%15), 0, 10.0f, basetime, NULL, MDL_CULL_VFC | MDL_CULL_DIST);
362
if(&mmi) rendermodel(e.color, e.dir, mmi.name, anim, 0, mmi.tex, e.o, (float)((e.attr1+7)-(e.attr1+7)%15), 0, 0, basetime, NULL, MDL_CULL_VFC | MDL_CULL_DIST);
356
365
extern int reflectdist;
410
424
findvisiblemms(ents);
412
426
static int skipoq = 0;
427
bool doquery = hasOQ && oqfrags && oqmm;
414
429
renderedmms.setsizenodelete(0);
416
for(octaentities *oe = visiblemms; oe; oe = oe->next)
418
bool occluded = oe->distance < 0;
421
bool hasmodels = false;
424
const extentity &e = *ents[oe->mapmodels[i]];
425
if(!e.visible || (e.attr3 && e.triggerstate == TRIGGER_DISAPPEARED)) continue;
429
if(!hasmodels) continue;
432
if(!hasOQ || !oqfrags || !oqmm || !oe->distance) oe->query = NULL;
433
else if(!occluded && (++skipoq % oqmm)) oe->query = NULL;
434
else oe->query = newquery(oe);
440
glDepthMask(GL_FALSE);
441
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
443
startquery(oe->query);
445
if(!occluded || oe->query)
447
ivec bbmin(oe->o), bbmax(oe->o);
449
bool rendered = false;
452
extentity &e = *ents[oe->mapmodels[i]];
453
if(e.attr3 && e.triggerstate == TRIGGER_DISAPPEARED) continue;
457
if(getentboundingbox(e, bo, br))
461
bbmin[j] = min(bbmin[j], bo[j]);
462
bbmax[j] = max(bbmax[j], bo[j]+br[j]);
468
if(!rendered) { renderedmms.add(oe); rendered = true; }
477
bbmin[j] = max(bbmin[j], oe->o[j]);
478
bbmax[j] = min(bbmax[j], oe->o[j]+oe->size);
480
drawbb(bbmin, bbmax.sub(bbmin));
488
glDepthMask(GL_TRUE);
489
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
431
for(octaentities *oe = visiblemms; oe; oe = oe->next) if(oe->distance>=0)
435
extentity &e = *ents[oe->mapmodels[i]];
436
if(!e.visible || (e.attr3 && e.triggerstate == TRIGGER_DISAPPEARED)) continue;
437
if(renderedmms.empty() || renderedmms.last()!=oe)
440
oe->query = doquery && oe->distance>0 && !(++skipoq%oqmm) ? newquery(oe) : NULL;
441
if(oe->query) startmodelquery(oe->query);
446
if(renderedmms.length() && renderedmms.last()==oe && oe->query) endmodelquery();
450
bool colormask = true;
451
for(octaentities *oe = visiblemms; oe; oe = oe->next) if(oe->distance<0)
453
oe->query = doquery ? newquery(oe) : NULL;
454
if(!oe->query) continue;
457
glDepthMask(GL_FALSE);
458
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
459
nocolorshader->set();
462
startquery(oe->query);
463
drawbb(oe->bbmin, ivec(oe->bbmax).sub(oe->bbmin));
468
glDepthMask(GL_TRUE);
469
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
597
574
GLfloat fogc[4] = {1, 1, 1, 1};
598
575
glFogfv(GL_FOG_COLOR, fogc);
600
GLfloat s[4] = { 0.0055f, 0, 0.0033f, 0 };
601
GLfloat t[4] = { 0, 0.0055f, 0.0033f, 0 };
577
GLfloat s[4] = { 0.011f, 0, 0.0066f, 0 };
578
GLfloat t[4] = { 0, 0.011f, 0.0066f, 0 };
604
s[k] *= 100.0f/causticscale;
605
t[k] *= 100.0f/causticscale;
581
s[k] *= 100.0f/(causticscale<<VVEC_FRAC);
582
t[k] *= 100.0f/(causticscale<<VVEC_FRAC);
608
585
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
701
677
glFogfv(GL_FOG_COLOR, oldfogc);
680
VARP(maxdynlights, 0, MAXDYNLIGHTS, MAXDYNLIGHTS);
681
VARP(dynlightdist, 0, 1024, 10000);
688
int fade, peak, expire;
690
float calcradius() const
692
return peak>0 && expire-lastmillis>fade ? (radius/peak)*(peak-(expire-lastmillis-fade)) : radius;
695
float intensity() const
699
int remaining = expire - lastmillis;
700
return remaining > fade ? 1.0f - float(remaining - fade)/peak : float(remaining)/fade;
706
vector<dynlight> dynlights;
707
vector<dynlight *> closedynlights, visibledynlights;
709
void adddynlight(const vec &o, float radius, const vec &color, int fade, int peak)
711
if(o.dist(camera1->o) > dynlightdist) return;
713
int insert = 0, expire = fade + peak + lastmillis;
714
loopvrev(dynlights) if(expire>=dynlights[i].expire) { insert = i+1; break; }
722
dynlights.insert(insert, d);
725
void cleardynlights()
728
loopv(dynlights) if(lastmillis<dynlights[i].expire) { faded = i; break; }
729
if(faded<0) dynlights.setsizenodelete(0);
730
else if(faded>0) dynlights.remove(0, faded);
735
closedynlights.setsizenodelete(0);
736
if(maxdynlights) loopvj(dynlights)
738
dynlight &d = dynlights[j];
739
d.dist = camera1->o.dist(d.o) - d.calcradius();
740
if(d.dist>dynlightdist || isvisiblesphere(d.radius, d.o) >= VFC_FOGGED) continue;
742
loopvrev(closedynlights) if(d.dist >= closedynlights[i]->dist) { insert = i+1; break; }
743
if(closedynlights.length()>=maxdynlights)
745
if(insert+1>=maxdynlights) continue;
746
closedynlights.drop();
748
closedynlights.insert(insert, &d);
750
return closedynlights.length();
753
void dynlightreaching(const vec &target, vec &color, vec &dir)
755
vec dyncolor(0, 0, 0);//, dyndir(0, 0, 0);
758
dynlight &d = dynlights[i];
761
float mag = ray.magnitude(), radius = d.calcradius();
762
if(radius<=0 || mag >= radius) continue;
763
float intensity = d.intensity()*(1 - mag/radius);
764
dyncolor.add(vec(d.color).mul(intensity));
765
//dyndir.add(ray.mul(intensity/mag));
771
float x = dyncolor.magnitude(), y = color.magnitude();
776
dir.add(dyndir).div(x+y);
777
if(dir.iszero()) dir = vec(0, 0, 1);
778
else dir.normalize();
785
void setdynlights(vtxarray *va)
787
visibledynlights.setsizenodelete(0);
788
loopv(closedynlights)
790
dynlight &d = *closedynlights[i];
791
if(d.o.dist_to_bb(va->min, va->max) < d.calcradius()) visibledynlights.add(&d);
793
if(visibledynlights.empty()) return;
795
static string vertexparams[MAXDYNLIGHTS] = { "" }, pixelparams[MAXDYNLIGHTS] = { "" };
796
if(!*vertexparams[0]) loopi(MAXDYNLIGHTS)
798
s_sprintf(vertexparams[i])("dynlight%dpos", i);
799
s_sprintf(pixelparams[i])("dynlight%dcolor", i);
802
loopv(visibledynlights)
804
dynlight &d = *visibledynlights[i];
805
setenvparamfv(vertexparams[i], SHPARAM_VERTEX, 10+i, vec4(d.o, 1).sub(ivec(va->x, va->y, va->z).mask(~VVEC_INT_MASK).tovec()).mul(1<<VVEC_FRAC).v);
807
color.mul(2*d.intensity());
808
float radius = d.calcradius();
809
setenvparamf(pixelparams[i], SHPARAM_PIXEL, 10+i, color.x, color.y, color.z, -1.0f/(radius*radius*(1<<(2*VVEC_FRAC))));
704
813
float orientation_tangent [3][4] = { { 0,1, 0,0 }, { 1,0, 0,0 }, { 1,0,0,0 }};
705
814
float orientation_binormal[3][4] = { { 0,0,-1,0 }, { 0,0,-1,0 }, { 0,1,0,0 }};
801
933
if(offset > lastdraw)
803
935
(lastslot->shader->type&SHADER_GLSLANG ? nocolorglslshader : nocolorshader)->set();
804
glDrawElements(GL_TRIANGLES, offset - lastdraw, GL_UNSIGNED_SHORT, lod.ebuf + lastdraw);
936
drawvatris(va, offset-lastdraw, lod.ebuf+lastdraw);
808
939
xtravertsva += va->verts;
943
if(refracting && renderpath!=R_FIXEDFUNCTION)
814
945
float fogplane = refracting - (va->z & ~VVEC_INT_MASK);
815
946
if(cur.fogplane!=fogplane)
817
948
cur.fogplane = fogplane;
818
setfogplane(0.5f, fogplane);
949
setfogplane(1.0f/(1<<VVEC_FRAC), fogplane);
821
952
if(!cur.colormask) { cur.colormask = true; glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); }
823
if(refracting ? va->z+va->size<=refracting-waterfog : va->curvfc==VFC_FOGGED)
954
if(refracting && renderpath!=R_FIXEDFUNCTION ? va->z+va->size<=refracting-waterfog : va->curvfc==VFC_FOGGED)
956
// this case is never reached if called from rendergeommultipass()
825
957
static Shader *fogshader = NULL;
826
958
if(!fogshader) fogshader = lookupshaderbyname("fogworld");
827
959
fogshader->set();
831
963
cur.texture = false;
832
if(renderpath!=R_FIXEDFUNCTION) glDisableClientState(GL_COLOR_ARRAY);
833
glDisable(GL_TEXTURE_2D);
834
glActiveTexture_(GL_TEXTURE1_ARB);
835
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
836
glDisable(GL_TEXTURE_2D);
837
glActiveTexture_(GL_TEXTURE0_ARB);
964
glDisable(GL_TEXTURE_2D);
965
if(pass==RENDERPASS_LIGHTMAP)
967
if(renderpath!=R_FIXEDFUNCTION) glDisableClientState(GL_COLOR_ARRAY);
968
glActiveTexture_(GL_TEXTURE1_ARB);
969
glClientActiveTexture_(GL_TEXTURE1_ARB);
970
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
971
glDisable(GL_TEXTURE_2D);
972
glActiveTexture_(GL_TEXTURE0_ARB);
973
glClientActiveTexture_(GL_TEXTURE0_ARB);
839
glDrawElements(GL_TRIANGLES, 3*lod.tris, GL_UNSIGNED_SHORT, lod.ebuf);
977
drawvatris(va, 3*lod.tris, lod.ebuf);
841
978
vtris += lod.tris;
842
979
vverts += va->verts;
848
985
cur.texture = true;
849
if(renderpath!=R_FIXEDFUNCTION) glEnableClientState(GL_COLOR_ARRAY);
850
glEnable(GL_TEXTURE_2D);
851
glActiveTexture_(GL_TEXTURE1_ARB);
852
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
853
glEnable(GL_TEXTURE_2D);
854
glActiveTexture_(GL_TEXTURE0_ARB);
986
glEnable(GL_TEXTURE_2D);
987
if(pass==RENDERPASS_LIGHTMAP)
989
if(renderpath!=R_FIXEDFUNCTION) glEnableClientState(GL_COLOR_ARRAY);
990
glActiveTexture_(GL_TEXTURE1_ARB);
991
glClientActiveTexture_(GL_TEXTURE1_ARB);
992
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
993
glEnable(GL_TEXTURE_2D);
994
glActiveTexture_(GL_TEXTURE0_ARB);
995
glClientActiveTexture_(GL_TEXTURE0_ARB);
858
if(renderpath!=R_FIXEDFUNCTION)
1000
if(pass==RENDERPASS_LIGHTMAP && renderpath!=R_FIXEDFUNCTION)
860
1002
if(vbufchanged) glColorPointer(3, GL_UNSIGNED_BYTE, VTXSIZE, floatvtx ? &(((fvertex *)va->vbuf)[0].n) : &(va->vbuf[0].n));
861
setenvparamfv("camera", SHPARAM_VERTEX, 4, vec4(camera1->o, 1).sub(ivec(va->x, va->y, va->z).mask(~VVEC_INT_MASK).tovec()).mul(2).v);
1003
setenvparamfv("camera", SHPARAM_VERTEX, 4, vec4(camera1->o, 1).sub(ivec(va->x, va->y, va->z).mask(~VVEC_INT_MASK).tovec()).mul(1<<VVEC_FRAC).v);
1008
if(vbufchanged && pass==RENDERPASS_LIGHTMAP)
866
1010
glClientActiveTexture_(GL_TEXTURE1_ARB);
867
1011
glTexCoordPointer(2, GL_SHORT, VTXSIZE, floatvtx ? &(((fvertex *)va->vbuf)[0].u) : &(va->vbuf[0].u));
920
1072
if(&slot!=lastslot)
922
glBindTexture(GL_TEXTURE_2D, tex->gl);
924
if(renderpath!=R_FIXEDFUNCTION)
1074
if(pass==RENDERPASS_LIGHTMAP || pass==RENDERPASS_COLOR) glBindTexture(GL_TEXTURE_2D, tex->gl);
1075
if(renderpath==R_FIXEDFUNCTION)
1078
if(pass==RENDERPASS_GLOW || maxtmus>=3) loopvj(slot.sts)
1080
Slot::Tex &t = slot.sts[j];
1081
if(t.type==TEX_GLOW && t.combined<0)
1083
if(pass==RENDERPASS_LIGHTMAP)
1085
glActiveTexture_(GL_TEXTURE2_ARB);
1086
if(!mtglow) { glEnable(GL_TEXTURE_2D); mtglow = true; }
1088
glBindTexture(GL_TEXTURE_2D, t.t->gl);
1092
if(pass==RENDERPASS_GLOW && noglow)
1094
loopl(3) ebuf += lod.eslist[i].length[l];
1099
if(noglow) { glActiveTexture_(GL_TEXTURE2_ARB); glDisable(GL_TEXTURE_2D); mtglow = false; }
1100
glActiveTexture_(GL_TEXTURE0_ARB);
1103
else if(pass==RENDERPASS_LIGHTMAP && s)
1105
if(visibledynlights.empty()) s->set(&slot);
1106
else s->variant(visibledynlights.length()-1)->set(&slot);
927
1109
if(s->type&SHADER_NORMALSLMS) tmu++;
928
1110
if(s->type&SHADER_ENVMAP) tmu++;
929
1111
loopvj(slot.sts)
931
1113
Slot::Tex &t = slot.sts[j];
932
if(t.type==TEX_DIFFUSE || t.combined>=0) continue;
1114
if(t.type==TEX_DIFFUSE || t.type==TEX_ENVMAP || t.combined>=0) continue;
933
1115
glActiveTexture_(GL_TEXTURE0_ARB+tmu++);
934
1116
glBindTexture(GL_TEXTURE_2D, t.t->gl);
980
1170
lastscale = scale;
983
if(s->type&SHADER_NORMALSLMS && renderpath!=R_FIXEDFUNCTION)
1173
if(pass==RENDERPASS_LIGHTMAP && s && s->type&SHADER_NORMALSLMS && renderpath!=R_FIXEDFUNCTION)
985
1175
setlocalparamfv("orienttangent", SHPARAM_VERTEX, 2, orientation_tangent[l]);
986
1176
setlocalparamfv("orientbinormal", SHPARAM_VERTEX, 3, orientation_binormal[l]);
989
glDrawElements(GL_TRIANGLES, lod.eslist[i].length[l], GL_UNSIGNED_SHORT, ebuf);
1179
drawvatris(va, lod.eslist[i].length[l], ebuf, lod.eslist[i].minvert[l], lod.eslist[i].maxvert[l]);
990
1180
ebuf += lod.eslist[i].length[l]; // Advance to next array.
1186
glActiveTexture_(GL_TEXTURE2_ARB);
1187
glDisable(GL_TEXTURE_2D);
997
1191
loopi(4) if(envmapped&(1<<i))
1009
1203
VAR(oqdist, 0, 256, 1024);
1010
1204
VAR(zpass, 0, 1, 1);
1205
VAR(glowpass, 0, 1, 1);
1012
1207
extern int ati_texgen_bug;
1209
static void setuptexgen()
1211
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
1212
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
1213
glEnable(GL_TEXTURE_GEN_S);
1214
glEnable(GL_TEXTURE_GEN_T);
1215
if(ati_texgen_bug) glEnable(GL_TEXTURE_GEN_R); // should not be needed, but apparently makes some ATI drivers happy
1218
static void disabletexgen()
1220
glDisable(GL_TEXTURE_GEN_S);
1221
glDisable(GL_TEXTURE_GEN_T);
1222
if(ati_texgen_bug) glDisable(GL_TEXTURE_GEN_R);
1014
1225
void setupTMUs()
1016
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
1017
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
1018
glEnable(GL_TEXTURE_GEN_S);
1019
glEnable(GL_TEXTURE_GEN_T);
1020
if(ati_texgen_bug) glEnable(GL_TEXTURE_GEN_R); // should not be needed, but apparently makes some ATI drivers happy
1022
if(renderpath!=R_FIXEDFUNCTION) glEnableClientState(GL_COLOR_ARRAY);
1231
if(nolights) return;
1026
1235
glActiveTexture_(GL_TEXTURE1_ARB);
1027
1236
glClientActiveTexture_(GL_TEXTURE1_ARB);
1029
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 2.0f);
1238
setuptmu(1, "P * T x 2");
1031
1240
glEnable(GL_TEXTURE_2D);
1033
1241
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
1035
1243
glMatrixMode(GL_TEXTURE);
1037
1245
glScalef(1.0f/SHRT_MAX, 1.0f/SHRT_MAX, 1.0f);
1038
1246
glMatrixMode(GL_MODELVIEW);
1248
if(renderpath==R_FIXEDFUNCTION && maxtmus>=3)
1250
glActiveTexture_(GL_TEXTURE2_ARB);
1253
setuptmu(2, "P + T");
1040
1256
glActiveTexture_(GL_TEXTURE0_ARB);
1041
1257
glClientActiveTexture_(GL_TEXTURE0_ARB);
1043
1259
if(renderpath!=R_FIXEDFUNCTION)
1261
glEnableClientState(GL_COLOR_ARRAY);
1045
1262
loopi(8-2) { glActiveTexture_(GL_TEXTURE2_ARB+i); glEnable(GL_TEXTURE_2D); }
1046
1263
glActiveTexture_(GL_TEXTURE0_ARB);
1047
1264
setenvparamf("ambient", SHPARAM_PIXEL, 5, hdr.ambient/255.0f, hdr.ambient/255.0f, hdr.ambient/255.0f);
1048
setenvparamf("millis", SHPARAM_VERTEX, 6, lastmillis/1000.0f, lastmillis/1000.0f, lastmillis/1000.0f, 0);
1265
setenvparamf("millis", SHPARAM_VERTEX, 6, lastmillis/1000.0f, lastmillis/1000.0f, lastmillis/1000.0f);
1051
glColor4f(1, 1, 1, 1);
1271
glEnable(GL_TEXTURE_2D);
1058
1277
glBindBuffer_(GL_ARRAY_BUFFER_ARB, 0);
1059
1278
glBindBuffer_(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
1064
1283
glDisableClientState(GL_COLOR_ARRAY);
1065
1284
loopi(8-2) { glActiveTexture_(GL_TEXTURE2_ARB+i); glDisable(GL_TEXTURE_2D); }
1285
glActiveTexture_(GL_TEXTURE0_ARB);
1288
if(!nolights) resettmu(0);
1293
if(nolights) return;
1068
1295
glActiveTexture_(GL_TEXTURE1_ARB);
1069
1296
glClientActiveTexture_(GL_TEXTURE1_ARB);
1071
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 1.0f);
1073
1299
glDisable(GL_TEXTURE_2D);
1074
1300
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
1301
glMatrixMode(GL_TEXTURE);
1303
glMatrixMode(GL_MODELVIEW);
1305
if(renderpath==R_FIXEDFUNCTION && maxtmus>=3)
1307
glActiveTexture_(GL_TEXTURE2_ARB);
1310
glDisable(GL_TEXTURE_2D);
1076
1313
glActiveTexture_(GL_TEXTURE0_ARB);
1077
1314
glClientActiveTexture_(GL_TEXTURE0_ARB);
1078
glEnable(GL_TEXTURE_2D);
1080
glDisable(GL_TEXTURE_GEN_S);
1081
glDisable(GL_TEXTURE_GEN_T);
1082
if(ati_texgen_bug) glDisable(GL_TEXTURE_GEN_R);
1086
1318
VAR(showva, 0, 0, 1);
1321
#define FIRSTVA (reflecting && !refracting && camera1->o.z >= reflecting ? reflectedva : visibleva)
1322
#define NEXTVA (reflecting && !refracting && camera1->o.z >= reflecting ? va->rnext : va->next)
1324
void rendergeommultipass(renderstate &cur, int pass)
1327
for(vtxarray *va = FIRSTVA; va; va = NEXTVA)
1329
lodlevel &lod = va->curlod ? va->l1 : va->l0;
1330
if(!lod.texs || va->occluded >= OCCLUDE_GEOM) continue;
1331
if(refracting || (reflecting && camera1->o.z < reflecting))
1333
if(va->curvfc == VFC_FOGGED || (refracting && camera1->o.z >= refracting ? va->min.z > refracting : va->max.z <= refracting)) continue;
1334
if((!hasOQ || !oqfrags) && va->distance > reflectdist) break;
1338
if(va->max.z <= reflecting || (va->rquery && checkquery(va->rquery))) continue;
1339
if(va->rquery && checkquery(va->rquery)) continue;
1341
if(refracting && renderpath!=R_FIXEDFUNCTION ? va->z+va->size<=refracting-waterfog : va->curvfc==VFC_FOGGED) continue;
1342
renderva(cur, va, lod, pass);
1089
1346
void rendergeom()
1091
1348
glEnableClientState(GL_VERTEX_ARRAY);
1093
if(!zpass) setupTMUs();
1350
if(!reflecting && !refracting)
1356
bool doOQ = !refracting && (reflecting ? camera1->o.z >= reflecting && hasOQ && oqfrags && oqreflect : zpass!=0);
1357
if(!doOQ) setupTMUs();
1099
1361
glPushMatrix();
1103
1365
renderstate cur;
1104
for(vtxarray *va = visibleva; va; va = va->next)
1366
for(vtxarray *va = FIRSTVA; va; va = NEXTVA)
1106
1368
lodlevel &lod = va->curlod ? va->l1 : va->l0;
1107
1369
if(!lod.texs) continue;
1108
if(hasOQ && oqfrags && (zpass || va->distance > oqdist) && !insideva(va, camera1->o))
1370
if(refracting || (reflecting && camera1->o.z < reflecting))
1372
if(va->curvfc == VFC_FOGGED || (refracting && camera1->o.z >= refracting ? va->min.z > refracting : va->max.z <= reflecting) || va->occluded >= OCCLUDE_GEOM) continue;
1373
if((!hasOQ || !oqfrags) && va->distance > reflectdist) break;
1377
if(va->max.z <= reflecting) continue;
1380
va->rquery = newquery(&va->rquery);
1381
if(!va->rquery) continue;
1382
if(va->occluded >= OCCLUDE_BB || va->curvfc == VFC_NOT_VISIBLE)
1384
renderquery(cur, va->rquery, va);
1389
else if(hasOQ && oqfrags && (zpass || va->distance > oqdist) && !insideva(va, camera1->o))
1110
1391
if(!zpass && va->query && va->query->owner == va)
1111
1392
va->occluded = checkquery(va->query) ? min(va->occluded+1, OCCLUDE_BB) : OCCLUDE_NOTHING;
1135
1416
va->occluded = OCCLUDE_NOTHING;
1139
if(va->query) startquery(va->query);
1141
renderva(cur, va, lod, zpass!=0);
1143
if(va->query) endquery(va->query);
1421
if(!reflecting) { if(va->query) startquery(va->query); }
1422
else if(camera1->o.z >= reflecting && va->rquery) startquery(va->rquery);
1425
renderva(cur, va, lod, doOQ ? RENDERPASS_Z : (nolights ? RENDERPASS_COLOR : RENDERPASS_LIGHTMAP));
1429
if(!reflecting) { if(va->query) endquery(va->query); }
1430
else if(camera1->o.z >= reflecting && va->rquery) endquery(va->rquery);
1146
1434
if(!cur.colormask) { cur.colormask = true; glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); }
1147
1435
if(!cur.depthmask) { cur.depthmask = true; glDepthMask(GL_TRUE); }
1152
1440
glDepthFunc(GL_LEQUAL);
1182
1479
else glColor3f(1, 1, 1);
1185
renderva(cur, va, lod);
1482
renderva(cur, va, lod, nolights ? RENDERPASS_COLOR : RENDERPASS_LIGHTMAP);
1187
1484
glDepthFunc(GL_LESS);
1489
#define START_ADDITIVE_PASS \
1490
glDepthFunc(GL_LEQUAL); \
1491
glDepthMask(GL_FALSE); \
1492
glEnable(GL_BLEND); \
1493
glBlendFunc(GL_ONE, GL_ONE); \
1494
GLfloat oldfogc[4]; \
1495
glGetFloatv(GL_FOG_COLOR, oldfogc); \
1496
static GLfloat zerofog[4] = { 0, 0, 0, 1 }; \
1497
glFogfv(GL_FOG_COLOR, zerofog);
1499
#define END_ADDITIVE_PASS \
1500
glFogfv(GL_FOG_COLOR, oldfogc); \
1501
glDisable(GL_BLEND); \
1502
glDepthFunc(GL_LESS); \
1503
glDepthMask(GL_TRUE);
1505
if(renderpath==R_FIXEDFUNCTION && maxtmus<3 && glowpass)
1509
rendergeommultipass(cur, RENDERPASS_GLOW);
1194
1518
void findreflectedvas(vector<vtxarray *> &vas, float z, bool refract, bool vfc = true)
1226
1550
void renderreflectedgeom(float z, bool refract)
1228
glEnableClientState(GL_VERTEX_ARRAY);
1235
1552
if(!refract && camera1->o.z >= z)
1237
1554
reflectvfcP(z);
1238
1555
reflectedva = NULL;
1239
1556
findreflectedvas(varoot, z, refract);
1240
bool doOQ = hasOQ && oqfrags && oqreflect;
1241
for(vtxarray *va = reflectedva; va; va = va->rnext)
1243
lodlevel &lod = va->curlod ? va->l1 : va->l0;
1244
if(!lod.texs || va->max.z <= z) continue;
1247
va->rquery = newquery(&va->rquery);
1248
if(!va->rquery) continue;
1249
if(va->occluded >= OCCLUDE_BB || va->curvfc == VFC_NOT_VISIBLE)
1251
renderquery(cur, va->rquery, va);
1255
if(va->rquery) startquery(va->rquery);
1256
renderva(cur, va, lod, doOQ);
1257
if(va->rquery) endquery(va->rquery);
1261
glDepthFunc(GL_LEQUAL);
1262
if(!cur.colormask) { cur.colormask = true; glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); }
1263
if(!cur.depthmask) { cur.depthmask = true; glDepthMask(GL_TRUE); }
1265
for(vtxarray **prevva = &reflectedva, *va = reflectedva; va; prevva = &va->rnext, va = va->rnext)
1267
lodlevel &lod = va->curlod ? va->l1 : va->l0;
1268
if(!lod.texs || va->max.z <= z) continue;
1269
if(va->rquery && checkquery(va->rquery))
1271
if(va->occluded >= OCCLUDE_BB || va->curvfc == VFC_NOT_VISIBLE) *prevva = va->rnext;
1274
renderva(cur, va, lod);
1276
glDepthFunc(GL_LESS);
1282
for(vtxarray *va = visibleva; va; va = va->next)
1284
lodlevel &lod = va->curlod ? va->l1 : va->l0;
1285
if(!lod.texs) continue;
1286
if(va->curvfc == VFC_FOGGED || (refract && camera1->o.z >= z ? va->min.z > z : va->max.z <= z) || va->occluded >= OCCLUDE_GEOM) continue;
1287
if((!hasOQ || !oqfrags) && va->distance > reflectdist) break;
1288
renderva(cur, va, lod);
1296
1563
static GLuint skyvbufGL, skyebufGL;
1317
1584
if(vbufchanged) glVertexPointer(3, floatvtx ? GL_FLOAT : GL_SHORT, VTXSIZE, &(va->vbuf[0].x));
1319
glDrawElements(GL_TRIANGLES, explicitonly ? lod.explicitsky : lod.sky+lod.explicitsky, GL_UNSIGNED_SHORT, explicitonly ? lod.skybuf+lod.sky : lod.skybuf);
1586
drawvatris(va, explicitonly ? lod.explicitsky : lod.sky+lod.explicitsky, explicitonly ? lod.skybuf+lod.sky : lod.skybuf);
1322
1588
if(!explicitonly) xtraverts += lod.sky/3;
1323
1589
xtraverts += lod.explicitsky/3;
1326
void renderreflectedskyvas(vector<vtxarray *> &vas, float z, bool vfc = true)
1592
int renderreflectedskyvas(vector<vtxarray *> &vas, float z, bool vfc = true)
1330
1597
vtxarray *va = vas[i];
1331
1598
lodlevel &lod = va->curlod ? va->l1 : va->l0;
1332
1599
if((vfc && va->curvfc == VFC_FULL_VISIBLE) && va->occluded >= OCCLUDE_BB) continue;
1333
1600
if(va->z+va->size <= z || isvisiblecube(vec(va->x, va->y, va->z), va->size) == VFC_NOT_VISIBLE) continue;
1334
if(lod.sky+lod.explicitsky) renderskyva(va, lod);
1335
if(va->children->length()) renderreflectedskyvas(*va->children, z, vfc && va->curvfc != VFC_NOT_VISIBLE);
1601
if(lod.sky+lod.explicitsky)
1603
renderskyva(va, lod);
1606
if(va->children->length()) rendered += renderreflectedskyvas(*va->children, z, vfc && va->curvfc != VFC_NOT_VISIBLE);
1339
void rendersky(bool explicitonly, float zreflect)
1611
bool rendersky(bool explicitonly, float zreflect)
1341
1613
glEnableClientState(GL_VERTEX_ARRAY);