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

📄 r_polyse.pas

📁 delphi编的不错的贪吃蛇
💻 PAS
📖 第 1 页 / 共 4 页
字号:
{$ALIGN 8}{$MINENUMSIZE 4}
{----------------------------------------------------------------------------}
{                                                                            }
{ File(s): r_polyse.c                                                          }
{                                                                            }
{ Initial conversion by : Michael Skovslund (Michael@skovslund.dk)               }
{ Initial conversion on : 24-Mar-2002                                        }
{                                                                            }
{ This File contains part of convertion of Quake2 source to ObjectPascal.    }
{ More information about this project can be found at:                       }
{ http://www.sulaco.co.za/quake2/                                            }
{                                                                            }
{ Copyright (C) 1997-2001 Id Software, Inc.                                  }
{                                                                            }
{ This program is free software; you can redistribute it and/or              }
{ modify it under the terms of the GNU General Public License                }
{ as published by the Free Software Foundation; either version 2             }
{ of the License, or (at your option) any later version.                     }
{                                                                            }
{ This program is distributed in the hope that it will be useful,            }
{ but WITHOUT ANY WARRANTY; without even the implied warranty of             }
{ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.                       }
{                                                                            }
{ See the GNU General Public License for more details.                       }
{                                                                            }
{----------------------------------------------------------------------------}
{ Updated on : 24-Mar-2002                                                   }
{ Updated by : CodeFusion (Michael@skovslund.dk)                             }
{   Last functions is converted.                                             }
{                                                                            }
{ Updated on : 19-July-2002                                                  }
{ Updated by : CodeFusion (Michael@skovslund.dk)                             }
{   2 functions was forgotten, so now they are implemented :-).              }
{   The functions are:                                                       }
{     procedure R_PolysetDrawSpansConstant8_66(pspanpackage : spanpackage_p);}
{     procedure R_PolysetDrawSpansConstant8_33(pspanpackage : spanpackage_p);}
{                                                                            }
{ Updated on : 21-Aug-2002                                                   }
{ Updated by : Magog (magog@fistofbenztown.de)                               }
{   removed declaration of "r_newrefdef" as it is defined in r_main.pas      }
{                                                                            }
{----------------------------------------------------------------------------}
{ * Still dependent (to compile correctly) on:                               }
{                                                                            }
{----------------------------------------------------------------------------}
{ IMPORTANT NOTES:                                                           }
{ the file "adivtab.pas" has been converted to "adivtab.inc" so the array    }
{ type is kept within this unit eg. I removed the const declaration from     }
{ "adivtab.pas" so it can be included in this source file.                   }
{ Some functions are not found in .c file. The files are:                    }
{ 1. procedure R_PolysetScanLeftEdge(height : Integer);                      }
{ 2. procedure R_DrawNonSubdiv;                                              }
{ These procedures are defined at the buttom of the unit.                    }
{----------------------------------------------------------------------------}
{ * TODO:                                                                    }
{ Fix all the bugs                                                           }
{ 1)                                                                         }
{ 2)                                                                         }
{----------------------------------------------------------------------------}

// r_polyse.c
unit r_polyse;

interface

uses
  r_local,
{$IFNDEF id386}
  ref,
  q_shared,
{$ENDIF}
  SysUtils;

const
  rand1k: array[0..1023] of integer = (
{$INCLUDE rand1k.inc}
    );
  MASK_1K = $3FF;
// TODO: put in span spilling to shrink list size
// !!! if this is changed, it must be changed in d_polysa.s too !!!
  DPS_MAXSPANS = MAXHEIGHT + 1;
         // 1 extra for spanpackage that marks end

type
// !!! if this is changed, it must be changed in asm_draw.h too !!!
  spanpackage_p = ^spanpackage_t;
  spanpackage_t = record
    pdest: Pointer;
    pz: PSmallInt;
    count: Integer;
    ptex: PByte;
    sfrac: Integer;
    tfrac: Integer;
    light: Integer;
    zi: Integer;
  end;
  spanpackage_array_p = ^spanpackage_array;
  spanpackage_array = array[0..(MaxInt div SizeOf(spanpackage_t))-1] of spanpackage_t;
  fixed8_t = Integer;

