Gradient evaluation outside of render



  • 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



  • 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



  • 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.



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

    thanks,
    are you initializing that render struct?

    Ama



  • 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().



  • 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



  • 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



  • 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



  • 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



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

    Hello Ama,

    was your question answered?

    Best wishes,
    Sebastian


Log in to reply