You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
251 lines
5.5 KiB
251 lines
5.5 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef DISPINFO_DEFS_H |
|
#define DISPINFO_DEFS_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
|
|
#include "utlvector.h" |
|
#include "materialsystem/imesh.h" |
|
#include "convar.h" |
|
#include "bspfile.h" |
|
#include "filesystem.h" |
|
#include "decal_private.h" |
|
#include "mempool.h" |
|
#include "decal_clip.h" |
|
#include "bitvec.h" |
|
#include "Overlay.h" |
|
#include "zone.h" |
|
|
|
|
|
extern ConVar r_DrawDisp; |
|
|
|
|
|
class CDispInfo; |
|
class CDispGroup; |
|
|
|
|
|
// The texture stage that displacement lightmap coordinates go in. |
|
#define DISP_LMCOORDS_STAGE 1 |
|
|
|
|
|
#define MAX_STATIC_BUFFER_VERTS (8*1024) |
|
#define MAX_STATIC_BUFFER_INDICES (8*1024) |
|
|
|
#define MAX_DISP_DECALS 32 |
|
|
|
#define MAX_EXTRA_DEPENDENCIES 8 |
|
#define MAX_RETESSELATE MAX_MAP_DISPINFO // Max number of displacements that can be retesselated per frame. |
|
|
|
#define MAX_TOTAL_DISP_DEPENDENCIES (4*2 + 4*MAX_DISP_CORNER_NEIGHBORS + MAX_EXTRA_DEPENDENCIES) |
|
|
|
|
|
|
|
// These hold the HDISPINFOARRAYs. |
|
class CDispArray |
|
{ |
|
public: |
|
unsigned short m_CurTag; |
|
|
|
CDispInfo *m_pDispInfos; |
|
int m_nDispInfos; |
|
}; |
|
|
|
|
|
|
|
// These classes store groups of meshes which can be drawn with one IMesh::Draw() call. |
|
class CGroupMesh |
|
{ |
|
public: |
|
IMesh *m_pMesh; |
|
CUtlVector<CDispInfo*> m_DispInfos; |
|
|
|
// This list is updated each frame to point at the visible LODs. |
|
CUtlVector<CDispInfo*> m_VisibleDisps; |
|
CUtlVector<CPrimList> m_Visible; |
|
int m_nVisible; |
|
|
|
CDispGroup *m_pGroup; |
|
}; |
|
|
|
|
|
class CDispGroup |
|
{ |
|
public: |
|
|
|
int m_LightmapPageID; |
|
IMaterial *m_pMaterial; |
|
CUtlVector<CGroupMesh*> m_Meshes; |
|
CUtlVector<int> m_DispInfos; |
|
int m_nVisible; |
|
}; |
|
|
|
|
|
// This represents the two neighboring verts that are used to calculate the |
|
// error when removing a side vert of a node. |
|
class CSideVertCorners |
|
{ |
|
public: |
|
CFourVerts m_Corners[2]; |
|
}; |
|
|
|
|
|
class CDispDecalBase |
|
{ |
|
public: |
|
CDispDecalBase( int flags ) : m_Flags(flags) {} |
|
|
|
enum |
|
{ |
|
NODE_BITFIELD_COMPUTED = 0x1, |
|
DECAL_SHADOW = 0x2, |
|
NO_INTERSECTION = 0x4, |
|
FRAGMENTS_COMPUTED = 0x8, // *non-shadow* fragments |
|
}; |
|
|
|
// Precalculated flags on the nodes telling which nodes this decal can intersect. |
|
// See CPowerInfo::m_NodeIndexIncrements for a description of how the node tree is |
|
// walked using this bit vector. |
|
CBitVec<85> m_NodeIntersect; // The number of nodes on a 17x17 is 85. |
|
// Note: this must be larger if MAX_MAP_DISP_POWER gets larger. |
|
|
|
// Number of triangles + verts that got generated for this decal. |
|
unsigned char m_Flags; |
|
unsigned short m_nVerts; |
|
unsigned short m_nTris; |
|
}; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Types associated with normal decals |
|
//----------------------------------------------------------------------------- |
|
|
|
typedef unsigned short DispDecalFragmentHandle_t; |
|
|
|
enum |
|
{ |
|
DISP_DECAL_FRAGMENT_HANDLE_INVALID = (DispDecalFragmentHandle_t)~0 |
|
}; |
|
|
|
class CDispDecal : public CDispDecalBase |
|
{ |
|
public: |
|
CDispDecal() : CDispDecalBase(0) {} |
|
|
|
decal_t *m_pDecal; |
|
float m_DecalWorldScale[2]; |
|
Vector m_TextureSpaceBasis[3]; |
|
float m_flSize; |
|
DispDecalFragmentHandle_t m_FirstFragment; |
|
}; |
|
|
|
#pragma pack(1) |
|
class CDispDecalFragment |
|
{ |
|
public: |
|
enum { MAX_VERTS = 6 }; // 3 decal verts clipped by 4 planes results in a maximum of 6 (not 8) verts |
|
|
|
decal_t *m_pDecal; // Owning Decal |
|
unsigned char m_nVerts; // |
|
CDecalVert* m_pVerts; // m_pVerts[MAX_VERTS]; |
|
|
|
~CDispDecalFragment() |
|
{ |
|
delete[] m_pVerts; |
|
m_pVerts = NULL; |
|
} |
|
}; |
|
|
|
|
|
#pragma pack() |
|
|
|
|
|
typedef unsigned short DispShadowFragmentHandle_t; |
|
|
|
enum |
|
{ |
|
DISP_SHADOW_FRAGMENT_HANDLE_INVALID = (DispShadowFragmentHandle_t)~0 |
|
}; |
|
|
|
class CDispShadowDecal : public CDispDecalBase |
|
{ |
|
public: |
|
CDispShadowDecal() : CDispDecalBase(DECAL_SHADOW) {} |
|
|
|
ShadowHandle_t m_Shadow; |
|
DispShadowFragmentHandle_t m_FirstFragment; |
|
}; |
|
|
|
|
|
class CDispShadowFragment |
|
{ |
|
public: |
|
// NOTE: This # is >8 because we have 6 clip planes, it overflowed.. |
|
enum { MAX_VERTS = 12 }; |
|
|
|
int m_nVerts; |
|
ShadowVertex_t* m_ShadowVerts; |
|
|
|
~CDispShadowFragment() |
|
{ |
|
delete[] m_ShadowVerts; |
|
m_ShadowVerts = NULL; |
|
} |
|
}; |
|
|
|
|
|
|
|
class CDispRenderVert |
|
{ |
|
public: |
|
|
|
Vector m_vPos; |
|
// These are necessary for mat_normals to work |
|
Vector m_vNormal; |
|
Vector m_vSVector; |
|
Vector m_vTVector; |
|
|
|
Vector2D m_vTexCoord; |
|
Vector2D m_LMCoords; |
|
}; |
|
|
|
|
|
// This position is about OVERLAY_AVOID_FLICKER_NORMAL_OFFSET inches off the surface |
|
// and is used by overlays and shadows to avoid z-fighting. |
|
inline Vector GetOverlayPos( CMeshReader *pReader, int iVertIndex ) |
|
{ |
|
Vector vNormal; |
|
pReader->Normal( iVertIndex, vNormal ); |
|
return pReader->Position( iVertIndex ) + vNormal * OVERLAY_AVOID_FLICKER_NORMAL_OFFSET; |
|
} |
|
|
|
|
|
// --------------------------------------------------------------------------------- // |
|
// Global tables. |
|
// --------------------------------------------------------------------------------- // |
|
|
|
extern int g_CoreDispNeighborOrientationMap[4][4]; |
|
|
|
|
|
// --------------------------------------------------------------------------------- // |
|
// Global variables. |
|
// --------------------------------------------------------------------------------- // |
|
extern CUtlVector<unsigned char> g_DispLMAlpha; |
|
extern CUtlVector<unsigned char, CHunkMemory<unsigned char> > g_DispLightmapSamplePositions; |
|
extern CUtlVector<CDispGroup*> g_DispGroups; |
|
|
|
|
|
// CVars. |
|
extern ConVar r_DispWalkable; |
|
extern ConVar r_DispBuildable; |
|
|
|
// If this is true, then no backface removal is done. |
|
extern bool g_bDispOrthoRender; |
|
|
|
#endif // DISPINFO_DEFS_H
|
|
|