// Reported missing in action :-)
{$IFNDEF id386}
procedure R_PolysetScanLeftEdge(height: Integer);
{$ENDIF}
// Well, these survieved the "accident".
procedure R_PolysetSetEdgeTable;
procedure R_RasterizeAliasPolySmooth;
procedure R_PolysetCalcGradients(skinwidth: Integer);
procedure R_PolysetScanLeftEdge_C(height: Integer);
procedure R_PolysetDrawSpans8_Opaque(pspanpackage: spanpackage_p);
procedure R_PolysetDrawThreshSpans8(pspanpackage: spanpackage_p);
procedure R_PolysetDrawSpans8_33(pspanpackage: spanpackage_p);
procedure R_PolysetDrawSpans8_66(pspanpackage: spanpackage_p);
procedure R_DrawTriangle;
procedure R_PolysetUpdateTables;
procedure R_PolysetDrawSpansConstant8_66(pspanpackage: spanpackage_p);
procedure R_PolysetDrawSpansConstant8_33(pspanpackage: spanpackage_p);

type
  drawspans_func = procedure(pspanpackage: spanpackage_p);

var
  d_pdrawspans: drawspans_func;
  aliastriangleparms: aliastriangleparms_t;
  d_aflatcolor: Integer;
  iractive: Byte = 0;

implementation

uses
//  Math,
  r_main,
  r_bsp_c,
  adivtab_inc,
  r_alias_c,
  r_edge,
  DelphiTypes,
  r_polysa;

type
  edgetable_p = ^edgetable;
  edgetable = record
    isflattop: Integer;
    numleftedges: Integer;
    pleftedgevert0: PInteger;
    pleftedgevert1: PInteger;
    pleftedgevert2: PInteger;
    numrightedges: Integer;
    prightedgevert0: PInteger;
    prightedgevert1: PInteger;
    prightedgevert2: PInteger;
  end;

// ======================
// PGM
// 64 65 66 67 68 69 70 71   72 73 74 75 76 77 78 79
const
  irtable: array[0..255] of byte = (
    79, 78, 77, 76, 75, 74, 73, 72, // black/white
    71, 70, 69, 68, 67, 66, 65, 64,
    64, 65, 66, 67, 68, 69, 70, 71, // dark taupe
    72, 73, 74, 75, 76, 77, 78, 79,

    64, 65, 66, 67, 68, 69, 70, 71, // slate grey
    72, 73, 74, 75, 76, 77, 78, 79,
    208, 208, 208, 208, 208, 208, 208, 208, // unused?'
    64, 66, 68, 70, 72, 74, 76, 78, // dark yellow

    64, 65, 66, 67, 68, 69, 70, 71, // dark red
    72, 73, 74, 75, 76, 77, 78, 79,
    64, 65, 66, 67, 68, 69, 70, 71, // grey/tan
    72, 73, 74, 75, 76, 77, 78, 79,

    64, 66, 68, 70, 72, 74, 76, 78, // chocolate
    68, 67, 66, 65, 64, 65, 66, 67, // mauve / teal
    68, 69, 70, 71, 72, 73, 74, 75,
    76, 76, 77, 77, 78, 78, 79, 79,

    64, 65, 66, 67, 68, 69, 70, 71, // more mauve
    72, 73, 74, 75, 76, 77, 78, 79,
    64, 65, 66, 67, 68, 69, 70, 71, // olive
    72, 73, 74, 75, 76, 77, 78, 79,

    64, 65, 66, 67, 68, 69, 70, 71, // maroon
    72, 73, 74, 75, 76, 77, 78, 79,
    64, 65, 66, 67, 68, 69, 70, 71, // sky blue
    72, 73, 74, 75, 76, 77, 78, 79,

    64, 65, 66, 67, 68, 69, 70, 71, // olive again
    72, 73, 74, 75, 76, 77, 78, 79,
    64, 65, 66, 67, 68, 69, 70, 71, // nuclear green
    64, 65, 66, 67, 68, 69, 70, 71, // bright yellow

    64, 65, 66, 67, 68, 69, 70, 71, // fire colors
    72, 73, 74, 75, 76, 77, 78, 79,
    208, 208, 64, 64, 70, 71, 72, 64, // mishmash1
    66, 68, 70, 64, 65, 66, 67, 68); // mishmash2
