魔兽3自适应地块贴图算法

整个贴图过程分为4个步骤:
1. 删除地块
2. 拼接地块
3. 排序地块层
4. 更新地块

有2种类型的地形纹理:
o_SimpleTexture.JPG
o_FullTexture.JPG
o_Base.JPG

根据上面这张排好索引的图片,加上效果图可以知道基本地块为:
1 | 2
8 | 16
然后是随机地块,数据如下:
s32 s_pBaseTexIndex_c[] = { 1, 2, 8, 16 };
s32 s_pRandTexIndex_c[] = { 0, 4, 5, 6, 7, 12, 13, 14, 15, 20, 21, 22, 23, 27, 28, 29, 30, 31 };

整个贴图算法都是基于上面这个基本索引而来.4个基本索引相加为27,是一个很特别的索引.

举2个例子:

1 |  2+1           1 | 3

8 | 16+8 =       8 | 24 =
o_Right.JPG

1     | 2                 1 | 2

8+1 | 16+2 =       9 | 18 =
o_Down.JPG
一个格子最多可以贴4个地块,也就是4层地块,下面是基本数据定义.

// 地形顶点数据
struct TeVertex
{
         f32            fHeight;          ///< 地形高度值
         Vector3f v3Normal; ///< 地形顶点法向量
};

// 地形地块纹理数据
struct TeTile
{
         s8 Block[TE_TILE_COUNT]; ///< 纹理中的一块
         u8 Texture[TE_TILE_COUNT]; ///< 纹理ID,255代表空
};

首先初始化一个32*32的地形数据:

m_pVertex = new TeVertex[32*32];
m_pTile = new TeTile[32*32];

for( i = 0; i < 32*32; ++i )
{
       nBlock = s_pRandTexIndex_c[rand() % 18];

       m_pVertex[i].fHeight = 0.0f;

       m_pTile[i].Block[0] = nBlock;
       m_pTile[i].Texture[0] = 0;

       m_pTile[i].Block[1] = 0;
       m_pTile[i].Texture[1] = 255;

       m_pTile[i].Block[2] = 0;
       m_pTile[i].Texture[2] = 255;

       m_pTile[i].Block[3] = 0;
       m_pTile[i].Texture[3] = 255;
}

在拼接之前首先是找出4个要拼接的格子,如图:
o_FindTile.JPG
1. 删除地块
         1-1: 如果当前地块第0层的纹理索引不为0并且Block索引是随机地块的话,格子的数据需要调整, 算法为用27减去除第0层外所有有效层的Block索引,最后的结果赋予第0层的Block.
   
         1-2: 循环直到找出如果4个格子的某一层的Texture索引都相同,并找出所在的层,然后在做以下判断:
              1-2-1: 如果这4个格子的这4层的Block索引都是随机地块索引,并且Texture索引比要贴的Texture索引大的话,则这4个格子的相应Block索引都要变为27减去基本索引. 然后回到2-1.
        
              1-2-2: 1-2-1不成立的话,判断4个格子的Block是否可删除,条件是用当前地块的当前层的Block索引减去基本地块,如果是随机地块索引(除开0和27)则不合法,其余结果是合法的.
        
              1-2-3: 将4个格子的对应层的Block索引都减去一个值.如果是Block索引是随机地块索引,则用27减去基本地块索引.否则用自身的Block索引减去基本索引值,如果减出来的结果是0的话, 则设置这个格子的这一层的Texture索引为255

2. 拼接地块
         首先是找出要拼接纹理对应的层次,这中间涉及到调节层次数据,看下面的代码.接下来就是修改Block索引,主要的操作就是加上基本索引.在这中间涉及到的判断相当的多,还是看代码直接:),值得注意的是当设置的地块Block索引为27的时候需要特殊处理.

3. 排序地块层
         这一步最简单,一共才4层,最简单的冒泡排序就行了:)

