2017-04-17 06:17:10 -06:00

175 lines
4.4 KiB
C++
Executable File

#ifndef _POD_
#define _POD_
#include "Simpobj.h"
#include "export.h"
enum {PLACE,SIMPLE,STANDARD,INST,META,FRAG};
enum { NTNM,DTNOM,TNOM,NOTM,DTM,TM};
class ParticleData
{ public:
Point3 position,velocity;
float size,life,age;
BYTE type[2];
Matrix3 *tform;
Object* src;
};
typedef struct
{ float stepSize,starttime;
int count;
BOOL valid;float tvalid;
}Groupdata;
class ParticleMatData
{ public:
unsigned short mtltbl;
MtlID matid;
};
class WithTex
{ public:
BYTE bytype;
Point3 tv;
};
class PartwithTex:public ParticleData,public WithTex
{};
class PartwithMtl:public ParticleData,public ParticleMatData
{};
class MSpin
{ public:
float mass;
Point3 spinaxis;
float stretch;
};
class TexMatData: public WithTex,public ParticleMatData
{};
class ParticlePtrTab:public Tab<ParticleData *>
{ public:
void Clear();
void Add(int c);
PartwithTex *gettv(int i);
PartwithMtl *getmtl(int i);
};
class BaseSimpleData :public ParticleData
{ public:
float spinrate,spinphase;
int table,sub;
};
class SimpleData :public BaseSimpleData
{ public:
short sdtype;
float dither;
};
class SimpleDataMat :public SimpleData,public ParticleMatData
{};
class SimpleDataTex :public SimpleData,public WithTex
{};
class SimpleDataMatTex :public SimpleDataTex,public ParticleMatData
{};
class StandardData :public SimpleData,public MSpin
{};
class StandardDataMat :public StandardData,public ParticleMatData
{};
class StandardDataTex :public StandardData,public WithTex
{};
class StandardDataMatTex :public StandardDataTex,public ParticleMatData
{};
class MetaPartData:public ParticleData
{ public:
float mass,tension;
};
class MetaPartDataMat :public MetaPartData,public ParticleMatData
{};
class MetaPartDataTex :public MetaPartData,public WithTex
{};
class MetaPartDataMatTex :public ParticleMatData,public MetaPartDataTex
{};
class InstanceData:public BaseSimpleData,public MSpin
{ public:
BYTE ofs[2];
float animoffset;
INode *objectptr;
};
class InstanceDataMat :public InstanceData,public ParticleMatData
{};
class InstanceDataTex :public InstanceData,public WithTex
{};
class InstanceDataMatTex :public InstanceDataTex,public ParticleMatData
{};
class FragmentData :public BaseSimpleData,public MSpin
{ public:
FragmentData();
FragmentData(BOOL nomesh);
~FragmentData();
Mesh *pmesh;
};
class FragmentDataMat :public FragmentData,public ParticleMatData
{ public:
FragmentDataMat(BOOL nomesh=FALSE);
};
class FragmentDataTex :public FragmentData,public WithTex
{ public:
FragmentDataTex(BOOL nomesh=FALSE);
};
class FragmentDataMatTex :public FragmentDataTex,public ParticleMatData
{ public:
FragmentDataMatTex(BOOL nomesh=FALSE);
};
typedef struct{
int refnum;
} SourceInfo;
typedef struct{
int refnum;
BOOL test;
int trefnum,frefnum;
} EffectsInfo;
typedef Tab<INode*> InputTab;
typedef Tab<SourceInfo*> SourceDataTab;
typedef Tab<EffectsInfo*> EffectsDataTab;
#define BASEP 1
class PodObj;
typedef PodObj* PodObjPtr;
class PodObj : public SimpleObject2
{
public:
BOOL updatenow;
DllExport void UpdateWrangler();
DllExport void AddToList(INode *newnode,int i,BOOL add);
DllExport BOOL AddSourceBinding(INode *node);
DllExport BOOL AddOperatorBinding(INode *node,BOOL test);
DllExport void AddResBinding(INode *node,int effnum,BOOL torf);
DllExport void DeleteFromList(int nnum);
DllExport INode *GetSource(int num);
DllExport INode *GetEffects(int num);
DllExport INode *GetResultT(int num);
DllExport INode *GetResultF(int num);
InputTab InputList;
SourceDataTab Source;
EffectsDataTab Effects;
int podnum,groupnum;
virtual void GetGroupStats(int gnum,Groupdata &gdata,PodObjPtr *plist) {};
virtual void UpdatePod(float t=0.0f,float stepSize=-1.0f) {};
using SimpleObject2::GetInterface;
virtual void* GetInterface(ULONG id) {return NULL;}
virtual BOOL TryBinding(INode *node) {return FALSE;}
virtual void GetPart(ParticleData &part,int i){}
};
class ITestInterface
{
public:
virtual int NPTestInterface(TimeValue t,BOOL UpdatePastCollide,ParticleData *part,float dt,INode *node,int index)=0;
};
class IOperatorInterface
{
public:
virtual int NPOpInterface(TimeValue t,ParticleData *part,float dt,INode *node,int index)=0;
virtual int UseOtherPod() {return -1;}
};
#endif //_POD_