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.
80 lines
2.9 KiB
80 lines
2.9 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef VRAD_DISPCOLL_H |
|
#define VRAD_DISPCOLL_H |
|
#pragma once |
|
|
|
#include <assert.h> |
|
#include "DispColl_Common.h" |
|
|
|
//============================================================================= |
|
// |
|
// VRAD specific collision |
|
// |
|
#define VRAD_QUAD_SIZE 4 |
|
|
|
struct CPatch; |
|
|
|
class CVRADDispColl : public CDispCollTree |
|
{ |
|
public: |
|
|
|
// Creation/Destruction Functions |
|
CVRADDispColl(); |
|
~CVRADDispColl(); |
|
bool Create( CCoreDispInfo *pDisp ); |
|
|
|
// Patches. |
|
bool InitPatch( int iPatch, int iParentPatch, int iChild, Vector *pPoints, int *pIndices, float &flArea ); |
|
bool InitParentPatch( int iPatch, Vector *pPoints, float &flArea ); |
|
float CreateParentPatches( void ); |
|
void CreateChildPatches( int iParentPatch, int nLevel ); |
|
void CreateChildPatchesFromRoot( int iParentPatch, int *pChildPatch ); |
|
void CreateChildPatchesSub( int iParentPatch ); |
|
|
|
// Operations Functions |
|
void BaseFacePlaneToDispUV( Vector const &vecPlanePt, Vector2D &dispUV ); |
|
void DispUVToSurfPoint( Vector2D const &dispUV, Vector &vecPoint, float flPushEps ); |
|
void DispUVToSurfNormal( Vector2D const &dispUV, Vector &vecNormal ); |
|
|
|
// Data. |
|
inline float GetSampleRadius2( void ) { return m_flSampleRadius2; } |
|
inline float GetPatchSampleRadius2( void ) { return m_flPatchSampleRadius2; } |
|
|
|
inline int GetParentIndex( void ) { return m_iParent; } |
|
inline void GetParentFaceNormal( Vector &vecNormal ) { vecNormal = m_vecStabDir; } |
|
|
|
inline void GetVert( int iVert, Vector &vecVert ) { Assert( ( iVert >= 0 ) && ( iVert < GetSize() ) ); vecVert = m_aVerts[iVert]; } |
|
inline void GetVertNormal( int iVert, Vector &vecNormal ) { Assert( ( iVert >= 0 ) && ( iVert < GetSize() ) ); vecNormal = m_aVertNormals[iVert]; } |
|
inline Vector2D const& GetLuxelCoord( int iLuxel ) { Assert( ( iLuxel >= 0 ) && ( iLuxel < GetSize() ) ); return m_aLuxelCoords[iLuxel]; } |
|
|
|
// Raytracing |
|
void AddPolysForRayTrace( void ); |
|
|
|
protected: |
|
|
|
void CalcSampleRadius2AndBox( dface_t *pFace ); |
|
|
|
// Utility. |
|
void DispUVToSurf_TriTLToBR( Vector &vecPoint, float flPushEps, float flU, float flV, int nSnapU, int nSnapV, int nWidth, int nHeight ); |
|
void DispUVToSurf_TriBLToTR( Vector &vecPoint, float flPushEps, float flU, float flV, int nSnapU, int nSnapV, int nWidth, int nHeight ); |
|
void GetSurfaceMinMax( Vector &boxMin, Vector &boxMax ); |
|
void GetMinorAxes( Vector const &vecNormal, int &nAxis0, int &nAxis1 ); |
|
|
|
protected: |
|
|
|
int m_iParent; // Parent index |
|
float m_flSampleRadius2; // Sampling radius |
|
float m_flPatchSampleRadius2; // Patch sampling radius (max bound) |
|
float m_flSampleWidth; |
|
float m_flSampleHeight; |
|
CUtlVector<Vector2D> m_aLuxelCoords; // Lightmap coordinates. |
|
CUtlVector<Vector> m_aVertNormals; // Displacement vertex normals |
|
}; |
|
|
|
#endif // VRAD_DISPCOLL_H
|