/////////////////////////////////////////////////////////////
// CINEMA 4D SDK                                           //
/////////////////////////////////////////////////////////////
// (c) MAXON Computer GmbH, all rights reserved            //
/////////////////////////////////////////////////////////////

#ifndef __C4D_VIDEOPOSTPLUGIN_H
#define __C4D_VIDEOPOSTPLUGIN_H

#include "ge_math.h"
#include "c4d_basetime.h"
#include "c4d_videopostdata.h"
#include "c4d_nodeplugin.h"

class GlFrameBuffer;

struct VIDEOPOSTPLUGIN : public NODEPLUGIN
{
	Int32	priority;

	Bool	(VideoPostData::*Draw						)(BaseVideoPost *node, BaseDraw *bd, BaseDrawHelp *bh);
	void	(VideoPostData::*AllocateBuffers)(BaseVideoPost *node, Render *render, BaseDocument *doc);
	VIDEOPOSTINFO (VideoPostData::*GetRenderInfo  )(BaseVideoPost *node);

	RENDERRESULT (VideoPostData::*Execute	)(BaseVideoPost *node, VideoPostStruct *vps);
	void	(VideoPostData::*ExecuteLine		)(BaseVideoPost *node, PixelPost *pp);
	void	(VideoPostData::*ExecutePixel   )(BaseVideoPost *node, PixelPost *pp, Int32 x, Int32 subx, Int32 suby);

	void  (VideoPostData::*CalcVolumetric	)(BaseVideoPost *node, VolumeData *vd);
	void  (VideoPostData::*CalcShadow    	)(BaseVideoPost *node, VolumeData *vd);
	Bool	(VideoPostData::*GlDraw					)(BaseVideoPost *node, BaseDraw *bd, GlFrameBuffer* fbuf, Int32 colortex, Int32 depthtex, VIDEOPOST_GLDRAW flags);

	Vector (VideoPostData::*ComputeDiffuseGI     )(BaseVideoPost *node, VolumeData *vd, Float receive_strength);
	Vector (VideoPostData::*ComputeDiffuseCaustic)(BaseVideoPost *node, VolumeData *vd, Float sampleradius, Int32 accuracy);
	Vector (VideoPostData::*ComputeVolumeCausticEx)(BaseVideoPost *node, const Vector64 &p);

	void  (VideoPostData::*CreateRay      )(Ray *dst, Float x, Float y);
	VIDEOPOST_GLINFO (VideoPostData::*GetGlInfo)(BaseVideoPost *node, BaseDocument* doc, BaseDraw *bd);
	Int32 (VideoPostData::*StereoGetCameraCountEditor)(BaseVideoPost *node, BaseDocument* doc, BaseDraw *bd);
	Bool (VideoPostData::*StereoGetCameraInfo)(BaseVideoPost *node, BaseDocument* doc, BaseDraw *bd, RenderData* rd, Int32 index, StereoCameraInfo& info);
	Int32 (VideoPostData::*StereoGetSceneHookID)(BaseVideoPost *node);
	Bool (VideoPostData::*StereoMergeImages)(BaseVideoPost *node, BaseBitmap* dest, const BaseBitmap* const* source, Int32 cnt, const BaseContainer &settings, COLORSPACETRANSFORMATION transform);
	Int32 (VideoPostData::*StereoGetCameraCountRenderer)(BaseVideoPost *node, BaseDocument* doc, RenderData* rd);

	Bool (VideoPostData::*RenderEngineCheck)(BaseVideoPost *node, Int32 id);

	Vector (VideoPostData::*ComputeVolumeCaustic )(BaseVideoPost *node, const Vector64 &p, Int32 cpu_index);

	void (VideoPostData::*SetDiffuseWeight)(BaseVideoPost *node, Int32 cpu_index, Float weight);

	
	void (VideoPostData::*CreateExtendedRay)(Ray *dst, Float x, Float y, Float lensx, Float lensy, Float time);

	Bool (VideoPostData::*NetFrameInit)(BaseVideoPost *node, BaseDocument* doc, RenderJob* job, Int32 assignedClients, const NetRenderData* renderData, MultipassBitmap* frameBmp, BaseThread* bt, Int32& realdepth);
	void (VideoPostData::*NetFrameFree)(BaseVideoPost *node);
	Bool (VideoPostData::*NetFrameMessage)(BaseVideoPost *node, const C4DUuid& remoteUuid, const NetRenderBuffer& data, NetRenderBuffer *result);
	
	Bool (VideoPostData::*NetCreateBuffer)(BaseVideoPost *node, VideoPostStruct *vps, Int32 x, Int32 y, Int32 sizex, Int32 sizey, Int32 &id, Int32 &subid);

	void*	reserved[(32-27)*C4DPL_MEMBERMULTIPLIER-1];
};

#endif
