📄 r_polyse.pas
字号:
{$ELSE}
procedure R_PolysetCalcGradients(skinwidth: Integer);
var
xstepdenominv: Single;
ystepdenominv: Single;
t0, t1: Single;
p01_minus_p21: Single;
p11_minus_p21: Single;
p00_minus_p20: Single;
p10_minus_p20: Single;
begin
p00_minus_p20 := r_p0[0] - r_p2[0];
p01_minus_p21 := r_p0[1] - r_p2[1];
p10_minus_p20 := r_p1[0] - r_p2[0];
p11_minus_p21 := r_p1[1] - r_p2[1];
// xstepdenominv := 1.0 / d_xdenom;
xstepdenominv := d_xdenom;
xstepdenominv := 1.0 / xstepdenominv;
ystepdenominv := -xstepdenominv;
// ceil () for light so positive steps are exaggerated, negative steps
// diminished, pushing us away from underflow toward overflow. Underflow is
// very visible, overflow is very unlikely, because of ambient lighting
t0 := r_p0[4] - r_p2[4];
t1 := r_p1[4] - r_p2[4];
r_lstepx := ceil((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv);
r_lstepy := ceil((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ystepdenominv);
t0 := r_p0[2] - r_p2[2];
t1 := r_p1[2] - r_p2[2];
r_sstepx := Trunc(((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv));
r_sstepy := Trunc(((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ystepdenominv));
t0 := r_p0[3] - r_p2[3];
t1 := r_p1[3] - r_p2[3];
r_tstepx := Trunc(((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv));
r_tstepy := Trunc(((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ystepdenominv));
t0 := r_p0[5] - r_p2[5];
t1 := r_p1[5] - r_p2[5];
r_zistepx := Trunc(((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv));
r_zistepy := Trunc(((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ystepdenominv));
{$IFDEF id386}
if (d_pdrawspans = R_PolysetDrawSpans8_Opaque) then
begin
a_sstepxfrac := _SAL(r_sstepx, 16);
a_tstepxfrac := _SAL(r_tstepx, 16);
end
else
{$ENDIF}
begin
a_sstepxfrac := r_sstepx and $FFFF;
a_tstepxfrac := r_tstepx and $FFFF;
end;
a_ststepxwhole := skinwidth * _SAR(r_tstepx, 16) + _SAR(r_sstepx, 16);
end;
{$ENDIF}
(*
================
R_PolysetDrawThreshSpans8
Random fizzle fade rasterizer
================
*)
procedure R_PolysetDrawThreshSpans8(pspanpackage: spanpackage_p);
var
lcount: Integer;
lpdest: PByte;
lptex: PByte;
lsfrac: Integer;
ltfrac: Integer;
llight: Integer;
lzi: Integer;
lpz: PSmallInt;
begin
repeat
lcount := d_aspancount - pspanpackage^.count;
inc(errorterm, erroradjustup);
if (errorterm >= 0) then
begin
inc(d_aspancount, d_countextrastep);
dec(errorterm, erroradjustdown);
end
else
begin
inc(d_aspancount, ubasestep);
end;
if (lcount <> 0) then
begin
lpdest := pspanpackage^.pdest;
lptex := pspanpackage^.ptex;
lpz := pspanpackage^.pz;
lsfrac := pspanpackage^.sfrac;
ltfrac := pspanpackage^.tfrac;
llight := pspanpackage^.light;
lzi := pspanpackage^.zi;
repeat
if (_SAR(lzi, 16) >= lpz^) then
begin
rand1k_index := (rand1k_index + 1) and MASK_1K;
if (rand1k[rand1k_index] <= r_affinetridesc.vis_thresh) then
begin
lpdest^ := PByteArray(vid.colormap)^[lptex^ + (llight and $FF00)];
lpz^ := _SAR(lzi, 16);
end;
end;
inc(Integer(lpdest), 1);
inc(lzi, r_zistepx);
inc(Integer(lpz), SizeOf(SmallInt));
inc(llight, r_lstepx);
inc(Integer(lptex), a_ststepxwhole);
inc(lsfrac, a_sstepxfrac);
inc(Integer(lptex), _SAR(lsfrac, 16));
lsfrac := lsfrac and $FFFF;
inc(ltfrac, a_tstepxfrac);
if (ltfrac and $10000) <> 0 then
begin
inc(lptex, r_affinetridesc.skinwidth);
ltfrac := ltfrac and $FFFF;
end;
dec(lcount);
until lcount = 0;
end;
inc(Integer(pspanpackage), SizeOf(spanpackage_t));
until (pspanpackage^.count = -999999);
end;
(*
================
R_PolysetDrawSpans8
================
*)
procedure R_PolysetDrawSpans8_33(pspanpackage: spanpackage_p);
var
lcount: Integer;
lpdest: PByte;
lptex: PByte;
lsfrac: Integer;
ltfrac: Integer;
llight: Integer;
lzi: Integer;
lpz: PSmallInt;
temp: Integer;
begin
repeat
lcount := d_aspancount - pspanpackage^.count;
inc(errorterm, erroradjustup);
if (errorterm >= 0) then
begin
inc(d_aspancount, d_countextrastep);
dec(errorterm, erroradjustdown);
end
else
begin
inc(d_aspancount, ubasestep);
end;
if (lcount <> 0) then
begin
lpdest := pspanpackage^.pdest;
lptex := pspanpackage^.ptex;
lpz := pspanpackage^.pz;
lsfrac := pspanpackage^.sfrac;
ltfrac := pspanpackage^.tfrac;
llight := pspanpackage^.light;
lzi := pspanpackage^.zi;
//do
repeat
if (_SAR(lzi, 16) >= lpz^) then
// if (lzi shr 16 >= lpz^) then
begin
temp := PByteArray(vid.colormap)^[lptex^ + (llight and $FF00)];
lpdest^ := PByteArray(vid.alphamap)^[temp + lpdest^ * 256];
end;
inc(integer(lpdest));
inc(lzi, r_zistepx);
inc(Integer(lpz), SizeOf(SmallInt));
inc(llight, r_lstepx);
inc(Integer(lptex), a_ststepxwhole);
inc(lsfrac, a_sstepxfrac);
inc(lptex, _SAR(lsfrac, 16));
lsfrac := lsfrac and $FFFF;
inc(ltfrac, a_tstepxfrac);
if (ltfrac and $10000) <> 0 then
begin
inc(lptex, r_affinetridesc.skinwidth);
ltfrac := ltfrac and $FFFF;
end;
dec(lcount);
until lcount = 0;
end;
inc(Integer(pspanpackage), sizeof(spanpackage_t));
until pspanpackage^.count = -999999;
end;
procedure R_PolysetDrawSpansConstant8_33(pspanpackage: spanpackage_p);
var
lcount: Integer;
lpdest: PByte;
lzi: Integer;
lpz: PSmallInt;
begin
while (pspanpackage^.count <> -999999) do
begin
lcount := d_aspancount - pspanpackage^.count;
Inc(errorterm, erroradjustup);
if (errorterm >= 0) then
begin
Inc(d_aspancount, d_countextrastep);
Dec(errorterm, erroradjustdown);
end
else
begin
Inc(d_aspancount, ubasestep);
end;
if (lcount <> 0) then
begin
lpdest := pspanpackage^.pdest;
lpz := pspanpackage^.pz;
lzi := pspanpackage^.zi;
while (lcount > 0) do
begin
if (_SAR(lzi, 16) >= lpz^) then
lpdest^ := PByte(Integer(vid.alphamap) + (r_aliasblendcolor + lpdest^ * 256))^;
Inc(Integer(lpdest));
Inc(lzi, r_zistepx);
Inc(Integer(lpz), SizeOf(SmallInt));
Dec(lcount);
end;
end;
Inc(Integer(pspanpackage), sizeof(spanpackage_t));
end;
end;
procedure R_PolysetDrawSpans8_66(pspanpackage: spanpackage_p);
var
lcount: Integer;
lpdest: PByte;
lptex: PByte;
lsfrac: Integer;
ltfrac: Integer;
llight: Integer;
lzi: Integer;
lpz: PSmallInt;
temp: Integer;
begin
repeat
lcount := d_aspancount - pspanpackage^.count;
inc(errorterm, erroradjustup);
if (errorterm >= 0) then
begin
inc(d_aspancount, d_countextrastep);
dec(errorterm, erroradjustdown);
end
else
begin
inc(d_aspancount, ubasestep);
end;
if (lcount <> 0) then
begin
lpdest := pspanpackage^.pdest;
lptex := pspanpackage^.ptex;
lpz := pspanpackage^.pz;
lsfrac := pspanpackage^.sfrac;
ltfrac := pspanpackage^.tfrac;
llight := pspanpackage^.light;
lzi := pspanpackage^.zi;
repeat
if (_SAR(lzi, 16) >= lpz^) then
begin
temp := PByteArray(vid.colormap)^[lptex^ + (llight and $FF00)];
lpdest^ := PByteArray(vid.alphamap)^[temp * 256 + lpdest^];
lpz^ := _SAR(lzi, 16);
end;
inc(lpdest);
inc(lzi, r_zistepx);
inc(lpz);
inc(llight, r_lstepx);
inc(lptex, a_ststepxwhole);
inc(lsfrac, a_sstepxfrac);
inc(lptex, _SAR(lsfrac, 16));
lsfrac := lsfrac and $FFFF;
inc(ltfrac, a_tstepxfrac);
if (ltfrac and $10000) <> 0 then
begin
inc(lptex, r_affinetridesc.skinwidth);
ltfrac := ltfrac and $FFFF;
end;
dec(lcount);
until lcount = 0;
end;
inc(Integer(pspanpackage), sizeof(spanpackage_t));
until pspanpackage^.count = -999999;
end;
procedure R_PolysetDrawSpansConstant8_66(pspanpackage: spanpackage_p);
var
lcount: Integer;
lpdest: PByte;
lzi: Integer;
lpz: PSmallInt;
begin
repeat
lcount := d_aspancount - pspanpackage^.count;
Inc(errorterm, erroradjustup);
if (errorterm >= 0) then
begin
Inc(d_aspancount, d_countextrastep);
Dec(errorterm, erroradjustdown);
end
else
begin
Inc(d_aspancount, ubasestep);
end;
if (lcount <> 0) then
begin
lpdest := pspanpackage^.pdest;
lpz := pspanpackage^.pz;
lzi := pspanpackage^.zi;
while (lcount > 0) do
begin
if (_SAR(lzi, 16) >= lpz^) then
lpdest^ := PByte(Integer(vid.alphamap) + (r_aliasblendcolor * 256 + lpdest^))^;
Inc(Integer(lpdest));
Inc(lzi, r_zistepx);
Inc(Integer(lpz), SizeOf(SmallInt));
Dec(lcount);
end;
end;
Inc(Integer(pspanpackage), sizeof(spanpackage_t));
until (pspanpackage^.count = -999999);
end;
{$IFNDEF id386}
procedure R_PolysetDrawSpans8_Opaque(pspanpackage: spanpackage_p);
var
lcount: Integer;
lsfrac: Integer;
ltfrac: Integer;
lpdest: PByte;
lptex: PByte;
llight: Integer;
lzi: Integer;
lpz: PSmallInt;
begin
repeat
lcount := d_aspancount - pspanpackage^.count;
inc(errorterm, erroradjustup);
if (errorterm >= 0) then
begin
inc(d_aspancount, d_countextrastep);
dec(errorterm, erroradjustdown);
end
else
begin
inc(d_aspancount, ubasestep);
end;
if (lcount > 0) then
begin
lpdest := pspanpackage^.pdest;
lptex := pspanpackage^.ptex;
lpz := pspanpackage^.pz;
lsfrac := pspanpackage^.sfrac;
ltfrac := pspanpackage^.tfrac;
llight := pspanpackage^.light;
lzi := pspanpackage^.zi;
repeat
if (_SAR(lzi, 16) >= lpz^) then
begin
//PGM
//try
if (((r_newrefdef.rdflags and RDF_IRGOGGLES) <> 0) and
((currententity^.flags and RF_IR_VISIBLE) <> 0)) then
lpdest^ := PByteArray(vid.colormap)^[irtable[lptex^]]
else
lpdest^ := PByteArray(vid.colormap)^[lptex^ + (llight and $FF00)];
//except
//end;
//PGM
lpz^ := _SAR(lzi, 16);
end;
inc(Integer(lpdest));
inc(lzi, r_zistepx);
inc(Integer(lpz), SizeOf(SmallInt));
inc(llight, r_lstepx);
inc(Integer(lptex), a_ststepxwhole);
inc(lsfrac, a_sstepxfrac);
inc(Integer(lptex), _SAR(lsfrac, 16));
lsfrac := lsfrac and $FFFF;
inc(ltfrac, a_tstepxfrac);
if (ltfrac and $10000) <> 0 then
begin
inc(Integer(lptex), r_affinetridesc.skinwidth);
ltfrac := ltfrac and $FFFF;
end;
dec(lcount);
until lcount = 0;
end;
inc(Integer(pspanpackage), sizeof(spanpackage_t));
until pspanpackage^.count = -999999;
end;
{$ELSE}
procedure R_PolysetDrawSpans8_Opaque(pspanpackage: spanpackage_p);
begin
end;
{$ENDIF}
(*
================
R_PolysetFillSpans8
================
*)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -