📄 oxnewtonbsp.pas
字号:
property Manager: TOXNewtonManager read FManager;
property SoundEngine: TQ3SoundEngine read FSoundEngine;
property PlayerDummy: TGLDummyCube read FPlayerDummy;
procedure DoProgress( const progressTime: TProgressTimes ); override;
procedure LoadBSP( const FileName: String );
procedure DoRender( var ARci: TRenderContextInfo;
ARenderSelf, ARenderChildren: Boolean ); override;
procedure InitNewton;
constructor Create( AOwner: TComponent ); override;
destructor Destroy; override;
protected
//
published
property DefaultCollision: boolean read FQ3DefaultCollision write FQ3DefaultCollision;
end;
{******************************************************************************}
// [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
TShaderManager = class( TCollection )
private
FAvailableShaders: TStringList;
FRequiredShaders: TStringList;
FLoadedTextures: TIntegerHash;
FPath: string;
function GetItem( Index: integer ): TShader;
function ScanShader( path, filename: string ): boolean;
function ReadShadersFromList( filename: string; list: TStringList ): boolean;
function ScanAvailableShaders: boolean;
public
constructor Create( quakePath: string );
destructor Destroy; override;
function IndexOf( name: string ): integer;
function ReadRequiredShaders: boolean;
function LoadTexture( name: string; NoPicMip, NoMipMap: boolean ): GLUINT;
procedure SetState( ShaderID, StageID: integer );
property Items[Index: Integer]: TShader read GetItem; default;
property AvailableShaders: TStringList read FAvailableShaders;
property RequiredShaders: TStringList read FRequiredShaders write FRequiredShaders;
property LoadedTextures: TIntegerHash read FLoadedTextures write FLoadedTextures;
end;
{******************************************************************************}
// [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
TQ3SoundEngine = class( TObject )
private
FManager: TOXNewtonManager;
FBsp: TOXNewtonStaBSP;
FSoundLib: array[0..Q3MaxSamples -1] of TQ3Sample;
FnumOfSamples: integer;
FEmitters: array[0..Q3MaxChannels -1] of TQ3Emitter;
FnumOfEmitters: integer;
FSampleRate: integer;
FEnabled: boolean;
FCameraChannel: integer;
FSndCnt: byte;
FChannel: integer;
FPlaySound: boolean;
FNormalSound, FMetalSound, FWaterSound: integer;
protected
public
constructor Create( Manager: TOXNewtonManager; Bsp: TOXNewtonStaBSP );
destructor Destroy; override;
function LoadSample( name: string; Loop, Use3D: boolean): integer;
function NewEmitter( SampleId: integer; Position: TVector3f; UsePosition, IsCamera: boolean): integer;
procedure Update( Manager: TOXNewtonManager; PlayerPosition: TVector3f );
function CPU_Usage: single;
property Enabled: boolean read FEnabled;
property Count: integer read FnumOfSamples;
property CameraChannel: integer read FCameraChannel write FCameraChannel;
property SndCnt: byte read FSndCnt write FSndCnt;
property Channel: integer read FChannel write FChannel;
property PlaySound: boolean read FPlaySound write FPlaySound;
property NormalSound: integer read FNormalSound write FNormalSound;
property MetalSound: integer read FMetalSound write FMetalSound;
property WaterSound: integer read FWaterSound write FWaterSound;
end;
{******************************************************************************}
// [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
TQ3SkyBox = class( TObject )
private
FBsp: TOXNewtonStaBSP;
FSKY_MAX: Single;
FSKY_RES: integer;
FSkyType: integer;
FIndex: integer;
FnumOfVerts: integer;
FGlobePoints: array of TOXBSPVertex;
FPoints: array of TOXBSPVertex;
FnumOfPoints : integer;
Ftriangle_count: integer;
FTextures: array [0..5] of GLuint;
FList: integer;
procedure MakeSphereVert( sx, sy, xadd, yadd: integer );
public
constructor Create;
destructor Destroy; override;
procedure Init( DepthOfView, Resolution, SkyType: integer; texIds: array of GLuint );
procedure CalcRenderPoints( pos: TVector3f );
procedure CopyData( var Dest );
procedure DrawBox( pos: TVector3f );
property TriangleCount: integer read Ftriangle_count;
property SkyType: integer read FSkyType;
end;
{******************************************************************************}
// [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
type
TCompNdxFunc = function( e1, e2: word ): integer;
TSwapNdxFunc = procedure( e1, e2: word );
procedure QSort( uNElem: word; FCmp: TCompNdxFunc; FSwap: TSwapNdxFunc );
{******************************************************************************}
// [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
var
VisibleTriangles: integer = 0;
nextLeaf: integer;
FX_VOL: byte = 64;
MUSIC_VOL: byte = 64;
SKY_RESOLUTION: integer = 18;
GroundType: string = '';
SolidFaces: array of TOXBSPFaceSort;
AdditiveFaces: array of TOXBSPFaceSort;
TransparentFaces: array of TOXBSPFaceSort;
// geometry
BSPLeaves: integer;
renderedLeaves: integer;
PVSLeaves: integer;
FrustumLeaves: integer;
ValueList: TIntegerHash;
{******************************************************************************}
// [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
function InitLocking: boolean;
function LoadQuakeTexture( path, name: string; var Texture: GLUINT; NoPicMip, NoMipMap: boolean ): boolean;
function LoadTGATexture( Filename: String; var Texture: GLuint; LoadFromResource, NoPicMip, NoMipMap: Boolean ): Boolean;
function Q3VertexAdd( v1, v2: TOXBSPVertex ): TOXBSPVertex;
function Q3VertexScale( v1: TOXBSPVertex; s: double ): TOXBSPVertex;
procedure ChangeGamma( var color: array of byte; factor: single );
function LookUp( name: string ): integer;
function CompareTransparent( e1, e2: word ): integer; far;
procedure SwapAdditive( e1, e2: word ); far;
function CompareAdditive( e1, e2: word ): integer; far;
function CompareSolid( e1, e2: word ): integer; far;
procedure SwapSolid( e1, e2: word ); far;
procedure SwapTransparent( e1, e2: word ); far;
function StrToVector3f( s: string ): TVector3f;
function Q3SetVector( x, y, z: single ): TVector3f;
function Q3ScaleVector( v: TVector3f; s: single ): TVector3f;
function Q3PlaneDistance( point, PlaneNormal: TVector3f; PlaneDistance: single ): single;
function Q3DotProduct( x, y: TVector3f ): single;
function VectorNormalizeFast( v: TVector3f ): single;
function Q_rsqrt( number: single ): single;
function Q3AddVector( v1, v2: TVector3f ): TVector3f;
implementation
uses strutils,vectorgeometry;
{******************************************************************************}
// [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
function Q_rsqrt( number: single ): single;
var x, y: single;
begin
x:= 0.5 * number;
y:= sqrt( number )/1000;
result:= y * ( 1.5 - ( x * y * y ) );
end;
{******************************************************************************}
// [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
function Q3PlaneDistance( point, PlaneNormal: TVector3f; PlaneDistance: single ): single;
begin
result:= ( planeNormal[0] * point[0] +
planeNormal[1] * point[1] +
planeNormal[2] * point[2] ) - PlaneDistance;
end;
{******************************************************************************}
// [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
function Q3SetVector( x, y, z: single ): TVector3f;
begin
result[0]:= x;
result[1]:= y;
result[2]:= z;
end;
{******************************************************************************}
// [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
function Q3SubtractVector( v1, v2: TVector3f ): TVector3f;
begin
Result[0]:= v1[0] - v2[0];
Result[1]:= v1[1] - v2[1];
Result[2]:= v1[2] - v2[2];
end;
{******************************************************************************}
// [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
function Q3ScaleVector( v: TVector3f; s: single ): TVector3f;
begin
Result[0]:= v[0] * s;
Result[1]:= v[1] * s;
Result[2]:= v[2] * s;
end;
{******************************************************************************}
// [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
function Q3AddVector( v1, v2: TVector3f ): TVector3f;
begin
result[0]:= v1[0] + v2[0];
result[1]:= v1[1] + v2[1];
result[2]:= v1[2] + v2[2];
end;
{******************************************************************************}
// [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
function Q3Normalize( var v: TVector3f ): single;
var l: single;
begin
l:= sqrt( v[0] * v[0] + v[1] * v[1] + v[2] * v[2] );
if ( l > 0 ) then begin
v[0]:= v[0] / l;
v[1]:= v[1] / l;
v[2]:= v[2] / l;
end;
result:= l;
end;
{******************************************************************************}
// [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
function Q3DotProduct( x, y: TVector3f ): single;
begin
result:= x[0] * y[0] + x[1] * y[1] + x[2] * y[2];
end;
{******************************************************************************}
// [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
function VectorNormalizeFast( v: TVector3f ): single;
var
ilength: single;
begin
ilength:= Q_rsqrt( Q3DotProduct( v, v ) );
v[0]:= v[0] * ilength;
v[1]:= v[1] * ilength;
v[2]:= v[2] * ilength;
result:= ilength;
end;
{******************************************************************************}
// [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
function CompareTransparent( e1, e2: word ): integer; far;
begin
if TransparentFaces[e1].distance < TransparentFaces[e2].distance then
result := -1
else if TransparentFaces[e1].distance > TransparentFaces[e2].distance then
result := 1
else
result := 0;
end;
{******************************************************************************}
// [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
function StrToVector3f( s: string ): TVector3f;
var
v: TVector3f;
p, l: integer;
tmp: string;
begin
l:= Length( s );
if l > 0 then begin
p:= 1;
tmp:= '';
while s[p] <> ' ' do begin
tmp:= tmp + s[p];
inc( p );
end;
v[0]:= StrToInt( tmp );
inc( p );
tmp:= '';
while s[p] <> ' ' do begin
tmp:= tmp + s[p];
inc( p );
end;
v[1]:= -StrToInt( tmp );
inc( p );
tmp:= '';
while p <= l do begin
tmp:= tmp + s[p];
inc( p );
end;
v[2]:= StrToInt( tmp );
end;
result:= v;
end;
{******************************************************************************}
// [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
function Q3VertexScale( v1: TOXBSPVertex; s: double ): TOXBSPVertex;
var
tmp: TOXBSPVertex;
begin
tmp.Position[0]:= v1.Position[0] * s;
tmp.Position[1]:= v1.Position[1] * s;
tmp.Position[2]:= v1.Position[2] * s;
tmp.TextureCoord[0]:= v1.TextureCoord[0] * s;
tmp.TextureCoord[1]:= v1.TextureCoord[1] * s;
tmp.LightmapCoord[0]:= v1.LightmapCoord[0] * s;
tmp.LightmapCoord[1]:= v1.LightmapCoord[1] * s;
tmp.Normal[0]:= v1.Normal[0] * s;
tmp.Normal[1]:= v1.Normal[1] * s;
tmp.Normal[2]:= v1.Normal[2] * s;
result:= tmp;
end;
{******************************************************************************}
// [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
function Q3VertexAdd( v1, v2: TOXBSPVertex ): TOXBSPVertex;
var
tmp: TOXBSPVertex;
Normal: TVector3f;
begin
tmp.Position[0]:= v1.Position[0] + v2.Position[0];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -