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


Log in to reply