This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

93 lines
3.2 KiB
C++

//========= 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