254 lines
10 KiB
C++
Executable File
254 lines
10 KiB
C++
Executable File
/*! \file ParticleChannelMask.h
|
|
\brief An interface for ParticleChannelMask.
|
|
The interface is used by Operators/Elements to define
|
|
what channels are read/write.
|
|
The class is implemented by system.
|
|
*/
|
|
/**********************************************************************
|
|
*<
|
|
CREATED BY: Oleg Bayborodin
|
|
|
|
HISTORY: created 9-19-01
|
|
|
|
*> Copyright (c) 2001, All Rights Reserved.
|
|
**********************************************************************/
|
|
|
|
#ifndef _PARTICLECHANNELMASK_H_
|
|
#define _PARTICLECHANNELMASK_H_
|
|
|
|
#include "Max.h"
|
|
|
|
#include "PFExport.h"
|
|
|
|
// all generic particle channel listed (implemented by max)
|
|
enum PCU_genericChannelIndex {
|
|
PCG_float= 1<<0,
|
|
PCG_int= 1<<1,
|
|
// PCG_RGBA= 1<<2,
|
|
PCG_Point3= 1<<3,
|
|
PCG_bool= 1<<4,
|
|
// PCG_String= 1<<5,
|
|
// PCG_TimeValue= 1<<6,
|
|
PCG_PTV= 1<<7, // Precise Time Value
|
|
// PCG_TexMap= 1<<8,
|
|
PCG_INode= 1<<9,
|
|
PCG_Matrix3= 1<<10,
|
|
PCG_void= 1<<11,
|
|
// PCG_Interval= 1<<12,
|
|
PCG_AngAxis= 1<<13,
|
|
PCG_Quat= 1<<14,
|
|
// PCG_Point2= 1<<15,
|
|
// PCG_BitArray= 1<<16,
|
|
PCG_Mesh= 1<<17,
|
|
// PCG_TabPoint3= 1<<18,
|
|
// PCG_TabFace= 1<<19
|
|
PCG_TabUVVert= 1<<20,
|
|
PCG_TabTVFace= 1<<21,
|
|
PCG_Map= 1<<22,
|
|
PCG_MeshMap= 1<<23
|
|
};
|
|
|
|
// all standard particle channels listed (implemented by max)
|
|
// Note to Developer: update index2InterfaceID and InterfaceID2index methods
|
|
// if number/content of standard classes is changed
|
|
// maximum amount of standard particle channels is 31; restricted by bit size of DWORD
|
|
enum PCU_channelIndex {
|
|
PCU_Undefined= 0,
|
|
PCU_Amount= 1<<0, // fictional channel to indicate that Operator changes number of particles
|
|
PCU_New= 1<<1, // channel to trace newly born/entered particles
|
|
PCU_ID= 1<<2, // channel to keep particleID=(index,born)
|
|
PCU_Time= 1<<3, // current valid time for a particle (PCG_PTV)
|
|
PCU_BirthTime= 1<<4, // time when particle was born (PCG_PTV)
|
|
PCU_EventStart= 1<<5, // time when particle entered the current event (PCG_PTV)
|
|
PCU_Position= 1<<6, // particle position (PCG_Point3)
|
|
PCU_Speed= 1<<7, // particle speed (PCG_Point3)
|
|
PCU_Acceleration= 1<<8, // particle acceleration (PCG_Point3)
|
|
PCU_Orientation= 1<<9, // 3D orientation of a particle (PCG_Quad)
|
|
PCU_Spin= 1<<10, // angular velocity of a particle (PCG_AngAxis)
|
|
PCU_Scale= 1<<11, // scaling factor for particle (Point3: x, y, z axes)
|
|
PCU_Shape= 1<<12, // shape as a whole mesh (PCG_Mesh)
|
|
// PCU_ShapeTopology= 1<<13, // topology data (Tab<Face>)
|
|
// PCU_ShapeGeometry= 1<<14, // geometry data (Tab<Point3>)
|
|
// PCU_ShapeNormals= 1<<15, // normals data
|
|
PCU_ShapeTexture= 1<<16, // texture coordinate data
|
|
// PCU_Mass= 1<<17, // particle mass
|
|
PCU_MtlIndex= 1<<18, // material index for particles
|
|
PCU_Selection= 1<<19, // selection status
|
|
PCU_MXSInteger= 1<<20, // maxscript integer value
|
|
PCU_MXSFloat= 1<<21, // maxscript float value
|
|
PCU_MXSVector= 1<<22, // maxscript Point3 value
|
|
PCU_MXSMatrix= 1<<23, // maxscript Matrix3 value
|
|
PCU_DeathTime= 1<<24, // time when particle is expected to die (PCG_PTV)
|
|
PCU_Lifespan= 1<<25 // lifespan of a particle
|
|
};
|
|
|
|
class ParticleChannelMask
|
|
{
|
|
public:
|
|
|
|
/** @defgroup ParticleChannelMask ParticleChannelMask.h
|
|
* @{
|
|
*/
|
|
|
|
/*! \fn PFExport ParticleChannelMask();
|
|
* \brief constructors/destructor/assigning
|
|
*/
|
|
PFExport ParticleChannelMask();
|
|
|
|
/*! \fn PFExport ParticleChannelMask(const ParticleChannelMask&);
|
|
* \brief constructors/destructor/assigning
|
|
*/
|
|
PFExport ParticleChannelMask(const ParticleChannelMask&);
|
|
|
|
/*! \fn PFExport ParticleChannelMask(DWORD readMask, DWORD writeMask);
|
|
* \brief constructors/destructor/assigning
|
|
*/
|
|
PFExport ParticleChannelMask(DWORD readMask, DWORD writeMask);
|
|
|
|
/*! \fn PFExport ParticleChannelMask& operator=(const ParticleChannelMask&);
|
|
* \brief constructors/destructor/assigning
|
|
*/
|
|
PFExport ParticleChannelMask& operator=(const ParticleChannelMask&);
|
|
|
|
/*! \fn PFExport ~ParticleChannelMask();
|
|
* \brief constructors/destructor/assigning
|
|
*/
|
|
PFExport ~ParticleChannelMask();
|
|
|
|
/*! \fn PFExport int operator==(const ParticleChannelMask&) const;
|
|
* \brief Test for equality
|
|
*/
|
|
PFExport int operator==(const ParticleChannelMask&) const;
|
|
|
|
/*! \fn PFExport int operator!=(const ParticleChannelMask&) const;
|
|
* \brief Test for equality
|
|
*/
|
|
PFExport int operator!=(const ParticleChannelMask&) const;
|
|
|
|
/*! \fn PFExport void SetReadChannels(DWORD channelsFlag);
|
|
* \brief set standard read/write and custom channels methods. If a custom particle channel is indeed a standard particle channel then it's stored as a flag
|
|
*/
|
|
PFExport void SetReadChannels(DWORD channelsFlag);
|
|
|
|
/*! \fn PFExport void SetWriteChannels(DWORD channelsFlag);
|
|
* \brief See PFExport void SetReadChannels()
|
|
*/
|
|
PFExport void SetWriteChannels(DWORD channelsFlag);
|
|
|
|
/*! \fn PFExport bool SetChannels(int numChannels, Interface_ID* channels);
|
|
* \brief See PFExport void SetReadChannels()
|
|
*/
|
|
PFExport bool SetChannels(int numChannels, Interface_ID* channels);
|
|
|
|
/*! \fn PFExport void AddReadChannels(DWORD channelsFlag); // adds more standard read channels
|
|
* \brief See PFExport void SetReadChannels()
|
|
*/
|
|
PFExport void AddReadChannels(DWORD channelsFlag); // adds more standard read channels
|
|
|
|
/*! \fn PFExport void RemoveReadChannels(DWORD channelsFlag); // removes some standard read channels
|
|
* \brief See PFExport void SetReadChannels()
|
|
*/
|
|
PFExport void RemoveReadChannels(DWORD channelsFlag); // removes some standard read channels
|
|
|
|
/*! \fn PFExport void AddWriteChannels(DWORD channelsFlag); // adds more standard write channels
|
|
* \brief See PFExport void SetReadChannels()
|
|
*/
|
|
PFExport void AddWriteChannels(DWORD channelsFlag); // adds more standard write channels
|
|
|
|
/*! \fn PFExport void RemoveWriteChannels(DWORD channelsFlag); // removes some standard write channels
|
|
* \brief See PFExport void SetReadChannels()
|
|
*/
|
|
PFExport void RemoveWriteChannels(DWORD channelsFlag); // removes some standard write channels
|
|
|
|
/*! \fn PFExport bool AddChannel(Interface_ID& channel);
|
|
* \brief See PFExport void SetReadChannels()
|
|
*/
|
|
PFExport bool AddChannel(Interface_ID& channel);
|
|
|
|
/*! \fn PFExport bool RemoveChannel(Interface_ID& channel);
|
|
* \brief See PFExport void SetReadChannels()
|
|
*/
|
|
PFExport bool RemoveChannel(Interface_ID& channel);
|
|
|
|
/*! \fn PFExport const int GetNumChannels() const; // standard read/write and custom together
|
|
* \brief get channels methods
|
|
*/
|
|
PFExport const int GetNumChannels() const; // standard read/write and custom together
|
|
|
|
/*! \fn PFExport const Interface_ID GetChannel(int i) const;
|
|
* \brief
|
|
*/
|
|
PFExport const Interface_ID GetChannel(int i) const;
|
|
|
|
/*! \fn PFExport const bool HasChannel(Interface_ID& channel) const;
|
|
* \brief has channels methods. Returns true if the channel is present
|
|
*/
|
|
PFExport const bool HasChannel(Interface_ID& channel) const;
|
|
|
|
/*! \fn PFExport const bool HasReadChannels(DWORD channelsFlag) const;
|
|
* \brief returns true if all readChannels are present
|
|
*/
|
|
PFExport const bool HasReadChannels(DWORD channelsFlag) const;
|
|
|
|
/*! \fn PFExport const bool HasWriteChannels(DWORD channelsFlag) const;
|
|
* \brief returns true if all writeChannels are present
|
|
*/
|
|
PFExport const bool HasWriteChannels(DWORD channelsFlag) const;
|
|
|
|
/*! \fn PFExport static int NumStandardParticleChannels();
|
|
* \brief maximum number of available standard particle channels (constant)
|
|
*/
|
|
PFExport static int NumStandardParticleChannels();
|
|
|
|
/*! \fn PFExport static const ParticleChannelMask& Null();
|
|
* \brief empty mask
|
|
*/
|
|
PFExport static const ParticleChannelMask& Null();
|
|
|
|
private:
|
|
// conversion between channel index and standard channel Class_ID
|
|
// returns PCU_Undefined if the channel isn't standard particle channel
|
|
PFExport static const PCU_channelIndex InterfaceID2readIndex(Interface_ID& id);
|
|
PFExport static const PCU_channelIndex InterfaceID2writeIndex(Interface_ID& id);
|
|
// returns false if not a valid index
|
|
PFExport static const Interface_ID readIndex2InterfaceID(PCU_channelIndex index);
|
|
PFExport static const Interface_ID writeIndex2InterfaceID(PCU_channelIndex index);
|
|
|
|
void invalidateNumSRChannels() { _numSRChannelsValid() = false; }
|
|
void invalidateNumSWChannels() { _numSWChannelsValid() = false; }
|
|
|
|
// const access to class members
|
|
const DWORD readFlag() const { return m_readFlag; }
|
|
const DWORD writeFlag() const { return m_writeFlag; }
|
|
const bool numSRChannelsValid() const { return m_numSRChannelsValid; }
|
|
const bool numSWChannelsValid() const { return m_numSWChannelsValid; }
|
|
const int numStandardReadChannels() const; // updates num of standard read channels if invalid
|
|
const int numStandardWriteChannels() const; // updates num of standard write channels if invalid
|
|
const int numCustomChannels() const { return m_numCustomChannels; }
|
|
const Interface_ID* customChannels() const { return m_customChannels; }
|
|
|
|
// access to class members
|
|
DWORD& _readFlag() { return m_readFlag; }
|
|
DWORD& _writeFlag() { return m_writeFlag; }
|
|
bool& _numSRChannelsValid() { return m_numSRChannelsValid; }
|
|
bool& _numSWChannelsValid() { return m_numSWChannelsValid; }
|
|
int& _numStandardReadChannels() { return m_numStandardReadChannels; }
|
|
int& _numStandardWriteChannels() { return m_numStandardWriteChannels; }
|
|
int& _numCustomChannels() { return m_numCustomChannels; }
|
|
Interface_ID*& _customChannels() { return m_customChannels; }
|
|
|
|
|
|
protected:
|
|
|
|
DWORD m_readFlag, m_writeFlag;
|
|
mutable bool m_numSRChannelsValid, m_numSWChannelsValid;
|
|
mutable int m_numStandardReadChannels, m_numStandardWriteChannels;
|
|
int m_numCustomChannels;
|
|
Interface_ID *m_customChannels;
|
|
const static DWORD kChannelsCast;
|
|
const static int kNumStandardParticleChannels;
|
|
const static ParticleChannelMask kNull; // empty mask
|
|
};
|
|
|
|
#endif // _PARTICLECHANNELMASK_H_
|