// pathfindergenerator.h #ifndef _3DTERRAIN_PATHFINDERGENERATOR_H_ #define _3DTERRAIN_PATHFINDERGENERATOR_H_ #include "pathfinderbase.h" #include "pathtile.h" #include "pathedge.h" #include #include class CPathFinderGenerator : public CPathFinderBase { public: CPathFinderGenerator(); virtual ~CPathFinderGenerator(); virtual void Clear(); virtual void Destroy(); virtual BOOL Serialize( CWzArchive *pArchive); public: /// @name ÁöÇü »ý¼º virtual BOOL GenerateFrom( CWzdBase *pWzd, int iMeshGroup); virtual BOOL Refresh(); ///< ±æÃ£±â Á¤º¸ ´Ù½Ã »ý¼º virtual BOOL RenewalCurrentTileInfoToOcxtree(); //. ÇöÀç Àִ ŸÀÏ Á¤º¸¸¦ ¿ÁÆ®¸®¿¡ ´Ù½Ã µî·Ï½ÃŲ´Ù. /// @name --- ÁöÇü ±¸Á¶ protected: /// @name Á¤Á¡ ¸®½ºÆ® int m_iMaxPathVertices; ///< ÃÖ´ë Á¤Á¡ °³¼ö int m_iNumPathVertices; ///< Á¤Á¡ °³¼ö WzVector * m_pwvPathVertices; ///< Á¤Á¡À» ´ãÀº ¹öÆÛ /// @name ŸÀϵé int m_iNumPathTiles; CPathTile * m_pPathTiles; /// @name ¸ð¼­¸®µé int m_iMaxPathEdges; ///< ÃÖ´ë ¸ð¼­¸® °³¼ö int m_iNumPathEdges; ///< ¸ð¼­¸® °³¼ö CPathEdge * m_pPathEdges; ///< ¸ð¼­¸®¸¦ ´ãÀº ¹öÆÛ protected: void ConstructPathTiles( CWzdBase *pWzd, int iMeshGroup); int AddPathVertex( WzVector wvPos); void ConstructPathEdges(); ///< PathTile °æ°è »ý¼º int FindPathEdge( int iVertex1, int iVertex2); int AddPathEdge( int iVertex1, int iVertex2, WzVector wvCenter); float CalculateDistance( int iTile, int iTilePrev ); /// @name --- ·»´õ¸µ/Picking public: virtual void RenderPathTile( CDrawBase *pDraw, WORD wAttribute = 0, int *piTiles = NULL, int iNumTile = 0, BOOL bViewCollision = FALSE); virtual int PickPathTile( WzRay *pwr, float *pfT = NULL, BOOL bCulling = TRUE); virtual int PickPathTileForDebug( WzRay *pwr, WzVector* pResultVertexArray, int MaxVertexArrayCount, int* MeshCount, COctNode** pNode, float *pfT, BOOL bCulling); virtual BOOL CheckPickablePathTile(WzVector* pwvCollision); virtual BOOL IsOnTile( int iTile, WzRay *pwr, float *pfT = NULL, BOOL bCulling = TRUE); virtual WzVector GetRandomPosInTile( int iTile); virtual BOOL CorrectHeightByTile( int iTile, WzVector *pwvPos); protected: CWzArray m_arTileMap; CWzArray m_arVertexMap; CWzArray m_arUV; void InitInstantBufferToRender(); /// @name --- ŸÀÏ Á¤º¸ ¼¼ÆÃ/¾ò±â public: virtual int GetNumPathTile() { return ( m_iNumPathTiles); } /// @name ¼Ó¼º virtual void SetAttribute( int iTile, WORD wAttribute ); virtual void UnsetAttribute( int iTile, WORD wAttribute ); virtual BOOL CheckAttribute( int iTile, WORD wAttribute ); virtual WORD GetAttribute( int iTile); /// @name Octree °ü·Ã virtual WzOctIndex GetTileOctIndex( int iTile) { return ( m_pPathTiles[iTile].GetOctIndex()); } /// @name Convex virtual int GetConvexOfTile( int iTile); virtual int GetNearNodes( int iTile, int *piTile, int iMaxCount); virtual void GetTileVertexInfo(WzVector* pvOut, const int iTile); /// @name --- ±æÃ£±â °á°ú¸¦ ÀÌ¿ëÇØ¼­ ã¾Æ°¥ ¶§ public: virtual BOOL FindPath_Requst_NewAgent(CPathExplorer *ppe){return TRUE;} virtual float GetRealDistance( int iNode1, int iNode2, WzVector *pwvPos1, WzVector *pwvPos2, WzVector *pwvDir); virtual WzVector GetNearestPointToTarget( int iTile, WzVector wvTarget); ///< iTile ³»ÀÇ Á¡µé Áß¿¡ wvTarget °ú °¡Àå °¡±î¿î Á¡À» ¾ò´Â´Ù. WzVector GetPerpendicular( WzVector wvPoint, WzVector wvVec1, WzVector wvVec2 ); virtual ENUM_MD_RESULT MoveByDirection( int iCurrentTile, WzVector wvCurrentPos, WzVector wvDistance, int *piResultTile, WzVector *pwvResultPos, WORD wAttribute = ( PTA_ONLY_JUMP | PTA_NO_WALK), WzVector *pwvSlide = NULL); protected: /** * ÁÖ¾îÁø µÎÁ¡(From°ú To)À» ÀÕ´Â Á÷¼±°ú ¸ñÇ¥ ŸÀÏ(iTime)°úÀÇ ±³Â÷Á¡À» °Ë»çÇÏ¿© °á°ú¸¦ ¹ÝȯÇÑ´Ù. * @param piResult : int[3]ÇüÀÇ µ¥ÀÌÅÍ·Î ±³Â÷½Ã 1, ¹Ì±³Â÷½Ã 0À» ¼³Á¤ÇÏ¿© ¹ÝȯÇÑ´Ù. */ void Tile_HitTest( int iTile, WzVector wvFrom, WzVector wvTo, int *piResult, float *pfDist); BOOL Tile_TestBlocked( int *piNearTiles, int *piCrossResult, WORD wAttribute, int iException, int *piResult, float *pfDist); BOOL Tile_GetBlockedPos( WzVector *pwvResult, int iEdgeVert1, int iEdgeVert2, WzVector *pwvFrom, WzVector *pwvTo, WzVector *pwvSlide = NULL); BOOL Tile_CrossCheck( WzVector *pwvFrom, WzVector *pwvTo, WzVector *pwvEdge1, WzVector *pwvEdge2, float *pfDist, WzVector* pwvCross = NULL); /// @name --- ±æÃ£±â ¸Å½¬ ÀúÀå/Àç»ý¼º °ü·Ã ÇÔ¼ö. public: virtual BOOL SavePathTiles( CWzArchive *pArchive); virtual void GetTilesInBoundingVolume( CDrawBase *pDraw, WzBoundingVolume *pBV, CWzArray *arResult); virtual void GetTilesInterSectBoundingVolume( CDrawBase *pDraw, WzBoundingVolume *pBV, CWzArray *arResult); // °Ë»ç public: virtual BOOL CheckTileConnection( WzVector *pwvError); }; #endif // _3DTERRAIN_PATHFINDERGENERATOR_H_