@ -16,46 +16,11 @@
class NifEmitter : public Ogre : : ParticleEmitter
class NifEmitter : public Ogre : : ParticleEmitter
{
{
public :
public :
std: : string mSkelBaseNam e;
Ogre: : Bone * mEmitterBon e;
Ogre : : Bone * m Bone;
Ogre : : Bone * m Particle Bone;
Ogre : : ParticleSystem * getPartSys ( ) { return mParent ; }
Ogre : : ParticleSystem * getPartSys ( ) { return mParent ; }
class CmdSkelBase : public Ogre : : ParamCommand
{
public :
Ogre : : String doGet ( const void * target ) const
{
assert ( false & & " Unimplemented " ) ;
return " " ;
}
void doSet ( void * target , const Ogre : : String & val )
{
NifEmitter * emitter = static_cast < NifEmitter * > ( target ) ;
emitter - > mSkelBaseName = val ;
}
} ;
class CmdBone : public Ogre : : ParamCommand
{
public :
Ogre : : String doGet ( const void * target ) const
{
assert ( false & & " Unimplemented " ) ;
return " " ;
}
void doSet ( void * target , const Ogre : : String & val )
{
NifEmitter * emitter = static_cast < NifEmitter * > ( target ) ;
assert ( ! emitter - > mSkelBaseName . empty ( ) & & " Base entity needs to be set first " ) ;
Ogre : : ParticleSystem * partsys = emitter - > getPartSys ( ) ;
Ogre : : Entity * ent = partsys - > getParentSceneNode ( ) - > getCreator ( ) - > getEntity ( emitter - > mSkelBaseName ) ;
Ogre : : Bone * bone = ent - > getSkeleton ( ) - > getBone ( val ) ;
assert ( bone ) ;
emitter - > mBone = bone ;
}
} ;
/** Command object for the emitter width (see Ogre::ParamCommand).*/
/** Command object for the emitter width (see Ogre::ParamCommand).*/
class CmdWidth : public Ogre : : ParamCommand
class CmdWidth : public Ogre : : ParamCommand
{
{
@ -165,8 +130,10 @@ public:
NifEmitter ( Ogre : : ParticleSystem * psys )
NifEmitter ( Ogre : : ParticleSystem * psys )
: Ogre : : ParticleEmitter ( psys )
: Ogre : : ParticleEmitter ( psys )
, mBone ( NULL )
{
{
mEmitterBone = Ogre : : any_cast < Ogre : : Bone * > ( psys - > getUserObjectBindings ( ) . getUserAny ( ) ) ;
Ogre : : TagPoint * tag = static_cast < Ogre : : TagPoint * > ( mParent - > getParentNode ( ) ) ;
mParticleBone = static_cast < Ogre : : Bone * > ( tag - > getParent ( ) ) ;
initDefaults ( " Nif " ) ;
initDefaults ( " Nif " ) ;
}
}
@ -180,7 +147,6 @@ public:
/** See Ogre::ParticleEmitter. */
/** See Ogre::ParticleEmitter. */
void _initParticle ( Ogre : : Particle * particle )
void _initParticle ( Ogre : : Particle * particle )
{
{
assert ( mBone & & " No node set " ) ;
Ogre : : Vector3 xOff , yOff , zOff ;
Ogre : : Vector3 xOff , yOff , zOff ;
// Call superclass
// Call superclass
@ -189,23 +155,41 @@ public:
xOff = Ogre : : Math : : SymmetricRandom ( ) * mXRange ;
xOff = Ogre : : Math : : SymmetricRandom ( ) * mXRange ;
yOff = Ogre : : Math : : SymmetricRandom ( ) * mYRange ;
yOff = Ogre : : Math : : SymmetricRandom ( ) * mYRange ;
zOff = Ogre : : Math : : SymmetricRandom ( ) * mZRange ;
zOff = Ogre : : Math : : SymmetricRandom ( ) * mZRange ;
particle - > position = mBone - > _getDerivedPosition ( ) + xOff + yOff + zOff ;
# if OGRE_VERSION >= (1 << 16 | 10 << 8 | 0)
Ogre : : Vector3 & position = particle - > mPosition ;
Ogre : : Vector3 & direction = particle - > mDirection ;
Ogre : : ColourValue & colour = particle - > mColour ;
Ogre : : Real & totalTimeToLive = particle - > mTotalTimeToLive ;
Ogre : : Real & timeToLive = particle - > mTimeToLive ;
# else
Ogre : : Vector3 & position = particle - > position ;
Ogre : : Vector3 & direction = particle - > direction ;
Ogre : : ColourValue & colour = particle - > colour ;
Ogre : : Real & totalTimeToLive = particle - > totalTimeToLive ;
Ogre : : Real & timeToLive = particle - > timeToLive ;
# endif
position = xOff + yOff + zOff +
mParticleBone - > _getDerivedOrientation ( ) . Inverse ( ) * ( mEmitterBone - > _getDerivedPosition ( )
- mParticleBone - > _getDerivedPosition ( ) ) ;
// Generate complex data by reference
// Generate complex data by reference
genEmissionColour ( particle - > colour ) ;
genEmissionColour ( colour) ;
// NOTE: We do not use mDirection/mAngle for the initial direction.
// NOTE: We do not use mDirection/mAngle for the initial direction.
Ogre : : Radian hdir = mHorizontalDir + mHorizontalAngle * Ogre : : Math : : SymmetricRandom ( ) ;
Ogre : : Radian hdir = mHorizontalDir + mHorizontalAngle * Ogre : : Math : : SymmetricRandom ( ) ;
Ogre : : Radian vdir = mVerticalDir + mVerticalAngle * Ogre : : Math : : SymmetricRandom ( ) ;
Ogre : : Radian vdir = mVerticalDir + mVerticalAngle * Ogre : : Math : : SymmetricRandom ( ) ;
particle - > direction = ( mBone - > _getDerivedOrientation ( ) * Ogre : : Quaternion ( hdir , Ogre : : Vector3 : : UNIT_Z ) *
direction = ( mParticleBone - > _getDerivedOrientation ( ) . Inverse ( )
* mEmitterBone - > _getDerivedOrientation ( ) *
Ogre : : Quaternion ( hdir , Ogre : : Vector3 : : UNIT_Z ) *
Ogre : : Quaternion ( vdir , Ogre : : Vector3 : : UNIT_X ) ) *
Ogre : : Quaternion ( vdir , Ogre : : Vector3 : : UNIT_X ) ) *
Ogre : : Vector3 : : UNIT_Z ;
Ogre : : Vector3 : : UNIT_Z ;
genEmissionVelocity ( particle - > direction ) ;
genEmissionVelocity ( direction) ;
// Generate simpler data
// Generate simpler data
particle - > timeToLive = particle - > totalTimeToLive = genEmissionTTL ( ) ;
timeToLive = totalTimeToLive = genEmissionTTL ( ) ;
}
}
/** Overloaded to update the trans. matrix */
/** Overloaded to update the trans. matrix */
@ -361,16 +345,6 @@ protected:
Ogre : : PT_REAL ) ,
Ogre : : PT_REAL ) ,
& msHorizontalAngleCmd ) ;
& msHorizontalAngleCmd ) ;
dict - > addParameter ( Ogre : : ParameterDef ( " bone " ,
" The bone where the particles should be spawned " ,
Ogre : : PT_STRING ) ,
& msBoneCmd ) ;
dict - > addParameter ( Ogre : : ParameterDef ( " skelbase " ,
" The name of the entity containing the bone (see 'bone' parameter) " ,
Ogre : : PT_STRING ) ,
& msSkelBaseCmd ) ;
return true ;
return true ;
}
}
return false ;
return false ;
@ -384,8 +358,6 @@ protected:
static CmdVerticalAngle msVerticalAngleCmd ;
static CmdVerticalAngle msVerticalAngleCmd ;
static CmdHorizontalDir msHorizontalDirCmd ;
static CmdHorizontalDir msHorizontalDirCmd ;
static CmdHorizontalAngle msHorizontalAngleCmd ;
static CmdHorizontalAngle msHorizontalAngleCmd ;
static CmdBone msBoneCmd ;
static CmdSkelBase msSkelBaseCmd ;
} ;
} ;
NifEmitter : : CmdWidth NifEmitter : : msWidthCmd ;
NifEmitter : : CmdWidth NifEmitter : : msWidthCmd ;
NifEmitter : : CmdHeight NifEmitter : : msHeightCmd ;
NifEmitter : : CmdHeight NifEmitter : : msHeightCmd ;
@ -394,8 +366,6 @@ NifEmitter::CmdVerticalDir NifEmitter::msVerticalDirCmd;
NifEmitter : : CmdVerticalAngle NifEmitter : : msVerticalAngleCmd ;
NifEmitter : : CmdVerticalAngle NifEmitter : : msVerticalAngleCmd ;
NifEmitter : : CmdHorizontalDir NifEmitter : : msHorizontalDirCmd ;
NifEmitter : : CmdHorizontalDir NifEmitter : : msHorizontalDirCmd ;
NifEmitter : : CmdHorizontalAngle NifEmitter : : msHorizontalAngleCmd ;
NifEmitter : : CmdHorizontalAngle NifEmitter : : msHorizontalAngleCmd ;
NifEmitter : : CmdBone NifEmitter : : msBoneCmd ;
NifEmitter : : CmdSkelBase NifEmitter : : msSkelBaseCmd ;
Ogre : : ParticleEmitter * NifEmitterFactory : : createEmitter ( Ogre : : ParticleSystem * psys )
Ogre : : ParticleEmitter * NifEmitterFactory : : createEmitter ( Ogre : : ParticleSystem * psys )
{
{
@ -466,9 +436,13 @@ public:
/** See Ogre::ParticleAffector. */
/** See Ogre::ParticleAffector. */
void _initParticle ( Ogre : : Particle * particle )
void _initParticle ( Ogre : : Particle * particle )
{
{
# if OGRE_VERSION >= (1 << 16 | 10 << 8 | 0)
const Ogre : : Real life_time = particle - > mTotalTimeToLive ;
Ogre : : Real particle_time = particle - > mTimeToLive ;
# else
const Ogre : : Real life_time = particle - > totalTimeToLive ;
const Ogre : : Real life_time = particle - > totalTimeToLive ;
Ogre : : Real particle_time = particle - > timeToLive ;
Ogre : : Real particle_time = particle - > timeToLive ;
# endif
Ogre : : Real width = mParent - > getDefaultWidth ( ) ;
Ogre : : Real width = mParent - > getDefaultWidth ( ) ;
Ogre : : Real height = mParent - > getDefaultHeight ( ) ;
Ogre : : Real height = mParent - > getDefaultHeight ( ) ;
if ( life_time - particle_time < mGrowTime )
if ( life_time - particle_time < mGrowTime )
@ -493,9 +467,13 @@ public:
while ( ! pi . end ( ) )
while ( ! pi . end ( ) )
{
{
Ogre : : Particle * p = pi . getNext ( ) ;
Ogre : : Particle * p = pi . getNext ( ) ;
const Ogre : : Real life_time = p - > totalTimeToLive ;
# if OGRE_VERSION >= (1 << 16 | 10 << 8 | 0)
Ogre : : Real particle_time = p - > timeToLive ;
const Ogre : : Real life_time = p - > mTotalTimeToLive ;
Ogre : : Real particle_time = p - > mTimeToLive ;
# else
const Ogre : : Real life_time = p - > totalTimeToLive ;
Ogre : : Real particle_time = p - > timeToLive ;
# endif
Ogre : : Real width = mParent - > getDefaultWidth ( ) ;
Ogre : : Real width = mParent - > getDefaultWidth ( ) ;
Ogre : : Real height = mParent - > getDefaultHeight ( ) ;
Ogre : : Real height = mParent - > getDefaultHeight ( ) ;
if ( life_time - particle_time < mGrowTime )
if ( life_time - particle_time < mGrowTime )
@ -554,47 +532,11 @@ class GravityAffector : public Ogre::ParticleAffector
} ;
} ;
public :
public :
std: : string mSkelBaseNam e;
Ogre: : Bone * mEmitterBon e;
Ogre : : Bone * m Bone;
Ogre : : Bone * m Particle Bone;
Ogre : : ParticleSystem * getPartSys ( ) { return mParent ; }
Ogre : : ParticleSystem * getPartSys ( ) { return mParent ; }
class CmdSkelBase : public Ogre : : ParamCommand
{
public :
Ogre : : String doGet ( const void * target ) const
{
assert ( false & & " Unimplemented " ) ;
return " " ;
}
void doSet ( void * target , const Ogre : : String & val )
{
GravityAffector * affector = static_cast < GravityAffector * > ( target ) ;
affector - > mSkelBaseName = val ;
}
} ;
class CmdBone : public Ogre : : ParamCommand
{
public :
Ogre : : String doGet ( const void * target ) const
{
assert ( false & & " Unimplemented " ) ;
return " " ;
}
void doSet ( void * target , const Ogre : : String & val )
{
GravityAffector * affector = static_cast < GravityAffector * > ( target ) ;
assert ( ! affector - > mSkelBaseName . empty ( ) & & " Base entity needs to be set first " ) ;
Ogre : : ParticleSystem * partsys = affector - > getPartSys ( ) ;
Ogre : : Entity * ent = partsys - > getParentSceneNode ( ) - > getCreator ( ) - > getEntity ( affector - > mSkelBaseName ) ;
Ogre : : Bone * bone = ent - > getSkeleton ( ) - > getBone ( val ) ;
assert ( bone ) ;
affector - > mBone = bone ;
}
} ;
/** Command object for force (see Ogre::ParamCommand).*/
/** Command object for force (see Ogre::ParamCommand).*/
class CmdForce : public Ogre : : ParamCommand
class CmdForce : public Ogre : : ParamCommand
{
{
@ -688,8 +630,11 @@ public:
, mForceType ( Type_Wind )
, mForceType ( Type_Wind )
, mPosition ( 0.0f )
, mPosition ( 0.0f )
, mDirection ( 0.0f )
, mDirection ( 0.0f )
, mBone ( NULL )
{
{
mEmitterBone = Ogre : : any_cast < Ogre : : Bone * > ( psys - > getUserObjectBindings ( ) . getUserAny ( ) ) ;
Ogre : : TagPoint * tag = static_cast < Ogre : : TagPoint * > ( mParent - > getParentNode ( ) ) ;
mParticleBone = static_cast < Ogre : : Bone * > ( tag - > getParent ( ) ) ;
mType = " Gravity " ;
mType = " Gravity " ;
// Init parameters
// Init parameters
@ -710,16 +655,6 @@ public:
dict - > addParameter ( Ogre : : ParameterDef ( force_type_title , force_type_descr , Ogre : : PT_STRING ) , & msForceTypeCmd ) ;
dict - > addParameter ( Ogre : : ParameterDef ( force_type_title , force_type_descr , Ogre : : PT_STRING ) , & msForceTypeCmd ) ;
dict - > addParameter ( Ogre : : ParameterDef ( direction_title , direction_descr , Ogre : : PT_VECTOR3 ) , & msDirectionCmd ) ;
dict - > addParameter ( Ogre : : ParameterDef ( direction_title , direction_descr , Ogre : : PT_VECTOR3 ) , & msDirectionCmd ) ;
dict - > addParameter ( Ogre : : ParameterDef ( position_title , position_descr , Ogre : : PT_VECTOR3 ) , & msPositionCmd ) ;
dict - > addParameter ( Ogre : : ParameterDef ( position_title , position_descr , Ogre : : PT_VECTOR3 ) , & msPositionCmd ) ;
dict - > addParameter ( Ogre : : ParameterDef ( " bone " ,
" The bone where the particles should be spawned " ,
Ogre : : PT_STRING ) ,
& msBoneCmd ) ;
dict - > addParameter ( Ogre : : ParameterDef ( " skelbase " ,
" The name of the entity containing the bone (see 'bone' parameter) " ,
Ogre : : PT_STRING ) ,
& msSkelBaseCmd ) ;
}
}
}
}
@ -761,18 +696,20 @@ public:
static CmdForceType msForceTypeCmd ;
static CmdForceType msForceTypeCmd ;
static CmdDirection msDirectionCmd ;
static CmdDirection msDirectionCmd ;
static CmdPosition msPositionCmd ;
static CmdPosition msPositionCmd ;
static CmdBone msBoneCmd ;
static CmdSkelBase msSkelBaseCmd ;
protected :
protected :
void applyWindForce ( Ogre : : ParticleSystem * psys , Ogre : : Real timeElapsed )
void applyWindForce ( Ogre : : ParticleSystem * psys , Ogre : : Real timeElapsed )
{
{
const Ogre : : Vector3 vec = m Bone- > _getDerivedOrientation ( ) * m Direction * mForce * timeElapsed ;
const Ogre : : Vector3 vec = m Direction * mForce * timeElapsed ;
Ogre : : ParticleIterator pi = psys - > _getIterator ( ) ;
Ogre : : ParticleIterator pi = psys - > _getIterator ( ) ;
while ( ! pi . end ( ) )
while ( ! pi . end ( ) )
{
{
Ogre : : Particle * p = pi . getNext ( ) ;
Ogre : : Particle * p = pi . getNext ( ) ;
# if OGRE_VERSION >= (1 << 16 | 10 << 8 | 0)
p - > mDirection + = vec ;
# else
p - > direction + = vec ;
p - > direction + = vec ;
# endif
}
}
}
}
@ -783,9 +720,18 @@ protected:
while ( ! pi . end ( ) )
while ( ! pi . end ( ) )
{
{
Ogre : : Particle * p = pi . getNext ( ) ;
Ogre : : Particle * p = pi . getNext ( ) ;
const Ogre : : Vector3 vec = (
# if OGRE_VERSION >= (1 << 16 | 10 << 8 | 0)
( mBone - > _getDerivedOrientation ( ) * mPosition + mBone - > _getDerivedPosition ( ) ) - p - > position ) . normalisedCopy ( ) * force ;
Ogre : : Vector3 position = p - > mPosition ;
# else
Ogre : : Vector3 position = p - > position ;
# endif
Ogre : : Vector3 vec = ( mPosition - position ) . normalisedCopy ( ) * force ;
# if OGRE_VERSION >= (1 << 16 | 10 << 8 | 0)
p - > mDirection + = vec ;
# else
p - > direction + = vec ;
p - > direction + = vec ;
# endif
}
}
}
}
@ -801,8 +747,6 @@ GravityAffector::CmdForce GravityAffector::msForceCmd;
GravityAffector : : CmdForceType GravityAffector : : msForceTypeCmd ;
GravityAffector : : CmdForceType GravityAffector : : msForceTypeCmd ;
GravityAffector : : CmdDirection GravityAffector : : msDirectionCmd ;
GravityAffector : : CmdDirection GravityAffector : : msDirectionCmd ;
GravityAffector : : CmdPosition GravityAffector : : msPositionCmd ;
GravityAffector : : CmdPosition GravityAffector : : msPositionCmd ;
GravityAffector : : CmdBone GravityAffector : : msBoneCmd ;
GravityAffector : : CmdSkelBase GravityAffector : : msSkelBaseCmd ;
Ogre : : ParticleAffector * GravityAffectorFactory : : createAffector ( Ogre : : ParticleSystem * psys )
Ogre : : ParticleAffector * GravityAffectorFactory : : createAffector ( Ogre : : ParticleSystem * psys )
{
{