// Layer.h: interface for the CLayer class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_LAYER_H__92D64D54_E1C2_4D48_9664_8BD50F7324F8__INCLUDED_) #define AFX_LAYER_H__92D64D54_E1C2_4D48_9664_8BD50F7324F8__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 //! Single texture layer class CLayer : public CObject { public: CLayer(); virtual ~CLayer(); // Name CString GetLayerName() { return m_strLayerName; }; void SetLayerName(CString strName) { m_strLayerName = strName; }; // Slope float GetLayerMinSlope() { return m_minSlope; }; float GetLayerMaxSlope() { return m_maxSlope; }; void SetLayerMinSlope( float min ) { m_minSlope = min; InvalidateMask(); }; void SetLayerMaxSlope( float max ) { m_maxSlope = max; InvalidateMask(); }; // Altitude UINT GetLayerStart() { return m_iLayerStart; }; UINT GetLayerEnd() { return m_iLayerEnd; }; void SetLayerStart(UINT iStart) { m_iLayerStart = iStart; InvalidateMask(); }; void SetLayerEnd(UINT iEnd) { m_iLayerEnd = iEnd; InvalidateMask(); }; //! Calculate memory size allocated for this layer. int GetSize() const; ////////////////////////////////////////////////////////////////////////// // Layer Mask ////////////////////////////////////////////////////////////////////////// unsigned char GetLayerMaskPoint( uint x,uint y ) { return m_layerMask.ValueAt(x,y); } void SetLayerMaskPoint( uint x,uint y,unsigned char c ) { m_layerMask.ValueAt(x,y) = c; } ////////////////////////////////////////////////////////////////////////// // Update current mask. ////////////////////////////////////////////////////////////////////////// //! Update current mask for this sector and put it into target mask data. //! @param mask Mask image returned from function, may not be not initialized when calling function. //! @return true is mask for this sector exist, false if not. bool UpdateMaskForSector( CPoint sector,const CRect §orRect,const CFloatImage &hmap,CByteImage& mask ); bool UpdateMask( const CFloatImage &hmap,CByteImage& mask ); CByteImage& GetMask(); ////////////////////////////////////////////////////////////////////////// void UpdateLayerMask16(float *pHeightmapPixels, UINT iHeightmapWidth,UINT iHeightmapHeight, bool bStreamFromDisk); void GenerateWaterLayer16(float *pHeightmapPixels, UINT iHeightmapWidth,UINT iHeightmapHeight,float waterLevel ); ////////////////////////////////////////////////////////////////////////// int GetMaskResolution() const { return m_maskResolution; }; // Texture int GetTextureWidth() { return m_cTextureDimensions.cx; }; int GetTextureHeight() { return m_cTextureDimensions.cy; }; CSize GetTextureDimensions() { return m_cTextureDimensions; }; CString GetTextureFilename(); void DrawLayerTexturePreview(LPRECT rcPos, CDC *pDC); bool LoadTexture(CString strFileName); void FillWithColor( COLORREF col,int width,int height ); bool LoadTexture(LPCTSTR lpBitmapName, UINT iWidth, UINT iHeight); bool LoadTexture(DWORD *pBitmapData, UINT iWidth, UINT iHeight); void ExportTexture(CString strFileName); void ExportMask( const CString &strFileName ); bool HasTexture() { return GetTextureWidth() != NULL; }; uint& GetTexturePixel( int x,int y ) { return m_texture.ValueAt(x,y); }; //! Load a BMP texture into the layer mask. bool LoadMask( const CString &strFileName ); void GenerateLayerMask( CByteImage &mask,int width,int height ); //! Release allocated mask. void ReleaseMask(); // Serialisation void Serialize( CXmlArchive &xmlAr ); // Call if mask was Modified. void InvalidateMask(); //! Invalidate one sector of the layer mask. void InvalidateMaskSector( CPoint sector ); // Check if layer is valid. bool IsValid() { return m_layerMask.IsValid(); } // In use bool IsInUse() { return m_bLayerInUse; }; void SetInUse(bool bNewState) { m_bLayerInUse = bNewState; }; bool IsAutoGen() const { return m_bAutoGen; }; void SetAutoGen( bool bAutoGen ); ////////////////////////////////////////////////////////////////////////// // True if layer is currently selected. bool IsSelected() const { return m_bSelected; } //! Mark layer as selected or not. void SetSelected( bool bSelected ) { m_bSelected = bSelected; }; ////////////////////////////////////////////////////////////////////////// void SetSurfaceType( const CString &sfType ) { m_surfaceType = sfType; } CString GetSurfaceType() { return m_surfaceType; } void SetSmooth( bool bSmooth ) { m_bSmooth = bSmooth; InvalidateMask(); }; bool IsSmooth() const { return m_bSmooth; }; //! Load texture if it was unloaded. void PrecacheTexture(); //! Load mask if it was unloaded. void PrecacheMask(); ////////////////////////////////////////////////////////////////////////// //! Mark all layer mask sectors as invalid. void InvalidateAllSectors(); void SetAllSectorsValid(); //! Compress mask. void CompressMask(); //! Export layer block. void ExportBlock( const CRect &rect,CXmlArchive &ar ); //! Import layer block. void ImportBlock( CXmlArchive &ar,CPoint offset ); //! Allocate mask grid for layer. void AllocateMaskGrid(); protected: enum SectorMaskFlags { SECTOR_MASK_VALID = 1, }; // Convert the layer from BGR to RGB void BGRToRGB(); uchar& GetSector( CPoint sector ); //! Autogenerate layer mask. void AutogenLayerMask( const CRect &rect,const CFloatImage &hmap,CByteImage& mask ); //! Get native resolution for layer mask (For not autogen levels). int GetNativeMaskResolution() const; private: // Name CString m_strLayerName; // Layer texture CBitmap m_bmpLayerTexPrev; CDC m_dcLayerTexPrev; CString m_strLayerTexPath; CSize m_cTextureDimensions; //DWORD *m_pdwLayerTextureData; CImage m_texture; // Layer parameters UINT m_iLayerStart; UINT m_iLayerEnd; // Slope float m_minSlope; float m_maxSlope; uint m_currWidth; uint m_currHeight; ////////////////////////////////////////////////////////////////////////// // Mask. ////////////////////////////////////////////////////////////////////////// // Layer mask data CString m_maskFile; CByteImage m_layerMask; //! Mask used when scaled mask version is needed. CByteImage m_scaledMask; //! Native layer resolution (not for autogenerated layers). //int m_nativeResolution; int m_maskResolution; //BYTE *m_pLayerMask; bool m_bNeedUpdate; bool m_bCompressedMaskValid; CMemoryBlock m_compressedMask; // Should this layer be used during terrain generation ? bool m_bLayerInUse; bool m_bAutoGen; bool m_bNoise; float m_noiseSize; //! True if need to smooth layer. bool m_bSmooth; //! True if layer is selected as current. bool m_bSelected; CString m_surfaceType; //! Internal instance count, used for Uniq name assignment. static UINT m_iInstanceCount; ////////////////////////////////////////////////////////////////////////// // Layer Sectors. ////////////////////////////////////////////////////////////////////////// std::vector m_maskGrid; int m_numSectors; }; #endif // !defined(AFX_LAYER_H__92D64D54_E1C2_4D48_9664_8BD50F7324F8__INCLUDED_)