⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bfgrounddrawer.cpp

📁 这是整套横扫千军3D版游戏的源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				// 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 + -