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

📄 gui3d2.cpp

📁 人工智能遗传算法,经过改进,希望对大家有帮助,常常联系啊.
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			uf += uadd*tp;
			uf1 = long(uf*zzz);
			vf += vadd*tp;
			vf1 = long(vf*zzz);
			x = 0;
		}
		if(x2 > width)
		{	x2 = width;
		}
		dx = x2 - x;
		p22 = p2 + pitch2*y + x;
		p11 = p1 + pitch1*y + x;
		if(FIXED_TO_SHORT(zf1) < *p22)
		{	*p11 = *(pm+FIXED_TO_SHORT(vf1)*wh + FIXED_TO_SHORT(uf1));
			*p22 = FIXED_TO_SHORT(zf1);
		}
		if(dx <= 0)
		{	continue;
		}
		long step;
		float one = (float)0x00010000;
/*		while(x < x2)
		{	if((x+16)<x2)
				step = 16;
			else
				step = x2 - x;
			zb = zf + zadd * step;
			ub = uf + uadd * step;
			vb = vf + vadd * step;
			zf = zb,uf = ub, vf = vb;
			zb1 = LONG_TO_FIXED(long(((float)1.0)/zb));
			ub1 = LONG_TO_FIXED(long(ub/zb));
			vb1 = LONG_TO_FIXED(long(vb/zb));
			zadd1 = (zb1 - zf1)/step;
			uadd1 = (ub1 - uf1)/step;
			vadd1 = (vb1 - vf1)/step;
			for(long j=0;j<step;j++)
			{	p11++,p22++;
				zf1 += zadd1;
				uf1 += uadd1;
				vf1 += vadd1;
				if(FIXED_TO_SHORT(zf1) < *p22)
				{	*p11 = *(pm+FIXED_TO_SHORT(vf1)*wh + FIXED_TO_SHORT(uf1));
					*p22 = FIXED_TO_SHORT(zf1);
				}
			}
			x += 16;
		}*/
			__asm
			{	push	esi
				push	edi
				mov		eax,x
				mov		ebx,x2
out_loop:
				fld		zadd
				sub		ebx,eax
				mov		step,16
				fld		uadd
				cmp		ebx,16
				jg		stepOK
				mov		step,ebx
stepOK:
				fld		vadd
				fild	step
				fmul	st(3),st(0)
				fmul	st(2),st(0)
				fmulp	st(1),st(0)
				fld		vf
				fld		uf
				fld		zf
				faddp	st(5),st(0)
				faddp	st(3),st(0)
				faddp	st(1),st(0)
				fxch	st(2)
				fst		zf
				fxch	st(1)
				fst		uf
				fxch	st(2)
				fst		vf
				fld		one
				fdivrp	st(2),st(0)
				fmul	st(0),st(1)
				fxch	st(1)
				fmul	st(2),st(0)
				fistp	zb1
				fistp	vb1
				fistp	ub1
				mov		eax,zb1
				mov		ecx,vb1
				mov		ebx,ub1
				sub		eax,zf1
				sub		ebx,uf1
				mov		esi,step
				cdq
				sub		ecx,vf1
				idiv	esi
				xchg	eax,ebx
				cdq
				mov		zadd1,ebx
				idiv	esi
				xchg	eax,ecx
				cdq
				idiv	esi
				mov		uadd1,ecx
				mov		vadd1,eax
				mov		ecx,esi
				mov		ebx,p11
				mov		esi,p22
in_loop1:
				mov		edx,zf1
				mov		eax,vf1
				mov		edi,uf1
in_loop2:		
				add		edx,zadd1
				add		eax,vadd1
				add		edi,uadd1
				add		ebx,2
				add		esi,2
				mov		zf1,edx
				mov		vf1,eax
				mov		uf1,edi
				sar		edx,16
				cmp		dx,WORD PTR [esi]
				jge		short writeEnd
				sar		eax,16
				mov		WORD PTR [esi],dx
				sar		edi,16
				imul	wh
				add		eax,edi
				mov		edx,pm
				mov		edi,uf1
				lea		edx,[eax*2+edx]
				mov		ax,WORD PTR[edx]
				mov		edx,zf1
				mov		WORD PTR[ebx],ax
				mov		eax,vf1				
				loop	in_loop2
				jmp		short loopEnd
writeEnd:		
				loop	in_loop1
loopEnd:
				add		x,16
				mov		p11,ebx
				mov		p22,esi
				mov		eax,x
				mov		ebx,x2
				cmp		eax,ebx
				jl		out_loop
				pop		edi
				pop		esi
			}
	}
	delete[] lines;
}