var
  skintable: array[0..MAX_LBM_HEIGHT - 1] of PByte;
  skinwidth: Integer;
  skinstart: PByte;
  rand1k_index: Integer = 0;
  r_p0: array[0..5] of Integer;
  r_p1: array[0..5] of Integer;
  r_p2: array[0..5] of Integer;
// Compiler says it's never used!
//  d_pcolormap         : PByte;
  d_xdenom: Integer;
  pedgetable: edgetable_p;
// FIXME: some of these can become statics
  a_sstepxfrac: Integer;
  a_tstepxfrac: Integer;
  r_lstepx: Integer;
  a_ststepxwhole: Integer;

  r_sstepx: Integer;
  r_tstepx: Integer;
  r_lstepy: Integer;
  r_sstepy: Integer;
  r_tstepy: Integer;

  r_zistepx: Integer;
  r_zistepy: Integer;

  d_aspancount: Integer;
  d_countextrastep: Integer;

  a_spans: spanpackage_p;
  d_pedgespanpackage: spanpackage_p;
  ystart: Integer;
  d_pdest: PByte;
  d_ptex: PByte;
  d_pz: PSmallInt;

  d_sfrac: Integer;
  d_tfrac: Integer;
  d_light: Integer;
  d_zi: Integer;
  d_ptexextrastep: Integer;
  d_sfracextrastep: Integer;

  d_tfracextrastep: Integer;
  d_lightextrastep: Integer;
  d_pdestextrastep: Integer;

  d_lightbasestep: Integer;
  d_pdestbasestep: Integer;
  d_ptexbasestep: Integer;

  d_sfracbasestep: Integer;
  d_tfracbasestep: Integer;

  d_ziextrastep: Integer;
  d_zibasestep: Integer;

  d_pzextrastep: Integer;
  d_pzbasestep: Integer;

const
//  adivtab : array[0..32*32-1] of adivtab_t = (
//    {$include adivtab.inc}
//  );

  edgetables: array[0..11] of edgetable = (
    (isflattop: 0;
    numleftedges: 1;
    pleftedgevert0: @r_p0;
    pleftedgevert1: @r_p2;
    pleftedgevert2: nil;
    numrightedges: 2;
    prightedgevert0: @r_p0;
    prightedgevert1: @r_p1;
    prightedgevert2: @r_p2),
    (isflattop: 0;
    numleftedges: 2;
    pleftedgevert0: @r_p1;
    pleftedgevert1: @r_p0;
    pleftedgevert2: @r_p2;
    numrightedges: 1;
    prightedgevert0: @r_p1;
    prightedgevert1: @r_p2;
    prightedgevert2: nil),
    (isflattop: 1;
    numleftedges: 1;
    pleftedgevert0: @r_p0;
    pleftedgevert1: @r_p2;
    pleftedgevert2: nil;
    numrightedges: 1;
    prightedgevert0: @r_p1;
    prightedgevert1: @r_p2;
    prightedgevert2: nil),
    (isflattop: 0;
    numleftedges: 1;
    pleftedgevert0: @r_p1;
    pleftedgevert1: @r_p0;
    pleftedgevert2: nil;
    numrightedges: 2;
    prightedgevert0: @r_p1;
    prightedgevert1: @r_p2;
    prightedgevert2: @r_p0),
    (isflattop: 0;
    numleftedges: 2;
    pleftedgevert0: @r_p0;
    pleftedgevert1: @r_p2;
    pleftedgevert2: @r_p1;
    numrightedges: 1;
    prightedgevert0: @r_p0;
    prightedgevert1: @r_p1;
    prightedgevert2: nil),
    (isflattop: 0;
    numleftedges: 1;
    pleftedgevert0: @r_p2;
    pleftedgevert1: @r_p1;
    pleftedgevert2: nil;
    numrightedges: 1;
    prightedgevert0: @r_p2;
    prightedgevert1: @r_p0;
    prightedgevert2: nil),
    (isflattop: 0;
    numleftedges: 1;
    pleftedgevert0: @r_p2;
    pleftedgevert1: @r_p1;
    pleftedgevert2: nil;
    numrightedges: 2;
    prightedgevert0: @r_p2;
    prightedgevert1: @r_p0;
    prightedgevert2: @r_p1),
    (isflattop: 0;
    numleftedges: 2;
    pleftedgevert0: @r_p2;
    pleftedgevert1: @r_p1;
    pleftedgevert2: @r_p0;
    numrightedges: 1;
    prightedgevert0: @r_p2;
    prightedgevert1: @r_p0;
    prightedgevert2: nil),
    (isflattop: 0;
    numleftedges: 1;
    pleftedgevert0: @r_p1;
    pleftedgevert1: @r_p0;
    pleftedgevert2: nil;
    numrightedges: 1;
    prightedgevert0: @r_p1;
    prightedgevert1: @r_p2;
    prightedgevert2: nil),
    (isflattop: 1;
    numleftedges: 1;
    pleftedgevert0: @r_p2;
    pleftedgevert1: @r_p1;
    pleftedgevert2: nil;
    numrightedges: 1;
    prightedgevert0: @r_p0;
    prightedgevert1: @r_p1;
    prightedgevert2: nil),
    (isflattop: 1;
    numleftedges: 1;
    pleftedgevert0: @r_p1;
    pleftedgevert1: @r_p0;
    pleftedgevert2: nil;
    numrightedges: 1;
    prightedgevert0: @r_p2;
    prightedgevert1: @r_p0;
    prightedgevert2: nil),
    (isflattop: 0;
    numleftedges: 1;
    pleftedgevert0: @r_p0;
    pleftedgevert1: @r_p2;
    pleftedgevert2: nil;
    numrightedges: 1;
    prightedgevert0: @r_p0;
    prightedgevert1: @r_p1;
    prightedgevert2: nil)
    );

