On 08/02/2016 at 00:24, xxxxxxxx wrote:
Plugin1
// example for a channel shader with access to basechannel
// using standard GUI elements
#include "c4d.h"
#include "c4d_symbols.h"
#include "main.h"
#include "xtest.h"
class XtestData : public ShaderData
{
public:
BaseShader* shaderA;
BaseShader* shaderB;
public:
virtual Bool Init (GeListNode* node);
virtual Bool Message(GeListNode* node, Int32 type, void* data);
virtual Vector Output (BaseShader* chn, ChannelData* cd);
virtual Bool Read(GeListNode* node, HyperFile* hf, Int32 level);
virtual INITRENDERRESULT InitRender (BaseShader* chn, const InitRenderStruct& irs);
virtual void FreeRender (BaseShader* chn);
virtual SHADERINFO GetRenderInfo(BaseShader* sh);
virtual BaseShader* GetSubsurfaceShader(BaseShader* sh, Float& bestmpl);
static NodeData* Alloc(void)
{
return NewObjClear(XtestData);
// NodeData * node = NewObjClear(XtestData);
// XtestData * xnode = (XtestData * )node;
// xnode->shaderA = 0;
// xnode->shaderB = 0;
// return node;
}
};
SHADERINFO XtestData::GetRenderInfo(BaseShader* sh)
{
// return SHADERINFO_DYNAMICSUBSHADERS;
// return SHADERINFO_0;
return SHADERINFO_BUMP_SUPPORT;
}
BaseShader* XtestData::GetSubsurfaceShader(BaseShader* sh, Float& bestmpl)
{
// if (shaderA != nullptr)
// return shaderA->GetSubsurfaceShader(bestmpl);
// if (shaderB != nullptr)
// return shaderB->GetSubsurfaceShader(bestmpl);
return nullptr;
}
Bool XtestData::Init(GeListNode* node)
{
// if (!node) return false;
shaderA = 0;
shaderB = 0;
BaseContainer* data = ((BaseShader* )node)->GetDataInstance();
// if (!data) return false;
data->SetLink(XTEST_TEXTURE_A, nullptr);
data->SetLink(XTEST_TEXTURE_B, nullptr);
return true;
}
Bool XtestData::Read(GeListNode* node, HyperFile* hf, Int32 level)
{
if (hf->GetFileVersion() < 8300)
{
if (!hf->ReadChannelConvert(node, XTEST_TEXTURE_A))
return false; // convert old basechannel
if (!hf->ReadChannelConvert(node, XTEST_TEXTURE_B))
return false; // convert old basechannel
}
return true;
}
Vector XtestData::Output(BaseShader* chn, ChannelData* cd)
{
// if (!shaderA || !shaderB)
return Vector(1.0);
// Vector uv = cd->p;
// Vector res = shaderA->Sample(cd) + shaderB->Sample(cd);
// cd->p = uv;
// return res;
}
INITRENDERRESULT XtestData::InitRender(BaseShader* chn, const InitRenderStruct& irs)
{
// if (!chn) return INITRENDERRESULT_OK;
BaseContainer* data = chn->GetDataInstance();
// if (!data) return INITRENDERRESULT_OK;
// cache values for fast access
shaderA = (BaseShader* )data->GetLink(XTEST_TEXTURE_A, irs.doc, Xbase);
shaderB = (BaseShader* )data->GetLink(XTEST_TEXTURE_B, irs.doc, Xbase);
INITRENDERRESULT resA = INITRENDERRESULT_OK;
INITRENDERRESULT resB = INITRENDERRESULT_OK;
if (shaderA) resA = shaderA->InitRender(irs);
if (shaderB) resB = shaderB->InitRender(irs);
if (resA != INITRENDERRESULT_OK) return resA;
if (resB != INITRENDERRESULT_OK) return resB;
return INITRENDERRESULT_OK;
}
void XtestData::FreeRender(BaseShader* chn)
{
if (shaderA) shaderA->FreeRender();
if (shaderB) shaderB->FreeRender();
shaderA = 0;
shaderB = 0;
}
Bool XtestData::Message(GeListNode* node, Int32 type, void* msgdat)
{
// if (!node) return false;
BaseContainer* data = ((BaseShader* )node)->GetDataInstance();
// if (!data) return false;
HandleInitialChannel(node, XTEST_TEXTURE_A, type, msgdat);
HandleInitialChannel(node, XTEST_TEXTURE_B, type, msgdat);
BaseShader * _shaderA = (BaseShader* )data->GetLink(XTEST_TEXTURE_A, node->GetDocument(), Xbase);
BaseShader * _shaderB = (BaseShader* )data->GetLink(XTEST_TEXTURE_B, node->GetDocument(), Xbase);
if (!shaderA) HandleShaderMessage(node, _shaderA, type, msgdat);
if (!shaderB) HandleShaderMessage(node, _shaderB, type, msgdat);
return true;
}
// be sure to use a unique ID obtained from www.plugincafe.com
Bool RegisterXtest(void)
{
return RegisterShaderPlugin(PLUGIN_ID_TEST, String("test binary shader"), 0, XtestData::Alloc, "Xtest", 0);
}