Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python 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

    How To Get At Shader Options?

    Scheduled Pinned Locked Moved SDK Help
    14 Posts 0 Posters 1.2k Views
    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 Offline
      Helper
      last edited by

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

      On 06/05/2011 at 07:48, xxxxxxxx wrote:

      Thanks for the reply.

      I've been trying to use the Get/SetParameter() method. like this:
      shd->SetParameter(DescID(NOISESHADER_SCALEX), GeData(2.0), DESCFLAGS_SET_0);

      I wasn't even sure if using this was the right method to get at the data. So thanks for confirming that for me.
      But NOISESHADER_SCALEX produces an undefined error.
      I must be missing something really simple.

      -ScottA

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

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

        On 06/05/2011 at 10:10, xxxxxxxx wrote:

        You will probably need to include the header from the resource/modules/shader/res/description folder.

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

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

          On 06/05/2011 at 10:25, xxxxxxxx wrote:

          Once again..You saved my butt Robert. 👍

          I got the ID: NOISESHADER_SCALEX by dragging from the dialog into the console.
          But I could not find any reference to this ID anywhere in my file structure.
          I have been using the built-in Windows Vista search option. And it usually finds things like this for me very well. But in this case it failed me.

          Do you have a favorite program, or method, you use search through all of the files for specific ID's?
          It looks like I can't trust the Windows search anymore.

          -ScottA

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

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

            On 06/05/2011 at 10:44, xxxxxxxx wrote:

            Windows 7 search seems to do the trick every time.  😄  "Hint Hint"  HAHA

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

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

              On 06/05/2011 at 10:47, xxxxxxxx wrote:

              Even the Windows 7 search can be trick-y. 🙂

              I use something called Agent Ransack.  It works brilliantly!

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

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

                On 06/05/2011 at 11:10, xxxxxxxx wrote:

                I'll check it out.
                But..I'm stuck again. (Don't kill me. I'm trying hard Embarrassed).

                Now I need to know how to change the gradient knots.
                All I can find is examples on creating brand new gradients from scratch using the gradient class.
                But what I need to know is just how to change the .pos values and the Vector() values of the two existing knots.

                I'll post the complete code when I'm done. So anyone else new to this stuff doesn't have to ask you guys these same simple questions over again.

                -ScottA

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

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

                  On 06/05/2011 at 13:43, xxxxxxxx wrote:

                  I couldn't figure out how to edit existing gradients. So I tried allocating a new one. And it seems to replace the old one. So I guess that will work. *shrug*

                  Here's the entire plugin code:

                  #include "c4d.h"  
                  #include "c4d_symbols.h"  
                  #include "../../cinema4dsdk/res/description/xsdkgradient.h"  
                  #include "../../modules/shader/res/description/xnoise.h"  
                    
                  #define PLUGIN_ID    10000010 // ID FOR TESTING ONLY!!!!!!!!!!  
                    
                  class SimplePlugin : public CommandData  
                  {      
                    public:  
                        SimplePlugin(); //The Constructor                  
                        virtual Bool      Execute(BaseDocument *doc);  
                  };  
                    
                  SimplePlugin::SimplePlugin() // The Constructor  
                  {  
                    //not used in this example  
                  }  
                    
                  Bool SimplePlugin::Execute(BaseDocument *doc)  
                  {   
                    
                    BaseMaterial *mat = doc->GetFirstMaterial(); // Get the first material and assign a variable to it   
                    if(!mat) return TRUE; // Error handling  
                      
                    BaseContainer *data = mat->GetDataInstance(); // Get the material's container  
                    BaseShader *shd = BaseShader::Alloc(Xsimplenoise); // Creates simple noise instance....For other types(fresnel,etc..). Look up  "enum Xbase"  in the SDK    
                    if(!shd) return FALSE; // Error handling  
                    
                    data->SetLink(MATERIAL_COLOR_SHADER, shd); // Adds a SimpleNoise shader to the color channel in memory only  
                    
                    BaseContainer *shddata = shd->GetDataInstance(); // Get the shader's container  
                    AutoAlloc<Gradient> gradient; // Creates a new gradient  
                    if (!gradient) return FALSE; // Error handling  
                    
                    GradientKnot k1,k2;           // Create two variables to hold the two knot values  
                    k1.col = Vector(0.0,0.0,0.0); // First knot's color is black  
                    k1.pos = 0.0;                 // First knot's position   
                    
                    k2.col = Vector(1.0,1.0,1.0); // Second knot's color is white  
                    k2.pos = 1.0;                 // Second knot's position   
                    
                    gradient->InsertKnot(k1);  //Adds the First knot from memory  
                    gradient->InsertKnot(k2);  //Adds the Second knot from memory  
                    
                    shddata->SetData(SDKGRADIENTSHADER_COLOR,GeData(CUSTOMDATATYPE_GRADIENT,gradient)); // Executes the knot changes from memory      
                    shddata->SetData(SDKGRADIENTSHADER_MODE,GeData(1)); //Sets the mode<---BROKEN!!   
                      
                    shd->SetParameter(DescID(NOISESHADER_SCALEX), GeData(5.0), DESCFLAGS_SET_0); // Sets the scaleX value  
                    shd->SetParameter(DescID(NOISESHADER_SCALEY), GeData(5.0), DESCFLAGS_SET_0); // Sets the scaleY value  
                    mat->InsertShader(shd, NULL); // Adds the Simple Noise to the color channel from memory with all it's settings made   
                      
                    mat->Message(MSG_UPDATE); // update the changes  
                    mat->Update(TRUE, TRUE); // updates the material icon  
                    void Free(BaseMaterial*& mat); // Free memory used in the code(not sure if this is needed)  
                    
                    return true;  
                  }  
                    
                  Bool RegisterSimplePlugin()  
                  {    
                    return RegisterCommandPlugin(PLUGIN_ID, GeLoadString(IDS_My_Simple_Plugin), 0, AutoBitmap("icon.tif"), String("Help text Goes here"), gNew SimplePlugin);                                                                        
                  }
                  

                  I hope this helps any newbs out there get up running a lot easier.
                  The mode option is still broken. But I'm exhausted from starring at this thing. So I'm taking a break.

                  Thanks for the help guys,
                  -ScottA

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

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

                    On 09/05/2011 at 02:48, xxxxxxxx wrote:

                    There is no need to allocate a Gradient if you just want to change it in an existing shader.

                    Here is a simple example. It sets the knot's postion to a random value.

                      
                    GeData d;  
                      
                    // get the data  
                    if (shd->GetParameter(DescLevel(SLA_GRADIENT_GRADIENT), d, DESCFLAGS_GET_0))  
                    {  
                      //get the Gradient custom data  
                      Gradient *gd = (Gradient* )d.GetCustomDataType(CUSTOMDATATYPE_GRADIENT);  
                      
                      if (gd)  
                      {  
                          // iterate through all knots and set them randomly  
                          LONG kcnt = gd->GetKnotCount();  
                      
                          Random rnd;  
                          rnd.Init(436357);  
                      
                          for (LONG i=0; i<kcnt; i++)  
                          {  
                              GradientKnot knot = gd->GetKnot(i);  
                              knot.pos = rnd.Get01();  
                              gd->SetKnot(i, knot);  
                          }  
                            
                          // set the gradient  
                          shd->SetParameter(DescLevel(SLA_GRADIENT_GRADIENT), d, DESCFLAGS_SET_0);  
                      
                          shd->Message(MSG_UPDATE);  
                      
                          EventAdd();  
                      }  
                    }  
                    

                    Also check the GradientShader.cpp SDK example for some more sample code.

                    cheers,
                    Matthias

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

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

                      On 09/05/2011 at 07:34, xxxxxxxx wrote:

                      Thank you. 👍

                      -ScottA

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

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

                        On 09/05/2011 at 10:27, xxxxxxxx wrote:

                        Still doesn't work for me. 😠
                        It looks like the problem begins when trying to get the gradient's container:

                        Bool SimplePlugin::Execute(BaseDocument *doc)  
                        {   
                          
                          BaseMaterial *mat = doc->GetFirstMaterial(); // Get the first material and assign a variable to it   
                          if(!mat) return TRUE; // Error handling  
                          
                          BaseContainer *data = mat->GetDataInstance(); // Get the material's container  
                          BaseShader *shd = BaseShader::Alloc(Xsimplenoise);  
                          data->SetLink(MATERIAL_COLOR_SHADER, shd); // Adds a SimpleNoise shader to the color channel in memory only  
                          mat->InsertShader(shd, NULL); // Adds the Simple Noise to the color channel from memory  
                          mat->Message(MSG_UPDATE); // update the changes  
                          mat->Update(TRUE, TRUE); // updates the material icon  
                          EventAdd();  
                          //////////////////     EVERYTHING IS WORKING AT THIS POINT   /////////////////////////////////////  
                          
                         //Now lets try to access the gradient and it's parameters   
                          
                        GeData d;  
                        if (shd->GetParameter(DescLevel(SLA_GRADIENT_GRADIENT), d, DESCFLAGS_GET_0))  
                         {  
                          GePrint("Is this working so far?"); //<-----Yes. This does print and proves that everything is working at this point  
                          
                          Gradient *gd = (Gradient* )d.GetCustomDataType(CUSTOMDATATYPE_GRADIENT); //get the gradient's custom data  
                          
                          if (gd) GePrint("true");  
                          else GePrint ("false"); // <-------Prints false. The code is broken. Starting from Gradient *gd  
                                                  // We are not properly accessing the gradients container. We cannot continue until this is fixed  
                         }
                        

                        I'm sure I'm missing something really simple.

                        -ScottA

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

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

                          On 17/05/2011 at 01:45, xxxxxxxx wrote:

                          SLA_GRADIENT_GRADIENT is the wrong ID for the gradient of the Simple Noise shader. Please use NOISESHADER_COLOR instead.

                          cheers,
                          Matthias

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

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

                            On 17/05/2011 at 11:42, xxxxxxxx wrote:

                            Thanks for sticking with me on this. I'm almost there now. But I have one final problem.
                            I can't get the gradient's mode to change:

                            Here are my list of includes:

                            #include "c4d.h"  
                            #include "c4d_symbols.h"  
                            #include "../../cinema4dsdk/res/description/xsdkgradient.h"  
                            #include "../../modules/shader/res/description/xnoise.h"  
                            #include "../../modules/xtensions/res/description/dgradient.h"
                            

                            And here's my code:

                            Bool SimplePlugin::Execute(BaseDocument *doc)  
                            {   
                              
                              BaseMaterial *mat = doc->GetFirstMaterial(); // Get the first material and assign a variable to it   
                              if(!mat) return TRUE; // Error handling  
                                
                              BaseContainer *data = mat->GetDataInstance(); // Get the material's container  
                              BaseShader *shd = BaseShader::Alloc(Xsimplenoise); // Creates simple noise instance....For other types(fresnel,etc..). Look up  "enum Xbase"  in the SDK    
                              if(!shd) return FALSE; // Error handling  
                              
                              data->SetLink(MATERIAL_COLOR_SHADER, shd); // Adds a SimpleNoise shader to the color channel in memory only  
                              
                              BaseContainer *shddata = shd->GetDataInstance(); // Get the shader's container  
                                
                            GeData d;  
                            if (shd->GetParameter(DescLevel(NOISESHADER_COLOR), d, DESCFLAGS_GET_0)) // If it's a Simple Noise shader. Get it's attributes  
                             {  
                              Gradient *gd = (Gradient* )d.GetCustomDataType(CUSTOMDATATYPE_GRADIENT); //Get the gradient's custom data and assign it to a variable  
                                    
                               if (gd)  
                                {          
                                  LONG kcnt = gd->GetKnotCount(); // Get the total number of knots in case we need it later  
                                  GradientKnot first = gd->GetKnot(0); //Gets the first knot  
                                  GradientKnot second = gd->GetKnot(1); //Gets the second knot  
                              
                                  first.pos = 0.1;                   // Changes the first knot's position in memory only          
                                  second.pos = 0.8;                 // Changes the second knot's position in memory only  
                                  first.col = Vector(0.5, 0.1, 0.0);     // Changes the first knot's color in memory only      
                                  second.col = Vector(1.0 , 1.0, 1.0); // Changes the second knot's color in memory only      
                              
                                  gd->SetKnot(0, first);         // Execute the first knot's changes from memory  
                                  gd->SetKnot(1, second);        // Execute the second knot's changes from memory  
                                    
                                  // Set the gradient changes  
                                  shd->SetParameter(DescLevel(NOISESHADER_COLOR), d, DESCFLAGS_SET_0);  
                                  shd->Message(MSG_UPDATE);  
                                  EventAdd();  
                                }    
                              shd->Message(MSG_UPDATE); // Tell C4D that we made some changes  
                              EventAdd(); // Update the scene changes  
                             }   
                              
                              shddata->SetData(GRADIENTSUBCHANNEL_INTERPOLATION,GeData(GRADIENTSUBCHANNEL_INTERPOLATION_SMOOTHKNOT)); //<-----------Does Not Work! Mode does not Change!  
                              shd->SetParameter(DescID(NOISESHADER_SCALEX), GeData(5.0), DESCFLAGS_SET_0); // Sets the scaleX value  
                              shd->SetParameter(DescID(NOISESHADER_SCALEY), GeData(5.0), DESCFLAGS_SET_0); // Sets the scaleY value  
                              mat->InsertShader(shd, NULL); // Adds the Simple Noise to the color channel from memory with all it's settings made   
                                
                              mat->Message(MSG_UPDATE); // update the changes  
                              mat->Update(TRUE, TRUE); // updates the material icon  
                              void Free(BaseMaterial*& mat); // Free memory used in the code(not sure if this is needed)  
                              
                              return true;  
                            }
                            

                            Any idea what I'm doing wrong with the mode code?

                            -ScottA

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