#ifdef __API_INTERN__
	#include "operatingsystem.h"
#endif
#include "c4d_videopost.h"
#include "c4d_raytrace.h"
#include "c4d_memory.h"
#include "c4d_basecontainer.h"
#include "c4d_basebitmap.h"
#include "c4d_file.h"
#include "c4d_general.h"
#include "c4d_gui.h"
#include "c4d_resource.h"

Bool VideoPostData::Draw(BaseVideoPost* node, BaseDraw* bd, BaseDrawHelp* bh)
{
	return true;
}

void VideoPostData::CalcVolumetric(BaseVideoPost* node, VolumeData* vd)
{
}

void VideoPostData::CalcShadow(BaseVideoPost* node, VolumeData* vd)
{
}

void VideoPostData::AllocateBuffers(BaseVideoPost* node, Render* render, BaseDocument* doc)
{
}

VIDEOPOSTINFO VideoPostData::GetRenderInfo(BaseVideoPost* node)
{
	return VIDEOPOSTINFO_0;
}

RENDERRESULT VideoPostData::Execute(BaseVideoPost* node, VideoPostStruct* vps)
{
	return RENDERRESULT_OK;
}

void VideoPostData::ExecuteLine(BaseVideoPost* node, PixelPost* pp)
{
}

void VideoPostData::ExecutePixel(BaseVideoPost* node, PixelPost* pp, Int32 x, Int32 subx, Int32 suby)
{
}

Bool VideoPostData::GlDraw(BaseVideoPost* node, BaseDraw* bd, GlFrameBuffer* fbuf, Int32 colortex, Int32 depthtex, VIDEOPOST_GLDRAW flags)
{
	return true;
}

VIDEOPOST_GLINFO VideoPostData::GetGlInfo(BaseVideoPost* node, BaseDocument* doc, BaseDraw* bd)
{
	return VIDEOPOST_GLINFO_0;
}

void VideoPostData::SetDiffuseWeight(BaseVideoPost* node, Int32 cpu_index, Float weight)
{
}

Vector VideoPostData::ComputeDiffuseGI(BaseVideoPost* node, VolumeData* vd, Float receive_strength)
{
	return Vector(0.0);
}

Vector VideoPostData::ComputeDiffuseCaustic(BaseVideoPost* node, VolumeData* vd, Float sampleradius, Int32 accuracy)
{
	return Vector(0.0);
}

Vector VideoPostData::ComputeVolumeCaustic(BaseVideoPost* node, const Vector64& p, Int32 cpu_index)
{
	return Vector(0.0);
}

void VideoPostData::CreateRay(Ray* dst, Float x, Float y)
{
}

void VideoPostData::CreateExtendedRay(Ray* dst, Float x, Float y, Float lensx, Float lensy, Float time)
{
}

Int32 VideoPostData::StereoGetCameraCountEditor(BaseVideoPost* node, BaseDocument* doc, BaseDraw* bd)
{
	return NOTOK;
}

Int32 VideoPostData::StereoGetCameraCountRenderer(BaseVideoPost* node, BaseDocument* doc, RenderData* rd)
{
	return NOTOK;
}

Bool VideoPostData::StereoGetCameraInfo(BaseVideoPost* node, BaseDocument* doc, BaseDraw* bd, RenderData* rd, Int32 index, StereoCameraInfo& info)
{
	return false;
}

Int32 VideoPostData::StereoGetSceneHookID(BaseVideoPost* node)
{
	return 0;
}

Bool VideoPostData::StereoMergeImages(BaseVideoPost* node, BaseBitmap* dest, const BaseBitmap* const* source, Int32 cnt, const BaseContainer& settings, COLORSPACETRANSFORMATION transform)
{
	return false;
}

Bool VideoPostData::RenderEngineCheck(BaseVideoPost* node, Int32 id)
{
	return true;
}

Bool VideoPostData::NetFrameInit(BaseVideoPost* node, BaseDocument* doc, RenderJob* job, Int32 assignedClients, const NetRenderData* renderData, MultipassBitmap* frameBmp, BaseThread* bt, Int32& realdepth)
{
	return false;
}

void VideoPostData::NetFrameFree(BaseVideoPost* node)
{
}

Bool VideoPostData::NetFrameMessage(BaseVideoPost* node, const C4DUuid& remoteUuid, const NetRenderBuffer& data, NetRenderBuffer* result)
{
	return false;
}

Bool VideoPostData::NetCreateBuffer(BaseVideoPost* node, VideoPostStruct* vps, Int32 x, Int32 y, Int32 sizex, Int32 sizey, Int32& id, Int32& subid)
{
	return false;
}

Bool RegisterVideoPostPlugin(Int32 id, const String& str, Int32 info, DataAllocator* g, const String& description, Int32 disklevel, Int32 priority, void* emulation)
{
	if (description.Content() && !RegisterDescription(id, description))
		return false;

	VIDEOPOSTPLUGIN np;
	ClearMem(&np, sizeof(np));

	FillNodePlugin(&np, info, g, nullptr, disklevel, emulation);

	np.priority	= priority;
	np.Draw	= &VideoPostData::Draw;
	np.GlDraw	= &VideoPostData::GlDraw;
	np.GetGlInfo = &VideoPostData::GetGlInfo;
	np.AllocateBuffers = &VideoPostData::AllocateBuffers;
	np.GetRenderInfo = &VideoPostData::GetRenderInfo;
	np.Execute = &VideoPostData::Execute;
	np.ExecuteLine	= &VideoPostData::ExecuteLine;
	np.ExecutePixel	= &VideoPostData::ExecutePixel;
	np.CalcVolumetric = &VideoPostData::CalcVolumetric;
	np.CalcShadow = &VideoPostData::CalcShadow;
	np.ComputeDiffuseGI = &VideoPostData::ComputeDiffuseGI;
	np.ComputeDiffuseCaustic	= &VideoPostData::ComputeDiffuseCaustic;
	np.ComputeVolumeCausticEx = nullptr;
	np.ComputeVolumeCaustic = &VideoPostData::ComputeVolumeCaustic;
	np.CreateRay = &VideoPostData::CreateRay;
	np.CreateExtendedRay = &VideoPostData::CreateExtendedRay;
	np.StereoGetCameraCountEditor = &VideoPostData::StereoGetCameraCountEditor;
	np.StereoGetCameraCountRenderer = &VideoPostData::StereoGetCameraCountRenderer;
	np.StereoGetCameraInfo	= &VideoPostData::StereoGetCameraInfo;
	np.StereoGetSceneHookID = &VideoPostData::StereoGetSceneHookID;
	np.StereoMergeImages = &VideoPostData::StereoMergeImages;
	np.RenderEngineCheck = &VideoPostData::RenderEngineCheck;
	np.SetDiffuseWeight	 = &VideoPostData::SetDiffuseWeight;
	np.NetFrameInit	= &VideoPostData::NetFrameInit;
	np.NetFrameFree	= &VideoPostData::NetFrameFree;
	np.NetFrameMessage = &VideoPostData::NetFrameMessage;
	np.NetCreateBuffer = &VideoPostData::NetCreateBuffer;

	return GeRegisterPlugin(PLUGINTYPE_VIDEOPOST, id, str, &np, sizeof(np));
}
