📄 render.cpp
字号:
}
plist[j] =Render_OrthoWorldToView(Cam, &b->Faces[i].Points[0]);
Polyline(ViewDC, plist, j+1);
}
}
*/
//come back to this later
#pragma warning (disable:4100)
static void FillBackSpans(ViewVars *Cam)
{
/*
long i;
Node Dummy;
RenderFace Clipped, Unclipped, TempFace;
Plane dp;
memset(&Dummy, 0, sizeof(Node));
// Dummy.Faces=(Face *)geRam_Allocate(sizeof(Face));
// memset(Dummy.Faces, 0, sizeof(Face));
geVec3d_Subtract(&VecOrigin, &Cam->Vpn, &dp.Normal);
dp.Dist =-geVec3d_DotProduct(&Cam->Vpn, &Cam->CamPos)-5.0f;
Node_CreateFromPlane(&Dummy, &dp);
Dummy.Faces->Tex.Dib =0xffff;
if(ClipToFrustum(Dummy.Faces, &TempFace, Cam))
{
for(i=0;i < TempFace.NumPoints;i++)
Clipped.Points[i] =Render_XFormVert(Cam, &TempFace.Points[i]);
for(i=0;i < Dummy.Faces->NumPoints;i++)
Unclipped.Points[i] =Render_XFormVert(Cam, &Dummy.Faces->Points[i]);
Clipped.NumPoints =TempFace.NumPoints;
Unclipped.NumPoints =Dummy.Faces->NumPoints;
AddNodeEdges(&Dummy, 0, &Clipped, &Unclipped, 1, Cam, NORMAL);
}
geRam_Free (Dummy.Faces->Points);
geRam_Free (Dummy.Faces);
*/
}
#pragma warning (default:4100)
//standard error term line draw with zbuffering
static void Render_LineZBuffer(int xa, int ya, geFloat za,
int xb, int yb, geFloat zb,
uint16 color, ViewVars *Cam)
{
int dx, dy;
short pos;
int g, r, c, inc1, inc2, f;
uint32 zai, dz, *tz;
uint16 *td;
dy =yb - ya;
if(dy==0)
{
//Horizontal lines
if(xb < xa)
{
dz =(uint32)(((za - zb)/((geFloat)(xa-xb))) * FixedScale);
zai =(uint32)(zb * FixedScale);
tz =(uint32 *)(Cam->pZBuffer + (ya * Cam->Width) + xb);
td =((uint16 *)Cam->pBits) + (ya * Cam->Width) + xb;
for(;xb <= xa;xb++)
{
if(*tz > zai)
{
*td =color;
*tz =zai;
}
td++;
tz++;
zai +=dz;
}
}
else
{
dz =(uint32)(((zb - za)/((geFloat)(xb-xa))) * FixedScale);
zai =(uint32)(za * FixedScale);
tz =(uint32 *)(Cam->pZBuffer + (ya * Cam->Width) + xa);
td =((uint16 *)Cam->pBits) + (ya * Cam->Width) + xa;
for(;xa <= xb;xa++)
{
if(*tz > zai)
{
*td =color;
*tz =zai;
}
td++;
tz++;
zai +=dz;
}
}
return;
}
dx =xb - xa;
if(dx==0)
{
//Vertical Lines
if (yb < ya)
{
dz =(uint32)(((za - zb)/((geFloat)(ya-yb))) * FixedScale);
zai =(uint32)(zb * FixedScale);
tz =(uint32 *)(Cam->pZBuffer + (yb * Cam->Width) + xb);
td =((uint16 *)Cam->pBits) + (yb * Cam->Width) + xb;
for(;yb <= ya;yb++)
{
if(*tz > zai)
{
*td =color;
*tz =zai;
}
td +=Cam->Width;
tz +=Cam->Width;
zai +=dz;
}
}
else
{
dz =(uint32)(((zb - za)/((geFloat)(yb-ya))) * FixedScale);
zai =(uint32)(za * FixedScale);
tz =(uint32 *)(Cam->pZBuffer + (ya * Cam->Width) + xb);
td =((uint16 *)Cam->pBits) + (ya * Cam->Width) + xb;
for(;ya <= yb;ya++)
{
if(*tz > zai)
{
*td =color;
*tz =zai;
}
td +=Cam->Width;
tz +=Cam->Width;
zai +=dz;
}
}
return;
}
if(dx > 0)
{
if(dy < 0)
{
pos =0;
}
else
{
pos =1;
}
}
else
{
if(dy < 0)
{
pos =1;
}
else
{
pos =0;
}
}
if(abs(dx) > abs(dy))
{
if(dx > 0)
{
c =xa;
r =ya;
f =xb;
dz =(uint32)(((zb - za)/((geFloat)(xb-xa))) * FixedScale);
zai =(uint32)(za * FixedScale);
tz =(uint32 *)(Cam->pZBuffer + (ya * Cam->Width) + xa);
td =((uint16 *)Cam->pBits) + (ya * Cam->Width) + xa;
}
else
{
c =xb;
r =yb;
f =xa;
dz =(uint32)(((za - zb)/((geFloat)(xa-xb))) * FixedScale);
zai =(uint32)(zb * FixedScale);
tz =(uint32 *)(Cam->pZBuffer + (yb * Cam->Width) + xb);
td =((uint16 *)Cam->pBits) + (yb * Cam->Width) + xb;
}
inc1=abs(dy + dy);
g =abs(dy) * 2 - abs(dx);
inc2=(abs(dy) - abs(dx)) * 2;
if(pos)
{
while(c <= f)
{
if(*tz > zai)
{
*td =color;
*tz =zai;
}
td++;
tz++;
zai +=dz;
c++;
if(g >= 0)
{
r++;
g +=inc2;
td +=Cam->Width;
tz +=Cam->Width;
}
else
{
g +=inc1;
}
}
return;
}
else
{
while(c <= f)
{
if(*tz > zai)
{
*td =color;
*tz =zai;
}
zai +=dz;
c++;
td++;
tz++;
if(g > 0)
{
r--;
g +=inc2;
td -=Cam->Width;
tz -=Cam->Width;
}
else
{
g +=inc1;
}
}
return;
}
}
else
{
if(dy > 0)
{
c =ya;
r =xa;
f =yb;
dz =(uint32)(((zb - za)/((geFloat)(yb-ya))) * FixedScale);
zai =(uint32)(za * FixedScale);
tz =(uint32 *)(Cam->pZBuffer + (ya * Cam->Width) + xa);
td =((uint16 *)Cam->pBits) + (ya * Cam->Width) + xa;
}
else
{
c =yb;
r =xb;
f =ya;
dz =(uint32)(((za - zb)/((geFloat)(ya-yb))) * FixedScale);
zai =(uint32)(zb * FixedScale);
tz =(uint32 *)(Cam->pZBuffer + (yb * Cam->Width) + xb);
td =((uint16 *)Cam->pBits) + (yb * Cam->Width) + xb;
}
inc1 =abs(dx + dx);
g =abs(dx) * 2 - abs(dy);
inc2 =(abs(dx) - abs(dy)) * 2;
if(pos)
{
if(c <= f)
{
if(*tz > zai)
{
*td =color;
*tz =zai;
}
LOOP3:
td +=Cam->Width;
tz +=Cam->Width;
zai +=dz;
c++;
if(g >= 0)
{
r++;
g +=inc2;
td++;
tz++;
if(c > f)
{
goto EXIT_LOOP3;
}
if(*tz > zai)
{
*td =color;
*tz =zai;
}
zai +=dz;
}
else
{
g +=inc1;
if(c > f)
{
goto EXIT_LOOP3;
}
if(*tz > zai)
{
*td =color;
*tz =zai;
}
zai +=dz;
}
goto LOOP3;
EXIT_LOOP3:
;
}
return;
}
else
{
if(c <= f)
{
if(*tz > zai)
{
*td =color;
*tz =zai;
}
LOOP4:
td +=Cam->Width;
tz +=Cam->Width;
zai +=dz;
c++;
if(g >= 0)
{
r--;
g +=inc2;
td--;
tz--;
if(c > f)
{
goto EXIT_LOOP4;
}
if(*tz > zai)
{
*td =color;
*tz =zai;
}
zai +=dz;
}
else
{
g +=inc1;
if(c > f)
{
goto EXIT_LOOP4;
}
if(*tz > zai)
{
*td =color;
*tz =zai;
}
zai +=dz;
}
goto LOOP4;
EXIT_LOOP4:
;
}
}
}
}
//standard error term line draw
static void Render_Line(int xa, int ya,
int xb, int yb,
uint16 color, ViewVars *Cam)
{
int dx, dy;
short pos;
int g, r, c, inc1, inc2, f;
uint16 *td;
dy =yb - ya;
if(dy==0)
{
//Horizontal lines
if(xb < xa)
{
td =((uint16 *)Cam->pBits) + (ya * Cam->Width) + xb;
for(;xb <= xa;xb++)
{
*td =color;
td++;
}
}
else
{
td =((uint16 *)Cam->pBits) + (ya * Cam->Width) + xa;
for(;xa <= xb;xa++)
{
*td =color;
td++;
}
}
return;
}
dx =xb - xa;
if(dx==0)
{
//Vertical Lines
if (yb < ya)
{
td =((uint16 *)Cam->pBits) + (yb * Cam->Width) + xb;
for(;yb <= ya;yb++)
{
*td =color;
td +=Cam->Width;
}
}
else
{
td =((uint16 *)Cam->pBits) + (ya * Cam->Width) + xb;
for(;ya <= yb;ya++)
{
*td =color;
td +=Cam->Width;
}
}
return;
}
if(dx > 0)
{
if(dy < 0)
{
pos =0;
}
else
{
pos =1;
}
}
else
{
if(dy < 0)
{
pos =1;
}
else
{
pos =0;
}
}
if(abs(dx) > abs(dy))
{
if(dx > 0)
{
c =xa;
r =ya;
f =xb;
td =((uint16 *)Cam->pBits) + (ya * Cam->Width) + xa;
}
else
{
c =xb;
r =yb;
f =xa;
td =((uint16 *)Cam->pBits) + (yb * Cam->Width) + xb;
}
inc1=abs(dy + dy);
g =abs(dy) * 2 - abs(dx);
inc2=(abs(dy) - abs(dx)) * 2;
if(pos)
{
while(c <= f)
{
*td =color;
td++;
c++;
if(g >= 0)
{
r++;
g +=inc2;
td +=Cam->Width;
}
else
{
g +=inc1;
}
}
return;
}
else
{
while(c <= f)
{
*td =color;
c++;
td++;
if(g > 0)
{
r--;
g +=inc2;
td -=Cam->Width;
}
else
{
g +=inc1;
}
}
return;
}
}
else
{
if(dy > 0)
{
c =ya;
r =xa;
f =yb;
td =((uint16 *)Cam->pBits) + (ya * Cam->Width) + xa;
}
else
{
c =yb;
r =xb;
f =ya;
td =((uint16 *)Cam->pBits) + (yb * Cam->Width) + xb;
}
inc1 =abs(dx + dx);
g =abs(dx) * 2 - abs(dy);
inc2 =(abs(dx) - abs(dy)) * 2;
if(pos)
{
if(c <= f)
{
*td =color;
LOOP3:
td +=Cam->Width;
c++;
if(g >= 0)
{
r++;
g +=inc2;
td++;
if(c > f)
{
goto EXIT_LOOP3;
}
*td =color;
}
else
{
g +=inc1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -