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

📄 oxnewtonbsp.pas

📁 Newton Game Dynamic 1.52 Delphi下基于GLScene的OpenGL游戏开发控件。功能非常强大和易于使用。 Advanced physics engine for re
💻 PAS
📖 第 1 页 / 共 5 页
字号:
{******************************************************************************}
 // [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
type
  TOXBSPBrush = record
    brushside,
    numOfBrushsides,
    Texture: integer;
  end;
{******************************************************************************}
 // [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
type
  TOXBSPBrushSide = record
    plane,
    texture: integer;
  end;
{******************************************************************************}
 // [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
type
  TOXBSPModel = record
    min: TVector3f;
    max: TVector3f;
    faceIndex: integer;
    numOfFaces: integer;
    brushIndex: integer;
    numOfBrushes: integer;
  end;
{******************************************************************************}
 // [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
type
  TOXFileEffect = packed record
    Name: array[0..63] of char;
    brushIndex: integer;
    visibleSide: integer;
  end;
{******************************************************************************}
 // [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
type
  TOXBSPEffect = record
    shaderIndex: integer;
    brushIndex: integer;
    visibleSide: integer;
  end;
{******************************************************************************}
 // [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
type
  TOXBSPMove = record
    fraction: single;
    startPoint: TVector3f;
    endPoint: TVector3f;
    extents: TVector3f;
    Normal: TVector3f;
    allSolid: boolean;
    leafIndex: integer;
    brush: integer;
  end;
{******************************************************************************}
 // [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
type
  TOXBSPFaceSort = record
    FaceIndex: integer;
    distance: single;
  end;
{******************************************************************************}
 // [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
var
  WORLD_MAX: single = 0;
  DEPTH_OF_VIEW: integer = 4000;
  Gamma: single = 2;
  // Tesselation 5 or lower because higher coming a little bit so much for a NewtonTreeCollison.
  // Anyway next newton version is suposed to have a special method to load bsp.
  Tesselation: integer = 4;
  WireFrame: Boolean = false;
  SimpleRender: boolean = false;
  MultiTexture: boolean = true;
  ShowFog: boolean = true;
  SortFaces: boolean = true;
{******************************************************************************}
 // [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
const
  kEntities     = 0;
  kTextures     = 1;
  kPlanes       = 2;
  kNodes        = 3;
  kLeafs        = 4;
  kLeafFaces    = 5;
  kLeafBrushes  = 6;
  kModels       = 7;
  kBrushes      = 8;
  kBrushSides   = 9;
  kVertices     = 10;
  kMeshVerts    = 11;
  kEffects      = 12;
  kFaces        = 13;
  kLightmaps    = 14;
  kLightVolumes = 15;
  kVisData      = 16;
  kMaxLumps     = 19;
{******************************************************************************}
 // [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
type
  TQ3Sample = record
    Name: string;
    SamplePtr: PFSoundSample;
    Loop: boolean;
    Use3D: boolean;
  end;
  TQ3Emitter = record
    SampleId: integer;
    SamplePtr: PFSoundSample;
    Position: TVector3f;
    UsePosition: boolean;
  end;
const
  Q3MaxChannels = 128;
  Q3MaxSamples = 256;
{******************************************************************************}
 // [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
type
  TShader = class( TCollectionItem )
  public
    FaceType: integer;
    ShaderFile: string;
    Name: string;
    lastTime: longword;
    Cull: integer;
    Source: string;
    Surface: cardinal;
    Contents: cardinal;
    Layers: array of TLayer;
    numOfLayers: integer;
    numOfDeformVertexes: integer;
    qerImage: string;
    qerId: GLUINT;
    NoMipMap: boolean;
    NoPicMip: boolean;
    IsSkyBox: boolean;
    effectIndex: integer;
    FogValues: array[0..1] of single;
    DeformVertexes: array of TDeformVertexes;
    Fog: TFogParam;
    hasFog: boolean;
    SortKey: enSortKey;
    TotallyTrans: boolean;
    SkyboxType: integer;
    SkyboxTextureNames: array of string;
    SkyboxTextureIds: array of cardinal;
    constructor Create( AOwner: TCollection ); override;
  end;
  type PShader = ^TShader;
