📄 bfgrounddrawer.cpp
字号:
// rita yttre begr�snings yta mot n�ta lod
if (maxlx < maxtx && maxlx >= mintx) {
x = maxlx;
for (y = max(ystart - lod, minty); y < min(yend + lod, maxty); y += lod) {
DrawVertexA(x, y );
DrawVertexA(x, y + lod);
if (y % (lod * 2)) {
int idx1 = CLAMP((y ) * heightDataX + x), idx1LOD = CLAMP(idx1 + lod);
int idx2 = CLAMP((y + lod) * heightDataX + x), idx2LOD = CLAMP(idx2 + lod);
int idx3 = CLAMP((y - lod) * heightDataX + x), idx3LOD = CLAMP(idx3 + lod);
float h = ((heightData[idx3LOD] +
heightData[idx2LOD]) * 0.5f) * (1 - camxpart) +
heightData[idx1LOD] * (camxpart);
DrawVertexA(x + lod, y, h);
DrawVertexA(x + lod, y + lod );
} else {
int idx1 = CLAMP((y ) * heightDataX + x), idx1LOD = CLAMP(idx1 + lod);
int idx2 = CLAMP((y + lod ) * heightDataX + x), idx2LOD = CLAMP(idx2 + lod);
int idx3 = CLAMP((y + lod * 2) * heightDataX + x), idx3LOD = CLAMP(idx3 + lod);
float h = (heightData[idx1LOD] +
heightData[idx3LOD]) * 0.5f * (1 - camxpart) +
heightData[idx2LOD] * (camxpart);
DrawVertexA(x + lod, y);
DrawVertexA(x + lod, y + lod, h);
}
EndStrip();
}
}
if (minlx > mintx && minlx < maxtx) {
x = minlx - lod;
for (y = max(ystart - lod, minty); y < min(yend + lod, maxty); y += lod) {
if (y % (lod * 2)) {
int idx1 = CLAMP((y ) * heightDataX + x);
int idx2 = CLAMP((y + lod) * heightDataX + x);
int idx3 = CLAMP((y - lod) * heightDataX + x);
float h = ((heightData[idx3] +
heightData[idx2]) * 0.5f) * (camxpart) +
heightData[idx1] * (1 - camxpart);
DrawVertexA(x, y, h);
DrawVertexA(x, y + lod );
} else {
int idx1 = CLAMP((y ) * heightDataX + x);
int idx2 = CLAMP((y + lod ) * heightDataX + x);
int idx3 = CLAMP((y + lod * 2) * heightDataX + x);
float h = (heightData[idx1] +
heightData[idx3]) * 0.5f * (camxpart) +
heightData[idx2] * (1 - camxpart);
DrawVertexA(x, y);
DrawVertexA(x, y + lod, h);
}
DrawVertexA(x + lod, y );
DrawVertexA(x + lod, y + lod);
EndStrip();
}
}
if (maxly < maxty && maxly > minty) {
y = maxly;
int xs = max(xstart - lod, mintx);
int xe = min(xend + lod, maxtx);
int xtest, xtest2;
std::vector<fline>::iterator fli;
for (fli = left.begin(); fli != left.end(); fli++) {
xtest = ((int) (fli->base / (SQUARE_SIZE) + fli->dir * y )) / lod * lod - lod;
xtest2 = ((int) (fli->base / (SQUARE_SIZE) + fli->dir * (y + lod))) / lod * lod - lod;
if (xtest > xtest2)
xtest = xtest2;
if (xtest > xs)
xs = xtest;
}
for (fli = right.begin(); fli != right.end(); fli++) {
xtest = ((int) (fli->base / (SQUARE_SIZE) + fli->dir * y )) / lod * lod + lod;
xtest2 = ((int) (fli->base / (SQUARE_SIZE) + fli->dir * (y + lod))) / lod * lod + lod;
if (xtest < xtest2)
xtest = xtest2;
if (xtest < xe)
xe = xtest;
}
if (xs < xe) {
x = xs;
if (x % (lod * 2)) {
int idx2 = CLAMP((y + lod) * heightDataX + x),
idx2PLOD = CLAMP(idx2 + lod),
idx2MLOD = CLAMP(idx2 - lod);
float h = ((heightData[idx2MLOD] +
heightData[idx2PLOD]) * 0.5f) * (1 - camypart) +
heightData[idx2 ] * (camypart);
DrawVertexA(x, y);
DrawVertexA(x, y + lod, h);
} else {
DrawVertexA(x, y );
DrawVertexA(x, y + lod);
}
for (x = xs; x < xe; x += lod) {
if (x % (lod * 2)) {
DrawVertexA(x + lod, y );
DrawVertexA(x + lod, y + lod);
} else {
int idx2 = CLAMP((y + lod) * heightDataX + x),
idx2PLOD = CLAMP(idx2 + lod),
idx2PLOD2 = CLAMP(idx2 + 2 * lod);
float h = (heightData[idx2PLOD2] +
heightData[idx2 ]) * 0.5f * (1 - camypart) +
heightData[idx2PLOD ] * (camypart);
DrawVertexA(x + lod, y);
DrawVertexA(x + lod, y + lod, h);
}
}
EndStrip();
}
}
if (minly > minty && minly < maxty) {
y = minly - lod;
int xs = max(xstart - lod, mintx);
int xe = min(xend + lod, maxtx);
int xtest, xtest2;
std::vector<fline>::iterator fli;
for (fli = left.begin(); fli != left.end(); fli++) {
xtest = ((int) (fli->base / (SQUARE_SIZE) + fli->dir * y )) / lod * lod - lod;
xtest2 = ((int) (fli->base / (SQUARE_SIZE) + fli->dir * (y + lod))) / lod * lod - lod;
if (xtest > xtest2)
xtest = xtest2;
if (xtest > xs)
xs = xtest;
}
for (fli = right.begin(); fli != right.end(); fli++) {
xtest = ((int) (fli->base / (SQUARE_SIZE) + fli->dir * y )) / lod * lod + lod;
xtest2 = ((int) (fli->base / (SQUARE_SIZE) + fli->dir * (y + lod))) / lod * lod + lod;
if (xtest < xtest2)
xtest = xtest2;
if (xtest < xe)
xe = xtest;
}
if (xs < xe) {
x = xs;
if (x % (lod * 2)) {
int idx1 = CLAMP((y) * heightDataX + x),
idx1PLOD = CLAMP(idx1 + lod),
idx1MLOD = CLAMP(idx1 - lod);
float h = ((heightData[idx1MLOD] +
heightData[idx1PLOD]) * 0.5f) * (camypart) +
heightData[idx1 ] * (1 - camypart);
DrawVertexA(x, y, h);
DrawVertexA(x, y + lod );
} else {
DrawVertexA(x, y );
DrawVertexA(x, y + lod);
}
for (x = xs; x < xe; x+= lod) {
if (x % (lod * 2)) {
DrawVertexA(x + lod, y );
DrawVertexA(x + lod, y + lod);
} else {
int idx1 = CLAMP((y) * heightDataX + x),
idx1PLOD = CLAMP(idx1 + lod),
idx1PLOD2 = CLAMP(idx1 + 2 * lod);
float h = (heightData[idx1PLOD2] +
heightData[idx1 ]) * 0.5f * (camypart) +
heightData[idx1PLOD ] * (1 - camypart);
DrawVertexA(x + lod, y, h);
DrawVertexA(x + lod, y + lod );
}
}
EndStrip();
}
}
}
DrawGroundVertexArray();
}
}
ResetTextureUnits(drawWaterReflection, overrideVP);
glDisable(GL_CULL_FACE);
if (wireframe) {
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
if (map->voidWater && !drawWater) {
glDisable(GL_ALPHA_TEST);
}
if (map->hasWaterPlane) {
glDisable(GL_TEXTURE_2D);
glColor3f(map->waterPlaneColor.x, map->waterPlaneColor.y, map->waterPlaneColor.z);
glBegin(GL_QUADS); // water color edge of map <0
if (!drawWaterReflection) {
float xsize = gs->mapx * SQUARE_SIZE / 4;
float ysize = gs->mapy * SQUARE_SIZE / 4;
for (y = -4; y < 8; ++y) {
for (int x = -4; x < 8; ++x) {
if (x > 3 || x < 0 || y > 3 || y < 0 || camera->pos.x < 0 || camera->pos.z < 0 || camera->pos.x > float3::maxxpos || camera->pos.z > float3::maxzpos) {
glVertex3f( x * xsize, -200, y * ysize);
glVertex3f((x + 1) * xsize, -200, y * ysize);
glVertex3f((x + 1) * xsize, -200, (y + 1) * ysize);
glVertex3f( x * xsize, -200, (y + 1) * ysize);
}
}
}
}
glEnd();
}
if (groundDecals && !(drawWaterReflection || drawUnitReflection))
groundDecals->Draw();
glEnable(GL_ALPHA_TEST);
glEnable(GL_TEXTURE_2D);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
// sky->SetCloudShadow(1);
// if (drawWaterReflection)
// treeDistance *= 0.5f;
ph->DrawGroundFlashes();
if (treeDrawer->drawTrees) {
if (DrawExtraTex()) {
glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD_SIGNED_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_MODULATE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
glBindTexture(GL_TEXTURE_2D, infoTex);
SetTexGen(1.0f / (gs->pwr2mapx * SQUARE_SIZE), 1.0f / (gs->pwr2mapy * SQUARE_SIZE), 0, 0);
glActiveTextureARB(GL_TEXTURE0_ARB);
}
treeDrawer->Draw(drawWaterReflection || drawUnitReflection);
if (DrawExtraTex()) {
glActiveTextureARB(GL_TEXTURE1_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_TEXTURE_2D);
glActiveTextureARB(GL_TEXTURE0_ARB);
}
}
glDisable(GL_ALPHA_TEST);
glDisable(GL_TEXTURE_2D);
viewRadius = baseViewRadius;
}
void CBFGroundDrawer::DrawShadowPass(void)
{
va = GetVertexArray();
va->Initialize();
// glEnable(GL_CULL_FACE);
bool inStrip=false;
glPolygonOffset(1,1);
glEnable(GL_POLYGON_OFFSET_FILL);
int x,y;
float camxpart=0,oldcamxpart;
float camypart=0,oldcamypart;
glBindProgramARB( GL_VERTEX_PROGRAM_ARB, groundShadowVP );
glEnable( GL_VERTEX_PROGRAM_ARB );
for(int lod=1;lod<(2<<NUM_LODS);lod*=2){
int cx=(int)(camera->pos.x/(SQUARE_SIZE));
int cy=(int)(camera->pos.z/(SQUARE_SIZE));
cx=(cx/lod)*lod;
cy=(cy/lod)*lod;
int hlod=lod>>1;
int ysquaremod=((cy)%(2*lod))/lod;
int xsquaremod=((cx)%(2*lod))/lod;
oldcamxpart=camxpart;
float cx2=(cx/(2*lod))*lod*2;
camxpart=(camera->pos.x/(SQUARE_SIZE)-cx2)/(lod*2);
oldcamypart=camypart;
float cy2=(cy/(2*lod))*lod*2;
camypart=(camera->pos.z/(SQUARE_SIZE)-cy2)/(lod*2);
int minty=0;
int maxty=gs->mapy;
int mintx=0;
int maxtx=gs->mapx;
int minly=cy+(-viewRadius+3-ysquaremod)*lod;
int maxly=cy+(viewRadius-1-ysquaremod)*lod;
int minlx=cx+(-viewRadius+3-xsquaremod)*lod;
int maxlx=cx+(viewRadius-1-xsquaremod)*lod;
int xstart=max(minlx,mintx);
int xend=min(maxlx,maxtx);
int ystart=max(minly,minty);
int yend=min(maxly,maxty);
for(y=ystart;y<yend;y+=lod){
int xs=xstart;
int xe=xend;
for(x=xs;x<xe;x+=lod){
if((lod==1) ||
(x>(cx)+viewRadius*hlod) || (x<(cx)-viewRadius*hlod) ||
(y>(cy)+viewRadius*hlod) || (y<(cy)-viewRadius*hlod)){ //normal terr�g
if(!inStrip){
DrawVertexA(x,y);
DrawVertexA(x,y+lod);
inStrip=true;
}
DrawVertexA(x+lod,y);
DrawVertexA(x+lod,y+lod);
} else { //inre begr�sning mot f�eg�nde lod
if((x>=(cx)+viewRadius*hlod)){
float h1=(heightData[(y)*heightDataX+x]+heightData[(y+lod)*heightDataX+x])*0.5f*(1-oldcamxpart)+heightData[(y+hlod)*heightDataX+x]*(oldcamxpart);
float h2=(heightData[(y)*heightDataX+x]+heightData[(y)*heightDataX+x+lod])*0.5f*(1-oldcamxpart)+heightData[(y)*heightDataX+x+hlod]*(oldcamxpart);
float h3=(heightData[(y+lod)*heightDataX+x]+heightData[(y)*heightDataX+x+lod])*0.5f*(1-oldcamxpart)+heightData[(y+hlod)*heightDataX+x+hlod]*(oldcamxpart);
float h4=(heightData[(y+lod)*heightDataX+x]+heightData[(y+lod)*heightDataX+x+lod])*0.5f*(1-oldcamxpart)+heightData[(y+lod)*heightDataX+x+hlod]*(oldcamxpart);
if(inStrip){
EndStrip();
inStrip=false;
}
DrawVertexA(x,y);
DrawVertexA(x,y+hlod,h1);
DrawVertexA(x+hlod,y,h2);
DrawVertexA(x+hlod,y+hlod,h3);
EndStrip();
DrawVertexA(x,y+hlod,h1);
DrawVertexA(x,y+lod);
DrawVertexA(x+hlod,y+hlod,h3);
DrawVertexA(x+hlod,y+lod,h4);
EndStrip();
DrawVertexA(x+hlod,y+lod,h4);
DrawVertexA(x+lod,y+lod);
DrawVertexA(x+hlod,y+hlod,h3);
DrawVertexA(x+lod,y);
DrawVertexA(x+hlod,y,h2);
EndStrip();
}
if((x<=(cx)-viewRadius*hlod)){
float h1=(heightData[(y)*heightDataX+x+lod]+heightData[(y+lod)*heightDataX+x+lod])*0.5f*(oldcamxpart)+heightData[(y+hlod)*heightDataX+x+lod]*(1-oldcamxpart);
float h2=(heightData[(y)*heightDataX+x]+heightData[(y)*heightDataX+x+lod])*0.5f*(oldcamxpart)+heightData[(y)*heightDataX+x+hlod]*(1-oldcamxpart);
float h3=(heightData[(y+lod)*heightDataX+x]+heightData[(y)*heightDataX+x+lod])*0.5f*(oldcamxpart)+heightData[(y+hlod)*heightDataX+x+hlod]*(1-oldcamxpart);
float h4=(heightData[(y+lod)*heightDataX+x]+heightData[(y+lod)*heightDataX+x+lod])*0.5f*(oldcamxpart)+heightData[(y+lod)*heightDataX+x+hlod]*(1-oldcamxpart);
if(inStrip){
EndStrip();
inStrip=false;
}
DrawVertexA(x+lod,y+hlod,h1);
DrawVertexA(x+lod,y);
DrawVertexA(x+hlod,y+hlod,h3);
DrawVertexA(x+hlod,y,h2);
EndStrip();
DrawVertexA(x+lod,y+lod);
DrawVertexA(x+lod,y+hlod,h1);
DrawVertexA(x+hlod,y+lod,h4);
DrawVertexA(x+hlod,y+hlod,h3);
EndStrip();
DrawVertexA(x+hlod,y,h2);
DrawVertexA(x,y);
DrawVertexA(x+hlod,y+hlod,h3);
DrawVertexA(x,y+lod);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -