/////////////////////////////////////////////////////////////
// CINEMA 4D SDK                                           //
/////////////////////////////////////////////////////////////
// (c) 1989-2006 MAXON Computer GmbH, all rights reserved  //
/////////////////////////////////////////////////////////////

#ifndef _C4D_EFFECTORDATAPLUGIN_H_
#define _C4D_EFFECTORDATAPLUGIN_H_

#include "c4d.h"
#include "c4d_baseeffectordata.h"

//--------------------------------------------------------
//	--- Internal Stuff

struct EFFECTORPLUGIN : public OBJECTPLUGIN
{
	EffectorDataStruct*	(EffectorData::*GetEffectorData				)();
	C4D_Falloff*				(EffectorData::*GetFalloff						)();
	void								(EffectorData::*AddEffectorDependence	)(BaseObject *op);
	LONG								(EffectorData::*GetEffectorFlags			)();
	Bool								(EffectorData::*ModifyDDescription		)(GeListNode *node, Description *description, AtomArray *ar);
	Bool								(EffectorData::*ExecuteEffector				)(BaseObject *op, BaseDocument *doc, BaseObject *gen, MoData *md, Real strength, BaseThread *thread);
	void								(EffectorData::*InitPoints						)(BaseObject *op, BaseObject *gen, BaseDocument *doc, EffectorDataStruct *data, MoData *md, BaseThread *thread);
	void								(EffectorData::*ModifyPoints					)(BaseObject *op, BaseObject *gen, BaseDocument *doc, EffectorDataStruct *data, MoData *md, BaseThread *thread);
	void								(EffectorData::*FreePoints						)();
	void								(EffectorData::*CalcPlacebo						)(BaseObject *op,BaseObject *gen,BaseDocument	*doc,EffectorDataStruct *data, LONG index, MoData *md, const Vector &globalpos, Real fall_weight);
	void								(EffectorData::*CalcPointValue				)(BaseObject *op, BaseObject *gen, BaseDocument *doc, EffectorDataStruct *data, LONG index, MoData *md, const Vector &globalpos, Real fall_weight);
	Vector							(EffectorData::*CalcPointColor				)(BaseObject *op, BaseObject *gen, BaseDocument *doc, EffectorDataStruct *data, LONG index, MoData *md, const Vector &globalpos, Real fall_weight );
	Bool								(EffectorData::*InitEffector					)(GeListNode *node);
	void								(EffectorData::*FreeEffector					)(GeListNode *node);

	void*	reserved[(32-14)*C4DPL_MEMBERMULTIPLIER];
};

struct EffectorDataLib : public C4DLibrary
{
	Bool								(*Effector_Init									)(GeListNode *node);
	void								(*Effector_Free									)(GeListNode *node);
	Bool								(*Effector_GetDDescription			)(GeListNode *node, Description *description, LONG &flags);
	Bool								(*Effector_Draw									)(BaseObject *op, LONG type, BaseDraw *bd, BaseDrawHelp *bh);
	void								(*Effector_GetDimension					)(BaseObject *op, Vector *mp, Vector *rad);
	LONG								(*Effector_Execute							)(BaseObject *op, BaseDocument *doc, BaseThread *bt, LONG priority, LONG flags);
	Bool								(*Effector_ModifyObject					)(BaseObject *mod,BaseDocument *doc,BaseObject *op,const Matrix &op_mg,const Matrix	&mod_mg,Real lod,LONG flags,BaseThread *thread);
	Bool								(*Effector_Message							)(GeListNode *node, LONG type, void *t_data);
	LONG								(*Effector_GetHandleCount				)(BaseObject *op);
	Vector							(*Effector_GetHandle						)(BaseObject *op, LONG i);
	void								(*Effector_SetHandle						)(BaseObject *op, LONG i, Vector p);

	EffectorDataStruct*	(*Effector_GetEffectorData			)(GeListNode *node);
	C4D_Falloff*				(*Effector_GetFalloff						)(GeListNode *node);
	void								(*Effector_AddEffectorDependence)(GeListNode *node,BaseObject *op);
	Bool								(*Effector_ExecuteEffector			)(BaseObject *op, BaseDocument *doc, BaseObject *gen, MoData *md, Real strength, BaseThread *thread);
	void								(*Effector_ModifyPoints					)(BaseObject *op, BaseObject *gen, BaseDocument *doc, EffectorDataStruct *data, MoData *md, BaseThread *thread);
	Bool								(*Effector_CopyTo								)(NodeData *dest,GeListNode *snode,GeListNode *dnode,LONG flags,AliasTrans *trn);
};

//	--- Internal Stuff
//--------------------------------------------------------

#endif