本文轉自:http://blog.csdn.net/shadow_gz/article/details/6359220
特效系統
對於通用化的特效,圖形效果,我設計結構是如下:
第一部分:
EntitySource 特效的渲染實體,封裝了各種類型特效的渲染。
現已經支持了粒子特效,序列幀動畫,地形貼花等
繼承其的子類:
EffectSourceBase UV動畫,模型動畫,粒子特效
EffectAureSoure 貼花
EffectMaterialSource 拓展材質
EffectMRTSource MRT熱能擾動
EffectSourcePool,每個EffectSource都會對應唯一的EffectSourcePool
通過EffectSourcePool克隆新的EffectSource
通過ID可以輕鬆的辨別特效類別,後期優化可以進行優化,減少狀態切換
EffectSourceManger對EffectSource進行管理,包括資源的加載,刪除,克隆等操作。
第二部分:
EntityEffect 特效的邏輯實體。
不同類別的EntityEffect可帶有不同的EffectProperty,通過EffectBuilder進行組織。
現支持BaseEffect,AureEffect貼花,Material(材質),PostEffect(後處理)。
一個EntityEffect 關聯一個EffectSource,一個EffectTimeController.
EntityEffect Update只對所有的時間控制器EffectControl進行跟新。管理生命週期。
Render對EffectProperty,EffectSource進行更新,更新渲染實體,並執行渲染。
EffectEntityManger對EntityEffect進行創建,管理。
一般的特效的創建一般是對EntityEffect的拼裝過程。
EntityEffect對應對外操作: Play()播放Pause()暫停 Stop()結束,請不要手動Delete EntityEffect若要撤銷刪除EntityEffect調用Stop()。
第三部分:
EffectController 時間控制器,管理EntityEffect的生命週期,以及各種數據運算.把運算邏輯抽出來。一般的EffectSource需要讀取Nif 裏面TimeController的時間控制信息,藉此執行特效資源的Frame Render。
EffectProperty EffectPropertyContainer 封裝了EntityEffect所具有的特性。
PropertyInterpolater 屬性插值器,提供給EffectController 對EntityEffect 的Property進行數據運算
暫且封裝了兩種類別的插值器:
l TransformInterpolator:位置計算。封裝了Effect軌跡計算。每個EffectController都需要對應一個唯一的TransformInterpolator(m_pkMainInterpolator)進行軌跡計算。其決定了EffectController的生命週期。現封裝了以下的TransformInterpolator:
1、EffectClampInterpolator:綁定到某一節點(位置)只播放一次。
2、EffectFallOffInterpolator:自由落體運動。
3、EffectFollowInterpolator:一直跟隨某一節點(位置),直到EffectProperties::E_CONTROLEND== FASLE;
4、EffectMissileInterpolator:導彈飛行,追蹤某一節點(位置)
5、EffectParabolaInterpolater:拋物線軌跡計算。
l EffectFloatInterpolator:
通過PropertyInterpolater對EffectProperty 進行插值計算,比如通常用到的Alpha插值,Scale大小插值。
第四部分
組合特效,面對於EntityEffect多個實例我們允許其拼裝。我提供了兩個東西:
CombinProcess 主要是對EntityEffect與 多個EffectTimeController 結合,得到各種不同的效果。
CombinEffectManager 組合特效管理,主要負責對CombinProcess 進行拼裝。
這部分做的大部分工作是根據表格內容拼裝出相應的特效。
關於爲何要抽取EntityEffect和EntitySource ,我們可以把物理實體和渲染實體分開,一個關注邏輯運算以及數據驅動一個關注渲染。
比如同一個序列幀動畫爆炸特效,場景裏面有10個爆炸特效的EntitySource都是同一個,資源也是同一個,只不過爆炸的位置和當前的播放的幀不同而已。
最後我還封裝
EntitySourceManager 管理所有的EntitySource,包括了EntitySource的內存池。
EntityEffectManager
舉個實例:
地形貼花系統
EntitySource 是主要渲染的貼花渲染接口
EntityEffect 是邏輯實體,其關注了貼花系統的邏輯變化,比如帶有Property:貼花層數,每層的Alpha值,每層的問題等等。
CombinProcess 裏面描述了EntityEffect 使用MisslieTimeController 的運動軌跡是從點A移動點B,或者BindTimeController一直跟隨人走。
其又描述了EffectTimeController裏面使用PropertyInterpolater對根據幀時間Alpha進行0~1的間插值。並且不斷的替換紋理。
CombinEffectManager 可以包含多個CombinProcess形成一個新的特效。