📄 gui3d2.cpp
字号:
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 + -