📄 unobj.h
字号:
PF_Modulated = 0x00000040, // Modulation transparency.
PF_FakeBackdrop = 0x00000080, // Poly looks exactly like backdrop.
PF_TwoSided = 0x00000100, // Poly is visible from both sides.
PF_AutoUPan = 0x00000200, // Automatically pans in U direction.
PF_AutoVPan = 0x00000400, // Automatically pans in V direction.
PF_NoSmooth = 0x00000800, // Don't smooth textures.
PF_BigWavy = 0x00001000, // Poly has a big wavy pattern in it.
#if 1 //MWP
PF_SpecialPoly = 0x00001000, // Game-specific poly-level render control (reuse BigWavy flag)
#endif
PF_SmallWavy = 0x00002000, // Small wavy pattern (for water/enviro reflection).
PF_Flat = 0x00004000, // Flat surface.
PF_LowShadowDetail = 0x00008000, // Low detaul shadows.
PF_NoMerge = 0x00010000, // Don't merge poly's nodes before lighting when rendering.
PF_CloudWavy = 0x00020000, // Polygon appears wavy like clouds.
PF_DirtyShadows = 0x00040000, // Dirty shadows.
PF_BrightCorners = 0x00080000, // Brighten convex corners.
PF_SpecialLit = 0x00100000, // Only speciallit lights apply to this poly.
PF_Gouraud = 0x00200000, // Gouraud shaded.
#if 1 //MWP
PF_NoBoundRejection = 0x00200000, // Disable bound rejection in OccludeBSP (reuse Gourard flag)
#endif
PF_Unlit = 0x00400000, // Unlit.
PF_HighShadowDetail = 0x00800000, // High detail shadows.
PF_Portal = 0x04000000, // Portal between iZones.
PF_Mirrored = 0x08000000, // Reflective surface.
// Editor flags.
PF_Memorized = 0x01000000, // Editor: Poly is remembered.
PF_Selected = 0x02000000, // Editor: Poly is selected.
PF_Highlighted = 0x10000000, // Editor: Poly is highlighted.
PF_FlatShaded = 0x40000000, // FPoly has been split by SplitPolyWithPlane.
// Internal.
PF_EdProcessed = 0x40000000, // FPoly was already processed in editorBuildFPolys.
PF_EdCut = 0x80000000, // FPoly has been split by SplitPolyWithPlane.
PF_RenderFog = 0x40000000, // Render with fogmapping.
PF_Occlude = 0x80000000, // Occludes even if PF_NoOcclude.
PF_RenderHint = 0x01000000, // Rendering optimization hint.
// Combinations of flags.
PF_NoOcclude = PF_Masked | PF_Translucent | PF_Invisible | PF_Modulated,
PF_NoEdit = PF_Memorized | PF_Selected | PF_EdProcessed | PF_NoMerge | PF_EdCut,
PF_NoImport = PF_NoEdit | PF_NoMerge | PF_Memorized | PF_Selected | PF_EdProcessed | PF_EdCut,
PF_AddLast = PF_Semisolid | PF_NotSolid,
PF_NoAddToBSP = PF_EdCut | PF_EdProcessed | PF_Selected | PF_Memorized,
#if 0 //MWP
PF_NoShadows = PF_Unlit | PF_Invisible | PF_FakeBackdrop,
#else
PF_NoShadows = PF_Unlit | PF_Invisible | PF_Environment | PF_FakeBackdrop,
#endif
};
/*-----------------------------------------------------------------------------
FLightMapIndex.
-----------------------------------------------------------------------------*/
//
// A shadow occlusion mask.
//
class ENGINE_API FShadowMask
{
public:
AActor* Owner;
TArray<BYTE> ShadowData;
friend FArchive& operator<<( FArchive& Ar, FShadowMask& M )
{
return Ar << *(UObject**)&M.Owner << M.ShadowData;
}
};
//
// Describes the mesh-based lighting applied to a Bsp poly.
//
class ENGINE_API FLightMapIndex
{
public:
INT DataOffset;
INT iLightActors;
FVector Pan;
FLOAT UScale, VScale;
INT UClamp, VClamp;
BYTE UBits, VBits;
friend FArchive& operator<<( FArchive& Ar, FLightMapIndex& I )
{
guard(FLightMapIndex<<);
Ar << I.DataOffset;
Ar << I.Pan;
Ar << AR_INDEX(I.UClamp) << AR_INDEX(I.VClamp);
Ar << I.UScale << I.VScale;
Ar << I.iLightActors;
return Ar;
unguard;
}
};
/*-----------------------------------------------------------------------------
UPolys.
-----------------------------------------------------------------------------*/
// Results from FPoly.SplitWithPlane, describing the result of splitting
// an arbitrary FPoly with an arbitrary plane.
enum ESplitType
{
SP_Coplanar = 0, // Poly wasn't split, but is coplanar with plane
SP_Front = 1, // Poly wasn't split, but is entirely in front of plane
SP_Back = 2, // Poly wasn't split, but is entirely in back of plane
SP_Split = 3, // Poly was split into two new editor polygons
};
//
// A general-purpose polygon used by the editor. An FPoly is a free-standing
// class which exists independently of any particular level, unlike the polys
// associated with Bsp nodes which rely on scads of other objects. FPolys are
// used in UnrealEd for internal work, such as building the Bsp and performing
// boolean operations.
//
class ENGINE_API FPoly
{
public:
enum {MAX_VERTICES=16}; // Maximum vertices an FPoly may have.
enum {VERTEX_THRESHOLD=MAX_VERTICES-2}; // Threshold for splitting into two.
FVector Base; // Base point of polygon.
FVector Normal; // Normal of polygon.
FVector TextureU; // Texture U vector.
FVector TextureV; // Texture V vector.
FVector Vertex[MAX_VERTICES]; // Actual vertices.
DWORD PolyFlags; // FPoly & Bsp poly bit flags (PF_).
ABrush* Actor; // Brush where this originated, or NULL.
UTexture* Texture; // Texture map.
FName ItemName; // Item name.
INT NumVertices; // Number of vertices.
INT iLink; // iBspSurf, or brush fpoly index of first identical polygon, or MAXWORD.
INT iBrushPoly; // Index of editor solid's polygon this originated from.
SWORD PanU,PanV; // Texture panning values.
// Custom functions.
void Init ();
void Reverse ();
void SplitInHalf (FPoly *OtherHalf);
void Transform (const FModelCoords &Coords, const FVector &PreSubtract,const FVector &PostAdd, FLOAT Orientation);
int Fix ();
int CalcNormal ();
int SplitWithPlane (const FVector &Base,const FVector &Normal,FPoly *FrontPoly,FPoly *BackPoly,int VeryPrecise) const;
int SplitWithNode (const UModel *Model,INT iNode,FPoly *FrontPoly,FPoly *BackPoly,int VeryPrecise) const;
int SplitWithPlaneFast(const FPlane Plane,FPoly *FrontPoly,FPoly *BackPoly) const;
int Split (const FVector &Normal, const FVector &Base, int NoOverflow=0 );
int RemoveColinears ();
int Finalize (int NoError);
int Faces (const FPoly &Test) const;
FLOAT Area ();
// Serializer.
ENGINE_API friend FArchive& operator<<( FArchive& Ar, FPoly& Poly );
// Inlines.
int IsBackfaced( const FVector &Point ) const
{return ((Point-Base) | Normal) < 0.0;}
int IsCoplanar( const FPoly &Test ) const
{return Abs((Base - Test.Base)|Normal)<0.01 && Abs(Normal|Test.Normal)>0.9999;}
};
//
// List of FPolys.
//
class ENGINE_API UPolys : public UObject
{
DECLARE_CLASS(UPolys,UObject,CLASS_RuntimeStatic)
// Elements.
TTransArray<FPoly> Element;
// Constructors.
UPolys()
: Element( this )
{}
// UObject interface.
void Serialize( FArchive& Ar )
{
guard(UPolys::Serialize);
Super::Serialize( Ar );
if( Ar.IsTrans() )
{
Ar << Element;
}
else
{
Element.CountBytes( Ar );
INT DbNum=Element.Num(), DbMax=DbNum;
Ar << DbNum << DbMax;
if( Ar.IsLoading() )
{
Element.Empty( DbNum );
Element.AddZeroed( DbNum );
}
for( INT i=0; i<Element.Num(); i++ )
Ar << Element(i);
}
unguard;
}
};
/*-----------------------------------------------------------------------------
UVerts.
-----------------------------------------------------------------------------*/
//
// One vertex associated with a Bsp node's polygon. Contains a vertex index
// into the level's FPoints table, and a unique number which is common to all
// other sides in the level which are cospatial with this side.
//
class FVert
{
public:
// Variables.
INT pVertex; // Index of vertex.
INT iSide; // If shared, index of unique side. Otherwise INDEX_NONE.
// Functions.
friend FArchive& operator<< (FArchive &Ar, FVert &Vert)
{
guard(FVert<<);
return Ar << AR_INDEX(Vert.pVertex) << AR_INDEX(Vert.iSide);
unguard;
}
};
/*----------------------------------------------------------------------------
The End.
----------------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -