#pragma once
/** @file Terrain.h
@brief 地形优化器 用于地形数据导出时的优化
* Copyright (c) 2007,第九城市游戏研发中心
* All rights reserved.
*
* 当前版本:1.0
* 作 者:Shi Yazheng
* 完成日期:2008-01-27
*
* 取代版本:
* 作 者:和萌
* 完成日期:
*/
#ifndef CODE_INGAME
#include "Terrain.h"
class MAIN_ENTRY CTerrainOptimizer
{
public:
CTerrainOptimizer(CTerrain* pTerrain, int iSensitivity = 5);
~CTerrainOptimizer(void);
/**
*
功能说明:优化地形
*
可访问性:
*
注 释:
* @param bFinalOptimize[in] 是否最终优化。最终优化过程不可逆,只用作地形导出
* @return
*/
void Optimize(bool bFinalOptimize = false);
/// 获取 quadMatrix 中 iX, iY 坐标元素 对应的索引值
int GetQuadMatrixIndex(int iX, int iY)
{
return iY*(m_pTerrain->GetChunkNumX()*GRIDINCHUNK+1)+iX;
}
unsigned char GetQuadMatrixValue(int iX, int iY)
{
return m_ucpQuadMatrix[GetQuadMatrixIndex(iX, iY)];
}
private:
// 优化单个 chunk
void _OptimizeChunk(int iX, int iY);
// quad mat 标准化
void _StandardQuadMat(int iChunkX, int iChunkY, int iX, int iY, int iEdgeLength);
/**
*
功能说明:生成一个 quad tree 节点的三角形
*
可访问性:
*
注 释:
* @param iChunkX[in] 当前节点所在 chunk 的坐标(行列下标)
* @param iChunkY[in]
* @param iX[in] 节点中心顶点在本chunk顶点中坐标(行列下标)
* @param iY[in]
* @param iEdegLength[in] 节点边长
* @param pVI[out] 顶点索引
* @param iNumTri[out] 生成的三角形总数
* @return
*/
void _GenerateTriangles(int iChunkX, int iChunkY, int iX, int iY, int iEdgeLength, WORD* pVI, int &iNumTri);
// 清除所有未使用顶点。用于最终优化
void _ClearUnuseVertices();
// 修正chunk边界的顶点normal值 [6/22/2009 hemeng]
// 逐chunk计算normal容易造成chunk接缝处的公用顶点计算的normal不相同:因为两边的三角形并不相同
bool _ModifyNormals();
// 记录chunk normal错误的结构 [6/22/2009 hemeng]
struct stChunkNormal
{
unsigned int uiChunkID;
unsigned int uiVertIndex;
NiPoint3 kNormal;
};
void _CheckChunkBorder(int iChunkID, vector& vErrorVer, bool bRow);
CTerrain* m_pTerrain;
unsigned char* m_ucpQuadMatrix; // 四叉树矩阵, 用来标记所有四叉树节点的细分情况
int m_iSensitivity; // 敏感度
};
#endif