THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 24/02/2010 at 02:24, xxxxxxxx wrote:
Yes, you have to overwrite CalcSurface(). To sample the shader link use PluginShader::Sample(). You have to generate the texure projection manually. See the example code of TexData in the SDK docu.
here a simple example, it samples a shader using UV projection (make sure the texture tag is set to UVW projection) :
/////////////////////////////////////////////////////////////
// CINEMA 4D SDK //
/////////////////////////////////////////////////////////////
// (c) 1989-2004 MAXON Computer GmbH, all rights reserved //
/////////////////////////////////////////////////////////////
// volumetric shader example that accesses particles and displays its own preview
// absolutely not optimized for speed
#include "c4d.h"
#include "c4d_symbols.h"
#include "mparticlevolume.h"
class ParticleVolume : public MaterialData
{
public:
virtual Bool Init(GeListNode *node);
virtual LONG GetRenderInfo(PluginMaterial *mat) { return 0; }
virtual LONG InitRender(PluginMaterial *mat, InitRenderStruct *irs);
virtual void FreeRender(PluginMaterial *mat);
virtual void CalcSurface(PluginMaterial *mat, VolumeData *vd);
static NodeData *Alloc(void) { return gNew ParticleVolume; }
private:
PluginShader *shader;
};
Bool ParticleVolume::Init(GeListNode *node)
{
shader=NULL;
BaseContainer *data = ((PluginShader* )node)->GetDataInstance();
data->SetLink(MY_SHADER, NULL);
return TRUE;
}
LONG ParticleVolume::InitRender(PluginMaterial *mat, InitRenderStruct *irs)
{
BaseContainer *data = mat->GetDataInstance();
// cd.t = irs->time.Get();
shader = (PluginShader* )data->GetLink(MY_SHADER,irs->doc,Xbase);
if (shader) return shader->InitRender(irs);
return LOAD_OK;
}
void ParticleVolume::FreeRender(PluginMaterial *mat)
{
if (shader) shader->FreeRender();
shader=NULL;
}
void ParticleVolume::CalcSurface(PluginMaterial *mat, VolumeData *vd)
{
vd->trans = 0.0;
ChannelData cd(vd);
Vector uv;
cd.p = vd->GetPointUVW(vd->tex, vd->lhit, vd->p);
if (shader)
{
vd->col = shader->Sample(&cd);
}
}
// be sure to use a unique ID obtained from www.plugincafe.com
#define ID_PARTICLEVOLUME 1001163
Bool RegisterParticleVolume(void)
{
// decide by name if the plugin shall be registered - just for user convenience
String name=GeLoadString(IDS_PARTICLEVOLUME); if (!name.Content()) return TRUE;
name = GeGetDefaultFilename(DEFAULTFILENAME_SHADER_VOLUME)+name; // place in default Shader section
return RegisterMaterialPlugin(ID_PARTICLEVOLUME,name,0,ParticleVolume::Alloc,"MParticleVolume",0);
}
cheers,
Matthias