Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    Getting data from SHADERLINK

    SDK Help
    0
    8
    634
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H
      Helper
      last edited by

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

      On 13/05/2007 at 14:10, xxxxxxxx wrote:

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

      ---------
      Hi,
      i can't find any tutorials about introduction about writing sdk plugins, and i have (propably) realy basics problems.

      I created a simple SHADERLINK in gui,
      (like that: SHADERLINK MATERIAL_ALPHA_SHADER2 { } ), and i'm trying, and trying, and trying to read data and everything gone for nothing.

      example:
      BaseDocument *doc;
      BaseLink *tekstura;
      BaseList2D *bl;

      // in InitRender
      PluginShader *shader = NULL;
      tekstura = data->GetBaseLink(MATERIAL_ALPHA_SHADER2);
           if(tekstura!=NULL){
                bl = tekstura->ForceGetLink(); // when i trying to use tekstura- >GetLink(doc);, the methon returns null
                shader = bl->GetFirstShader(); // < --- here i always get null -- why??
                PluginShader *ge = (PluginShader * )bl; // < -- is this correct?
      }

      // in CalcSurface
           if(tekstura!=NULL){
                PluginShader *shader = NULL;
                bl = tekstura->ForceGetLink();
                shader = bl->GetFirstShader(); // always null
                
                PluginShader *ge = (PluginShader * )bl;
                
                Vector btm = ge->Sample((ChannelData * )vd); // always null

      GePrint("Name: "+ge- >GetName()); // functions works fine, that's why i thing that at least some of this code is correct 😉

      I would be very gratefull for any help, or pice of good code.

      1 Reply Last reply Reply Quote 0
      • H
        Helper
        last edited by

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

        On 19/05/2007 at 06:37, xxxxxxxx wrote:

        Can somebody help me?
        This is very important for me.

        1 Reply Last reply Reply Quote 0
        • H
          Helper
          last edited by

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

          On 21/05/2007 at 01:45, xxxxxxxx wrote:

          What are you trying to achieve, simply loading a shader in your own shader? Take a look at the Bitmapdistortion Shader in the SDK examples. It shows how to initialize and use a ShaderLink.

          cheers,
          Matthias

          1 Reply Last reply Reply Quote 0
          • H
            Helper
            last edited by

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

            On 21/05/2007 at 23:45, xxxxxxxx wrote:

            Hi,

            What I'm trying to achieve is to load a shader in SHADERLINK, and use it as a color of object or as a bump texture - it doesn't matter.

            Bitmapdistortion Shader inherit from ShaderData, my plugin inherts from MaterialData - that's why Bitmapdistortion Shader isn't very helpfull example.

            i found this
            but this is too all about ShaderData.

            1 Reply Last reply Reply Quote 0
            • H
              Helper
              last edited by

              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

              1 Reply Last reply Reply Quote 0
              • H
                Helper
                last edited by

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

                On 22/05/2007 at 02:44, xxxxxxxx wrote:

                Thank you for help. I was looking sth like this example.

                I have last question, only for sure.

                there is no difrents between this

                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;);

                and this:

                ChannelData *cd = new ChannelData(vd);
                          Vector col = shader->Sample(cd);

                right?

                1 Reply Last reply Reply Quote 0
                • H
                  Helper
                  last edited by

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

                  On 22/05/2007 at 02:50, xxxxxxxx wrote:

                  Quote: there is no difrents between this
                  >
                  > * * *
                  >
                  >
                  > 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;);
                  >
                  > and this:
                  >
                  >           ChannelData *cd = new ChannelData(vd);
                  >           Vector col = shader->Sample(cd);
                  >
                  > right?
                  >
                  >
                  >
                  > * * *

                  no, but still you have to fill the ChanndelData first, like cd->vd = vd etc. also don't forget to free your ChannelData with delete after using it.

                  cheers,
                  Matthias

                  1 Reply Last reply Reply Quote 0
                  • H
                    Helper
                    last edited by

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

                    On 22/05/2007 at 03:16, xxxxxxxx wrote:

                    Thanks, i'm appreciate for your help.

                    1 Reply Last reply Reply Quote 0
                    • First post
                      Last post