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

    Gradient evaluation outside of render

    SDK Help
    0
    10
    745
    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

      On 08/05/2015 at 11:31, xxxxxxxx wrote:

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

      ---------
      It seems the gradient calculate function requires InitRender to be called first.

      Is there a way to evaluate CalcGradientPixel without a render structure or is there a way to initialize the render structure without volume data?

      Ama

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

        On 08/05/2015 at 11:43, xxxxxxxx wrote:

        Here is what I tried:

        colorGradient = (Gradient* )data->GetCustomDataType( GRADIENTID, CUSTOMDATATYPE_GRADIENT );
        InitRenderStruct renderStruct;
        renderStruct.Init( bn->GetDocument() );
        VolumeData *volumeData = VolumeData::Alloc();
        renderStruct.vd = volumeData;
        colorGradient->InitRender( renderStruct );

        I am confused why this not working.

        then try to calculate.

        Ama

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

          On 09/05/2015 at 02:53, xxxxxxxx wrote:

          You don't need no VolumeData for the GradientData. Maybe that is the problem, it works for me with an
          empty InitRenderStruct.

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

            On 09/05/2015 at 04:22, xxxxxxxx wrote:

            thanks,
            are you initializing that render struct?

            Ama

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

              On 09/05/2015 at 05:52, xxxxxxxx wrote:

              Nope. Here's how it works in Python:

              import c4d
              def main() :
                  gradient = op[c4d.ID_USERDATA,1]
                  irs = c4d.modules.render.InitRenderStruct()
                  res = gradient.InitRender(irs)
                  if res != c4d.INITRENDERRESULT_OK:
                      print "InitRender() failed"
                  try:
                      for i in xrange(10) :
                          x = i / 9.0
                          print gradient.CalcGradientPixel(x)
                  finally:
                      gradient.FreeRender()
                
              main()
              

              And I remember successfully doing it in C++ without calling InitRenderStruct::Init().

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

                On 10/05/2015 at 07:25, xxxxxxxx wrote:

                I am trying to get this working within an xpresso node.  If I access the gradient directly from the res file it all works fine.  If I access it through a port, it initializes, has the correct render knot count, but crashes on Calc or FreeRender.

                Ama

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

                  On 11/05/2015 at 10:05, xxxxxxxx wrote:

                  Hello,

                  can you tell us what exactly you mean with "working within an xpresso node"? Are you creating your own GvOperatorData plugin?

                  Best wishes,
                  Sebastian

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

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

                    I have created a GvOperatorData plugin.  The problem is that I can not use a port for the gradient successfully.  If I use the res static gradient is all fine.  If I use the port gradient, it will init but crashes when calc or free is called.

                    Ama

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

                      On 12/05/2015 at 10:00, xxxxxxxx wrote:

                      Hello,

                      in an Xpresso node, you don't handle parameters but ports. These ports must be handled in special ways:

                        
                      static Int32 input_ids[] = { GV_TEST_A, GV_TEST_B, 0 };  
                        
                      ...  
                        
                        
                      GvValuesInfo ports; // data structure for all ports  
                        
                      // init the input ports  
                      virtual Bool InitCalculation(GvNode *bn, GvCalc *calc, GvRun *run)  
                      {  
                        return GvBuildValuesTable(bn, ports, calc, run, input_ids);;  
                      }  
                        
                      virtual Bool Calculate(GvNode *bn, GvPort *port, GvRun *r, GvCalc *calc)  
                      {  
                        // calculate all ports  
                        if (!GvCalculateInValuesTable(bn, r, calc, ports)) return false;  
                        
                        // get the "Gradient" port  
                        GvPort* portGradient = ports.in_values[0]->GetPort();  
                        
                        // get the "Gradient" data  
                        Gradient* gradient = nullptr;  
                        portGradient->GetDataInstance((const void*&)gradient, CUSTOMDATATYPE_GRADIENT, r);  
                        
                        
                        // sample the gradient  
                        if(gradient != nullptr)  
                        {  
                            InitRenderStruct irs(bn->GetDocument());  
                            gradient->InitRender(irs);  
                        
                            for(Int32 i = 0; i < 10; i++)  
                            {  
                                Vector color = gradient->CalcGradientPixel(Float(i) / 10.0);  
                                GePrint(String::VectorToString(color));  
                            }  
                          
                            gradient->FreeRender();  
                        }  
                        
                        return true;  
                      }  
                        
                      // free data  
                      virtual void FreeCalculation(GvNode *bn, GvCalc *calc)  
                      {  
                        GvFreeValuesTable(bn, ports);  
                      }  
                      

                      best wishes,
                      Sebastian

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

                        On 22/05/2015 at 08:55, xxxxxxxx wrote:

                        Hello Ama,

                        was your question answered?

                        Best wishes,
                        Sebastian

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