//===== Copyright © 1996-2005, Valve Corporation, All rights reserved. ======// // // Purpose: // // $NoKeywords: $ // //===========================================================================// #ifndef BVH_SUPPORT_H #define BVH_SUPPORT_H #include #include #include #include #include //-------------------------------------------------------------------------------------- // Temp material: this is all throwaway //-------------------------------------------------------------------------------------- #define MAX_SHADER_NAME 48 #define MAX_BINDS 16 enum BindStage_t { STAGE_VS = 0, STAGE_HS = 1, STAGE_DS = 2, STAGE_GS = 3, STAGE_PS = 4 }; enum BindSampler_t { SAMPLER_LINEAR = 0, SAMPLER_POINT = 1, SAMPLER_ANISO = 2, SAMPLER_SHADOW_LESS = 3 }; struct MaterialResourceBinding_t { DECLARE_BYTESWAP_DATADESC(); uint8 m_cBindStage; // Which stage to bind to (VS,HS,DS,GS,PS) uint8 m_cBindSlot; // Which slot to bind to in this stage uint8 m_cBindSampler; // If this is a texture, this is the sampler enum to use //uint8 m_padding; // don't worry about padding, because we're storing an array of 16 of them }; struct Material_t { DECLARE_BYTESWAP_DATADESC(); char m_szShaderVS[MAX_SHADER_NAME]; char m_szShaderPS[MAX_SHADER_NAME]; int32 m_nBinds; MaterialResourceBinding_t m_Binds[MAX_BINDS]; float m_flPhongExp; float m_flPhongBoost; // Alloc these in blocks of 4 for alignment bool m_bAlphaTest; // Need to explicitly call out alpha-test so that we can bind textures during the shadow pass bool m_bInstanced; // use instancing for this material bool m_bUseAtlas; // use an atlas with an indirection texture bool m_bVertexColor; // don't use a texture map, color is in the vertices bool m_bNormalMap; // have a normal map bool m_bPhong; // use phong bool m_bPhongTexture; // pull phong exp from a texture bool m_bPadding; }; //-------------------------------------------------------------------------------------- // Tiled coordinate //-------------------------------------------------------------------------------------- struct IntVector { DECLARE_BYTESWAP_DATADESC(); int x,y,z; }; extern Vector g_vWorldUnitsPerTile; struct TiledPosition_t { DECLARE_BYTESWAP_DATADESC(); IntVector m_vTile; Vector m_vLocal; void Rationalize() { Vector vFloor( floor( m_vLocal.x / g_vWorldUnitsPerTile.x ), floor( m_vLocal.y / g_vWorldUnitsPerTile.y ), floor( m_vLocal.z / g_vWorldUnitsPerTile.z ) ); m_vTile.x += (int)vFloor.x; m_vTile.y += (int)vFloor.y; m_vTile.z += (int)vFloor.z; m_vLocal -= vFloor * g_vWorldUnitsPerTile; } TiledPosition_t operator +( TiledPosition_t &Other ) { TiledPosition_t retVal; retVal.m_vTile.x = m_vTile.x + Other.m_vTile.x; retVal.m_vTile.y = m_vTile.y + Other.m_vTile.y; retVal.m_vTile.z = m_vTile.z + Other.m_vTile.z; retVal.m_vLocal = m_vLocal + Other.m_vLocal; retVal.Rationalize(); return retVal; } TiledPosition_t operator -( TiledPosition_t &Other ) { TiledPosition_t retVal; retVal.m_vTile.x = m_vTile.x - Other.m_vTile.x; retVal.m_vTile.y = m_vTile.y - Other.m_vTile.y; retVal.m_vTile.z = m_vTile.z - Other.m_vTile.z; retVal.m_vLocal = m_vLocal - Other.m_vLocal; retVal.Rationalize(); return retVal; } Vector ToWorldPosition() { Vector vTile( m_vTile.x, m_vTile.y, m_vTile.z ); return vTile * g_vWorldUnitsPerTile + m_vLocal; } }; #include "frustum.h" //-------------------------------------------------------------------------------------- // generic buffer for variable sized vertices //-------------------------------------------------------------------------------------- class CGenericBuffer { public: CGenericBuffer( int nElementStride = 0, int nGrowElements = 1024, int nInitElements = 1024 ) : m_pMemory( NULL ), m_nAllocBytes( 0 ) { Init( nElementStride, nGrowElements, nInitElements ); } ~CGenericBuffer() { Purge(); } void Init( int nElementStride, int nGrowElements = 1024, int nInitElements = 1024 ) { Purge(); m_nElementStride = nElementStride; m_nGrowBytes = nGrowElements * nElementStride; m_nAllocBytes = nInitElements * nElementStride; m_pMemory = new unsigned char[ nInitElements * nElementStride ]; } int GetElementStride() const { return m_nElementStride; } unsigned char *Base() const { return m_pMemory; } int ByteCount() const { return m_nElements * m_nElementStride; } int Count() const { return m_nElements; } int AddToTail( unsigned char* pElement ) { EnsureAddSize( 1 ); Q_memcpy( m_pMemory + m_nElements * m_nElementStride, pElement, m_nElementStride ); m_nElements++; return m_nElements-1; } int AddMultipleToTail( int nCount, unsigned char* pElements ) { EnsureAddSize( nCount ); Q_memcpy( m_pMemory + m_nElements * m_nElementStride, pElements, nCount * m_nElementStride ); m_nElements += nCount; return m_nElements-1; } int AddMultipleToTail( int nCount ) { EnsureAddSize( nCount ); Q_memset( m_pMemory + m_nElements * m_nElementStride, 0, nCount * m_nElementStride ); m_nElements += nCount; return m_nElements-1; } void RestrideElements( int nNewStride ) { uint8 *pNewMemory = new uint8[ nNewStride * m_nElements ]; int nMinStride = MIN( nNewStride, m_nElementStride ); uint8 *pNewStart = pNewMemory; for ( int i=0; i