type
  TOXNewtonStaBSP = class;
  TShaderManager = class;
  TQ3SoundEngine = class;
  TQ3SkyBox = class;
{******************************************************************************}
 // [09/05/07]: TOXNewtonStaBSP last change by Dave Gravel.
{******************************************************************************}
  TOXNewtonStaBSP = class( TGLDirectOpenGL )
    private                         // this collision method don't use newton...
      FQ3DefaultCollision: boolean; // working but buggy with patch mesh again...
      FQ3IsSplash: boolean;
      FQ3LevelName: string;
      FQ3LevelSplashName: string;
      FQ3LevelSplashId: GLUINT;
      FLockArrayCompatible: boolean;
      FPlayerDummy: TGLDummyCube;
      FOldPos: TVector3f;
      FBSPFileName: string;
      FLastError: Cardinal;
      FTexturesDeleted: boolean;
      FFreeTexture: boolean;
      FNumSolid: integer;
      FNumAdditive: integer;
      FNumTransparent: integer;
      FFogBuffer: array of single;
      FInputBuffer: array[0..16383] of TOXBSPVertex;
      FTexCoordBuffer: array[0..16383] of TVector2f;
      FColorBuffer: array[0..16383] of TOXRGBA;
      FSoundEngine: TQ3SoundEngine;
      FRenderNoTexture: boolean;
      FRenderSky: boolean;
      FEntitiesLoaded: boolean;
      FDov: single;
      FDist: single;
      FSky: TQ3Skybox;
      FPath: string;
      FVecList: TAffineVectorList;
      FFrust: TQ3Frustum;
      FCanRender: boolean;
      FActived: boolean;
      FNumOfPositions: integer;
      FNumOfOldLightmaps: integer;
      FNumOfOldTextures: integer;
      FNumOfVerts: integer;
      FNumOfFaces: integer;
      FNumOfTextures: integer;
      FNumOfLightmaps: integer;
      FNumOfNodes: integer;
      FNumOfLeafs: integer;
      FNumOfLeafFaces: integer;
      FNumOfPlanes: integer;
      FNumOfMeshVerts: integer;
      FNumOfModels: integer;
      FNumOfBrushes: integer;
      FNumOfBrushSides: integer;
      FNumOfLeafBrushes: integer;
      FNumOfEffects: integer;
      FNumOfFogVolumes: integer;
      FNumOfEntities: integer;
      FQuadricPatches: TOXBSPQuadricPatchArray;
      FLumps: array of TOXBSPLump;
      FMeshVertices: array of integer;
      FVertices: array of TOXBSPVertex;
      FFaces: array of TOXBSPFace;
      FEntityList: TStringList;
      FNodes: array of TOXBSPNode;
      FLeafs: array of TOXBSPLeaf;
      FPlanes: array of TOXBSPPlane;
      FLeafFaces: array of integer;
      FModels: array of TOXBSPModel;
      FEffects: array of TOXBSPEffect;
      Fclusters: TOXBSPVisData;
      FFacesDrawn: array of boolean;
      FTextureInfo: array of TOXBSPTextureInfo;
      FBrushes: array of TOXBSPBrush;
      FBrushSides: array of TOXBSPBrushSide;
      FLeafbrushes: array of integer;
      FLightmaps: array of GLUINT;
      FBSPLightMap: array of TOXBSPLightmap;
      FFogVolumes: array of TBSPBoundingBox;
      FCenterPoints: array of TVector3f;
      FIsModelFace: array of boolean;
      FFileTextures: array of TOXQ3FileTexture;
      FEntities: array of TEntities;
      FPositions: array of TOXBSPPosition;
      FCurPosition: integer;
      FManager: TOXNewtonManager;
      FShaderManager: TShaderManager;
      FCurrentName: string;
      FDeltaTime: double;
      FNewtime: double;
      FSkyboxShader: integer;
      FOnFree: boolean;
      FF: File;
      FCollision1: PNewtonCollision; // Why 1 ? because later i loading vertices on multiple NewtonCollisionTree
      FBody1: PNewtonBody;           // Why 1 ? because later i loading vertices on multiple NewtonCollisionTree
      function GetSurfaceType( brushIndex: integer ): string;
      procedure SetDefaults;
      procedure RenderSky;
      procedure BuildBoundingBoxModels;
      procedure SetPositions( l: TStringList );
      function ParseEntityStringValue( const S: String; var Rest: string ): string;
      function ParseEntityVector3f( const S: String ): TVector3f;
      function ParseEntityVector3f_Exact( const S: String ): TVector3f;
      procedure ProcessEntity( Block: TStringList );
      procedure RenderSurfaceNoTexture( faceIndex: integer );
      procedure ReadShaderEffects( var F: File; var cLumps: array of TOXBSPLump; var cEffects: array of TOXFileEffect; var shader: string );
      procedure ReadVisData( var F: File; var cLumps: array of TOXBSPLump );
      procedure ReadLightmaps( var F: File; var cLumps: array of TOXBSPLump );
      procedure ReadFaces( var F: File; var cLumps: array of TOXBSPLump );
      procedure ReadShaders( var F: File; var cLumps: array of TOXBSPLump; var shader: string );
      procedure ReadEffects( var F: File; var cLumps: array of TOXBSPLump; var cEffects: array of TOXFileEffect );
      procedure ReadMeshVerts( var F: File; var cLumps: array of TOXBSPLump );
      procedure ReadVertices( var F: File; var cLumps: array of TOXBSPLump );
      procedure ReadBrushSides( var F: File; var cLumps: array of TOXBSPLump );
      procedure ReadBrushes( var F: File; var cLumps: array of TOXBSPLump );
      procedure ReadModels( var F: File; var cLumps: array of TOXBSPLump );
      procedure ReadLeafBrushes( var F: File; var cLumps: array of TOXBSPLump );
      procedure ReadFaceLeafs( var F: File; var cLumps: array of TOXBSPLump );
      procedure ReadLeafs( var F: File; var cLumps: array of TOXBSPLump );
      procedure ReadNodes( var F: File; var cLumps: array of TOXBSPLump );
      procedure ReadPlanes( var F: File; var cLumps: array of TOXBSPLump );
      procedure ReadTextures( var F: File; var cLumps: array of TOXBSPLump; var shader: string );
      procedure ReadLumps( var F: File; var cLumps: array of TOXBSPLump );
      procedure ReadBspTag( var F: File; FileName: String );
      procedure Q3LevelSplashScreen;
      procedure RenderFog( faceIndex, shaderId, planeId: integer );
      procedure SetTextureCoordinates( shaderId, stageId, numOfVerts: integer );
      procedure SetVertexColors( Face: POXBSPFace; shaderId, stageId, numOfVerts: integer );
      procedure SetVertexCoords( Face: POXBSPFace; shaderId, numOfVerts: integer );
      procedure RenderSurfaceShader( faceIndex, shaderId: integer );
      procedure SetSoundEmitters( l: TStringList );
      procedure WalkLeaf( leafIndex: integer;  sort: boolean );
      function CheckMove( sp, ep, extent: TVector3f ): TOXBSPMove;
      procedure CheckMoveNode( sf, ef: single; sp, ep: TVector3f; node: integer; var Move: TOXBSPMove );
      procedure CheckMoveLeaf( leafIndex: integer; var Move : TOXBSPMove );
      procedure CheckCollision( sp, ep: TVector3f );
      procedure InitNewtonSpace;
      function Eval( wave: TWaveFunc ): single;
      procedure RenderSurface( faceIndex: integer );
      function IsClusterVisible( current, test: integer ): integer;
      function FindLeaf( vPos: TVector3f ): integer;
      procedure QuadricPatch( faceIndex: integer );
      procedure BindTextures( texId, lmId: integer );
      procedure LoadEntities( var f: file; Lump: TOXBSPLump );
      procedure SetWorldSpawn( l: TStringList );
      procedure SwapBoundingBoxFloat( var min, max: TVector3f );
      procedure SwapBoundingBoxInteger( var min, max: TVector3i );
      procedure ChangeGammaLightmap( var pImage: TOXBSPLightmap; const Width, height: integer; factor: GlFloat );
      Procedure CreateLightmapTexture( var texture: GLUINT; pImage: TOXBSPLightmap; width, height: integer );
      function CalculPatch( controlPoints: array of TOXBSPVertex; VertexOffset, IndexOffset, pointOffset: integer ): boolean;
      procedure SetFogColor( faceIndex, planeIndex, numOfVerts: integer; red, green, blue, distanceToOpaque: single );
      procedure LoadNewtonBSP( const FileName: String );
      procedure InitialValue;
    public
      property OldPlayerPos: TVector3f read FOldPos write FOldPos;
      property TexturesDeleted: boolean read FTexturesDeleted write FTexturesDeleted;
      property FreeTextures: boolean read FFreeTexture write FFreeTexture;
      property Actived: boolean read FActived;

⌨️ 快捷键说明

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