(*
================
R_PolysetUpdateTables
================
*)

procedure R_PolysetUpdateTables;
var
  i: Integer;
  s: PByte;
begin
  if (r_affinetridesc.skinwidth <> skinwidth) or (r_affinetridesc.pskin <> skinstart) then
  begin
    skinwidth := r_affinetridesc.skinwidth;
    skinstart := r_affinetridesc.pskin;
    s := skinstart;
    for I := 0 to MAX_LBM_HEIGHT - 1 do
    begin
      skintable[i] := s;
      Inc(Integer(s), skinwidth);
    end;
  end;
end;

(*
================
R_DrawTriangle
================
*)

procedure R_DrawTriangle;
var
  spans: array[0..DPS_MAXSPANS - 1] of spanpackage_t;
  dv1_ab: Integer;
  dv0_ac: Integer;
  dv0_ab: Integer;
  dv1_ac: Integer;
begin
  FillChar(spans, SizeOf(spans), 0);
	(*
	d_xdenom = ( aliastriangleparms.a->v[1] - aliastriangleparms.b->v[1] ) * ( aliastriangleparms.a->v[0] - aliastriangleparms.c->v[0] ) -
			   ( aliastriangleparms.a->v[0] - aliastriangleparms.b->v[0] ) * ( aliastriangleparms.a->v[1] - aliastriangleparms.c->v[1] );
	*)

	dv0_ab := aliastriangleparms.a^.u - aliastriangleparms.b^.u;
	dv1_ab := aliastriangleparms.a^.v - aliastriangleparms.b^.v;

	if ((dv0_ab or dv1_ab) = 0) then
		Exit;

  dv0_ac := aliastriangleparms.a^.u - aliastriangleparms.c^.u;
  dv1_ac := aliastriangleparms.a^.v - aliastriangleparms.c^.v;

  if ((dv0_ac or dv1_ac) = 0) then
    Exit;

  d_xdenom := (dv0_ac * dv1_ab) - (dv0_ab * dv1_ac);

  if (d_xdenom < 0) then
  begin
    a_spans := @spans;

    r_p0[0] := aliastriangleparms.a^.u; // u
    r_p0[1] := aliastriangleparms.a^.v; // v
    r_p0[2] := aliastriangleparms.a^.s; // s
    r_p0[3] := aliastriangleparms.a^.t; // t
    r_p0[4] := aliastriangleparms.a^.l; // light

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -