/** @file AOPerVertexShadowGenerator.h @brief 逐顶点地形 AO 阴影产生.利用场景物件和地形产生 AODisk, 逐地形顶点计算阴影,将结果插值写入 blend texture 的 alpha 通道.
*	Copyright (c) 2008,第九城市游戏研发中心
*	All rights reserved.
*
*	当前版本:
*	作    者:Shi Yazheng
*	完成日期:2008-04-23
*
*	取代版本:
*	作    者:
*	完成日期:
*/ #ifndef CODE_INGAME #pragma once #include "AODiskGenerator.h" #include namespace SceneCore { class MAIN_ENTRY CAOPerVertexShadowGenerator { public: CAOPerVertexShadowGenerator(CTerrain* pkTerrain); ~CAOPerVertexShadowGenerator(void); /// 添加投射阴影的物件,利用该物件产生 AODisk //void AddShadowEmitter(NiAVObject* pkAVObj); void AddShadowEmitter(NiEntityInterface* pkEntity); /// 产生地形阴影 void GenerateTerrainShadow(int iChunkID, float fTerrainAffectFactor=20.0f, float fSceneAffectFactor=12.0f, float fMaxShadowValue = 0.5f); /// 产生假的物件环境阴影 // fMaxShadowValue - 最大阴影深度 // fBlur - 模糊程度 // fBlurTexSize - scale down 到原纹理的多少尺寸 void GenerateSceneObjectShadow(float fMaxShadowValue, float fBlur, float fBlurTexSize); // 1_2 // | | // 0-3 /** *
功能说明: 为一个4个顶点构成的正方形插值计算任一 uv 点的值 *
可访问性: public *
注 释: 用来插值阴影,所以只是一个通道. * @param fColor[0,3] 四个顶点的颜色 * @param uv 目标点 uv * @return 插值结果 */ float QuadColorInterpolation(float fColor0, float fColor1, float fColor2, float fColor3, NiPoint2 uv); float ElementShadow(NiPoint3 v, float rSquared, NiPoint3 kReceiveNromal, NiPoint3 vEmitterNormal, float fEmitterArea); // 获取 disk 数量 void GetNumDisks(int& iNumTerrainDisks, int &iNumSceneDisks); // 保存场景物件 disk info bool SaveSceneDiskInfo(const char* pszFileName); // 保存地形 disk info bool LoadSceneDiskInfo(const char* pszFileName); CTerrain* GetTargetTerrain() {return m_pkTerrain;} protected: // 对纹理进行模糊 void _BlurTexture(NiTexture* pkTexture, float fBlur, float fBlurTexSize); CTerrain* m_pkTerrain; // 产生阴影的目标地形 CAODiskGenerator m_kDiskGenerator; // AODisk 产生器 list *m_aEntityList; // 场景所有物件列表,按照 chunk 分别存放 }; #include "AOPerVertexShadowGenerator.inl" }; #endif