📄 oxnewtonbsp.pas
字号:
{******************************************************************************}
// [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 + -