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

📄 gui3d2.cpp

📁 人工智能遗传算法,经过改进,希望对大家有帮助,常常联系啊.
💻 CPP
📖 第 1 页 / 共 4 页
字号:
				maxY = points[i].y;
	}
	if(minY == maxY)
		return;
	if((lines = new HLINE3D[maxY - minY]) == NULL)
		return;
	rindex = lindex;
	while(points[lindex].y == minY)
		//INDEX_BACKWORD(lindex);
		INDEX_FORWORD(lindex);
	INDEX_BACKWORD(lindex);
	//INDEX_FORWORD(lindex);
	while(points[rindex].y == minY)
		//INDEX_FORWORD(rindex);
		INDEX_BACKWORD(rindex);
	//INDEX_BACKWORD(rindex);
	INDEX_FORWORD(rindex);
	lx1 = points[lindex].x;
	ly1 = points[lindex].y;
	lz1 = points[lindex].z;
	lu1 = points[lindex].u;
	lv1 = points[lindex].v;
	INDEX_FORWORD(lindex);
	//INDEX_BACKWORD(lindex);
	lx2 = points[lindex].x;
	ly2 = points[lindex].y;
	lz2 = points[lindex].z;
	lu2 = points[lindex].u;
	lv2 = points[lindex].v;
	ldy = ly2 - ly1;
	lxadd = (lx2 - lx1)/ldy;
	lzadd = (lz2 - lz1)/ldy;
	luadd = (lu2 - lu1)/ldy;
	lvadd = (lv2 - lv1)/ldy;
	rx1 = points[rindex].x;
	ry1 = points[rindex].y;
	rz1 = points[rindex].z;
	ru1 = points[rindex].u;
	rv1 = points[rindex].v;
	INDEX_BACKWORD(rindex);
	//INDEX_FORWORD(rindex);
	rx2 = points[rindex].x;
	ry2 = points[rindex].y;
	rz2 = points[rindex].z;
	ru2 = points[rindex].u;
	rv2 = points[rindex].v;
	rdy = ry2 - ry1;
	rxadd = (rx2 - rx1)/rdy;
	rzadd = (rz2 - rz1)/rdy;
	ruadd = (ru2 - ru1)/rdy;
	rvadd = (rv2 - rv1)/rdy;
	minY++;
	while(1)
	{	lx1+=lxadd;
		lz1+=lzadd;
		lu1+=luadd;
		lv1+=lvadd;
		rx1+=rxadd;
		rz1+=rzadd;
		ru1+=ruadd;
		rv1+=rvadd;
		x11 = FIXED_TO_LONG(lx1),x22 = FIXED_TO_LONG(rx1)-1;
		long u11,u22,v11,v22,z11,z22;
		u11 = lu1,u22 = ru1,v11 = lv1,v22 = rv1,z11 = lz1,z22 = rz1;
		if(minY>=0&&minY<=height&&x11<=width&&x22>=0&&x22>=x11)
		{	if(x11<0)
			{	long dx=x22-x11;
				u11 = u11-x11*(u22-u11)/dx;
				v11 = v11-x11*(v22-v11)/dx;
				z11 = z11-x11*(z22-z11)/dx;
				x11=0;
			}
			else if(x22>width)
			{	long dx=x22-x11;
				long ddx=x22-width;
				x22=width;
				u22 = u22-ddx*(u22-u11)/dx;
				v22 = v22-ddx*(v22-v11)/dx;
				z22 = z22-ddx*(z22-z11)/dx;
			}
			lines[lineNum].x1 = x11;
			lines[lineNum].z1 = z11;
			lines[lineNum].u1 = u11;
			lines[lineNum].v1 = v11;
			lines[lineNum].x2 = x22;
			lines[lineNum].z2 = z22;
			lines[lineNum].u2 = u22;
			lines[lineNum].v2 = v22;
			lines[lineNum++].y = minY;
		}
		if(minY >= maxY)
			break;
		if(minY == ly2)
		{	do{	
				lx1 = points[lindex].x;
				ly1 = points[lindex].y;
				lz1 = points[lindex].z;
				lu1 = points[lindex].u;
				lv1 = points[lindex].v;
				INDEX_FORWORD(lindex);
				//INDEX_BACKWORD(lindex);
				lx2 = points[lindex].x;
				ly2 = points[lindex].y;
				lz2 = points[lindex].z;
				lu2 = points[lindex].u;
				lv2 = points[lindex].v;
			}while(ly2 == ly1);
			ldy = ly2 - ly1;
			lxadd = (lx2 - lx1)/ldy;
			lzadd = (lz2 - lz1)/ldy;
			luadd = (lu2 - lu1)/ldy;
			lvadd = (lv2 - lv1)/ldy;
		}
		if(minY == ry2)
		{	do{
				rx1 = points[rindex].x;
				ry1 = points[rindex].y;
				rz1 = points[rindex].z;
				ru1 = points[rindex].u;
				rv1 = points[rindex].v;
				INDEX_BACKWORD(rindex);
				//INDEX_FORWORD(rindex);
				rx2 = points[rindex].x;
				ry2 = points[rindex].y;
				rz2 = points[rindex].z;
				ru2 = points[rindex].u;
				rv2 = points[rindex].v;
			}while(ry2 == ry1);
			rdy = ry2 - ry1;
			rxadd = (rx2 - rx1)/rdy;
			rzadd = (rz2 - rz1)/rdy;
			ruadd = (ru2 - ru1)/rdy;
			rvadd = (rv2 - rv1)/rdy;
		}
		minY++;
	}
	WORD* p11,*pm;
	short* p22;
	pm = tex.textures[t->map]->image + tex.textures[t->map]->sectLenth*ll;
	UINT wh = tex.textures[t->map]->width;
	UINT ht = tex.textures[t->map]->height;
	int dx,dz,du,dv,x,z,u,v,y,x2,z2,zadd,uadd,vadd,us,vs;
	for(i = 0;i < lineNum;i++)
	{	x = lines[i].x1;
		z = lines[i].z1;
		u = lines[i].u1;
		v = lines[i].v1;
		x2 = lines[i].x2;
		z2 = lines[i].z2;
		y = lines[i].y;
		dx = x2 - x;
		p22 = p2 + pitch2*y + x;
		p11 = p1 + pitch1*y + x;
		if(FIXED_TO_SHORT(z) < *p22)
		{	*p11 = *(pm+FIXED_TO_SHORT(v)*wh + FIXED_TO_SHORT(u));
			*p22 = FIXED_TO_SHORT(z);
		}
		if(dx <= 0)
		{	continue;
		}
		dz = z2 - z;
		du = lines[i].u2 - u;
		dv = lines[i].v2 - v;
		zadd = dz/dx;
		uadd = du/dx;
		vadd = dv/dx;
/*		while(x <= x2)
		{	if(FIXED_TO_SHORT(z) < *p22)
			{	us = FIXED_TO_SHORT(u);
				vs = FIXED_TO_SHORT(v);
				if(us>=wh)
					us = us%wh;
				if(vs>=ht)
					vs = vs%ht;
				*p11 = *(pm+vs*wh + us);
				*p22 = FIXED_TO_SHORT(z<<1);
			}
			x++;
			p11++;
			p22++;
			z += zadd;
			u += uadd;
			v += vadd;
		}*/
		__asm
		{	push	esi
			push	edi
			mov		ecx,x2
			mov		eax,x
			mov		esi,p11
			mov		edi,p22
			sub		ecx,eax
inLoop:
			mov		eax,z
			mov		ebx,u
			mov		edx,v
			add		esi,2
			add		edi,2
			add		eax,zadd
			add		ebx,uadd
			add		edx,vadd
			mov		z,eax
			mov		u,ebx
			mov		v,edx
			sar		eax,16
			cmp		ax,WORD PTR[edi]
			jge		writeEnd
			mov		WORD PTR[edi],ax
			mov		eax,ebx
			mov		ebx,edx
			sar		eax,16
			mov		edx,0
			sar		ebx,16
			cmp		eax,wh
			jl		checkV
			div		wh
			mov		eax,edx
checkV:
			xchg	eax,ebx
			mov		edx,0
			cmp		eax,ht
			jl		writePixel111
			div		ht
			mov		eax,edx
writePixel111:
			mul		wh
			add		eax,ebx
			mov		edx,pm
			lea		edx,[eax*2+edx]
			mov		ax,WORD PTR[edx]
			mov		WORD PTR[esi],ax			
writeEnd:
			loop	inLoop
loopEnd:
			pop		edi
			pop		esi
		}
	} 
	delete[] lines;
}

