/** @file TerrainMaterial.h @brief
* Copyright (c) 2007,第九城市游戏研发中心 * All rights reserved. * * 当前版本: * 作 者:zhaixufeng * 完成日期:2007-09-28 * * 取代版本: * 作 者: * 完成日期:*/ #ifndef TERRAIN_MTL_H #define TERRAIN_MTL_H #define BLENDTEX_SIZE 256 #define MAX_LAYER 4 /// 材质类型定义 //enum MAIN_ENTRY EMaterialType //{ // MT_GRASS, // MT_MORASS, // MT_SAND, // MT_UNKNOWN //}; // 从流导入地形需要将所有所使用的纹理初始化,并为每个chunk填充此结构并传入导入函数 struct stChunkTextures { int iChunkID; // chunk 索引 NiSourceTexturePtr pkBlendTexture; // 混合纹理 int iUsedTextureLayer; // 使用的纹理层数 char szFileNames[4][MAX_PATH]; // 四层纹理名称 不一定需要 NiSourceTexturePtr pTextures[4]; // 四层纹理 }; /** @brief 地表材质类,限制四层纹 * * 限制四层纹理,通过一张带有RGB通道的贴图来混合 */ class MAIN_ENTRY CTerrainMaterial { public: /// 构造 CTerrainMaterial( const char *pszL0=0, const char *pszL1=0, const char *pszL2=0, const char *pszL3=0 ); /// 析构 virtual ~CTerrainMaterial(void); /// Blend Texture通道枚举 enum EChannel { CHANNEL_R, CHANNEL_G, CHANNEL_B, CHANNEL_MAX }; /// 获取Shader NiShader *GetShader() { return m_spShader; } /// 获取材质 NiSingleShaderMaterial *GetMaterial() { return m_spSSMaterial; } public: /// 创建 bool Create(const char* pszBlendTexFile = NULL, const char* pszPropertyTexFile = NULL); /// 创建 bool Create(const stChunkTextures& pChunkTextueres); /// 销毁 void Destroy(); /// 创建blend纹理 bool CreateBlendTexture( const char *pszTexFile = NULL); /// 设置层纹理 返回当前使用的纹理层数 int SetTexture( const string& strTexFile, bool& bAddLayer); /// 已使用纹理层数统计 const int GetUsedLayerCount() const { return m_iUsedTexLayer; } /// 当前正使用的纹理层 const int GetInUseLayer() const {return m_iTexIndex;} /// 由层索引获得纹理 NiSourceTexturePtr GetTexture( int iLayer ) { if ( iLayer >=0 && iLayer < MAX_LAYER ) return m_pLayerTexture[iLayer]; return 0; } const string& GetTextureFile( int iLayer ) { assert( iLayer >= 0 && iLayer < MAX_LAYER ); return m_strTexFiles[iLayer]; } /// 获取Blend纹理 NiSourceTexturePtr GetBlendTexture() { return m_spBlendTexture; } /// 获取Blend纹理大小 const int GetBlendTexSize() const { return BLENDTEX_SIZE; } friend class CTerrain; /************************************************ * 这里是只在编辑器中使用,游戏中不使用的函数 *************************************************/ #ifndef CODE_INGAME public: /// 替换第iLayer层纹理 bool ReplaceTexture(int iLayer, const string& strTexFile); // 删除iLayer层纹理 [5/4/2009 hemeng] bool DeleteTexture(int iLayer); /** *