// 一维矢量随机初始化器
template<
class _ParticleType,
class _RandGenerator,
class _RandDistribution
> class TUniformRandomVec1Initializer {
protected:
typedef _ParticleType tParticle;
typedef _RandGenerator tGenerator;
typedef _RandDistribution tDistribution;
typedef boost::variate_generator< _RandGenerator, _RandDistribution > tVarGen;
// 数值生成器
tVarGen m_VGen;
public:
TUniformRandomVec1Initializer( void )
: m_VGen( tGenerator( 1 ), tDistribution() )
{}
// 设置种子
void Seed( boost::uint32_t nSeed ) {
m_VGen.engine().seed( nSeed );
}
// 设置分布器
void SetDist( const tDistribution& Dist ) {
m_VGen.distribution() = Dist;
}
// 执行初始化
template< size_t nIndex >
void Action( tParticle& p ) {
p.Part< nIndex >().m_Value = m_VGen();
}
};
TUniformRandomVec1Initializer是一个一维随机初始化器,它接受3个模板参数,_ParticleType用于指定所需要初始化的粒子类型,_RandGenerator用于指定随机数生成器(详细说明请参看Boost.Random的文档),_RandDistribution用于指定随机数分布器(详细说明请参看Boost.Random的文档)。公共成员函数Seed用于设置随机数生成器的种子,SetDist用于设置随机数分布器。
TUniformRandomVec2Initializer二维随机初始化器,
TUniformRandomVec3Initializer三维随机初始化器,
TUniformRandomVec4Initializer四维随机初始化器,
TSphereRandomVec2XYInitializer三维XY平面圆形随机初始化器,
TSphereRandomVec2XZInitializer三维XZ平面圆形随机初始化器,
TSphereRandomVec2YZInitializer三维YZ平面圆形随机初始化器,
的使用都与此类似,详细使用请参看本文所附例程,详细实现请参看本文所附源代码及Boost.Random文档。
如果以上提到的内建初始化器中并没有您需要的,那么动手自定义一个初始化器也是一件非常轻松愉快的事情。
// 根据寿命修正退色因子
template<
class _ParticleType,
size_t nFadeIndex
> class TFixFadeByLifeInitializer {
protected:
typedef _ParticleType tParticle;
public:
// 执行初始化
template< size_t nIndex >
void Action( tParticle& p ) {
p.Part< nFadeIndex >().m_Value = 1.0 / p.Part< nIndex >().m_Value;
}
};
这里我们自定义了一个根据初始寿命值修正退色因子的初始化器,它接受两个模板参数,_ParticleType用于指定所需要初始化的粒子类型,nFadeIndex用于指定退色因子在粒子结构中的索引。
四、更新器
更新器和初始化器一样也粒子系统重要的组成部分,每个更新器都必须有个一公共的带有一个size_t型模板参数的Action成员函数,此函数接受一个从上次更新到现在的时间间隔作为参数,TParticleSystem将调用此函数对粒子进行更新,模板参数nIndex用于指定所需要更新的粒子部分。系统中内建了几个常用的更新器:
// 空更新器
template<
class _ParticleType
> class TNilActor {
protected:
typedef _ParticleType tParticle;
public:
template< size_t nIndex >
void Action( const double&, tParticle& ) {
}
};
TNilActor是一个空更新器, 它有一个模板参数,_ParticleType用于指定所需要更新的粒子类型,如果指定其为某个粒子部分的更新器系统将不对此粒子部分进行更新动作。