📄 r_polyse.pas
字号:
{$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 + -