THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 22/05/2007 at 02:08, xxxxxxxx wrote:
Here is a complete example for MaterialData plugin which loads a shader and uses it in CalcSurface
/////////////////////////////////////////////////////////////
// CINEMA 4D SDK //
/////////////////////////////////////////////////////////////
// (c) 1989-2004 MAXON Computer GmbH, all rights reserved //
/////////////////////////////////////////////////////////////
// example for an easy implementation of a volume (surface) shader
// It modifies the preview scenes and adds its own scene
#include "c4d.h"
#include "c4d_symbols.h"
#include "msimplematerial.h"
// be sure to use a unique ID obtained from www.plugincafe.com
#define ID_SIMPLEMAT 1001164
class SimpleMaterial : public MaterialData
{
INSTANCEOF(SimpleMaterial,MaterialData)
private:
PluginShader *shader;
public:
virtual Bool Init (GeListNode *node);
virtual void CalcSurface (PluginMaterial *mat, VolumeData *vd);
virtual LONG InitRender(PluginMaterial *mat, InitRenderStruct *irs);
virtual void FreeRender(PluginMaterial* mat);
virtual Bool Message(GeListNode* node, LONG type, void* data);
static NodeData *Alloc(void) { return gNew SimpleMaterial; }
};
Bool SimpleMaterial::Init(GeListNode *node)
{
shader = NULL;
BaseContainer *data=((PluginMaterial* )node)->GetDataInstance();
data->SetLink(SIMPLEMATERIAL_TEXTURE,NULL);
return TRUE;
}
LONG SimpleMaterial::InitRender(PluginMaterial *mat, InitRenderStruct *irs)
{
BaseContainer *data=mat->GetDataInstance();
shader = (PluginShader* )data->GetLink(SIMPLEMATERIAL_TEXTURE,irs->doc,Xbase);
if (shader)
return shader->InitRender(irs);
return LOAD_OK;
}
void SimpleMaterial::FreeRender(PluginMaterial *mat)
{
if (shader)
shader->FreeRender();
shader=NULL;
}
void SimpleMaterial::CalcSurface(PluginMaterial *mat, VolumeData *vd)
{
if(shader)
{
ChannelData cd;
cd.vd = vd;
cd.d = 0;
cd.n = vd->n;
cd.off = 0;
cd.p = vd->uvw;
cd.scale = 0;
cd.t = 0;
cd.texflag = TEX_TILE;
Vector col = shader->Sample(&cd;);
vd->col = col;
Multipass *buf = vd->multipass;
if (!buf) return;
// process multipass data
*buf->vp_mat_color = col;
}
else
{
vd->col = 1.0;
Multipass *buf = vd->multipass;
if (!buf) return;
// process multipass data
*buf->vp_mat_color = 1.0;
}
}
Bool SimpleMaterial::Message(GeListNode* node, LONG type, void* data)
{
BaseContainer *dat = ((PluginShader* )node)->GetDataInstance();
HandleInitialChannel(node,SIMPLEMATERIAL_TEXTURE,type,data);
HandleShaderMessage(node,(PluginShader* )dat->GetLink(SIMPLEMATERIAL_TEXTURE,node->GetDocument(),Xbase),type,data);
return TRUE;
}
Bool RegisterSimpleMaterial(void)
{
// decide by name if the plugin shall be registered - just for user convenience
String name=GeLoadString(IDS_SIMPLEMATERIAL); if (!name.Content()) return TRUE;
return RegisterMaterialPlugin(ID_SIMPLEMAT,name,0,SimpleMaterial::Alloc,"Msimplematerial",0);
}
here the description resource
CONTAINER Msimplematerial
{
NAME Msimplematerial;
INCLUDE Mpreview;
INCLUDE Mbase;
GROUP ID_MATERIALPROPERTIES
{
SHADERLINK SIMPLEMATERIAL_TEXTURE { }
}
}
also take a look a look at the material examples in the sdk
cheers,
Matthias