/** @file SprayGenerator.h
@brief 高级水体 排浪生成器
* Copyright (c) 2007,第九城市游戏研发中心
* All rights reserved.
*
* 当前版本:0.1
* 作 者:Shi Yazheng
* 完成日期:2008-10-07
*
* 取代版本:
* 作 者:
* 完成日期:
*/
#pragma once
#include "Terrain.h"
#include
#ifndef CODE_INGAME
namespace SceneCore
{
// 排浪生成
// 根据面片和地形的交叉处生成排浪面片和UV
class MAIN_ENTRY CSprayGenerator
{
public:
// Constructor
CSprayGenerator();
// Destructor
~CSprayGenerator(void);
// 初始化
bool Init(CTerrain* pTerrain, float fSeaLevel, float fWidth, float fAlpha,
float fT0, float fV0, float fT1, float fV1, float fT2, float fV2, float fT3, float fV3, const char* strTexFilename);
// 生成排浪几何体
NiGeometryPtr GenerateSprayGeometry();
NiGeometryPtr GenerateSprayGeometry(std::set& gridSet);
// 获取已生成的排浪几何体
NiGeometryPtr GetSprayGeometry();
protected:
// 提取海岸线
void _ExtractCoastEdge();
void _ExtractCoastEdge(std::set& gridSet);
// 连接海岸线线段
void _ConnectCoastEdge();
// 挤压海岸线生成排浪面片
void _ExtrudeCoastEdge();
// 生成排浪面片
void _CreateMesh();
// 为排浪面片设置纹理动画
void _SetTextureAnimation();
// 按照 z 对两点线性插值
NiPoint3 _Lerp(const NiPoint3& kStart, const NiPoint3& kEnd, float fInterValue);
// 判断两个 NiPoint3 的位置是否重合
bool _SimpleEqule(const NiPoint3& p0, const NiPoint3& p1);
// 检查从 kBase 向 kDirection 方向挤压是否合法.返回合法的方向.
// 如果挤压一个很小的距离(比如0.1)后在地形之下,认为不合理,反之合理
bool _CheckExtrudeDirection(const NiPoint3& kBase, const NiPoint3& kDirection);
private:
CTerrain* m_pTerrain; // 目标地形
float m_fSeaLevel; // 海平面高度
float m_fWidth; // 排浪宽度
float m_fAlpha; // 动画速度
float m_fT0, m_fT1, m_fT2, m_fT3; // 关键帧时间
float m_fV0, m_fV1, m_fV2, m_fV3; // V 偏移
NiTexturePtr m_spSprayTexture; // 排浪纹理
list m_EdgeSegmentList; // 海岸线线段列表
vector*> m_CoastEdgeList; // 连续海岸线列表
vector*> m_ExtrudeEdgeList; // 连续海岸线挤压顶点列表
NiGeometryPtr m_spSprayMesh; // 排浪几何体
}; // End of Class
#include "SprayGenerator.inl"
}; // End of namespace
#endif