本文转自: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形成一个新的特效。