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