Shader drived from a Tag

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 11/05/2005 at 08:55, xxxxxxxx wrote:

User Information:
Cinema 4D Version:   8.2+ 
Platform:   Windows  ; Mac  ;  Mac OSX  ; 
Language(s) :     C++  ;

---------
Hi all,

I need to write a shader drived by a my PluginTag.
Maybe like a Proxymal Shader.
Can someone help me to understand how i can pass parameter from a TAG to a shader?
I thought to an array that contain a index for all objects that have same texture tag... but how?

thanks all
Renato T.

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 11/05/2005 at 10:27, xxxxxxxx wrote:

If no one has a better idea, you could always use messaging. I've used MSG_RETRIEVEPRIVATEDATA to pass structs and arrays (in the void* data of a RetrievePrivateData struct) to and from my own plugins with much success.

Basically, when your shader needs information from these tags, the shader can send a message like this with a RetrievePrivateData struct, the tag fills the data (and maybe sets the flags), and the shader retrieves what is filled into it.

If you need to look for tags, I suggest getting the BaseDocument from the node (node->GetDocument()), and then set up a recursive method in the shader to get each object and check for tags:

  
// These will need to be defined accessible for MyShader and MyTag  
#define RPDATA_SET     0  
#define RPDATA_GET     1  
  
struct MyDataStruct  
{  
     // whatever data is to be passed  
};  
  
Bool MyShader::SomeMethod()  
{  
     BaseDocument* baseDoc = node->GetDocument();  
     if (!QueryTag(baseDoc, baseDoc->GetFirstObject()) return FALSE;  
     ...  
     return TRUE;  
}  
  
// Recursively check Document Object's for your PluginTag  
Bool MyShader::QueryTag(BaseDocument* baseDoc, BaseObject* obj)  
{  
     LONG nr;  
     PluginTag* pt;  
     RetrievePrivateData rpdata;  
     MyDataStruct myDataStruct;  
  
     for (obj; obj; obj = obj->GetNext())  
     {  
          /* Do this here to perform leaf->root traversal  
          // Handle children  
          if (!QueryTag(baseDoc, obj->GetDown())) return FALSE;  
          */  
  
          // Get each MyPlugin tag from object (if nay)  
          for (nr = 0; pt = (PluginTag* )obj->GetTag(ID_MYTAG, nr); nr++)  
          {  
               // Messaging  
               rpdata.flags = RPDATA_GET;  
               rpdata.data = &myDataStruct;  
               if (pt->Message(MSG_RETRIEVEPRIVATEDATA, &rpdata;))  
               {  
                    // extract data filled by your PluginTag  
               }  
          }  
  
          // Do this here to perform root->leaf traversal  
          // Handle children  
          if (!QueryTag(baseDoc, obj->GetDown())) return FALSE;  
     }  
     return TRUE;  
}  

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 11/05/2005 at 10:51, xxxxxxxx wrote:

Thanks Robert,

i'll analize your code, i hope to get the right way from this.

Thanks
Renato T.

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 11/05/2005 at 15:31, xxxxxxxx wrote:

Now i need to know the Object ID from VolumeData.
I mean what RayObject is processing the shader.
Maybe easy but i don't find it.

Thanks
Renato T.

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 11/05/2005 at 17:13, xxxxxxxx wrote:

you can find the object in the volumedata

BaseObject* op = vd->op->link;

always check if NULL

hope this helps

Matthias

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 11/05/2005 at 17:22, xxxxxxxx wrote:

Argh.. i lost it in BaseVolumeData :(

thanks Matthias
Renato T.

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 12/05/2005 at 10:12, xxxxxxxx wrote:

Matthias,

I've looked for a unique id for objects but i don't find it.

I have a tag (N.o.t.a.) that manage Global Matrix of all objects grouped.. so i don't have a tag for each object and i need to check for a "id" if exist so i can look on my tag (or if possible add in each object container) for some data for index that can drive my Shader.

I hope that you understand what i mean.

Cheers
Renato T.

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 13/05/2005 at 00:15, xxxxxxxx wrote:

Nevermind :)

it's easy to add a data to container of all objects.. if is possible to do or add invisible tag for each object.

Thanks
Renato T.

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 13/05/2005 at 00:47, xxxxxxxx wrote:

Quote: Originally posted by RenatoT on 12 May 2005
>
> * * *
>
>
> I've looked for a unique id for objects but i don't find it.
>
>
> * * *

you can get a unique id with GetUniqueIP()

  
//source of Output of your pluginshader  
//cd is the ChannelData  
  
BaseObject *op = NULL;  
op = cd- >vd->op->link;  
LONG id = 0;  
if(op) id = op->GetUniqueIP();  

best,
Matthias