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

📄 r_polyse.pas

📁 delphi编的不错的贪吃蛇
💻 PAS
📖 第 1 页 / 共 4 页
字号:
{$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 + -