mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-11 19:29:08 +00:00
1
This commit is contained in:
@@ -0,0 +1,237 @@
|
||||
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||||
//
|
||||
// Purpose:
|
||||
//
|
||||
// $Workfile: $
|
||||
// $Date: $
|
||||
// $NoKeywords: $
|
||||
//===========================================================================//
|
||||
|
||||
#ifndef GL_RSURF_H
|
||||
#define GL_RSURF_H
|
||||
|
||||
#ifdef _WIN32
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#include "mathlib/vector.h"
|
||||
#include "bsptreedata.h"
|
||||
#include "materialsystem/imesh.h"
|
||||
|
||||
class Vector;
|
||||
struct WorldListInfo_t;
|
||||
class IMaterial;
|
||||
class IClientRenderable;
|
||||
class IBrushRenderer;
|
||||
class IClientEntity;
|
||||
struct model_t;
|
||||
struct cplane_t;
|
||||
struct VisibleFogVolumeInfo_t;
|
||||
|
||||
struct LightmapUpdateInfo_t
|
||||
{
|
||||
SurfaceHandle_t m_SurfHandle;
|
||||
int transformIndex;
|
||||
};
|
||||
|
||||
struct LightmapTransformInfo_t
|
||||
{
|
||||
model_t *pModel;
|
||||
matrix3x4_t xform;
|
||||
};
|
||||
extern CUtlVector<LightmapUpdateInfo_t> g_LightmapUpdateList;
|
||||
extern CUtlVector<LightmapTransformInfo_t> g_LightmapTransformList;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Helper class to iterate over leaves
|
||||
//-----------------------------------------------------------------------------
|
||||
class IEngineSpatialQuery : public ISpatialQuery
|
||||
{
|
||||
public:
|
||||
};
|
||||
|
||||
extern IEngineSpatialQuery* g_pToolBSPTree;
|
||||
|
||||
class IWorldRenderList;
|
||||
IWorldRenderList *AllocWorldRenderList();
|
||||
|
||||
void R_Surface_LevelInit();
|
||||
void R_Surface_LevelShutdown();
|
||||
void R_SceneBegin( void );
|
||||
void R_SceneEnd( void );
|
||||
void R_BuildWorldLists( IWorldRenderList *pRenderList, WorldListInfo_t* pInfo, int iForceViewLeaf, const struct VisOverrideData_t* pVisData, bool bShadowDepth = false, float *pWaterReflectionHeight = NULL );
|
||||
void R_DrawWorldLists( IWorldRenderList *pRenderList, unsigned long flags, float waterZAdjust );
|
||||
|
||||
void R_GetVisibleFogVolume( const Vector& vEyePoint, VisibleFogVolumeInfo_t *pInfo );
|
||||
void R_SetFogVolumeState( int fogVolume, bool useHeightFog );
|
||||
IMaterial *R_GetFogVolumeMaterial( int fogVolume, bool bEyeInFogVolume );
|
||||
void R_SetupSkyTexture( model_t *pWorld );
|
||||
|
||||
void Shader_DrawLightmapPageChains( IWorldRenderList *pRenderList, int pageId );
|
||||
void Shader_DrawLightmapPageSurface( SurfaceHandle_t surfID, float red, float green, float blue );
|
||||
void Shader_DrawTranslucentSurfaces( IWorldRenderList *pRenderList, int sortIndex, unsigned long flags, bool bShadowDepth );
|
||||
bool Shader_LeafContainsTranslucentSurfaces( IWorldRenderList *pRenderList, int sortIndex, unsigned long flags );
|
||||
void R_DrawTopView( bool enable );
|
||||
void R_TopViewBounds( const Vector2D & mins, const Vector2D & maxs );
|
||||
|
||||
// Resets a world render list
|
||||
void ResetWorldRenderList( IWorldRenderList *pRenderList );
|
||||
|
||||
// Computes the centroid of a surface
|
||||
void Surf_ComputeCentroid( SurfaceHandle_t surfID, Vector *pVecCentroid );
|
||||
|
||||
// Installs a client-side renderer for brush models
|
||||
void R_InstallBrushRenderOverride( IBrushRenderer* pBrushRenderer );
|
||||
|
||||
// update dlight status on a brush model
|
||||
extern int R_MarkDlightsOnBrushModel( model_t *model, IClientRenderable *pRenderable );
|
||||
|
||||
void R_DrawBrushModel(
|
||||
IClientEntity *baseentity,
|
||||
model_t *model,
|
||||
const Vector& origin,
|
||||
const QAngle& angles,
|
||||
ERenderDepthMode DepthMode, bool bDrawOpaque, bool bDrawTranslucent );
|
||||
|
||||
void R_DrawBrushModelShadow( IClientRenderable* pRender );
|
||||
void R_BrushBatchInit( void );
|
||||
|
||||
int R_GetBrushModelPlaneCount( const model_t *model );
|
||||
const cplane_t &R_GetBrushModelPlane( const model_t *model, int nIndex, Vector *pOrigin );
|
||||
|
||||
bool TangentSpaceSurfaceSetup( SurfaceHandle_t surfID, Vector &tVect );
|
||||
void TangentSpaceComputeBasis( Vector& tangentS, Vector& tangentT, const Vector& normal, const Vector& tVect, bool negateTangent );
|
||||
|
||||
#ifndef NEWMESH
|
||||
inline void BuildIndicesForSurface( CMeshBuilder &meshBuilder, SurfaceHandle_t surfID )
|
||||
{
|
||||
int nSurfTriangleCount = MSurf_VertCount( surfID ) - 2;
|
||||
unsigned short startVert = MSurf_VertBufferIndex( surfID );
|
||||
Assert(startVert!=0xFFFF);
|
||||
|
||||
// NOTE: This switch appears to help performance
|
||||
// add surface to this batch
|
||||
switch (nSurfTriangleCount)
|
||||
{
|
||||
case 1:
|
||||
meshBuilder.FastIndex( startVert );
|
||||
meshBuilder.FastIndex( startVert + 1 );
|
||||
meshBuilder.FastIndex( startVert + 2 );
|
||||
break;
|
||||
|
||||
case 2:
|
||||
meshBuilder.FastIndex( startVert );
|
||||
meshBuilder.FastIndex( startVert + 1 );
|
||||
meshBuilder.FastIndex( startVert + 2 );
|
||||
meshBuilder.FastIndex( startVert );
|
||||
meshBuilder.FastIndex( startVert + 2 );
|
||||
meshBuilder.FastIndex( startVert + 3 );
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
for ( unsigned short v = 0; v < nSurfTriangleCount; ++v )
|
||||
{
|
||||
meshBuilder.FastIndex( startVert );
|
||||
meshBuilder.FastIndex( startVert + v + 1 );
|
||||
meshBuilder.FastIndex( startVert + v + 2 );
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
inline void BuildIndicesForWorldSurface( CMeshBuilder &meshBuilder, SurfaceHandle_t surfID, worldbrushdata_t *pData )
|
||||
{
|
||||
if ( SurfaceHasPrims(surfID) )
|
||||
{
|
||||
mprimitive_t *pPrim = &pData->primitives[MSurf_FirstPrimID( surfID, pData )];
|
||||
Assert(pPrim->vertCount==0);
|
||||
unsigned short startVert = MSurf_VertBufferIndex( surfID );
|
||||
Assert( pPrim->indexCount == ((MSurf_VertCount( surfID ) - 2)*3));
|
||||
|
||||
for ( int primIndex = 0; primIndex < pPrim->indexCount; primIndex++ )
|
||||
{
|
||||
meshBuilder.FastIndex( pData->primindices[pPrim->firstIndex + primIndex] + startVert );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
BuildIndicesForSurface( meshBuilder, surfID );
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
inline void BuildIndicesForSurface( CIndexBufferBuilder &indexBufferBuilder, SurfaceHandle_t surfID )
|
||||
{
|
||||
int nSurfTriangleCount = MSurf_VertCount( surfID ) - 2;
|
||||
unsigned short startVert = MSurf_VertBufferIndex( surfID );
|
||||
Assert(startVert!=0xFFFF);
|
||||
|
||||
// NOTE: This switch appears to help performance
|
||||
// add surface to this batch
|
||||
switch (nSurfTriangleCount)
|
||||
{
|
||||
case 1:
|
||||
indexBufferBuilder.FastIndex( startVert );
|
||||
Warning( "BuildIndicesForSurface: indexBufferBuilder.FastIndex( %d )\n", ( int )( startVert ) );
|
||||
indexBufferBuilder.FastIndex( startVert + 1 );
|
||||
Warning( "BuildIndicesForSurface: indexBufferBuilder.FastIndex( %d )\n", ( int )( startVert + 1 ) );
|
||||
indexBufferBuilder.FastIndex( startVert + 2 );
|
||||
Warning( "BuildIndicesForSurface: indexBufferBuilder.FastIndex( %d )\n", ( int )( startVert + 2 ) );
|
||||
break;
|
||||
|
||||
case 2:
|
||||
indexBufferBuilder.FastIndex( startVert );
|
||||
Warning( "BuildIndicesForSurface: indexBufferBuilder.FastIndex( %d )\n", ( int )( startVert ) );
|
||||
indexBufferBuilder.FastIndex( startVert + 1 );
|
||||
Warning( "BuildIndicesForSurface: indexBufferBuilder.FastIndex( %d )\n", ( int )( startVert + 1 ) );
|
||||
indexBufferBuilder.FastIndex( startVert + 2 );
|
||||
Warning( "BuildIndicesForSurface: indexBufferBuilder.FastIndex( %d )\n", ( int )( startVert + 2 ) );
|
||||
indexBufferBuilder.FastIndex( startVert );
|
||||
Warning( "BuildIndicesForSurface: indexBufferBuilder.FastIndex( %d )\n", ( int )( startVert ) );
|
||||
indexBufferBuilder.FastIndex( startVert + 2 );
|
||||
Warning( "BuildIndicesForSurface: indexBufferBuilder.FastIndex( %d )\n", ( int )( startVert + 2 ) );
|
||||
indexBufferBuilder.FastIndex( startVert + 3 );
|
||||
Warning( "BuildIndicesForSurface: indexBufferBuilder.FastIndex( %d )\n", ( int )( startVert + 3 ) );
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
for ( unsigned short v = 0; v < nSurfTriangleCount; ++v )
|
||||
{
|
||||
indexBufferBuilder.FastIndex( startVert );
|
||||
Warning( "BuildIndicesForSurface: indexBufferBuilder.FastIndex( %d )\n", ( int )( startVert ) );
|
||||
indexBufferBuilder.FastIndex( startVert + v + 1 );
|
||||
Warning( "BuildIndicesForSurface: indexBufferBuilder.FastIndex( %d )\n", ( int )( startVert + v + 1 ) );
|
||||
indexBufferBuilder.FastIndex( startVert + v + 2 );
|
||||
Warning( "BuildIndicesForSurface: indexBufferBuilder.FastIndex( %d )\n", ( int )( startVert + v + 2 ) );
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
inline void BuildIndicesForWorldSurface( CIndexBufferBuilder &indexBufferBuilder, SurfaceHandle_t surfID, worldbrushdata_t *pData )
|
||||
{
|
||||
if ( SurfaceHasPrims(surfID) )
|
||||
{
|
||||
mprimitive_t *pPrim = &pData->primitives[MSurf_FirstPrimID( surfID, pData )];
|
||||
Assert(pPrim->vertCount==0);
|
||||
unsigned short startVert = MSurf_VertBufferIndex( surfID );
|
||||
Assert( pPrim->indexCount == ((MSurf_VertCount( surfID ) - 2)*3));
|
||||
|
||||
for ( int primIndex = 0; primIndex < pPrim->indexCount; primIndex++ )
|
||||
{
|
||||
indexBufferBuilder.FastIndex( pData->primindices[pPrim->firstIndex + primIndex] + startVert );
|
||||
Warning( "BuildIndicesForWorldSurface: indexBufferBuilder.FastIndex( %d )\n", ( int )( pData->primindices[pPrim->firstIndex + primIndex] + startVert ) );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
BuildIndicesForSurface( indexBufferBuilder, surfID );
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif // GL_RSURF_H
|
||||
Reference in New Issue
Block a user