|
|
//===== Copyright � 1996-2005, Valve Corporation, All rights reserved. ======//
//
// Purpose:
//
// $NoKeywords: $
//
//===========================================================================//
#ifndef WORLDSTRUCTURES_H
#define WORLDSTRUCTURES_H
#ifdef _WIN32
#pragma once
#endif
#define WORLD_FILE_VERSION 101
#include "tier0/platform.h"
#include "rendersystem/irenderdevice.h"
#include "rendersystem/irendercontext.h"
#include "bvhsupport.h"
//--------------------------------------------------------------------------------------
// Chunk types
//--------------------------------------------------------------------------------------
enum BVHChunkType_t { // Client-only resources
// GPU resources
CHUNK_TYPE_RESOURCE_DICTIONARY = 0, // Resource dictionary
CHUNK_TYPE_ENTITIES, // Entity lump
CHUNK_TYPE_HEIRARCHY, // Heirarchy
CHUNK_TYPE_VISIBILITY, // Visibility vectors
MAX_CHUNK_TYPES };
//--------------------------------------------------------------------------------------
// Generic chunk descriptor
//--------------------------------------------------------------------------------------
struct BVHChunkDescriptor_t { DECLARE_BYTESWAP_DATADESC();
BVHChunkType_t m_nChunkType; // type for the chunk
uint64 m_nOffset; // Offset from the beginning of the file to this chunk
uint64 m_nSize; // Number of bytes taken up
};
//--------------------------------------------------------------------------------------
// Fake-material related
//--------------------------------------------------------------------------------------
enum ShaderComboVariation_t { VARIATION_DEFAULT = 0, // business as usual
VARIATION_DEPTH, // depth only
VARIATION_NORM_DEPTH_SPEC, // normal and specular power
VARIATION_SAMPLE_LIGHTING, // sampling lighting
VARIATION_SAMPLE_LIGHTING_LOW_TEXTURE, // sampling lighting and only add a little texture in
// Tools modes
VARIATION_BAKE_ALL, // bake albedo, normal, and specular
VARIATION_RENDER_UV, // Render position and normal to UV space
MAX_VARIATIONS };
#define MAX_RUNTIME_VARIATIONS VARIATION_BAKE_ALL
//--------------------------------------------------------------------------------------
// Resource related
//--------------------------------------------------------------------------------------
enum BVHResourceType_t { // Client-only resources
// GPU resources
BVH_VERTEX_BUFFER = 0, BVH_CONSTANT_BUFFER, BVH_INDEX_BUFFER, BVH_TEXTURE, BVH_PRECOMP_CMD_BUFFER, // 360-only for now
// Cutoff for client-only resources
BVH_MAX_CLIENT_ONLY_RESOURCES = 16, // Make this a hard line in the sand?
// Non-client-only resources
BVH_MATERIAL, // Fake material class
BVH_KDTREE, // KD-tree for raycasts (normally stored in node0)
BVH_POINTLIGHT_DATA, // pointlight data
BVH_HEMILIGHT_DATA, // hemilight data
BVH_SPOTLIGHT_DATA, // spotlight data
BVH_PVS, BVH_SOMETHING_ELSE, };
//--------------------------------------------------------------------------------------
// use this buffer desc instead of BufferDesc_t because BufferDesc_t has pointers
// that won't serialized consistently between 32 and 64bits
//--------------------------------------------------------------------------------------
struct BVHBufferDesc_t { DECLARE_BYTESWAP_DATADESC();
RenderBufferType_t m_nBufferType; int32 m_nElementCount; // Number of vertices/indices
int32 m_nElementSizeInBytes; // Size of a single vertex/index
};
//--------------------------------------------------------------------------------------
// Dictionary related
//--------------------------------------------------------------------------------------
enum BVHDictionaryEntryFlags_t { NON_PAGEABLE = 0x01, // Resource can never be evicted once loaded
USE_SYS_MEMORY = 0x02, // Use system memory to fulfill this request
USE_INSTANCE_DATA = 0x04, // Instance data is in this resource
//USE_GPU_MEMORY = 0x04, // Use GPU visible memory to fulfill this request
USE_TRANSIENT_MEMORY = 0x08, // Use transient memory ( reclaimed system memory )
};
#define MAX_RESOURCE_NAME 64
class CBVHDictionaryEntry { public: DECLARE_BYTESWAP_DATADESC();
CBVHDictionaryEntry() : m_nRefCount( 0 ) { } ~CBVHDictionaryEntry() { }
int AddRef() { return ++m_nRefCount; } int Release() { m_nRefCount--; if ( m_nRefCount == 0 ) { // TODO: do we need to do anything here?
}
return m_nRefCount; } int GetRefCount() { return m_nRefCount; }
uint8 GetFlags() { return m_Flags; } uint64 GetOffset() const { return m_ChunkDesc.m_nOffset; } uint64 GetSize() { return m_ChunkDesc.m_nSize; } int GetResourceType() { return m_nResourceType; } char *GetName() { return m_pName; } bool GetInstanced() { return m_bInstanceData; } void SetFlags( unsigned char Flags ) { m_Flags = Flags; } void SetOffset( uint64 offset ) { m_ChunkDesc.m_nOffset = offset; } void SetSize( uint64 size ) { m_ChunkDesc.m_nSize = size; } void SetResourceType( int type ) { m_nResourceType = type; } void SetName( char *pName ) { Q_strncpy( m_pName, pName, MAX_RESOURCE_NAME ); } void SetInstanced( bool bInstanced ) { m_bInstanceData = bInstanced; } private:
BVHChunkDescriptor_t m_ChunkDesc; // Chunk descriptor for the mapping in file
int32 m_nRefCount; // Reference count
uint32 m_nLastFrameUsed; // The last frame in which this resource was used
int32 m_nResourceType; // of type BVHResourceType_t
char m_pName[MAX_RESOURCE_NAME]; // unique name to help identify this resource or its origin
uint8 m_Flags; // of type DictionaryEntryFlags_t
bool m_bInstanceData; // is this data instanced?
uint8 m_padding[2]; // pad the struct out to a multiple of 4 bytes
};
#define MAX_PAGE_FILE_NAME 64
struct BVHResourceDictionaryHeader_t { DECLARE_BYTESWAP_DATADESC();
int32 m_nInputLayouts; // Number of pre-defined input layouts for this map
int32 m_nResources; // Number of instanced resources
char m_pPageFile[MAX_PAGE_FILE_NAME]; // name of our page file
};
//--------------------------------------------------------------------------------------
// Input layout
//--------------------------------------------------------------------------------------
struct BVHInputLayoutDesc_t { DECLARE_BYTESWAP_DATADESC();
char m_pName[RENDER_INPUT_LAYOUT_FIELD_SEMANTIC_NAME_SIZE]; int32 m_nFields; union { RenderInputLayoutField_t *m_pFields; uint64 m_64Bits; // force to 64bits
}; };
//--------------------------------------------------------------------------------------
// Draw-call related
//--------------------------------------------------------------------------------------
struct BVHResourceBinding_t { DECLARE_BYTESWAP_DATADESC();
int32 m_nResourceIndex; // Which resource in the resource dictionary to bind
int32 m_nBindOffset; // Byte offset for binding (only applicable for buffers)
int32 m_nElementStride; // Element stride (only applicable for buffers) (byte?, short?)
uint8 m_cBindStage; // Which stage to bind to (IA,SHADER)
uint8 m_cBindSlot; uint8 m_padding[2]; // pad this structure out to a multiple of 4 bytes
};
enum BVHDrawCallFlags_t { DRAW_WHEN_NODE_LOADED = 0x00000001, // Wait for the entire node to load before drawing. Mutex with ASAP.
DRAW_ASAP = 0x00000002, // Draw as soon as we're loaded. Don't wait for anything.
DRAW_IF_PREVIOUS_DREW = 0x00000004, // Only draw if our previous draw happened
DRAW_TRANSPARENT = 0x00000008, // We have transparency
DRAW_WHEN_CAMERA_INSIDE = 0x00000010, // Only draw when the camera is in this node
DRAW_ALWAYS = 0x00000020, // Draw if any of the traversal hits this node
DRAW_CULL = 0x00000040, // Cull the draw individually using the draw's bounding box
DRAW_LIGHT = 0x00000080, // The draw call is bounding light geometry
};
enum BVHBindStage_t { BIND_STAGE_MATERIAL = 0x0, BIND_STAGE_SHADER, BIND_STAGE_IA, };
class CBVHDrawCall { public: bool Issue(); // issue the draw call
int32 GetFlags() { return m_Flags; } int32 GetInputLayout() { return m_nInputLayout; } int32 GetNumResourceBindings() { return m_nResourceBindings; }
public: DECLARE_BYTESWAP_DATADESC();
int32 m_Flags; // One of BVHDrawCallFlags_t
AABB_t m_Bounds; // Bounding box for culling
int32 m_nInputLayout; // Index for the pre-defined input layout for the vertices
int32 m_nResourceBindings; // Number of resource bindings
// Draw call data
RenderPrimitiveType_t m_nPrimitiveType; // Type of primitive to draw
int32 m_nBaseVertex; // Base vertex to use when rendering
int32 m_nVertexCount; // Number of vertices
int32 m_nStartIndex; // First index to use
int32 m_nIndexCount; // Number of indices to draw ( or index count per instance if instancing )
int32 m_nStartInstance; // Location of the first instance
int32 m_nInstanceCount; // Number of instances ( if 0, instancing is disabled )
// Binding pointer stored in-file
union // TODO: are nameless unions ok in gcc?
{ BVHResourceBinding_t *m_pResourceBindings; // Resource bindings
uint64 m_64Bits; // pad to 64bits
}; };
//--------------------------------------------------------------------------------------
// BVHNode related
//--------------------------------------------------------------------------------------
enum BVHNodeFlags_t { NODE_SIMPLIFIED = 0x0001, // The geometry is simplified
NODE_UNIQUE_UV = 0x0002, // The geometry is uniquely mapped (likely, we're a higher LOD)
NODE_ATLASED = 0x0004, // This node was atlased but not uniquely mapped
NODE_KDTREE = 0x0008, // Node contains a kd-tree for raycasts
NODE_NODRAW = 0x0010, // Node has no actual draw calls... it's just a container for stuff and other nodes
NODE_START_TRAVERSAL = 0x0020, // Start a traversal at this node (add a check to ensure that the KDTREE flag also exists with this one)
NODE_CAN_SEE_SKY = 0x0040, // Can this node see the sky?
NODE_MOST_DETAILED = 0x0080, // Node is the most detailed node containing the original geometry and textures
};
struct BVHNodeHeader_t { DECLARE_BYTESWAP_DATADESC();
int32 m_nID; // Node ID
int32 m_Flags; // One of BVHNodeFlags_t
// hierarchy
int32 m_nParent; // Parent node
TiledPosition_t m_Origin; // Tiled-position origin placing us in the world
AABB_t m_Bounds; // Axis-aligned bounding-box (pull out and vectorize?)
float m_flMinimumDistance; // Minimum camera distance at which this node renders (pull out and vectorize?)
int32 m_nChildren; // Number of child nodes
// resources
int32 m_nResources; // Number of resources needed by this node (int16?)
int32 m_nDrawCalls; // Number of draw calls (int16?)
};
//--------------------------------------------------------------------------------------
// World related
//--------------------------------------------------------------------------------------
struct BVHBuilderParams_t { DECLARE_BYTESWAP_DATADESC();
int32 m_nSizeBytesPerVoxel; // target size per-voxel
float m_flMinDrawVolumeSize; // minimum size of any draw call
float m_flMinDistToCamera; // minimum distance to camera for near objects
float m_flMinAtlasDist; // minimum distance at which any atlased node can be visible
float m_flMinSimplifiedDist; // minimum distance at which any simplified node can be visible
float m_flHorzFOV; // horizontal fov used for texel to screenspace calcs
float m_flHalfScreenWidth; // half target screen res used for texel to screenspace calcs
int32 m_nAtlasTextureSizeX; // X res of atlas textures
int32 m_nAtlasTextureSizeY; // Y res of atlas textures
int32 m_nUniqueTextureSizeX; // X res of uniquely atlased textures
int32 m_nUniqueTextureSizeY; // Y res of uniquely atlased textures
int32 m_nCompressedAtlasSize; // approx size of a compressed atlas texture
float m_flGutterSize; // gutter size (in texels)
float m_flUVMapThreshold; // cos( angle ) threshold between faces when creating a unique uv parameterization
Vector m_vWorldUnitsPerTile; // world units per tile for tiled coordinates
int32 m_nMaxTexScaleSlots; // maximum number of gpu registers we can take up with texture scaling
bool m_bWrapInAtlas; // true == handle wrapping texcoords by tiling the texture in the atlas
// false == handle wrapping by a frac in the pixel shader
uint8 m_padding[3]; // pad this structure out to a mutiple of 4 bytes
};
//--------------------------------------------------------------------------------------
// File header
//--------------------------------------------------------------------------------------
struct WorldFileHeader_t { DECLARE_BYTESWAP_DATADESC();
uint32 m_nFileVersion; // Versioning
Vector m_vWorldUnitsPerTile; // World units per-tile that this map was built against
int32 m_nChunks; // Number of chunks
BVHBuilderParams_t m_BuilderParams; // Original build parameters ( so we can potentially remake this file )
};
//--------------------------------------------------------------------------------------
// Known chunk headers
//--------------------------------------------------------------------------------------
struct HierarchyChunkHeader_t { DECLARE_BYTESWAP_DATADESC();
int32 m_nNodes; // Number of nodes in this world
int32 m_nMaxNodeSizeBytes; // Maximum size of a node in bytes (Average instead?)
int32 m_nAvgNodeSizeBytes; // Average size of a node in bytes (Average instead?)
};
struct EntityChunkHeader_t { DECLARE_BYTESWAP_DATADESC();
int32 m_nEntities; // Entity count
};
struct VisibilityChunkHeader_t { DECLARE_BYTESWAP_DATADESC();
int32 m_nNodes; // Num nodes accounted for
int32 m_nDWORDS; // Num dwords per visibility chunk
int32 m_nX; // Num grid points in X
int32 m_nY; // Num grid points in Y
int32 m_nZ; // Num grid points in Z
Vector m_vCellSize; // Cell size
Vector m_vStart; // Cell start
};
struct RenderInputLayoutFieldProxy_t { DECLARE_BYTESWAP_DATADESC();
char m_pSemanticName[RENDER_INPUT_LAYOUT_FIELD_SEMANTIC_NAME_SIZE]; int m_nSemanticIndex; ColorFormat_t m_Format; int m_nOffset; int m_nSlot; RenderSlotType_t m_nSlotType; int m_nInstanceStepRate; };
//--------------------------------------------------------------------------------------
// Light data
//--------------------------------------------------------------------------------------
struct PointLightData_t { Vector m_vOrigin; Vector4D m_vColorNRadius; Vector m_vAttenuation; };
struct HemiLightData_t { Vector4D m_vTransform0; // Direction is z column
Vector4D m_vTransform1; // Direction is z column
Vector4D m_vTransform2; // Direction is z column
Vector4D m_vColorNRadius; Vector m_vAttenuation; };
struct SpotLightData_t { Vector4D m_vTransform0; // Direction is z column
Vector4D m_vTransform1; // Direction is z column
Vector4D m_vTransform2; // Direction is z column
Vector4D m_vColorNRadius; Vector4D m_vAttenuationNCosSpot; };
#endif
|