inline void fillTriangle3dWithT1(DDSURFACEDESC* ddsd,CPointList* ppl,TRIANGLE3D* t,WORD color)
{	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;
//	if(t->maped == FALSE)
//	{	fillTriangle3d(ddsd,ppl,t,color);
//		return;
//	}
	long width=ddsd->dwWidth-1,width1=ddsd->dwWidth,height=ddsd->dwHeight-1;
	long pitch1 = ddsd->lPitch>>1;
	WORD* p1=(WORD*)ddsd->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(ldz*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(rdz*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(ldz*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(rdz*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;
	UINT wh = tex.textures[t->map]->width;
	int dx,dz,du,dv,x,z,u,v,y,x2,z2,zadd,uds,ua,vds,va,uadd,vadd,lps;
	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;
		p11 = p1 + pitch1*y + x;
		*p11 = *(pm+FIXED_TO_SHORT(v)*wh + FIXED_TO_SHORT(u));
		if(dx <= 0)
		{	continue;
		}
		dz = lines[i].z2 - z;
		du = lines[i].u2 - u;
		dv = lines[i].v2 - v;
		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++;
			uds += ua;
			vds += va;
			u+=uds;
			v+=vds;
//			u += uadd;
//			v += vadd;
			*p11 = *(pm+FIXED_TO_SHORT(v)*wh + FIXED_TO_SHORT(u));
		}*/
		__asm
		{	push	esi
			push	edi
			mov		eax,x2
			mov		edx,x
			mov		ebx,p11
			sub		eax,edx
			mov		ecx,eax
			jz		short loopOut
			mov		edi,ua
			mov		esi,va
inLoopTop:
			mov		eax,uds
			mov		edx,vds
			add		ebx,2
			add		eax,edi
			mov		edi,v
			add		edx,esi
			mov		esi,u
			mov		uds,eax
			mov		vds,edx
			add		edi,edx
			add		esi,eax
			mov		eax,wh
			sub		edx,edx
			mov		v,edi
			mov		u,esi
			sar		edi,16
			sar		esi,16
			imul	edi
			mov		edx,pm
			add		eax,esi
			mov		esi,va
			mov		edi,ua
			lea		edx,[eax*2+edx]
			dec		ecx
			mov		ax,WORD PTR [edx]
			mov		WORD PTR [ebx],ax
			jnz		short inLoopTop
loopOut:
			pop		edi
			pop		esi
		}
	}
	delete[] lines;
}

#pragma warning( disable : 4035 )
inline long fixedMul(long a,long b)
{	__asm
	{	mov		eax,a
		mov		ebx,b
		imul	ebx
		shrd	eax,edx,16
	}
}



inline long fixedDiv(long a,long b)
{	__asm
	{	mov		eax,a
		cdq
		shld	edx,eax,16
		sal		eax,16
		mov		ebx,b
		idiv	ebx
	}
}

inline void fillTriangle3dWithZLT(DDSURFACEDESC* ddsd,DDSURFACEDESC* ddsdZBuf,CPointList* ppl,TRIANGLE3D* t,UINT ll)
{	long lx1,ly1,lz1,lx2,ly2,lz2,rx1,ry1,rz1,rx2,ry2,rz2,ldy,rdy;
	long minY,maxY,lindex,rindex,lxadd,lzadd,rxadd,rzadd;
	long luadd,ruadd,lvadd,rvadd;
	long lu1,lv1,lu2,lv2,ru1,rv1,ru2,rv2;
	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;
	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)

⌨️ 快捷键说明

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