4. 更新地块
         把一个地块中所有的地块索引相加,索引为随机地块的不参与,如果最后的结果为27那么需要对这个地块的数据做调整.如果这个格子的Texture索引不是0的话,把这个格子的第0层的Block索引设置为随机地块索引.如果是0的话,则第0层的Texture索引变为第1层的Texture索引,并且把第2层的数据复制到第1层,把第3层的数据复制到第2层,第3层的数据设置为空.
   
         由于网上查不到相关的资料,上面这些都是我通过观察war3的编辑器总结出来的,希望可以给在做类似war3这种地形贴图的朋友一些帮助:),有不明白的地方可以在QQ(76537477)上联系我.

最后贴上我的效果图和核心代码:
o_Terrain.JPG

算法的基本代码(为了简单明了,下面的代码是简化了的, 这里实在是不知道怎么排版啊)

 

 

 

  1.  #define  TE_TILE_COUNT     4 
  2.  #define  TE_INVALID_TILE   255 
  3.  #define  TE_TILE_LEN       2.0f 
  4.  #define  TE_TEX_BASE       4  //  地形纹理基本变换数 
  5.  #define  TE_MAX_TEX        8  //  地形最多支持8种不同的纹理 
  6.  #define  TE_TEX_RAND_S     2  //  256的地形纹理最大变换数 
  7.  #define  TE_TEX_RAND_C     18  //  512的地形纹理最大变换数 
  8.  #define  TE_TEX_COUNT_S    16  //  Simple 
  9.  #define  TE_TEX_COUNT_C    32  //  Complex//-------------&------------- 
  10.  // ---------------------------&------------------------- 
  11.  void  SetTile(  const  Vector3f  & v3Pos )
  12.   {
  13.  if ( m_nSelectTexture  <   0   ||  m_nSelectTexture  >=  m_vecTexture.Size() )
  14.       return ;
  15. f32 fDis  =  TE_TILE_LEN  /   2.0f ;
  16. s32 nLDTile  =  (s32)((v3Pos.y  -  fDis)  /  TE_TILE_LEN)  *  m_nTileWid  +  (s32)((v3Pos.x  -  fDis)  /  TE_TILE_LEN);
  17. s32 nRDTile  =  (s32)((v3Pos.y  -  fDis)  /  TE_TILE_LEN)  *  m_nTileWid  +  (s32)((v3Pos.x  +  fDis)  /  TE_TILE_LEN);
  18. s32 nRUTile  =  (s32)((v3Pos.y  +  fDis)  /  TE_TILE_LEN)  *  m_nTileWid  +  (s32)((v3Pos.x  +  fDis)  /  TE_TILE_LEN);
  19. s32 nLUTile  =  (s32)((v3Pos.y  +  fDis)  /  TE_TILE_LEN)  *  m_nTileWid  +  (s32)((v3Pos.x  -  fDis)  /  TE_TILE_LEN);
  20. s32 i  =   0 , nLDLayer  =   0 , nRDLayer  =   0 , nRULayer  =   0 , nLULayer  =   0 ;
  21. s32 nLDBlock, nRDBlock, nRUBlock, nLUBlock;
  22. BOOL bLDCheck  =  FALSE, bRDCheck  =  FALSE, bRUCheck  =  FALSE, bLUCheck  =  FALSE; //  更新当前周围的地块属性 
  23. UpdateTileAttribute( nLDTile, nRDTile, nRUTile, nLUTile );  //  找出对应的层 
  24.  for ( i  =   0 ; i  <  TE_LAYERS;  ++ i )
  25.   {
  26.       if ( m_pTile[nLDTile].Texture[i]  ==  m_nSelectTexture )
  27.        {
  28.       nLDLayer  =  i;
  29.       bLDCheck  =  TRUE;
  30.      } 
  31.       else   if (  ! bLDCheck  &&  m_pTile[nLDTile].Texture[i]  !=  TE_INVALID_TILE )
  32.        {
  33.        ++ nLDLayer;
  34.      }      
  35.       if ( m_pTile[nRDTile].Texture[i]  ==  m_nSelectTexture )
  36.        {
  37.       nRDLayer  =  i;
  38.       bRDCheck  =  TRUE;
  39.      } 
  40.       else   if (  ! bRDCheck  &&  m_pTile[nRDTile].Texture[i]  !=  TE_INVALID_TILE )
  41.        {
  42.        ++ nRDLayer;
  43.      }      
  44.       if ( m_pTile[nRUTile].Texture[i]  ==  m_nSelectTexture )
  45.        {
  46.       nRULayer  =  i;
  47.       bRUCheck  =  TRUE;
  48.      } 
  49.       else   if (  ! bRUCheck  &&  m_pTile[nRUTile].Texture[i]  !=  TE_INVALID_TILE )
  50.        {
  51.        ++ nRULayer;
  52.      }      
  53.       if ( m_pTile[nLUTile].Texture[i]  ==  m_nSelectTexture )
  54.        {
  55.       nLULayer  =  i;
  56.       bLUCheck  =  TRUE;
  57.      } 
  58.       else   if (  ! bLUCheck  &&  m_pTile[nLUTile].Texture[i]  !=  TE_INVALID_TILE )
  59.        {
  60.        ++ nLULayer;
  61.      } 
  62.       if (  ! bLDCheck )
  63.      nLDLayer  =  AdjustTileLayer( nLDTile,  2  );
  64.       if (  ! bRDCheck )
  65.      nRDLayer  =  AdjustTileLayer( nRDTile,  3  );
  66.       if (  ! bRUCheck )
  67.      nRULayer  =  AdjustTileLayer( nRUTile,  1  );
  68.       if (  ! bLUCheck )
  69.      nLULayer  =  AdjustTileLayer( nLUTile,  0  );
  70. s32 nLDTexture  =  m_pTile[nLDTile].Texture[nLDLayer];
  71.  if ( nLDTexture  !=  TE_INVALID_TILE )
  72.   {
  73.      s32 nRDTexture  =  m_pTile[nRDTile].Texture[nRDLayer];
  74.      s32 nRUTexture  =  m_pTile[nRUTile].Texture[nRULayer];
  75.      s32 nLUTexture  =  m_pTile[nLUTile].Texture[nLULayer]; 
  76.      if ( nLDTexture  ==  nRDTexture  &&  nLDTexture  ==  nRUTexture  &&  nLDTexture  ==  nLUTexture )
  77.        {
  78.        if ( (m_pTile[nLDTile].Texture[TE_LAYERS - 1 ]  !=  TE_INVALID_TILE  ||  
  79.           m_pTile[nRDTile].Texture[TE_LAYERS - 1 ]  !=  TE_INVALID_TILE  || 
  80.           m_pTile[nRUTile].Texture[TE_LAYERS - 1 ]  !=  TE_INVALID_TILE  || 
  81.           m_pTile[nLUTile].Texture[TE_LAYERS - 1 ]  !=  TE_INVALID_TILE) )
  82.         {
  83.         if ( (nLDTexture  ==  m_nSelectTexture)  &&  
  84.            (m_pTile[nLDTile].Block[nLDLayer]  ==  s_pBaseTexIndex_c[ 2 ]  || 
  85.             m_pTile[nRDTile].Block[nRDLayer]  ==  s_pBaseTexIndex_c[ 3 ]  ||  
  86.             m_pTile[nRUTile].Block[nRULayer]  ==  s_pBaseTexIndex_c[ 1 ]  ||  
  87.             m_pTile[nLUTile].Block[nLULayer]  ==  s_pBaseTexIndex_c[ 0 ] ) )
  88.          {
  89.          goto  _SORT_LAYER;
  90.        }        nLDBlock  =  m_pTile[nLDTile].Block[nLDLayer];
  91.         if ( m_pTile[nLDTile].Texture[nLDLayer]  !=   0   &&  (nLDBlock  ==   0   ||   ! IsValidRandBlock(nLDBlock)) )
  92.         nLDBlock  =  m_pTile[nLDTile].Block[nLDLayer]  +  s_pBaseTexIndex_c[ 2 ];       nRDBlock  =  m_pTile[nRDTile].Block[nRDLayer];
  93.         if ( m_pTile[nRDTile].Texture[nRDLayer]  !=   0   &&  (nRDBlock  ==   0   ||   ! IsValidRandBlock(nRDBlock)) )
  94.         nRDBlock  =  m_pTile[nRDTile].Block[nRDLayer]  +  s_pBaseTexIndex_c[ 3 ];       nRUBlock  =  m_pTile[nRUTile].Block[nRULayer];
  95.         if ( m_pTile[nRUTile].Texture[nRULayer]  !=   0   &&  (nRUBlock  ==   0   ||   ! IsValidRandBlock(nRUBlock)) )
  96.         nRUBlock  =  m_pTile[nRUTile].Block[nRULayer]  +  s_pBaseTexIndex_c[ 1 ];       nLUBlock  =  m_pTile[nLUTile].Block[nLULayer];
  97.         if ( m_pTile[nLUTile].Texture[nLULayer]  !=   0   &&  (nLUBlock  ==   0   ||   ! IsValidRandBlock(nLUBlock)) )
  98.         nLUBlock  =  m_pTile[nLUTile].Block[nLULayer]  +  s_pBaseTexIndex_c[ 0 ];        if ( IsValidBlock(nLDBlock)  &&  IsValidTileBlock( nLDBlock ) )
  99.         SetTileAttribute( nLDTile, nLDLayer, nLDBlock );
  100.     
  101.         if ( IsValidBlock(nRDBlock)  &&  IsValidTileBlock( nRDBlock ) )
  102.         SetTileAttribute( nRDTile, nRDLayer, nRDBlock );
  103.     
  104.         if ( IsValidBlock(nRUBlock)  &&  IsValidTileBlock( nRUBlock ) )
  105.         SetTileAttribute( nRUTile, nRULayer, nRUBlock );
  106.     
  107.         if ( IsValidBlock(nLUBlock)  &&  IsValidTileBlock( nLUBlock ) )
  108.         SetTileAttribute( nLUTile, nLULayer, nLUBlock );        goto  _SORT_LAYER;
  109.       } 
  110.        else   if ( m_pTile[nLDTile].Block[nLDLayer]  +  s_pBaseTexIndex_c[ 2 ]  >=  TE_TEX_COUNT_C  || 
  111.         m_pTile[nRDTile].Block[nRDLayer]  +  s_pBaseTexIndex_c[ 3 ]  >=  TE_TEX_COUNT_C  || 
  112.         m_pTile[nRUTile].Block[nRULayer]  +  s_pBaseTexIndex_c[ 1 ]  >=  TE_TEX_COUNT_C  || 
  113.         m_pTile[nLUTile].Block[nLULayer]  +  s_pBaseTexIndex_c[ 0 ]  >=  TE_TEX_COUNT_C )
  114.         {
  115.         goto  _SORT_LAYER;
  116.       } 
  117.      } 
  118. }
  119.     nLDBlock  =  m_pTile[nLDTile].Block[nLDLayer]  +  s_pBaseTexIndex_c[ 2 ];
  120. nRDBlock  =  m_pTile[nRDTile].Block[nRDLayer]  +  s_pBaseTexIndex_c[ 3 ];
  121. nRUBlock  =  m_pTile[nRUTile].Block[nRULayer]  +  s_pBaseTexIndex_c[ 1 ];
  122. nLUBlock  =  m_pTile[nLUTile].Block[nLULayer]  +  s_pBaseTexIndex_c[ 0 ]; if (  ! IsValidTileBlock( nLDBlock ) )
  123.       goto  _SORT_LAYER; if (  ! IsValidTileBlock( nRDBlock ) )
  124.       goto  _SORT_LAYER; if (  ! IsValidTileBlock( nRUBlock ) )
  125.       goto  _SORT_LAYER; if (  ! IsValidTileBlock( nLUBlock ) )
  126.       goto  _SORT_LAYER;SetTileAttribute( nLDTile, nLDLayer, nLDBlock );
  127. SetTileAttribute( nRDTile, nRDLayer, nRDBlock );
  128. SetTileAttribute( nRUTile, nRULayer, nRUBlock );
  129. SetTileAttribute( nLUTile, nLULayer, nLUBlock );_SORT_LAYER:
  130. SortLayerTile( nLDTile );
  131. SortLayerTile( nRDTile );
  132. SortLayerTile( nRUTile );
  133. SortLayerTile( nLUTile );
  134. // -------------&-------------
  135.  // ---------------------------&------------------------- 
  136.  s32 AdjustTileLayer( s32 nTile, s32 nIndex )
  137.   {
  138. BOOL bCheck  =  FALSE, bFindLayer  =  FALSE;
  139. s32 i, nMinLayer, nRetLayer  =   0 ;
  140.  for ( i  =   0 ; i  <  TE_LAYERS;  ++ i )
  141.   {
  142.       if ( m_pTile[nTile].Texture[i]  ==  TE_INVALID_TILE )
  143.        {
  144.       bCheck  =  TRUE;
  145.       m_pTile[nTile].Texture[i]  =  m_nSelectTexture;
  146.        if ( m_nSelectTexture  ==   0  )
  147.        m_pTile[nTile].Block[i]  =   27 ;
  148.        break ;
  149.      } 
  150.  if (  ! bCheck )
  151.   {
  152.      nMinLayer  =   0 ;      for ( i  =   0 ; i  <  TE_LAYERS;  ++ i )
  153.        {
  154.        if ( m_pTile[nTile].Texture[i]  ==  m_nSelectTexture )
  155.         {
  156.        bFindLayer  =  TRUE;
  157.        m_pTile[nTile].Texture[i]  =  m_nSelectTexture;
  158.         break ;
  159.       } 
  160.      } 
  161.       if (  ! bFindLayer )
  162.        {
  163.        for ( i  =   0 ; i  <  TE_LAYERS  -   1 ;  ++ i )
  164.         {
  165.        m_pTile[nTile].Texture[i]  =  m_pTile[nTile].Texture[i + 1 ];
  166.        m_pTile[nTile].Block[i]  =  m_pTile[nTile].Block[i + 1 ];
  167.       }      
  168.             for ( i  =   0 ; i  <  TE_LAYERS  -   1 ;  ++ i )
  169.         {
  170.         if ( m_pTile[nTile].Texture[i]  ==  m_nSelectTexture )
  171.          {
  172.         m_pTile[nTile].Texture[TE_LAYERS - 1 ]  =   0 ;
  173.         m_pTile[nTile].Block[TE_LAYERS - 1 ]  =  s_pRandTexIndex_c[rand() % TE_TEX_RAND_C];         goto  _SPECIAL_LAYER;
  174.        } 
  175.       }       m_pTile[nTile].Texture[TE_LAYERS - 1 ]  =  m_nSelectTexture;
  176.       m_pTile[nTile].Block[TE_LAYERS - 1 ]  =   0 ;
  177.      } 
  178. } _SPECIAL_LAYER:
  179.  //  for( i = 0; i < TE_LAYERS; ++i )
  180.  //  {
  181.  //      if( m_pTile[nTile].Texture[i] < m_pTile[nTile].Texture[nMinLayer] )
  182.  //      {
  183.  //       nMinLayer = i;
  184.  //      }
  185.  //  }for( i = 0; i < TE_LAYERS; ++i ) 
  186.    {
  187.       if ( m_pTile[nTile].Texture[i]  ==  m_nSelectTexture )
  188.        {
  189.       nRetLayer  =  i;
  190.        goto  _LAYER_RETURN;
  191.      } 
  192.  for ( i  =   0 ; i  <  TE_LAYERS;  ++ i )
  193.   {
  194.       if ( m_pTile[nTile].Texture[i]  ==  TE_INVALID_TILE )
  195.        {
  196.       nRetLayer  =  i;
  197.        goto  _LAYER_RETURN;
  198.      } 
  199. } nRetLayer  =  TE_LAYERS  -   1 ;_LAYER_RETURN: return  nRetLayer;
  200. // +-------------&-------------
  201.  // +---------------------------&------------------------- 
  202.  void  SortLayerTile( s32 nTile )
  203.   {
  204. BOOL bBaseLayer  =  FALSE;
  205. s32 nBaseLayer  =   - 1 ;
  206. s32 i, j, nTex, nBlock; for ( i  =   0 ; i  <  TE_LAYERS;  ++ i )
  207.   {
  208.       for ( j  =  i  +   1 ; j  <  TE_LAYERS;  ++ j )
  209.        {
  210.        if ( m_pTile[nTile].Texture[i]  >  m_pTile[nTile].Texture[j] )
  211.         {
  212.        nTex  =  m_pTile[nTile].Texture[i];
  213.        nBlock  =  m_pTile[nTile].Block[i];       m_pTile[nTile].Texture[i]  =  m_pTile[nTile].Texture[j];
  214.        m_pTile[nTile].Block[i]  =  m_pTile[nTile].Block[j];       m_pTile[nTile].Texture[j]  =  nTex;
  215.        m_pTile[nTile].Block[j]  =  nBlock;
  216.       }      } 
  217. } nBlock  =   0 ;
  218.  for ( i  =   0 ; i  <  TE_LAYERS;  ++ i )
  219.   {
  220.       if (  ! IsValidRandBlock( m_pTile[nTile].Block[i] ) )
  221.        {
  222.       nBlock  +=  m_pTile[nTile].Block[i];
  223.      } 
  224. if ( nBlock  ==   27  )
  225.   {
  226.       if ( m_pTile[nTile].Texture[ 0 ]  ==   0  )
  227.        {
  228.       m_pTile[nTile].Texture[ 0 ]  =  m_pTile[nTile].Texture[ 1 ];
  229.       m_pTile[nTile].Block[ 0 ]  =   27 ;       for ( i  =   1 ; i  <  TE_LAYERS  -   1 ;  ++ i )
  230.         {
  231.        m_pTile[nTile].Texture[i]  =  m_pTile[nTile].Texture[i + 1 ];
  232.        m_pTile[nTile].Block[i]  =  m_pTile[nTile].Block[i + 1 ];
  233.       }       m_pTile[nTile].Texture[TE_LAYERS - 1 ]  =  TE_INVALID_TILE;
  234.       m_pTile[nTile].Block[TE_LAYERS - 1 ]  =   0 ;
  235.      } 
  236.       else 
  237.         {
  238.       m_pTile[nTile].Block[ 0 ]  =   27 ;
  239.      } 
  240. // -------------&-------------
  241.  // ---------------------------&------------------------- 
  242.  BOOL IsValidTileBlock( s32 nBlock )  const 
  243.    {
  244. s32 i  =   0 ; if ( nBlock  ==   0   ||  nBlock  ==   27  )
  245.       return  TRUE; for ( ; i  <  TE_TEX_RAND_C;  ++ i )
  246.   {
  247.       if ( nBlock  ==  s_pRandTexIndex_c[i] )
  248.        return  FALSE;
  249. return  TRUE;
  250. // -------------&-------------
  251.  // ---------------------------&------------------------- 
  252.  BOOL IsValidRandBlock( s32 nBlock )  const 
  253.    {
  254. s32 i  =   0 ;
  255.  for ( ; i  <  TE_TEX_RAND_C;  ++ i )
  256.   {
  257.       if ( nBlock  ==  s_pRandTexIndex_c[i] )
  258.        return  TRUE;
  259. return  FALSE;
  260. // +-------------&-------------
  261.  // +---------------------------&------------------------- 
  262.  s32 CheckLayerTile( s32 nTile, s32 nTexture )
  263.   {
  264. s32 i; for ( i  =   0 ; i  <  TE_TILE_COUNT;  ++ i )
  265.   {
  266.       if ( m_pTile[nTile].Texture[i]  !=  TE_INVALID_TILE  &&  m_pTile[nTile].Texture[i]  ==  nTexture )
  267.        return  i;
  268. return   - 1 ;
  269. // +-------------&-------------
  270.  // +---------------------------&------------------------- 
  271.  void  UpdateTileAttribute( s32 nLDTile, s32 nRDTile, s32 nRUTile, s32 nLUTile )
  272.   {
  273. s32 i, nBlock, nLDTexture;
  274. s32 nLDLayer, nRDLayer, nRULayer, nLULayer; if ( IsValidRandBlock(m_pTile[nLDTile].Block[ 0 ])  &&  m_pTile[nLDTile].Texture[ 0 ]  !=   0  )
  275.   {
  276.      nBlock  =   27 ;
  277.       for ( i  =   1 ; i  <  TE_LAYERS;  ++ i )
  278.        {
  279.        if ( m_pTile[nLDTile].Texture[i]  !=  TE_INVALID_TILE )
  280.         {
  281.        nBlock  -=  m_pTile[nLDTile].Block[i];
  282.       } 
  283.      }      m_pTile[nLDTile].Block[ 0 ]  =  nBlock;
  284. if ( IsValidRandBlock(m_pTile[nRDTile].Block[ 0 ])  &&  m_pTile[nRDTile].Texture[ 0 ]  !=   0  )
  285.   {
  286.      nBlock  =   27 ;
  287.       for ( i  =   1 ; i  <  TE_LAYERS;  ++ i )
  288.        {
  289.        if ( m_pTile[nRDTile].Texture[i]  !=  TE_INVALID_TILE )
  290.         {
  291.        nBlock  -=  m_pTile[nRDTile].Block[i];
  292.       } 
  293.      }      m_pTile[nRDTile].Block[ 0 ]  =  nBlock;
  294. if ( IsValidRandBlock(m_pTile[nRUTile].Block[ 0 ])  &&  m_pTile[nRUTile].Texture[ 0 ]  !=   0  )
  295.   {
  296.      nBlock  =   27 ;
  297.       for ( i  =   1 ; i  <  TE_LAYERS;  ++ i )
  298.        {
  299.        if ( m_pTile[nRUTile].Texture[i]  !=  TE_INVALID_TILE )
  300.         {
  301.        nBlock  -=  m_pTile[nRUTile].Block[i];
  302.       } 
  303.      }      m_pTile[nRUTile].Block[ 0 ]  =  nBlock;
  304. if ( IsValidRandBlock(m_pTile[nLUTile].Block[ 0 ])  &&  m_pTile[nLUTile].Texture[ 0 ]  !=   0  )
  305.   {
  306.      nBlock  =   27 ;
  307.       for ( i  =   1 ; i  <  TE_LAYERS;  ++ i )
  308.        {
  309.        if ( m_pTile[nLUTile].Texture[i]  !=  TE_INVALID_TILE )
  310.         {
  311.        nBlock  -=  m_pTile[nLUTile].Block[i];
  312.       } 
  313.      }      m_pTile[nLUTile].Block[ 0 ]  =  nBlock;
  314. //  找出对应的层 
  315.  for ( i  =   0 ; i  <  TE_TILE_COUNT;  ++ i )
  316.   {
  317.      nLDLayer  =  i;
  318.      nLDTexture  =  m_pTile[nLDTile].Texture[i];      if ( nLDTexture  ==  m_nSelectTexture )
  319.        continue ;     nRDLayer  =  CheckLayerTile( nRDTile, nLDTexture );
  320.       if ( nRDLayer  ==   - 1  )
  321.        continue ;     nRULayer  =  CheckLayerTile( nRUTile, nLDTexture );
  322.       if ( nRULayer  ==   - 1  )
  323.        continue ;     nLULayer  =  CheckLayerTile( nLUTile, nLDTexture );
  324.       if ( nLULayer  ==   - 1  )
  325.        continue ;      if ( IsValidRandBlock( m_pTile[nLDTile].Block[nLDLayer] )  && 
  326.          IsValidRandBlock( m_pTile[nRDTile].Block[nRDLayer] )  &&  
  327.          IsValidRandBlock( m_pTile[nRUTile].Block[nRULayer] )  &&  
  328.          IsValidRandBlock( m_pTile[nLUTile].Block[nLULayer] ) )
  329.        {
  330.        if ( m_nSelectTexture  <  nLDTexture )
  331.         {
  332.        m_pTile[nLDTile].Block[nLDLayer]  =   27   -  s_pBaseTexIndex_c[ 2 ];
  333.        m_pTile[nRDTile].Block[nRDLayer]  =   27   -  s_pBaseTexIndex_c[ 3 ];
  334.        m_pTile[nRUTile].Block[nRULayer]  =   27   -  s_pBaseTexIndex_c[ 1 ];
  335.        m_pTile[nLUTile].Block[nLULayer]  =   27   -  s_pBaseTexIndex_c[ 0 ];
  336.       } 
  337.        continue ;
  338.      }       if (  ! IsValidSubBlock( nLDTile, nLDLayer,  2  )  ||  
  339.           ! IsValidSubBlock( nRDTile, nRDLayer,  3  )  ||  
  340.           ! IsValidSubBlock( nRUTile, nRULayer,  1  )  ||  
  341.           ! IsValidSubBlock( nLUTile, nLULayer,  0  ) )
  342.        {
  343.        continue ;
  344.      }      ChangeBlock( nLDTile, nLDLayer,  2  );
  345.      ChangeBlock( nRDTile, nRDLayer,  3  );
  346.      ChangeBlock( nRUTile, nRULayer,  1  );
  347.      ChangeBlock( nLUTile, nLULayer,  0  );
  348. // +-------------&-------------
  349.  // +---------------------------&------------------------- 
  350.  BOOL IsValidSubBlock( s32 nTile, s32 nLayer, s32 nIndex )
  351.   {
  352. s32 nBlock  =  m_pTile[nTile].Block[nLayer]  -  s_pBaseTexIndex_c[nIndex]; if (  ! IsValidBlock( nBlock ) )
  353.       return  FALSE; if ( nBlock  ==   0   ||   ! IsValidRandBlock( nBlock ) )
  354.       return  TRUE; return  TRUE;
  355. // +-------------&-------------
  356.  // +---------------------------&------------------------- 
  357.  void  ChangeBlock( s32 nTile, s32 nLayer, s32 nIndex )
  358.   {
  359. s32 nBlock  =  m_pTile[nTile].Block[nLayer]; if (  ! IsValidRandBlock( nBlock ) )
  360.   {
  361.      nBlock  =  nBlock  -  s_pBaseTexIndex_c[nIndex];
  362.      m_pTile[nTile].Block[nLayer]  =  nBlock;      if ( nBlock  ==   0  )
  363.        {
  364.       m_pTile[nTile].Block[nLayer]  =   0 ;
  365.       m_pTile[nTile].Texture[nLayer]  =  TE_INVALID_TILE;
  366.      } 
  367.  else 
  368.    {
  369.      m_pTile[nTile].Block[nLayer]  =   27   -  s_pBaseTexIndex_c[nIndex];
  370. // -------------&-------------
  371.  // ---------------------------&------------------------- 
  372.  void  SetTileAttribute( s32 nTile, s32 nLayer, s32 nBlock )
  373.   {
  374.  if ( nBlock  ==   27  )
  375.   {
  376.       //  nBlock = s_pRandTexIndex_c[rand() % TE_TEX_RAND_C];     s32 i = 0; 
  377.        for ( ; i  <  TE_TILE_COUNT;  ++ i )
  378.        {
  379.        if ( m_pTile[nTile].Texture[i]  <  m_nSelectTexture )
  380.         {
  381.        m_pTile[nTile].Block[i]  =   0 ;
  382.        m_pTile[nTile].Texture[i]  =  TE_INVALID_TILE;
  383.       } 
  384.      }      m_pTile[nTile].Texture[nLayer]  =  m_nSelectTexture;
  385. if (  ! IsValidBlock( nBlock ) )
  386.   {
  387.      nBlock  =   0 ;
  388. if ( nBlock  >=   32  )
  389.   {
  390.      nBlock  =   27 ;
  391. } m_pTile[nTile].Block[nLayer]  =  nBlock;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红火吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值