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

📄 oxnewtonbsp.pas

📁 Newton Game Dynamic 1.52 Delphi下基于GLScene的OpenGL游戏开发控件。功能非常强大和易于使用。 Advanced physics engine for re
💻 PAS
📖 第 1 页 / 共 5 页
字号:
      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 + -