/*! \file IParticleChannelAmount.h \brief Channel-generic interfaces ParticleChannelAmount This is a part of every particle channel and particle container ParticleChannelAmount is a two-part interface: for read (R) and write (W) */ /********************************************************************** *< CREATED BY: Oleg Bayborodin HISTORY: created 10-05-01 *> Copyright (c) 2001, All Rights Reserved. **********************************************************************/ #ifndef _IPARTICLECHANNELAMOUNT_H_ #define _IPARTICLECHANNELAMOUNT_H_ #include "Max.h" // interface ID #define PARTICLECHANNELAMOUNTR_INTERFACE Interface_ID(0x74f93b00, 0x1eb34500) #define PARTICLECHANNELAMOUNTW_INTERFACE Interface_ID(0x74f93b00, 0x1eb34501) #define GetParticleChannelAmountRInterface(obj) ((IParticleChannelAmountR*)obj->GetInterface(PARTICLECHANNELAMOUNTR_INTERFACE)) #define GetParticleChannelAmountWInterface(obj) ((IParticleChannelAmountW*)obj->GetInterface(PARTICLECHANNELAMOUNTW_INTERFACE)) class IParticleChannelAmountR : public FPMixinInterface { public: // function IDs Read enum { kCount }; // Function Map for Function Publish System //*********************************** BEGIN_FUNCTION_MAP FN_0(kCount, TYPE_INT, Count); END_FUNCTION_MAP /** @defgroup IParticleChannelAmount IParticleChannelAmount.h * @{ */ /*! \fn virtual int Count() const = 0; * \brief Particle count management; number of particles in the channel */ virtual int Count() const = 0; /*! \fn FPInterfaceDesc* GetDesc() { return GetDescByID(PARTICLECHANNELAMOUNTR_INTERFACE); } * \brief */ FPInterfaceDesc* GetDesc() { return GetDescByID(PARTICLECHANNELAMOUNTR_INTERFACE); } }; class IParticleChannelAmountW : public FPMixinInterface { public: // function IDs Write enum { kZeroCount, kSetCount, kDeleteByIndex, kDeleteByArray, kSplit, kSpawn, kAppendNum, kAppend }; // Function Map for Function Publish System //*********************************** BEGIN_FUNCTION_MAP VFN_0(kZeroCount, ZeroCount); FN_1(kSetCount, TYPE_bool, SetCount, TYPE_INT); FN_2(kDeleteByIndex, TYPE_INT, Delete, TYPE_INT, TYPE_INT); FN_1(kDeleteByArray, TYPE_INT, Delete, TYPE_BITARRAY_BR); FN_1(kSplit, TYPE_IOBJECT, Split, TYPE_BITARRAY_BR); FN_1(kSpawn, TYPE_bool, Spawn, TYPE_INT_TAB_BR); FN_1(kAppendNum, TYPE_bool, AppendNum, TYPE_INT); FN_1(kAppend, TYPE_bool, Append, TYPE_IOBJECT); END_FUNCTION_MAP /** @defgroup IParticleChannelAmount IParticleChannelAmount.h * @{ */ /*! \fn virtual void ZeroCount() = 0; * \brief set number of particles in the channel to zero */ virtual void ZeroCount() = 0; /*! \fn virtual bool SetCount(int n) = 0; * \brief set number of particles in the channel to n */ virtual bool SetCount(int n) = 0; /*! \fn virtual int Delete(int start,int num) = 0; * \brief Delete num particles from start index. Returns number of particles left in the channel. */ virtual int Delete(int start,int num) = 0; /*! \fn virtual int Delete(BitArray& toRemove) = 0; * \brief Delete particles according to the BitArray (bit set == remove). Returns number of particles left in the channel */ virtual int Delete(BitArray& toRemove) = 0; /*! \fn virtual IObject* Split(BitArray& toSplit) = 0; * \brief To new "split" particle channel. Returns new particle channel; IObject type is chosen to be compatible with the available return types. All "bit-set" particles are moved. */ virtual IObject* Split(BitArray& toSplit) = 0; /*! \fn virtual bool Spawn( Tab& spawnTable ) = 0; * \brief Spawn particles according to the spawnTable. Returns true if the operation is successful. Size of the table equals to number of particles in the channel. Table value is how many particles are cloned from the index particle. */ virtual bool Spawn( Tab& spawnTable ) = 0; /*! \fn virtual bool AppendNum(int num) = 0; * \brief Append num particles to the channel(s). Returns true if the operation is successful. */ virtual bool AppendNum(int num) = 0; /*! \fn virtual bool Append(IObject* obj) = 0; * \brief Append all particles of another channel/container, then the input channel/container is deleted. Returns true if the operation is successful. */ virtual bool Append(IObject* obj) = 0; /*! \fn virtual void ResetAddedAmount() { ; } * \brief For internal use; no need to implement */ virtual void ResetAddedAmount() { ; } /*! \fn virtual int GetAddedAmount() { return 0; } * \brief For internal use; no need to implement */ virtual int GetAddedAmount() { return 0; } /*! \fn FPInterfaceDesc* GetDesc() { return GetDescByID(PARTICLECHANNELAMOUNTW_INTERFACE); } * \brief */ FPInterfaceDesc* GetDesc() { return GetDescByID(PARTICLECHANNELAMOUNTW_INTERFACE); } }; #endif // _IPARTICLECHANNELAMOUNT_H_