THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 23/03/2005 at 12:05, xxxxxxxx wrote:
Okay, I'll post some code and maybe give someone something to pick apart. 
This is from the ShaderData derived class, showing InitRender(), Output(), and FreeRender(). Note that I'm going through the list looking for ImageMap nodes with a BaseChannel allocated to each one. In Output(), chanSNode is the root node that all other nodes connect to - the nodes are processed stack-recursively (the calls stack until a leaf and are then unwound back for propagating the nodes interactions forward to the root node).
// ShaderData.InitRender
LONG iShader::InitRender(PluginShader* chn, InitRenderStruct* irs)
{
LONG load = LOAD_OK;
for (ShaderNode* sn = firstSNode; sn; sn = (ShaderNode* )sn->GetNext())
{
if (sn->IsInstanceOf(SHADERNODETYPE_IMAGEMAP))
{
if ((load = (static_cast<ImageMap_Node*>(sn))->GetChannel()->InitTexture(irs)) != LOAD_OK)
{
MessageDialog("Error: iShader.InitRender.InitTexture");
break;
}
}
}
return load;
}
// ShaderData.FreeRender
void iShader::FreeRender(PluginShader* chn)
{
for (ShaderNode* sn = firstSNode; sn; sn = (ShaderNode* )sn->GetNext())
{
if (sn->IsInstanceOf(SHADERNODETYPE_IMAGEMAP))
(static_cast<ImageMap_Node*>(sn))->GetChannel()->FreeTexture();
}
}
// ShaderData.Output
Vector iShader::Output(PluginShader* chn, ChannelData* cd)
{
return chanSNode.Output(chn, cd);
}
And here is the ImageMap_Node class (I've removed some nonrelevant code) :
// Initialize ImageMap_Node Bitmap
BOOL ImageMap_Node::InitBitmap(const LONG& t_pDim)
{
// Alloc and Init BaseChannel
if (!(channel = BaseChannel::Alloc()))
{
MessageDialog(GeLoadString(ERROR_MEMORY_TEXT)+": ImageMap_Node.Init.channel");
return FALSE;
}
BaseContainer bdata;
bdata.SetVector(BASECHANNEL_COLOR_EX, Vector(1.0));
channel->SetData(bdata);
bdata.SetReal(BASECHANNEL_BRIGHTNESS_EX, 1.0);
channel->SetData(bdata);
bdata.SetLong(BASECHANNEL_INTERPOLATION, BITMAPSHADER_INTERPOLATION_NONE);
channel->SetData(bdata);
bdata.SetLong(BASECHANNEL_MIXMODE_EX, MATERIAL_TEXTUREMIXING_NORMAL);
channel->SetData(bdata);
bdata.SetReal(BASECHANNEL_MIXSTRENGTH_EX, 1.0);
channel->SetData(bdata);
bdata.SetLong(BASECHANNEL_SHADERID, 0);
channel->SetData(bdata);
return TRUE;
}
// Set BaseChannel* channel
void ImageMap_Node::SetChannel(String fileString)
{
BaseContainer bdata;
if (GetC4DVersion() >= 8200)
{
bdata.SetFilename(BASECHANNEL_SUGGESTEDFOLDER, Filename(fileString).GetDirectory());
channel->SetData(bdata);
bdata.SetString(BASECHANNEL_TEXTURE, Filename(fileString).GetFileString());
}
else bdata.SetString(BASECHANNEL_TEXTURE, fileString);
channel->SetData(bdata);
}
// Get BaseChannel* channel
BaseChannel* ImageMap_Node::GetChannel()
{
return channel;
}
Vector ImageMap_Node::Output(PluginShader* chn, ChannelData* cd)
{
if (sn = GetNodeInput(0)->GetNode()) return Mix(channel->Sample(cd->vd, &cd-;>p, &cd-;>d, &cd-;>n, cd->t, cd->texflag, cd->off, cd->scale), sn->Output(chn, cd), 0.5);
return channel->Sample(cd->vd, &cd-;>p, &cd-;>d, &cd-;>n, cd->t, cd->texflag, cd->off, cd->scale);
}
Thanks,