📄 unobj.h
字号:
/*=============================================================================
UnObj.h: Standard Unreal object definitions.
Copyright 1997-1999 Epic Games, Inc. All Rights Reserved.
Revision history:
* Created by Tim Sweeney
=============================================================================*/
/*----------------------------------------------------------------------------
Forward declarations.
----------------------------------------------------------------------------*/
// All engine classes.
class UBitmap;
class UTexture;
class UFont;
class UPalette;
class USound;
class UMusic;
class UPrimitive;
class UMesh;
class UModel;
class UPolys;
class ULevelBase;
class ULevel;
class UPendingLevel;
class UPlayer;
class UViewport;
class UNetConnection;
class UConsole;
// Other classes.
struct FTextureInfo;
class AActor;
class ABrush;
class FScan;
/*-----------------------------------------------------------------------------
UBspNode.
-----------------------------------------------------------------------------*/
// Flags associated with a Bsp node.
enum EBspNodeFlags
{
// Flags.
NF_NotCsg = 0x01, // Node is not a Csg splitter, i.e. is a transparent poly.
NF_ShootThrough = 0x02, // Can shoot through (for projectile solid ops).
NF_NotVisBlocking = 0x04, // Node does not block visibility, i.e. is an invisible collision hull.
NF_PolyOccluded = 0x08, // Node's poly was occluded on the previously-drawn frame.
NF_BoxOccluded = 0x10, // Node's bounding box was occluded.
NF_BrightCorners = 0x10, // Temporary.
NF_IsNew = 0x20, // Editor: Node was newly-added.
NF_IsFront = 0x40, // Filter operation bounding-sphere precomputed and guaranteed to be front.
NF_IsBack = 0x80, // Guaranteed back.
// Combinations of flags.
NF_NeverMove = 0, // Bsp cleanup must not move nodes with these tags.
};
//
// Identifies a unique convex volume in the world.
//
struct ENGINE_API FPointRegion
{
// Variables.
class AZoneInfo* Zone; // Zone actor.
INT iLeaf; // Bsp leaf.
BYTE ZoneNumber; // Zone number.
// Constructors.
FPointRegion()
{}
FPointRegion( class AZoneInfo* InLevel )
: Zone(InLevel), iLeaf(INDEX_NONE), ZoneNumber(0)
{}
FPointRegion( class AZoneInfo* InZone, INT InLeaf, BYTE InZoneNumber )
: Zone(InZone), iLeaf(InLeaf), ZoneNumber(InZoneNumber)
{}
};
//
// FBspNode defines one node in the Bsp, including the front and back
// pointers and the polygon data itself. A node may have 0 or 3 to (MAX_NODE_VERTICES-1)
// vertices. If the node has zero vertices, it's only used for splitting and
// doesn't contain a polygon (this happens in the editor).
//
// vNormal, vTextureU, vTextureV, and others are indices into the level's
// vector table. iFront,iBack should be INDEX_NONE to indicate no children.
//
// If iPlane==INDEX_NONE, a node has no coplanars. Otherwise iPlane
// is an index to a coplanar polygon in the Bsp. All polygons that are iPlane
// children can only have iPlane children themselves, not fronts or backs.
//
class FBspNode // 64 bytes
{
public:
enum {MAX_NODE_VERTICES=16}; // Max vertices in a Bsp node, pre clipping.
enum {MAX_FINAL_VERTICES=24}; // Max vertices in a Bsp node, post clipping.
enum {MAX_ZONES=64}; // Max zones per level.
// Persistent information.
FPlane Plane; // 16 Plane the node falls into (X, Y, Z, W).
QWORD ZoneMask; // 8 Bit mask for all zones at or below this node (up to 64).
INT iVertPool; // 4 Index of first vertex in vertex pool, =iTerrain if NumVertices==0 and NF_TerrainFront.
INT iSurf; // 4 Index to surface information.
union
{
struct
{
INT iBack; // 4 Index to node in front (in direction of Normal).
INT iFront; // 4 Index to node in back (opposite direction as Normal).
INT iPlane; // 4 Index to next coplanar poly in coplanar list.
};
struct
{
INT iChild[3]; // 12 Index representation of children.
};
};
INT iCollisionBound;// 4 Collision bound.
INT iRenderBound; // 4 Rendering bound.
BYTE iZone[2]; // 2 Visibility zone in 1=front, 0=back.
BYTE NumVertices; // 1 Number of vertices in node.
BYTE NodeFlags; // 1 Node flags.
INT iLeaf[2]; // 8 Leaf in back and front, INDEX_NONE=not a leaf.
// Functions.
UBOOL IsCsg( DWORD ExtraFlags=0 ) const
{
return (NumVertices>0) && !(NodeFlags & (NF_IsNew | NF_NotCsg | ExtraFlags));
}
UBOOL ChildOutside( INT iChild, UBOOL Outside, DWORD ExtraFlags=0 ) const
{
return iChild ? (Outside || IsCsg(ExtraFlags)) : (Outside && !IsCsg(ExtraFlags));
}
ENGINE_API friend FArchive& operator<<( FArchive& Ar, FBspNode& N );
};
//
// Properties of a zone.
//
class ENGINE_API FZoneProperties
{
public:
// Variables.
AZoneInfo* ZoneActor; // Optional actor defining the zone's property.
FLOAT LastRenderTime; // Most recent level TimeSeconds when rendered.
QWORD Connectivity; // (Connect[i]&(1<<j))==1 if zone i is adjacent to zone j.
QWORD Visibility; // (Connect[i]&(1<<j))==1 if zone i can see zone j.
// Serializer.
friend FArchive& operator<<( FArchive& Ar, FZoneProperties& P )
{
guard(FZoneProperties<<);
return Ar << *(UObject**)&P.ZoneActor << P.Connectivity << P.Visibility;
Ar << P.LastRenderTime;
unguard;
}
};
/*-----------------------------------------------------------------------------
UBspLeaves.
-----------------------------------------------------------------------------*/
//
// Information about a convex volume.
//
class FLeaf
{
public:
// Variables.
INT iZone; // The zone this convex volume is in.
INT iPermeating; // Lights permeating this volume considering shadowing.
INT iVolumetric; // Volumetric lights hitting this region, no shadowing.
QWORD VisibleZones; // Bit mask of visible zones from this convex volume.
// Functions.
FLeaf()
{}
FLeaf( INT iInZone, INT InPermeating, INT InVolumetric, QWORD InVisibleZones )
: iZone(iInZone), iPermeating(InPermeating), iVolumetric(InVolumetric), VisibleZones(InVisibleZones)
{}
friend FArchive& operator<<( FArchive& Ar, FLeaf& L )
{
guard(FLeaf<<);
return Ar << AR_INDEX(L.iZone) << AR_INDEX(L.iPermeating) << AR_INDEX(L.iVolumetric) << L.VisibleZones;
unguard;
}
};
/*-----------------------------------------------------------------------------
UBspSurf.
-----------------------------------------------------------------------------*/
//
// One Bsp polygon. Lists all of the properties associated with the
// polygon's plane. Does not include a point list; the actual points
// are stored along with Bsp nodes, since several nodes which lie in the
// same plane may reference the same poly.
//
class FBspSurf
{
public:
// Persistent info.
UTexture* Texture; // 4 Texture map.
DWORD PolyFlags; // 4 Polygon flags.
INT pBase; // 4 Polygon & texture base point index (where U,V==0,0).
INT vNormal; // 4 Index to polygon normal.
INT vTextureU; // 4 Texture U-vector index.
INT vTextureV; // 4 Texture V-vector index.
INT iLightMap; // 4 Light mesh.
INT iBrushPoly; // 4 Editor brush polygon index.
SWORD PanU; // 2 U-Panning value.
SWORD PanV; // 2 V-Panning value.
ABrush* Actor; // 4 Brush actor owning this Bsp surface.
// Functions.
ENGINE_API friend FArchive& operator<<( FArchive& Ar, FBspSurf& Surf );
};
// Flags describing effects and properties of a Bsp polygon.
enum EPolyFlags
{
// Regular in-game flags.
PF_Invisible = 0x00000001, // Poly is invisible.
PF_Masked = 0x00000002, // Poly should be drawn masked.
PF_Translucent = 0x00000004, // Poly is transparent.
PF_NotSolid = 0x00000008, // Poly is not solid, doesn't block.
PF_Environment = 0x00000010, // Poly should be drawn environment mapped.
#if 1 //MWP
PF_ForceViewZone = 0x00000010, // Force current iViewZone in OccludeBSP (reuse Environment flag)
#endif
PF_Semisolid = 0x00000020, // Poly is semi-solid = collision solid, Csg nonsolid.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -