123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689 |
- //-----------------------------------------------------------------------------
- // Copyright (c) 2013 GarageGames, LLC
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to
- // deal in the Software without restriction, including without limitation the
- // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- // sell copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- //
- // The above copyright notice and this permission notice shall be included in
- // all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- // IN THE SOFTWARE.
- //-----------------------------------------------------------------------------
- #include "2d/assets/ParticleAssetEmitter.h"
- #ifndef _PARTICLE_ASSET_H_
- #include "2d/assets/ParticleAsset.h"
- #endif
- #ifndef _CONSOLETYPES_H_
- #include "console/consoleTypes.h"
- #endif
- // Script bindings.
- #include "ParticleAssetEmitter_ScriptBinding.h"
- //------------------------------------------------------------------------------
- static EnumTable::Enums emitterTypeLookup[] =
- {
- { ParticleAssetEmitter::POINT_EMITTER, "POINT" },
- { ParticleAssetEmitter::LINE_EMITTER, "LINE" },
- { ParticleAssetEmitter::BOX_EMITTER, "BOX" },
- { ParticleAssetEmitter::DISK_EMITTER, "DISK" },
- { ParticleAssetEmitter::ELLIPSE_EMITTER, "ELLIPSE" },
- { ParticleAssetEmitter::TORUS_EMITTER, "TORUS" },
- };
- //------------------------------------------------------------------------------
- static EnumTable EmitterTypeTable(sizeof(emitterTypeLookup) / sizeof(EnumTable::Enums), &emitterTypeLookup[0]);
- //------------------------------------------------------------------------------
- ParticleAssetEmitter::EmitterType ParticleAssetEmitter::getEmitterTypeEnum(const char* label)
- {
- // Search for Mnemonic.
- for(U32 i = 0; i < (sizeof(emitterTypeLookup) / sizeof(EnumTable::Enums)); i++)
- if( dStricmp(emitterTypeLookup[i].label, label) == 0)
- return((ParticleAssetEmitter::EmitterType)emitterTypeLookup[i].index);
- // Warn.
- Con::warnf( "ParticleAssetEmitter::getEmitterTypeEnum() - Invalid emitter-type '%s'.", label );
- return ParticleAssetEmitter::INVALID_EMITTER_TYPE;
- }
- //-----------------------------------------------------------------------------
- const char* ParticleAssetEmitter::getEmitterTypeDescription( const EmitterType emitterType )
- {
- // Search for Mnemonic.
- for (U32 i = 0; i < (sizeof(emitterTypeLookup) / sizeof(EnumTable::Enums)); i++)
- {
- if( emitterTypeLookup[i].index == (S32)emitterType )
- return emitterTypeLookup[i].label;
- }
- // Warn.
- Con::warnf( "ParticleAssetEmitter::getEmitterTypeDescription() - Invalid emitter-type." );
- return StringTable->EmptyString;
- }
- //-----------------------------------------------------------------------------
- static EnumTable::Enums physicsParticleType[] =
- {
- {b2ParticleFlag::b2_barrierParticle, "BarrierPartice"},
- {b2ParticleFlag::b2_colorMixingParticle, "ColorMixingParticle"},
- {b2ParticleFlag::b2_destructionListenerParticle,"DesctructionListenerParticle"},
- {b2ParticleFlag::b2_elasticParticle, "ElasticParticle"},
- {b2ParticleFlag::b2_powderParticle, "PowderParticle"},
- {b2ParticleFlag::b2_reactiveParticle, "ReactiveParticle"},
- {b2ParticleFlag::b2_repulsiveParticle, "RepulsiveParticle"},
- {b2ParticleFlag::b2_springParticle, "SpringParticle"},
- {b2ParticleFlag::b2_staticPressureParticle, "StaticPressureParticle"},
- {b2ParticleFlag::b2_tensileParticle, "TensileParticle"},
- {b2ParticleFlag::b2_viscousParticle, "ViscousParticle"},
- {b2ParticleFlag::b2_wallParticle, "WallParticle"},
- {b2ParticleFlag::b2_waterParticle, "WaterParticle"},
- {b2ParticleFlag::b2_zombieParticle, "ZombieParticle"}
- };
- static EnumTable PhysicsParticleTypeTable(sizeof(physicsParticleType) / sizeof(EnumTable::Enums), &physicsParticleType[0]);
- ParticleAssetEmitter::PhysicsParticleType ParticleAssetEmitter::getPhysicsParticleTypeEnum(const char* label)
- {
- for (U32 i = 0; i < (sizeof(physicsParticleType) / sizeof(EnumTable::Enums)); i++)
- if (dStricmp(physicsParticleType[i].label, label) == 0)
- return((ParticleAssetEmitter::PhysicsParticleType)physicsParticleType[i].index);
- // Warn.
- Con::warnf("ParticleAssetEmitter::getPhysicsParticleType() - Invalid physics particle type '%s'.", label);
- return ParticleAssetEmitter::INVALID_PHYSICS_PARTICLE_TYPE;
- }
- const char* ParticleAssetEmitter::getPhysicsParticleTypeDescription(const PhysicsParticleType particleType)
- {
- // Search for Mnemonic.
- for (U32 i = 0; i < (sizeof(physicsParticleType) / sizeof(EnumTable::Enums)); i++)
- {
- if (physicsParticleType[i].index == (S32)particleType)
- return physicsParticleType[i].label;
- }
- // Warn.
- Con::warnf("ParticleAssetEmitter::getPhysicsParticleTypeDescription() - Invalid physics particle-type");
- return StringTable->EmptyString;
- }
- //------------------------------------------------------------------------------
- static EnumTable::Enums particleOrientationTypeLookup[] =
- {
- { ParticleAssetEmitter::FIXED_ORIENTATION, "FIXED" },
- { ParticleAssetEmitter::ALIGNED_ORIENTATION, "ALIGNED" },
- { ParticleAssetEmitter::RANDOM_ORIENTATION, "RANDOM" },
- };
- //------------------------------------------------------------------------------
- static EnumTable OrientationTypeTable(sizeof(particleOrientationTypeLookup) / sizeof(EnumTable::Enums), &particleOrientationTypeLookup[0]);
- //------------------------------------------------------------------------------
- ParticleAssetEmitter::ParticleOrientationType ParticleAssetEmitter::getOrientationTypeEnum(const char* label)
- {
- // Search for Mnemonic.
- for(U32 i = 0; i < (sizeof(particleOrientationTypeLookup) / sizeof(EnumTable::Enums)); i++)
- if( dStricmp(particleOrientationTypeLookup[i].label, label) == 0)
- return((ParticleAssetEmitter::ParticleOrientationType)particleOrientationTypeLookup[i].index);
- // Warn.
- Con::warnf( "ParticleAssetEmitter::getOrientationTypeEnum() - Invalid orientation type '%s'.", label );
- return ParticleAssetEmitter::INVALID_ORIENTATION;
- }
- //------------------------------------------------------------------------------
- const char* ParticleAssetEmitter::getOrientationTypeDescription( const ParticleOrientationType orientationType )
- {
- // Search for Mnemonic.
- for (U32 i = 0; i < (sizeof(particleOrientationTypeLookup) / sizeof(EnumTable::Enums)); i++)
- {
- if( particleOrientationTypeLookup[i].index == (S32)orientationType )
- return particleOrientationTypeLookup[i].label;
- }
- // Warn.
- Con::warnf( "ParticleAssetEmitter::getOrientationTypeDescription() - Invalid orientation-type" );
- return StringTable->EmptyString;
- }
- //------------------------------------------------------------------------------
- ParticleAssetEmitter::ParticleAssetEmitter() :
- mEmitterName( StringTable->EmptyString ),
- mOwner( NULL ),
- mEmitterType( POINT_EMITTER ),
- mPhysicsParticleType(b2_waterParticle),
- mPhysicsParticles(false),
- mEmitterOffset( 0.0f, 0.0f),
- mTargetParticle(false),
- mTargetPosition(0.0f, 0.0f),
- mEmitterAngle( 0.0f ),
- mEmitterSize( 10.0f, 10.0f ),
- mFixedAspect( true ),
- mOrientationType( FIXED_ORIENTATION ),
- mKeepAligned( false ),
- mAlignedAngleOffset( 0.0f ),
- mRandomAngleOffset( 0.0f ),
- mRandomArc( 360.0f ),
- mFixedAngleOffset( 0.0f ),
- mLinkEmissionRotation( true ),
- mIntenseParticles( false ),
- mSingleParticle( false ),
- mAttachPositionToEmitter( false ),
- mAttachRotationToEmitter( false ),
- mOldestInFront( false ),
- mStaticMode( true ),
- mImageAsset( NULL ),
- mImageFrame( 0 ),
- mRandomImageFrame( false ),
- mAnimationAsset( NULL ),
- mBlendMode( true ),
- mSrcBlendFactor( GL_SRC_ALPHA ),
- mDstBlendFactor( GL_ONE_MINUS_SRC_ALPHA ),
- mAlphaTest( -1.0f )
- {
- // Set the pivot point.
- // NOTE: This is called to set the local AABB.
- setPivotPoint( Vector2::getZero() );
- // Set fixed force angle.
- // NOTE: This is called to set the fixed-force-direction.
- setFixedForceAngle( 0.0f );
- // Initialize particle fields.
- mParticleFields.addField( mParticleLife.getBase(), "Lifetime", 1000.0f, 0.0f, 10000.0f, 2.0f );
- mParticleFields.addField( mParticleLife.getVariation(), "LifetimeVariation", 1000.0f, 0.0f, 5000.0f, 0.0f );
- mParticleFields.addField( mQuantity.getBase(), "Quantity", 1000.0f, 0.0f, 1000.0f, 10.0f );
- mParticleFields.addField( mQuantity.getVariation(), "QuantityVariation", 1000.0f, 0.0f, 1000.0f, 0.0f );
- mParticleFields.addField( mSizeX.getBase(), "SizeX", 1000.0f, 0.0f, 100.0f, 2.0f );
- mParticleFields.addField( mSizeX.getVariation(), "SizeXVariation", 1000.0f, 0.0f, 200.0f, 0.0f );
- mParticleFields.addField( mSizeX.getLife(), "SizeXLife", 1.0f, -100.0f, 100.0f, 1.0f );
- mParticleFields.addField( mSizeY.getBase(), "SizeY", 1000.0f, 0.0f, 100.0f, 2.0f );
- mParticleFields.addField( mSizeY.getVariation(), "SizeYVariation", 1000.0f, 0.0f, 200.0f, 0.0f );
- mParticleFields.addField( mSizeY.getLife(), "SizeYLife", 1.0f, -100.0f, 100.0f, 1.0f );
- mParticleFields.addField( mSpeed.getBase(), "Speed", 1000.0f, 0.0f, 100.0f, 10.0f );
- mParticleFields.addField( mSpeed.getVariation(), "SpeedVariation", 1000.0f, 0.0f, 200.0f, 0.0f );
- mParticleFields.addField( mSpeed.getLife(), "SpeedLife", 1.0f, -100.0f, 100.0f, 1.0f );
- mParticleFields.addField( mSpin.getBase(), "Spin", 1000.0f, -1000.0f, 1000.0f, 0.0f );
- mParticleFields.addField( mSpin.getVariation(), "SpinVariation", 1000.0f, 0.0f, 2000.0f, 0.0f );
- mParticleFields.addField( mSpin.getLife(), "SpinLife", 1.0f, -1000.0f, 1000.0f, 1.0f );
- mParticleFields.addField( mFixedForce.getBase(), "FixedForce", 1000.0f, -1000.0f, 1000.0f, 0.0f );
- mParticleFields.addField( mFixedForce.getVariation(), "FixedForceVariation", 1000.0f, 0.0f, 2000.0f, 0.0f );
- mParticleFields.addField( mFixedForce.getLife(), "FixedForceLife", 1.0f, -1000.0f, 1000.0f, 1.0f );
- mParticleFields.addField( mRandomMotion.getBase(), "RandomMotion", 1000.0f, 0.0f, 1000.0f, 0.0f );
- mParticleFields.addField( mRandomMotion.getVariation(), "RandomMotionVariation", 1000.0f, 0.0f, 2000.0f, 0.0f );
- mParticleFields.addField( mRandomMotion.getLife(), "RandomMotionLife", 1.0f, -100.0f, 100.0f, 1.0f );
- mParticleFields.addField( mEmissionForce.getBase(), "EmissionForce", 1000.0f, -100.0f, 1000.0f, 5.0f );
- mParticleFields.addField( mEmissionForce.getVariation(), "EmissionForceVariation", 1000.0f, -500.0f, 500.0f, 5.0f );
- mParticleFields.addField( mEmissionAngle.getBase(), "EmissionAngle", 1000.0f, -180.0f, 180.0f, 0.0f );
- mParticleFields.addField( mEmissionAngle.getVariation(), "EmissionAngleVariation", 1000.0f, 0.0f, 360.0f, 0.0f );
- mParticleFields.addField( mEmissionArc.getBase(), "EmissionArc", 1000.0f, 0.0f, 360.0f, 360.0f );
- mParticleFields.addField( mEmissionArc.getVariation(), "EmissionArcVariation", 1000.0f, 0.0f, 720.0f, 0.0f );
- mParticleFields.addField( mRedChannel.getLife(), "RedChannel", 1.0f, 0.0f, 1.0f, 1.0f );
- mParticleFields.addField( mGreenChannel.getLife(), "GreenChannel", 1.0f, 0.0f, 1.0f, 1.0f );
- mParticleFields.addField( mBlueChannel.getLife(), "BlueChannel", 1.0f, 0.0f, 1.0f, 1.0f );
- mParticleFields.addField( mAlphaChannel.getLife(), "AlphaChannel", 1.0f, 0.0f, 1.0f, 1.0f );
- // Register for refresh notifications.
- mImageAsset.registerRefreshNotify( this );
- mAnimationAsset.registerRefreshNotify( this );
-
- mNamedImageFrame = "";
- mUsingNamedFrame = false;
- }
- //------------------------------------------------------------------------------
- ParticleAssetEmitter::~ParticleAssetEmitter()
- {
- }
- //------------------------------------------------------------------------------
- void ParticleAssetEmitter::initPersistFields()
- {
- // Call parent.
- Parent::initPersistFields();
- addProtectedField("EmitterName", TypeString, Offset(mEmitterName, ParticleAssetEmitter), &setEmitterName, &defaultProtectedGetFn, &defaultProtectedWriteFn, "");
- addProtectedField("EmitterType", TypeEnum, Offset(mEmitterType, ParticleAssetEmitter), &setEmitterType, &defaultProtectedGetFn, &writeEmitterType, 1, &EmitterTypeTable);
- addProtectedField("EmitterOffset", TypeVector2, Offset(mEmitterOffset, ParticleAssetEmitter), &setEmitterOffset, &defaultProtectedGetFn, &writeEmitterOffset, "");
- addProtectedField("IsTargeting", TypeBool, Offset(mTargetParticle, ParticleAssetEmitter), &setIsTargeting, &defaultProtectedGetFn, &writeTargetParticle, "");
- addProtectedField("TargetPosition", TypeVector2, Offset(mTargetPosition, ParticleAssetEmitter), &setTargetPosition, &defaultProtectedGetFn, &writeTargetPosition, "");
- //NOTE: long-term we plan to move physics particles to their own emmitter type.
- //Physics Particles
- //addProtectedField("PhysicsParticle", TypeBool, Offset(mPhysicsParticles, ParticleAssetEmitter), &setPhysicsParticles, &defaultProtectedGetFn, &writePhysicsParticles, "");
- //addProtectedField("PhysicsParticleType", TypeEnum, Offset(mPhysicsParticleType, ParticleAssetEmitter), &setPhysicsParticleType, &defaultProtectedGetFn, &writePhysicsParticleType, 1, &PhysicsParticleTypeTable);
- //Physics Particles end---
- addProtectedField("EmitterAngle", TypeF32, Offset(mEmitterAngle, ParticleAssetEmitter), &setEmitterAngle, &defaultProtectedGetFn, &writeEmitterAngle, "");
- addProtectedField("EmitterSize", TypeVector2, Offset(mEmitterSize, ParticleAssetEmitter), &setEmitterSize, &defaultProtectedGetFn, &writeEmitterSize, "");
- addProtectedField("FixedAspect", TypeBool, Offset(mFixedAspect, ParticleAssetEmitter), &setFixedAspect, &defaultProtectedGetFn, &writeFixedAspect, "");
- addProtectedField("FixedForceAngle", TypeF32, Offset(mFixedForceAngle, ParticleAssetEmitter), &setFixedForceAngle, &defaultProtectedGetFn, &writeFixedForceAngle, "");
- addProtectedField("OrientationType", TypeEnum, Offset(mOrientationType, ParticleAssetEmitter), &setOrientationType, &defaultProtectedGetFn, &writeOrientationType, 1, &OrientationTypeTable);
- addProtectedField("KeepAligned", TypeBool, Offset(mKeepAligned, ParticleAssetEmitter), &setKeepAligned, &defaultProtectedGetFn, &writeKeepAligned, "");
- addProtectedField("AlignedAngleOffset", TypeF32, Offset(mAlignedAngleOffset, ParticleAssetEmitter), &setAlignedAngleOffset, &defaultProtectedGetFn, &writeAlignedAngleOffset, "");
- addProtectedField("RandomAngleOffset", TypeF32, Offset(mRandomAngleOffset, ParticleAssetEmitter), &setRandomAngleOffset, &defaultProtectedGetFn, &writeRandomAngleOffset, "");
- addProtectedField("RandomArc", TypeF32, Offset(mRandomArc, ParticleAssetEmitter), &setRandomArc, &defaultProtectedGetFn, &writeRandomArc, "");
- addProtectedField("FixedAngleOffset", TypeF32, Offset(mFixedAngleOffset, ParticleAssetEmitter), &setFixedAngleOffset, &defaultProtectedGetFn, &writeFixedAngleOffset, "");
- addProtectedField("PivotPoint", TypeVector2, Offset(mPivotPoint, ParticleAssetEmitter), &setPivotPoint, &defaultProtectedGetFn, &writePivotPoint, "");
- addProtectedField("LinkEmissionRotation", TypeBool, Offset(mLinkEmissionRotation, ParticleAssetEmitter), &setLinkEmissionRotation, &defaultProtectedGetFn, &writeLinkEmissionRotation, "");
- addProtectedField("IntenseParticles", TypeBool, Offset(mIntenseParticles, ParticleAssetEmitter), &setIntenseParticles, &defaultProtectedGetFn, &writeIntenseParticles, "");
- addProtectedField("SingleParticle", TypeBool, Offset(mSingleParticle, ParticleAssetEmitter), &setSingleParticle, &defaultProtectedGetFn, &writeSingleParticle, "");
- addProtectedField("AttachPositionToEmitter", TypeBool, Offset(mAttachPositionToEmitter, ParticleAssetEmitter), &setAttachPositionToEmitter, &defaultProtectedGetFn, &writeAttachPositionToEmitter, "");
- addProtectedField("AttachRotationToEmitter", TypeBool, Offset(mAttachRotationToEmitter, ParticleAssetEmitter), &setAttachRotationToEmitter, &defaultProtectedGetFn, &writeAttachRotationToEmitter, "");
- addProtectedField("OldestInFront", TypeBool, Offset(mOldestInFront, ParticleAssetEmitter), &setOldestInFront, &defaultProtectedGetFn, &writeOldestInFront, "");
- addProtectedField("BlendMode", TypeBool, Offset(mBlendMode, ParticleAssetEmitter), &setBlendMode, &defaultProtectedGetFn, &writeBlendMode, "");
- addProtectedField("SrcBlendFactor", TypeEnum, Offset(mSrcBlendFactor, ParticleAssetEmitter), &setSrcBlendFactor, &defaultProtectedGetFn, &writeSrcBlendFactor, 1, &srcBlendFactorTable, "");
- addProtectedField("DstBlendFactor", TypeEnum, Offset(mDstBlendFactor, ParticleAssetEmitter), &setDstBlendFactor, &defaultProtectedGetFn, &writeDstBlendFactor, 1, &dstBlendFactorTable, "");
- addProtectedField("AlphaTest", TypeF32, Offset(mAlphaTest, ParticleAssetEmitter), &setAlphaTest, &defaultProtectedGetFn, &writeAlphaTest, "");
- addProtectedField("Image", TypeImageAssetPtr, Offset(mImageAsset, ParticleAssetEmitter), &setImage, &getImage, &writeImage, "");
- addProtectedField("Frame", TypeS32, Offset(mImageFrame, ParticleAssetEmitter), &setImageFrame, &defaultProtectedGetFn, &writeImageFrame, "");
- addProtectedField("NamedFrame", TypeString, Offset(mNamedImageFrame, ParticleAssetEmitter), &setNamedImageFrame, &defaultProtectedGetFn, &writeNamedImageFrame, "");
- addProtectedField("RandomImageFrame", TypeBool, Offset(mRandomImageFrame, ParticleAssetEmitter), &setRandomImageFrame, &defaultProtectedGetFn, &writeRandomImageFrame, "");
- addProtectedField("Animation", TypeAnimationAssetPtr, Offset(mAnimationAsset, ParticleAssetEmitter), &setAnimation, &getAnimation, &writeAnimation, "");
- }
- //------------------------------------------------------------------------------
- void ParticleAssetEmitter::copyTo(SimObject* object)
- {
- // Fetch particle asset emitter object.
- ParticleAssetEmitter* pParticleAssetEmitter = static_cast<ParticleAssetEmitter*>( object );
- // Sanity!
- AssertFatal( pParticleAssetEmitter != NULL, "ParticleAssetEmitter::copyTo() - Object is not the correct type.");
- // Copy parent.
- Parent::copyTo( object );
- // Copy fields.
- pParticleAssetEmitter->setEmitterName( getEmitterName() );
- pParticleAssetEmitter->setEmitterType( getEmitterType() );
- pParticleAssetEmitter->setEmitterOffset( getEmitterOffset() );
- pParticleAssetEmitter->setEmitterSize( getEmitterSize() );
- pParticleAssetEmitter->setEmitterAngle( getEmitterAngle() );
- pParticleAssetEmitter->setFixedAspect( getFixedAspect() );
- pParticleAssetEmitter->setFixedForceAngle( getFixedForceAngle() );
- pParticleAssetEmitter->setOrientationType( getOrientationType() );
- pParticleAssetEmitter->setKeepAligned( getKeepAligned() );
- pParticleAssetEmitter->setAlignedAngleOffset( getAlignedAngleOffset() );
- pParticleAssetEmitter->setRandomAngleOffset( getRandomAngleOffset() );
- pParticleAssetEmitter->setRandomArc( getRandomArc() );
- pParticleAssetEmitter->setFixedAngleOffset( getFixedAngleOffset() );
- pParticleAssetEmitter->setPivotPoint( getPivotPoint() );
- pParticleAssetEmitter->setLinkEmissionRotation( getLinkEmissionRotation() );
- pParticleAssetEmitter->setIntenseParticles( getIntenseParticles() );
- pParticleAssetEmitter->setSingleParticle( getSingleParticle() );
- pParticleAssetEmitter->setAttachPositionToEmitter( getAttachPositionToEmitter() );
- pParticleAssetEmitter->setAttachRotationToEmitter( getAttachRotationToEmitter() );
- pParticleAssetEmitter->setOldestInFront( getOldestInFront() );
- pParticleAssetEmitter->setBlendMode( getBlendMode() );
- pParticleAssetEmitter->setSrcBlendFactor( getSrcBlendFactor() );
- pParticleAssetEmitter->setDstBlendFactor( getDstBlendFactor() );
- pParticleAssetEmitter->setAlphaTest( getAlphaTest() );
- pParticleAssetEmitter->setRandomImageFrame( getRandomImageFrame() );
- // Static provider?
- if ( pParticleAssetEmitter->isStaticFrameProvider() )
- {
- // Named image frame?
- if ( pParticleAssetEmitter->isUsingNamedImageFrame() )
- pParticleAssetEmitter->setImage( getImage(), getNamedImageFrame() );
- else
- pParticleAssetEmitter->setImage( getImage(), getImageFrame() );
- }
- else
- {
- pParticleAssetEmitter->setAnimation( getAnimation() );
- }
- // Copy particle fields.
- mParticleFields.copyTo( pParticleAssetEmitter->mParticleFields );
- }
- //-----------------------------------------------------------------------------
- void ParticleAssetEmitter::setEmitterName( const char* pEmitterName )
- {
- // Sanity!
- AssertFatal( mEmitterName != NULL, "ParticleAssetEmitter::setEmitterName() - Cannot set a NULL particle asset emitter name." );
- // Set the emitter name.
- mEmitterName = StringTable->insert( pEmitterName );
- // Refresh the asset.
- refreshAsset();
- }
- //-----------------------------------------------------------------------------
- void ParticleAssetEmitter::setOwner( ParticleAsset* pParticleAsset )
- {
- if(pParticleAsset != NULL)
- {
- // Sanity!
- AssertFatal( mOwner == NULL, "ParticleAssetEmitter::setOwner() - Cannot set an owner when one is already assigned." );
- }
- // Set owner.
- mOwner = pParticleAsset;
- }
- //------------------------------------------------------------------------------
- void ParticleAssetEmitter::setPivotPoint( const Vector2& pivotPoint )
- {
- // Set the pivot point.
- mPivotPoint = pivotPoint;
- // Calculate the local pivot AABB.
- mLocalPivotAABB[0].Set( -0.5f + mPivotPoint.x, -0.5f + mPivotPoint.y );
- mLocalPivotAABB[1].Set( 0.5f + mPivotPoint.x, -0.5f + mPivotPoint.y );
- mLocalPivotAABB[2].Set( 0.5f + mPivotPoint.x, 0.5f + mPivotPoint.y );
- mLocalPivotAABB[3].Set( -0.5f + mPivotPoint.x, 0.5f + mPivotPoint.y );
- // Refresh the asset.
- refreshAsset(); }
- //------------------------------------------------------------------------------
- void ParticleAssetEmitter::setFixedForceAngle( F32 fixedForceAngle )
- {
- // Set Fixed-Force Angle.
- mFixedForceAngle = fixedForceAngle;
- // Calculate the angle in radians.
- const F32 fixedForceAngleRadians = mDegToRad(mFixedForceAngle);
- // Set Fixed-Force Direction.
- mFixedForceDirection.Set( mCos(fixedForceAngleRadians), mSin(fixedForceAngleRadians) );
- // Refresh the asset.
- refreshAsset();
- }
- //------------------------------------------------------------------------------
- bool ParticleAssetEmitter::setImage( const char* pAssetId, U32 frame )
- {
- // Sanity!
- AssertFatal( pAssetId != NULL, "ParticleAssetEmitter::setImage() - Cannot use a NULL asset Id." );
- // Set static mode.
- mStaticMode = true;
- // Clear animation asset.
- mAnimationAsset.clear();
- // Set asset Id.
- mImageAsset = pAssetId;
- // Is there an asset?
- if ( mImageAsset.notNull() )
- {
- // Yes, so is the frame valid?
- if ( frame >= mImageAsset->getFrameCount() )
- {
- // No, so warn.
- Con::warnf( "ParticleAssetEmitter::setImage() - Invalid frame '%d' for ImageAsset '%s'.", frame, mImageAsset.getAssetId() );
- }
- else
- {
- // Yes, so set the frame.
- mImageFrame = frame;
- }
- }
- else
- {
- // No, so reset the image frame.
- mImageFrame = 0;
- }
- // Using a numerical frame index
- mUsingNamedFrame = false;
- // Refresh the asset.
- refreshAsset();
- // Return Okay.
- return true;
- }
- //------------------------------------------------------------------------------
- bool ParticleAssetEmitter::setImage( const char* pAssetId, const char* frameName )
- {
- // Sanity!
- AssertFatal( pAssetId != NULL, "ParticleAssetEmitter::setImage() - Cannot use a NULL asset Id." );
-
- // Set static mode.
- mStaticMode = true;
-
- // Clear animation asset.
- mAnimationAsset.clear();
-
- // Set asset Id.
- mImageAsset = pAssetId;
-
- // Is there an asset?
- if ( mImageAsset.notNull() )
- {
- // Yes, so is the frame valid?
- if ( !mImageAsset->containsFrame(frameName) )
- {
- // No, so warn.
- Con::warnf( "ParticleAssetEmitter::setImage() - Invalid frame '%s' for ImageAsset '%s'.", frameName, mImageAsset.getAssetId() );
- }
- else
- {
- // Yes, so set the frame.
- mNamedImageFrame = StringTable->insert(frameName);
- }
- }
- else
- {
- // No, so reset the image frame.
- mNamedImageFrame = StringTable->insert(StringTable->EmptyString);
- }
- // Using a named frame index
- mUsingNamedFrame = true;
-
- // Refresh the asset.
- refreshAsset();
-
- // Return Okay.
- return true;
- }
- //------------------------------------------------------------------------------
- bool ParticleAssetEmitter::setImageFrame( const U32 frame )
- {
- // Check Existing Image.
- if ( mImageAsset.isNull() )
- {
- // Warn.
- Con::warnf("ParticleAssetEmitter::setImageFrame() - Cannot set Frame without existing asset Id.");
- // Return Here.
- return false;
- }
- // Check Frame Validity.
- if ( frame >= mImageAsset->getFrameCount() )
- {
- // Warn.
- Con::warnf( "ParticleAssetEmitter::setImageFrame() - Invalid Frame #%d for asset Id '%s'.", frame, mImageAsset.getAssetId() );
- // Return Here.
- return false;
- }
- // Set Frame.
- mImageFrame = frame;
- // Using a numerical frame index.
- mUsingNamedFrame = false;
- // Refresh the asset.
- refreshAsset();
- // Return Okay.
- return true;
- }
- //------------------------------------------------------------------------------
- bool ParticleAssetEmitter::setNamedImageFrame( const char* frameName )
- {
- // Check Existing Image.
- if ( mImageAsset.isNull() )
- {
- // Warn.
- Con::warnf("ParticleAssetEmitter::setNamedImageFrame() - Cannot set Frame without existing asset Id.");
-
- // Return Here.
- return false;
- }
-
- // Check Frame Validity.
- if ( !mImageAsset->containsFrame(frameName) )
- {
- // Warn.
- Con::warnf( "ParticleAssetEmitter::setNamedImageFrame() - Invalid Frame %s for asset Id '%s'.", frameName, mImageAsset.getAssetId() );
-
- // Return Here.
- return false;
- }
-
- // Set frame.
- mNamedImageFrame = StringTable->insert(frameName);
- // Using a named frame index
- mUsingNamedFrame = true;
-
- // Refresh the asset.
- refreshAsset();
-
- // Return Okay.
- return true;
- }
- //------------------------------------------------------------------------------
- bool ParticleAssetEmitter::setAnimation( const char* pAnimationAssetId )
- {
- // Sanity!
- AssertFatal( pAnimationAssetId != NULL, "ParticleAssetEmitter::setAnimation() - Cannot use NULL asset Id." );
- // Set animated mode.
- mStaticMode = false;
- // Clear static asset.
- mImageAsset.clear();
- // Set animation asset.
- mAnimationAsset = pAnimationAssetId;
- // Refresh the asset.
- refreshAsset();
- return true;
- }
- //------------------------------------------------------------------------------
- void ParticleAssetEmitter::refreshAsset( void )
- {
- // Finish if no owner.
- if ( mOwner == NULL )
- return;
- // Refresh the asset.
- mOwner->refreshAsset();
- }
- //------------------------------------------------------------------------------
- void ParticleAssetEmitter::onAssetRefreshed( AssetPtrBase* pAssetPtrBase )
- {
- // Either the image or animation asset has been refreshed to just refresh the
- // asset that this emitter may belong to.
- ParticleAssetEmitter::refreshAsset();
- }
- //------------------------------------------------------------------------------
- void ParticleAssetEmitter::onTamlCustomWrite( TamlCustomNodes& customNodes )
- {
- // Debug Profiling.
- PROFILE_SCOPE(ParticleAssetEmitter_OnTamlCustomWrite);
- // Write the fields.
- mParticleFields.onTamlCustomWrite( customNodes );
- }
- //-----------------------------------------------------------------------------
- void ParticleAssetEmitter::onTamlCustomRead( const TamlCustomNodes& customNodes )
- {
- // Debug Profiling.
- PROFILE_SCOPE(ParticleAssetEmitter_OnTamlCustomRead);
- // Read the fields.
- mParticleFields.onTamlCustomRead( customNodes );
- }
- //-----------------------------------------------------------------------------
- static void WriteCustomTamlSchema( const AbstractClassRep* pClassRep, TiXmlElement* pParentElement )
- {
- // Sanity!
- AssertFatal( pClassRep != NULL, "ParticleAssetEmitter::WriteCustomTamlSchema() - ClassRep cannot be NULL." );
- AssertFatal( pParentElement != NULL, "ParticleAssetEmitter::WriteCustomTamlSchema() - Parent Element cannot be NULL." );
- // Write the particle asset emitter fields.
- ParticleAssetEmitter particleAssetEmitter;
- particleAssetEmitter.getParticleFields().WriteCustomTamlSchema( pClassRep, pParentElement );
- }
- //-----------------------------------------------------------------------------
- IMPLEMENT_CONOBJECT_SCHEMA(ParticleAssetEmitter, WriteCustomTamlSchema);
|