/** @file WaterBody.h @brief 水体
*	Copyright (c) 2007,第九城市游戏研发中心
*	All rights reserved.
*
*	当前版本:0.1
*	作    者:Shi Yazheng
*	完成日期:2008-03-03
*
*	取代版本:
*	作    者:
*	完成日期:
*/ #ifndef WATER_BODY_H #define WATER_BODY_H #pragma once #include #include #include "WaterRenderView.h" //#include "NiSpeedTreeComponent.h" namespace SceneCore { /// 用来初始化水体的参数 struct stWaterInitParam { //NiRenderer* pkRenderer; // 场景唯一的 renderer CWaterRenderViewPtr pWaterRenderView; // 水体 render view.包含摄像机属性和反射纹理需要渲染得物件的最小集 NiPoint3 kPosition; // 水体左下定点坐标 float fSize; // 尺寸 float fAlpha; // 透明度 NiColor kColor; // 水面颜色 NiTexturePtr pkBGSkyTexture; // 用来做反射纹理背景的天空纹理 unsigned int uiReflectTexSize; // 反射纹理尺寸 NiTexturePtr pkBumpTexture; // bump 纹理 NiPoint2 kBumpMapRepeat; // u/v 方向上bump map 重复数量 NiPoint2 kUVSpeed; // u/v 方向上UV 动画运动速度 }; NiSmartPointer(CWaterBody); /// 水体 class MAIN_ENTRY CWaterBody : public NiAVObject { NiDeclareRTTI; public: CWaterBody(void); virtual ~CWaterBody(void); /// /** *
功能说明: 创建水体 *
可访问性: *
注 释: * @param stWaterInitParam[in] 水体初始化参数集 * @return 创建是否成功 */ bool Init(stWaterInitParam& waterInitParam); /// 获取材质 NiMaterialPtr GetMaterial(); /// 设置水体透明度 void SetAlpha(float fAlpha); float GetAlpha() const; /// 设置/获取 水体颜色 void SetColor(const NiColor& kColor); NiColor GetColor() const; /// 设置/获取 反射纹理尺寸 void SetReflectTextureSize(const unsigned short usSize); unsigned short GetReflectTextureSize() const; /// 设置/获取主活动相机 NiCamera *GetMainCamera(); void SetMainCamera(NiCamera* pCamera); /// 设置 mainRenderView void SetMainRenderView(CWaterRenderViewPtr pMainRenderView); /// 设置位置 void SetPosition(const NiPoint3& kPosition) {m_kPosition = kPosition;} const NiPoint3& GetPosition() {return m_kPosition;} /// 设置反射纹理的背景天空纹理 void SetReflectTextureBG(NiTexturePtr pkTexture); /// 设置Bump map void SetBumpMap(NiTexturePtr pkTexture); /// 设置/获取 bump map 重复次数 void SetBumpMapRepeat(const NiPoint2 kRepeat); NiPoint2 GetBumpMapRepeat() const; /// 设置/获取 bump map UV 动画速度 void SetBumpMapSpeed(const NiPoint2 kSpeed); NiPoint2 GetBumpMapSpeed() const; /// 保存/获取摄像机参数 void SaveCamParam(const NiPoint3& kPos, const NiPoint3& kDir); void RetrieveCamParam(NiPoint3& kPos, NiPoint3& kDir); /// 设置 clip plan void SetWaterClipPlane(bool bSet); /// 添加/删除/获取 可能被渲染到反射纹理中的潜在静态物件 void AppendPVStaticObject(NiAVObject* pkPVObject); void RemovePVStaticObject(NiAVObject* pkPVObject); list& GetPVStaticObjects(); /// 创建水体表面可视集 (针对水体表面的剔除,不针对 CWaterRenderView 中的渲染集) virtual void BuildVisibleSet( NiCamera * pCamera, NiCullingProcess* pCullingProcess ); /// 渲染反射纹理 由于各水面高低可能有差别,所以反射纹理只能单独渲染 void RenderReflectTexture(NiEntityRenderingContext* pkRenderingContext); /// 将speed tree 物件渲染到当前 render target //void RenderSpeedTree(); /// 终结 void ShutDown(); /// 更新 void Update(float fTotalTime ); /// 打开该效果 void Enable(); /// 关闭该效果 void Disable(); /// 获取场景根 NiNode* GetSceneRoot() { return m_spRootScene; } /// 获取RenderStep NiDefaultClickRenderStepPtr GetRenderStep(){ return m_spRenderStep; } protected: // 创建水体表面几何体 void _CreateWaterBodyGeom(); // 销毁 void _Destroy(); /// Water Texture 回调 static bool _PreWaterTextureCallback( NiRenderClick* pkCurrentRenderClick, void* pvCallbackData ); static bool _PostWaterTextureCallback( NiRenderClick* pkCurrentRenderClick, void* pvCallbackData ); /// 创建渲染到全屏的 render view void _CreateScreenFillingRenderViews(); /// 创建 bump map 函数作废 // bool _CreateBumpMap(NiPoint2 kNumWaves); /// 场景根节点 NiNodePtr m_spRootScene; /// 主视 包含摄像机和 culling processor CWaterRenderViewPtr m_spWaterRenderView; /// 渲染器 //NiRenderer* m_spRenderer; /// 水体周围,可能被渲染到反射纹理中的静态物件列表. list m_PVStaticObjects; /// 初始化结束标志 bool m_bInitialized; /// 默认RenderStep NiDefaultClickRenderStepPtr m_spRenderStep; /// 渲染到纹理 NiRenderedTexturePtr m_spTexture0; /// 渲染目标0 NiRenderTargetGroupPtr m_spRTGroup0; /// 作为倒影纹理的背景天空纹理 NiTexturePtr m_spTextureSky; /// Bump map NiTexturePtr m_spBumpMap; /// Render-to-texture全屏View NiScreenFillingRenderViewPtr m_spRTView; /// Texture Property NiTexturingPropertyPtr m_pkRTViewTexProp; /// 渲染背景天空纹理到反射纹理的 render click NiViewRenderClickPtr m_spReflectBGRenderClick; /// 渲染水面倒影纹理的 render click NiViewRenderClickPtr m_spReflectTexRenderClick; /// 水面几何体 NiTriShapePtr m_pkWaterSurface; /// 材质 NiMaterialPtr m_spWaterBodyMtl; // 水体本身属性 NiPoint3 m_kPosition; // 位置 float m_fSize; // 尺寸 float m_fAlpha; // 透明度 NiColor m_kColor; // 颜色 NiPoint2 m_kBumpMapRepeat;// bump map 重复次数 NiPoint2 m_kUVSpeed; // u/v 方向波纹运动速度 NiPoint3 m_kSaveCameraPos; // 保存的摄像机位置,用于水下拍照后渲染水面时恢复该位置 NiPoint3 m_kSaveCameraDir; // 保存摄像机方向 NiQuaternion m_kBumpMat; // bump matrix unsigned int m_uiReflectTexSize; // 反射纹理尺寸 bool m_bEnabled; // 水体效果是否开启 bool m_bInVisableArray; // 水体是否在可视集中 }; #include "WaterBody.inl" }; // end of namespace #endif