inline void fillTriangle3dWithZLT1(DDSURFACEDESC* ddsd,DDSURFACEDESC* ddsdZBuf,CPointList* ppl,TRIANGLE3D* t,UINT ll)
{	long lx1,ly1,lz1,lx2,ly2,lz2,rx1,ry1,rz1,rx2,ry2,rz2,ldx,ldy,ldz,rdx,rdy,rdz;
	long minY,maxY,lindex,rindex,lxadd,lzadd,rxadd,rzadd,uvtp;
	long luds,lua,lvds,lva,ruds,rua,rvds,rva,lza,lzds,rza,rzds;
	long lu1,lv1,lu2,lv2,ru1,rv1,ru2,rv2,ldu,ldv,rdu,rdv;
	long i,x11,x22,num = 3,lineNum = 0;
	long mapWidth,mapHeight;
	POINT3D_INT2 points[3];
	POINT3D* p3d;
	HLINE3D* lines;
	WORD color = lightLevel[ll];
	if(t->maped == FALSE)
	{	fillTriangle3dWithZ(ddsd,ddsdZBuf,ppl,t,color);
		return;
	}
//	if(tex.textures[t->map]->level == FALSE)
//		return;
	//ofstream ofs("c:\\tp.txt");
	long width=ddsd->dwWidth-1,width1=ddsd->dwWidth,height=ddsd->dwHeight-1;
	long pitch1 = ddsd->lPitch>>1;
	long pitch2 = ddsdZBuf->lPitch>>1;
	WORD* p1=(WORD*)ddsd->lpSurface;
	short* p2=(short*)ddsdZBuf->lpSurface;
	mapWidth = tex.textures[t->map]->width-1;
	mapHeight = tex.textures[t->map]->height-1;
	p3d = &ppl->points[t->p1];
	points[0].x = FLOAT_TO_FIXED(p3d->x), points[0].y = (long)p3d->y, points[0].z = FLOAT_TO_FIXED(p3d->z);
	points[0].u = FLOAT_TO_FIXED(t->u1*mapWidth), points[0].v = FLOAT_TO_FIXED(t->v1*mapHeight);
	p3d = &ppl->points[t->p2];
	points[1].x = FLOAT_TO_FIXED(p3d->x), points[1].y = (long)p3d->y, points[1].z = FLOAT_TO_FIXED(p3d->z);
	points[1].u = FLOAT_TO_FIXED(t->u2*mapWidth), points[1].v = FLOAT_TO_FIXED(t->v2*mapHeight);
	p3d = &ppl->points[t->p3];
	points[2].x = FLOAT_TO_FIXED(p3d->x), points[2].y = (long)p3d->y, points[2].z = FLOAT_TO_FIXED(p3d->z);
	points[2].u = FLOAT_TO_FIXED(t->u3*mapWidth), points[2].v = FLOAT_TO_FIXED(t->v3*mapHeight);
	rindex = lindex = 0;
	maxY=minY=points[0].y;
	for(i=0;i<num;i++)
	{	if(points[i].y<minY)
			minY = points[lindex = i].y;
		else if(points[i].y > maxY)
				maxY = points[i].y;
	}
	if(minY == maxY)
		return;
	if((lines = new HLINE3D[maxY - minY]) == NULL)
		return;
	rindex = lindex;
	while(points[lindex].y == minY)
		//INDEX_BACKWORD(lindex);
		INDEX_FORWORD(lindex);
	INDEX_BACKWORD(lindex);
	//INDEX_FORWORD(lindex);
	while(points[rindex].y == minY)
		//INDEX_FORWORD(rindex);
		INDEX_BACKWORD(rindex);
	//INDEX_BACKWORD(rindex);
	INDEX_FORWORD(rindex);
	lx1 = points[lindex].x;
	ly1 = points[lindex].y;
	lz1 = points[lindex].z;
	lu1 = points[lindex].u;
	lv1 = points[lindex].v;
	INDEX_FORWORD(lindex);
	//INDEX_BACKWORD(lindex);
	lx2 = points[lindex].x;
	ly2 = points[lindex].y;
	lz2 = points[lindex].z;
	lu2 = points[lindex].u;
	lv2 = points[lindex].v;
	ldx = lx2 - lx1;
	ldy = ly2 - ly1;
	ldz = lz2 - lz1;
	ldu = lu2 - lu1;
	ldv = lv2 - lv1;
	lxadd = ldx/ldy;
//	lzadd = ldz/ldy;
	uvtp = fixedDiv((lz2-lz1)*2,lz2+lz1)/ldy;
	lua = fixedMul(uvtp,ldu)/ldy;
	lva = fixedMul(uvtp,ldv)/ldy;
	lza = fixedMul(uvtp,ldz)/ldy;
	uvtp = fixedDiv(lz1*2,lz1+lz2)/ldy;
	luds = fixedMul(ldu,uvtp) - lua/2;
	lvds = fixedMul(ldv,uvtp) - lva/2;
	lzds = fixedMul(ldz,uvtp) - lza/2;
	rx1 = points[rindex].x;
	ry1 = points[rindex].y;
	rz1 = points[rindex].z;
	ru1 = points[rindex].u;
	rv1 = points[rindex].v;
	INDEX_BACKWORD(rindex);
	//INDEX_FORWORD(rindex);
	rx2 = points[rindex].x;
	ry2 = points[rindex].y;
	rz2 = points[rindex].z;
	ru2 = points[rindex].u;
	rv2 = points[rindex].v;
	rdx = rx2 - rx1;
	rdy = ry2 - ry1;
	rdz = rz2 - rz1;
	rdu = ru2 - ru1;
	rdv = rv2 - rv1;
	rxadd = rdx/rdy;
//	rzadd = rdz/rdy;
	uvtp = fixedDiv((rz2-rz1)*2,rz2+rz1)/rdy;
	rua = fixedMul(uvtp,rdu)/rdy;
	rva = fixedMul(uvtp,rdv)/rdy;
	rza = fixedMul(uvtp,rdz)/rdy;
	uvtp = fixedDiv(rz1*2,rz1+rz2)/rdy;
	ruds = fixedMul(rdu,uvtp) - rua/2;
	rvds = fixedMul(rdv,uvtp) - rva/2;
	rzds = fixedMul(rdz,uvtp) - rza/2;
	minY++;
	while(1)
	{	lx1+=lxadd;
//		lz1+=lzadd;
		luds += lua;
		lvds += lva;
		lzds += lza;
		lu1+=luds;
		lv1+=lvds;
		lz1+=lzds;
		rx1+=rxadd;
//		rz1+=rzadd;
		ruds += rua;
		rvds += rva;
		rzds += rza;
		ru1+=ruds;
		rv1+=rvds;
		rz1+=rzds;
		x11 = FIXED_TO_LONG(lx1),x22 = FIXED_TO_LONG(rx1) - 1;
		if(minY>=0&&minY<=height&&x11<=width&&x22>=0&&x22>=x11)
		{	if(x11<0)
				x11=0;
			if(x22>width)
				x22=width;
			lines[lineNum].x1 = x11;
			lines[lineNum].z1 = lz1;
			lines[lineNum].u1 = lu1;
			lines[lineNum].v1 = lv1;
			lines[lineNum].x2 = x22;
			lines[lineNum].z2 = rz1;
			lines[lineNum].u2 = ru1;
			lines[lineNum].v2 = rv1;
			lines[lineNum++].y = minY;
		}
		if(minY >= maxY)
			break;
		if(minY == ly2)
		{	do{	
				lx1 = points[lindex].x;
				ly1 = points[lindex].y;
				lz1 = points[lindex].z;
				lu1 = points[lindex].u;
				lv1 = points[lindex].v;
				INDEX_FORWORD(lindex);
				//INDEX_BACKWORD(lindex);
				lx2 = points[lindex].x;
				ly2 = points[lindex].y;
				lz2 = points[lindex].z;
				lu2 = points[lindex].u;
				lv2 = points[lindex].v;
			}while(ly2 == ly1);
			ldx = lx2 - lx1;
			ldy = ly2 - ly1;
			ldz = lz2 - lz1;
			ldu = lu2 - lu1;
			ldv = lv2 - lv1;
			lxadd = ldx/ldy;
//			lzadd = ldz/ldy;
			uvtp = fixedDiv((lz2-lz1)*2,lz2+lz1)/ldy;
			lua = fixedMul(uvtp,ldu)/ldy;
			lva = fixedMul(uvtp,ldv)/ldy;
			lza = fixedMul(uvtp,ldz)/ldy;
			uvtp = fixedDiv(lz1*2,lz1+lz2)/ldy;
			luds = fixedMul(ldu,uvtp) - lua/2;
			lvds = fixedMul(ldv,uvtp) - lva/2;
			lzds = fixedMul(ldz,uvtp) - lza/2;
		}
		if(minY == ry2)
		{	do{
				rx1 = points[rindex].x;
				ry1 = points[rindex].y;
				rz1 = points[rindex].z;
				ru1 = points[rindex].u;
				rv1 = points[rindex].v;
				INDEX_BACKWORD(rindex);
				//INDEX_FORWORD(rindex);
				rx2 = points[rindex].x;
				ry2 = points[rindex].y;
				rz2 = points[rindex].z;
				ru2 = points[rindex].u;
				rv2 = points[rindex].v;
			}while(ry2 == ry1);
			rdx = rx2 - rx1;
			rdy = ry2 - ry1;
			rdz = rz2 - rz1;
			rdu = ru2 - ru1;
			rdv = rv2 - rv1;
			rxadd = rdx/rdy;
//			rzadd = rdz/rdy;
			uvtp = fixedDiv((rz2-rz1)*2,rz2+rz1)/rdy;
			rua = fixedMul(uvtp,rdu)/rdy;
			rva = fixedMul(uvtp,rdv)/rdy;
			rza = fixedMul(uvtp,rdz)/rdy;
			uvtp = fixedDiv(rz1*2,rz1+rz2)/rdy;
			ruds = fixedMul(rdu,uvtp) - rua/2;
			rvds = fixedMul(rdv,uvtp) - rva/2;
			rzds = fixedMul(rdz,uvtp) - rza/2;
		}
		minY++;
	}
	WORD* p11,*pm;
	short* p22;
	pm = tex.textures[t->map]->image + tex.textures[t->map]->sectLenth*ll;
	UINT wh = tex.textures[t->map]->width;
	int dx,dz,du,dv,x,z,u,v,y,x2,z2,u2,v2,zadd,uds,ua,vds,va,uadd,vadd;
	for(i = 0;i < lineNum;i++)
	{	x = lines[i].x1;
		z = lines[i].z1;
		u = lines[i].u1;
		v = lines[i].v1;
		x2 = lines[i].x2;
		z2 = lines[i].z2;
		u2 = lines[i].u2;
		v2 = lines[i].v2;
		y = lines[i].y;
		dx = x2 - x;
		dz = z2 - z;
		du = u2 - u;
		dv = v2 - v;
		p22 = p2 + pitch2*y + x;
		p11 = p1 + pitch1*y + x;
		if(FIXED_TO_SHORT(z) < *p22)
		{	*p11 = *(pm+FIXED_TO_SHORT(v)*wh + FIXED_TO_SHORT(u));
			*p22 = FIXED_TO_SHORT(z);
		}
		if(dx <= 0)
		{	continue;
		}
		zadd = dz/dx;
		uvtp = fixedDiv(zadd*2,z2+z);
		ua = fixedMul(uvtp,du)/dx;
		va = fixedMul(uvtp,dv)/dx;
		uvtp = fixedDiv(z*2,z+z2)/dx;
		uds = fixedMul(du,uvtp) - ua/2;
		vds = fixedMul(dv,uvtp) - va/2;
	//	uadd = du/dx;
	//	vadd = dv/dx;
		while(x < x2)
		{	x++;
			p11++;
			p22++;
			z += zadd;
			uds += ua;
			vds += va;
			u+=uds;
			v+=vds;
	//		u += uadd;
	//		v += vadd;
			if(FIXED_TO_SHORT(z) < *p22)
			{	*p11 = *(pm+FIXED_TO_SHORT(v)*wh + FIXED_TO_SHORT(u));
				*p22 = FIXED_TO_SHORT(z);
			}
		}
	}
	delete[] lines;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -