132 lines
2.6 KiB
C++
132 lines
2.6 KiB
C++
//========= Copyright © 2009, Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose: Defines the regular grid nav as required by DOTA. Builds, renders,
|
|
// and saves out the nav. Traversable edges and cells are determined by
|
|
// picking into the world.
|
|
//
|
|
//=============================================================================//
|
|
|
|
#ifndef GRIDNAV_H
|
|
#define GRIDNAV_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
class CRender3D;
|
|
class CMapDoc;
|
|
|
|
#include "mathlib/vector.h"
|
|
#include "utlvector.h"
|
|
|
|
class CGridNavCell
|
|
{
|
|
public:
|
|
|
|
inline CGridNavCell();
|
|
|
|
bool m_bTraversable;
|
|
|
|
int m_nGridPosX;
|
|
int m_nGridPosY;
|
|
|
|
float m_flHeight;
|
|
};
|
|
|
|
class CGridNav
|
|
{
|
|
public:
|
|
|
|
CGridNav();
|
|
|
|
inline static bool IsEnabled();
|
|
|
|
inline bool IsPreviewActive();
|
|
inline void TogglePreview();
|
|
|
|
static void Init( bool enabled, float flEdgeSize = 0.0f, float flOffsetX = 0.0f, float flOffsetY = 0.0f, float flTraceHeight = 0.0f );
|
|
|
|
void Render( CRender3D *pRender, const Vector &vViewPos, const Vector &vViewDir );
|
|
|
|
void Update( CMapDoc *pMapDoc, const Vector &vViewPos, const Vector &vViewDir );
|
|
|
|
void GenerateGridNavFile( const char *pFileFullPath );
|
|
|
|
inline int CoordToGridPosX( float flCoordX ) const;
|
|
inline int CoordToGridPosY( float flCoordY ) const;
|
|
|
|
inline float GridPosXToCoordCenter( int nGridPosX ) const;
|
|
inline float GridPosYToCoordCenter( int nGridPosY ) const;
|
|
|
|
private:
|
|
|
|
static bool sm_bEnabled;
|
|
static float sm_flEdgeSize;
|
|
static float sm_flOffsetX;
|
|
static float sm_flOffsetY;
|
|
static float sm_flTraceHeight;
|
|
|
|
Vector m_vLatestCameraPos;
|
|
Vector m_vLatestCameraDir;
|
|
bool m_bNeedsCameraRecompute;
|
|
float m_flTimeCameraLastMoved;
|
|
int m_nTicksCameraStill;
|
|
|
|
CUtlVector< CGridNavCell > m_CurrentCells;
|
|
|
|
bool m_bPreviewActive;
|
|
};
|
|
|
|
|
|
////////////////////
|
|
|
|
bool CGridNav::IsEnabled()
|
|
{
|
|
return sm_bEnabled;
|
|
}
|
|
|
|
|
|
bool CGridNav::IsPreviewActive()
|
|
{
|
|
return m_bPreviewActive;
|
|
}
|
|
|
|
|
|
void CGridNav::TogglePreview()
|
|
{
|
|
m_bPreviewActive = !m_bPreviewActive;
|
|
}
|
|
|
|
|
|
int CGridNav::CoordToGridPosX( float flCoordX ) const
|
|
{
|
|
return (int)floor( ( ( flCoordX - sm_flOffsetX ) + ( sm_flEdgeSize * 0.5f ) ) / sm_flEdgeSize );
|
|
}
|
|
|
|
|
|
int CGridNav::CoordToGridPosY( float flCoordY ) const
|
|
{
|
|
return (int)floor( ( ( flCoordY - sm_flOffsetY ) + ( sm_flEdgeSize * 0.5f ) ) / sm_flEdgeSize );
|
|
}
|
|
|
|
|
|
float CGridNav::GridPosXToCoordCenter( int nGridPosX ) const
|
|
{
|
|
return ( ( (float)(nGridPosX) ) * sm_flEdgeSize ) + sm_flOffsetX;
|
|
}
|
|
|
|
|
|
float CGridNav::GridPosYToCoordCenter( int nGridPosY ) const
|
|
{
|
|
return ( ( (float)(nGridPosY) ) * sm_flEdgeSize ) + sm_flOffsetY;
|
|
}
|
|
|
|
|
|
CGridNavCell::CGridNavCell()
|
|
: m_bTraversable( false )
|
|
, m_nGridPosX( 0 )
|
|
, m_nGridPosY( 0 )
|
|
, m_flHeight( 0.0f )
|
|
{
|
|
}
|
|
|
|
#endif // GRIDNAV_H
|