//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $Workfile: $ // $Date: $ // //----------------------------------------------------------------------------- // $Log: $ // // $NoKeywords: $ //=============================================================================// #ifndef DISPMAPIMAGEFILTER_H #define DISPMAPIMAGEFILTER_H #pragma once class CChunkFile; class CMapDisp; enum ChunkFileResult_t; //#define PAINTAXIS_AXIAL_X 0 //#define PAINTAXIS_AXIAL_Y 1 //#define PAINTAXIS_AXIAL_Z 2 //#define PAINTAXIS_SUBDIV 3 //#define PAINTAXIS_FACE 4 //============================================================================= // // height,0-------height,width // | | // | | "Orientation of Filter" // | | // | | // | | // | | // | | // 0,0---------0,width // //#define IMAGEFILTERTYPE_ADD 0 //#define IMAGEFILTERTYPE_MULT 1 //#define IMAGEFILTERTYPE_CONV 2 //#define IMAGEFILTERTYPE_CONVATTEN 3 //#define IMAGEFILTERTYPE_EQUAL 4 #define IMAGEFILTER_EQUALMASK -99999.0f //#define IMAGEFILTERDATA_DISTANCE 0 //#define IMAGEFILTERDATA_ALPHA 1 //----------------------------------------------------------------------------- // // 2--3--4 // | | // 1 8 5 // | | // 0--7--6 // //----------------------------------------------------------------------------- #define IMAGEFILTER_WEST 1 #define IMAGEFILTER_NORTH 3 #define IMAGEFILTER_EAST 5 #define IMAGEFILTER_SOUTH 7 #define IMAGEFILTER_SOUTHWEST 0 #define IMAGEFILTER_NORTHWEST 2 #define IMAGEFILTER_NORTHEAST 4 #define IMAGEFILTER_SOUTHEAST 6 #define IMAGEFILTER_MAIN 8 #define IMAGEFILTER_ORIENT_WEST 0 #define IMAGEFILTER_ORIENT_NORTH 1 #define IMAGEFILTER_ORIENT_EAST 2 #define IMAGEFILTER_ORIENT_SOUTH 3 #define IMAGEFILTER_ORIENT_SOUTHWEST 0 #define IMAGEFILTER_ORIENT_SOUTHEAST 1 #define IMAGEFILTER_ORIENT_NORTHWEST 2 #define IMAGEFILTER_ORIENT_NORTHEAST 3 //============================================================================= // // Displacement Image Filter // class CDispMapImageFilter { public: unsigned int m_Type; // type of filter -- add, multiply, conv, etc. int m_DataType; // type of data - distance, alpha (all 1-d) float *m_pImage; // filter "image" - matrix defining the "brush" int m_Height; // filter size (height) int m_Width; // filter size (width) // set at run-time float m_Scale; // scale int m_AreaHeight; // convolution area of effect (height) int m_AreaWidth; // convolution area of effect (width) // icon name CString m_Name; // name of filter CDispMapImageFilter(); ~CDispMapImageFilter(); ChunkFileResult_t LoadFilter( CChunkFile *pFile ); private: static int GetFilterType( CString type ); static ChunkFileResult_t LoadFilterKeyCallback( const char *szKey, const char *szValue, CDispMapImageFilter *pFilter ); static ChunkFileResult_t LoadImageCallback( CChunkFile *pFile, CDispMapImageFilter *pFilter ); static ChunkFileResult_t LoadImageKeyCallback( const char *szKey, const char *szValue, CDispMapImageFilter *pFilter ); static void ValidHeight( int height ); static void ValidWidth( int width ); }; //============================================================================= // // Displacement Image Filter Manager // #define FILTERLIST_SIZE 64 class CDispMapImageFilterManager { public: //========================================================================= // // Filter Creation/Destruction Functions // CDispMapImageFilterManager(); CDispMapImageFilter *Create( void ); void Destroy( void ); void Add( CDispMapImageFilter *pFilter ); //========================================================================= // // Filter List Functions // inline int GetFilterCount( void ); inline CDispMapImageFilter *GetFilter( int ndx ); void AddFilterToList( CDispMapImageFilter *pFilter ); inline void SetActiveFilter( int ndx ); inline CDispMapImageFilter *GetActiveFilter( void ); //========================================================================= // // Operation Functions // bool Apply( CDispMapImageFilter *pFilter, CMapDisp *pDisp, int paintDirType, Vector const &vPaintDir, bool bSew ); private: int m_ActiveFilter; int m_FilterCount; CDispMapImageFilter *m_pFilterList[FILTERLIST_SIZE]; int m_PaintType; Vector m_PaintDir; //======================================================================== // // Filter Application Operation Functions // bool PreApply( CDispMapImageFilter *pFilter, int nPaintDirType, const Vector &vecPaintDir ); bool PostApply( bool bSew ); void ApplyAt( CDispMapImageFilter *pFilter, CMapDisp *pDisp, int ndxVert ); void ApplyAddFilter( CDispMapImageFilter *pFilter, CMapDisp *pDisp, int ndxVert ); void ApplyMultFilter( CDispMapImageFilter *pFilter, CMapDisp *pDisp, int ndxVert ); void ApplyEqualFilter( CDispMapImageFilter *pFilter, CMapDisp *pDisp, int ndxVert ); void ApplySmoothFilter( CDispMapImageFilter *pFilter, CMapDisp *pDisp, int ndxVert ); void Apply3x3SmoothFilter( CDispMapImageFilter *pFilter, CMapDisp *pDisp, int ndxVert, Vector &vPos ); //======================================================================== // // Hit Data // struct PosHitData_t { int m_CornerCount; int m_ndxCorners[2]; int m_EdgeCount; int m_ndxEdges[2]; bool m_bMain; }; void HitData_Init( PosHitData_t &hitData ); void HitData_Setup( PosHitData_t &hitData, int ndxHgt, int ndxWid, int imgHgt, int imgWid ); //========================================================================= // // Image Data Functions // void SetImageValues( CDispMapImageFilter *pFilter, CMapDisp *pDisp, int ndxHgt, int ndxWid, int ndxImg, int imgCount, Vector &vPaintValue ); bool GetImageValues( CDispMapImageFilter *pFilter, CMapDisp *pDisp, int ndxHgt, int ndxWid, int ndxImg, int imgCount, Vector &vPaintValue ); bool GetImageFlatSubdivValues( CDispMapImageFilter *pFilter, CMapDisp *pDisp, int ndxHgt, int ndxWid, int ndxImg, int imgCount, Vector &value ); bool GetImageFieldValues( CDispMapImageFilter *pFilter, CMapDisp *pDisp, int ndxHgt, int ndxWid, int ndxImg, int imgCount, Vector &vNormal, float &dist ); inline void SetImageValue( CMapDisp *pDisp, CDispMapImageFilter *pFilter, int ndx, Vector &vPaintValue ); inline void GetImageValue( CMapDisp *pDisp, CDispMapImageFilter *pFilter, int ndx, Vector &vPaintValue ); inline void GetImageFlatSubdivValue( CMapDisp *pDisp, CDispMapImageFilter *pFilter, int ndxDisp, Vector &vPaintValue ); inline void GetImageFieldData( CMapDisp *pDisp, CDispMapImageFilter *pFilter, int ndxDisp, Vector &vNormal, float &dist ); int GetSWImageIndex( CMapDisp *pDisp, int orient, int ndxHgt, int ndxWid ); int GetWImageIndex( CMapDisp *pDisp, int orient, int ndxHgt, int ndxWid ); int GetNWImageIndex( CMapDisp *pDisp, int orient, int ndxHgt, int ndxWid ); int GetNImageIndex( CMapDisp *pDisp, int orient, int ndxHgt, int ndxWid ); int GetNEImageIndex( CMapDisp *pDisp, int orient, int ndxHgt, int ndxWid ); int GetEImageIndex( CMapDisp *pDisp, int orient, int ndxHgt, int ndxWid ); int GetSEImageIndex( CMapDisp *pDisp, int orient, int ndxHgt, int ndxWid ); int GetSImageIndex( CMapDisp *pDisp, int orient, int ndxHgt, int ndxWid ); void MainImageValue( CDispMapImageFilter *pFilter, CMapDisp *pDisp, int ndxHgt, int ndxWid, bool bSet, Vector &value ); void SWImageValue( CDispMapImageFilter *pFilter, CMapDisp *pNeighborDisp, int neighborOrient, int ndxHgt, int ndxWid, bool bSet, Vector &value ); void WImageValue( CDispMapImageFilter *pFilter, CMapDisp *pNeighborDisp, int neighborOrient, int ndxHgt, int ndxWid, bool bSet, Vector &value ); void NWImageValue( CDispMapImageFilter *pFilter, CMapDisp *pNeighborDisp, int neighborOrient, int ndxHgt, int ndxWid, bool bSet, Vector &value ); void NImageValue( CDispMapImageFilter *pFilter, CMapDisp *pNeighborDisp, int neighborOrient, int ndxHgt, int ndxWid, bool bSet, Vector &value ); void NEImageValue( CDispMapImageFilter *pFilter, CMapDisp *pNeighborDisp, int neighborOrient, int ndxHgt, int ndxWid, bool bSet, Vector &value ); void EImageValue( CDispMapImageFilter *pFilter, CMapDisp *pNeighborDisp, int neighborOrient, int ndxHgt, int ndxWid, bool bSet, Vector &value ); void SEImageValue( CDispMapImageFilter *pFilter, CMapDisp *pNeighborDisp, int neighborOrient, int ndxHgt, int ndxWid, bool bSet, Vector &value ); void SImageValue( CDispMapImageFilter *pFilter, CMapDisp *pNeighborDisp, int neighborOrient, int ndxHgt, int ndxWid, bool bSet, Vector &value ); CMapDisp *GetSurfaceAtIndex( CMapDisp *pDisp, int ndxHgt, int ndxWid, int &newIndex ); CMapDisp *GetImage( CDispMapImageFilter *pFilter, CMapDisp *pDisp, int ndxHgt, int ndxWid, int ndxImg, int imgCount, int &orient ); bool IsNeighborInSelectionSet( CMapDisp *pNeighborDisp ); //========================================================================= // // Filter Data Functions // bool GetFilterVector( CDispMapImageFilter *pFilter,CMapDisp *pDisp, int ndxHgt, int ndxWid, int ndxImg, int imgCount, int ndxFilter, Vector &vFilterDir ); //========================================================================= // // Utility Functions // void ClampValues( CDispMapImageFilter *pFilter, Vector &v ); int GetAdjustedIndex( CMapDisp *pDisp, int orient, int ndxHgt, int ndxWid, int ndxImg ); bool IsEqualMask( CDispMapImageFilter *pFilter, int ndxFilter ); int GetCornerImageCount( CMapDisp *pDisp, int ndxCorner ); int GetImageCountAtPoint( CMapDisp *pDisp, int ndxHgt, int ndxWid ); void CalcEdgeCornerFlags( int ndxHgt, int ndxWid, int imgHgt, int imgWid, bool &bOnEdge, bool &bOnCorner ); }; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- inline int CDispMapImageFilterManager::GetFilterCount( void ) { return m_FilterCount; } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- inline CDispMapImageFilter *CDispMapImageFilterManager::GetFilter( int ndx ) { if( ndx < 0 ) { return NULL; } if( ndx >= m_FilterCount ) { return NULL; } return m_pFilterList[ndx]; } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- inline void CDispMapImageFilterManager::SetActiveFilter( int ndx ) { if( ndx < 0 ) { return; } if( ndx >= m_FilterCount ) { return; } m_ActiveFilter = ndx; } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- inline CDispMapImageFilter *CDispMapImageFilterManager::GetActiveFilter( void ) { return m_pFilterList[m_ActiveFilter]; } #endif // DISPMAPIMAGEFILTER_H