Initialising Gradient

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

On 08/11/2010 at 07:31, xxxxxxxx wrote:

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

---------
Hi,

in pre R12 I used to initialise a gradient element like this in a shader::Init() :

   AutoAlloc<Gradient> gradient1;  
  if (!gradient1) return FALSE;  
  
  GradientKnot k1;  
  k1.col =Vector(1.0,1.0,1.0);  
  k1.pos =1.0;  
  gradient1->InsertKnot(k1);  
  k1.col =Vector(0.0,0.0,0.0);  
  k1.pos =0.0;  
  gradient1->InsertKnot(k1);  
  gradient1->SetData(GRADIENT_INTERPOLATION,GRADIENT_INTERPOLATION_LINEAR);  
     data->SetData(DPIT_SMOKE_NOISE_GRADIENT,GeData(CUSTOMDATATYPE_GRADIENT,gradient1));

In R12 however this doesn´t work anymore (the gradient is initialised completely white). How does it work in R12?

Thanks

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

On 08/11/2010 at 07:50, xxxxxxxx wrote:

Ok, it seems the gradient IS correctly initialised but it anyway shows all the knots as white. And as soon as you touch the knots it indeed gets white. So is this a bug or am I doing anything wrong? It worked just fine before R12. 😕

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

On 08/11/2010 at 07:56, xxxxxxxx wrote:

Hm, looks ok to me.

This is the code from the SDKGradient example:

  
Bool SDKGradientClass::Init(GeListNode *node)  
{  
  BaseContainer *data = ((BaseShader* )node)->GetDataInstance();  
  
  AutoAlloc<Gradient> gradient;  
  if (!gradient) return FALSE;  
  
  GradientKnot k1,k2;  
  k1.col =Vector(0.0,0.0,1.0);  
  k1.pos =0.0;  
  
  k2.col =1.0;  
  k2.pos =1.0;  
  
  gradient->InsertKnot(k1);  
  gradient->InsertKnot(k2);  
  
  data->SetData(SDKGRADIENTSHADER_COLOR,GeData(CUSTOMDATATYPE_GRADIENT,gradient));  
  data->SetBool(SDKGRADIENTSHADER_CYCLE,FALSE);  
  data->SetLong(SDKGRADIENTSHADER_MODE,0);  
  data->SetReal(SDKGRADIENTSHADER_ANGLE,0.0);  
  
  data->SetReal(SDKGRADIENTSHADER_TURBULENCE,0.0);  
  data->SetReal(SDKGRADIENTSHADER_OCTAVES,5.0);  
  data->SetReal(SDKGRADIENTSHADER_SCALE,1.0);  
  data->SetReal(SDKGRADIENTSHADER_FREQ,1.0);  
  data->SetBool(SDKGRADIENTSHADER_ABSOLUTE,FALSE);  
    
  return TRUE;  
}  

cheers,
Matthias

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

On 08/11/2010 at 08:05, xxxxxxxx wrote:

yeah, I also found this in the sdk and it seems to work in the sdk example. Any idea what might be the problem? It´s the same for all my gradients so it seems strange. I also looked up the resources and beside having the ICC_BASEDOCUMENT; flag (which I added now to mine too but didn´t change anything) there´s nothing new to it.

Also in InitRender I call InitRender(irs) as in the sdk example but this doesn´t seem to change anything (well, how should it, it´s just the new call to pass irs). Could it be because I am in a MaterialData and not a ShaderData? Because in my ChannelShaders it works just fine!

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

On 08/11/2010 at 08:10, xxxxxxxx wrote:

hmm, no. I just added it to the simplematerial example and it works there. Argh, what could it be? I mean it worked before just fine and now in R12 it doesn´t. Did anything concerning resources convention change or similar? I am also using a custom material preview, could that be it? Also I am using the Obaselist for the material manager and the gradient is in a different GROUP.

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

On 08/11/2010 at 08:28, xxxxxxxx wrote:

Ah! It happens with the ALPHA flag only! This also happens in the simplematerial. So is this to be considered a bug?

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

On 08/11/2010 at 08:31, xxxxxxxx wrote:

Here is the changed code I used for testing in simplematerial:

  
class SimpleMaterial : public MaterialData  
{  
  INSTANCEOF(SimpleMaterial,MaterialData)  
  
  private:  
      Vector color;  
      Gradient* grad;  
  public:  
      virtual Bool Init        (GeListNode *node);  
      virtual    void CalcSurface            (BaseMaterial *mat, VolumeData *vd);  
      virtual    INITRENDERRESULT InitRender(BaseMaterial *mat, const InitRenderStruct &irs);  
      virtual    void FreeRender(BaseMaterial *mat)  
      {  
          if(grad) grad->FreeRender();  
      }  
  virtual Bool GetDParameter(GeListNode *node, const DescID &id,GeData &t_data,DESCFLAGS_GET &flags);  
  virtual Bool SetDParameter(GeListNode *node, const DescID &id,const GeData &t_data,DESCFLAGS_SET &flags);  
  virtual Bool Message(GeListNode* node, LONG type, void* data);  
  virtual Bool CopyTo(NodeData *dest, GeListNode *snode, GeListNode *dnode, COPYFLAGS flags, AliasTrans *trn);  
  
      static NodeData *Alloc(void) { return gNew SimpleMaterial; }  
  
  LONG updatecount;  
};  
  
Bool SimpleMaterial::Init(GeListNode *node)  
{  
  BaseContainer *data=((BaseMaterial* )node)->GetDataInstance();  
  data->SetVector(SIMPLEMATERIAL_COLOR,1.0);  
  updatecount = 0;  
  
  GeData previewData(CUSTOMDATATYPE_MATPREVIEW, DEFAULTVALUE);  
  MaterialPreviewData* preview = (MaterialPreviewData* )previewData.GetCustomDataType(CUSTOMDATATYPE_MATPREVIEW);  
  if (!preview)  
  return FALSE;  
  data->SetData(SIMPLEMATERIAL_MAT_PREVIEW, previewData);  
  
  AutoAlloc<Gradient> gradient;  
  if (!gradient) return FALSE;  
  
  GradientKnot k1,k2;  
  k1.col =Vector(1.0,1.0,1.0);  
  k1.pos =0.0;  
  
  k2.col =1.0;  
  k2.pos =1.0;  
  
  gradient->InsertKnot(k1);  
  gradient->InsertKnot(k2);  
  
  data->SetData(SIMPLEMATERIAL_COLORG,GeData(CUSTOMDATATYPE_GRADIENT,gradient));  
  return TRUE;  
}  
  
INITRENDERRESULT SimpleMaterial::InitRender(BaseMaterial *mat, const InitRenderStruct &irs)  
{  
  BaseContainer *data=mat->GetDataInstance();  
  color = data->GetVector(SIMPLEMATERIAL_COLOR);  
  grad     = (Gradient* )data->GetCustomDataType(SIMPLEMATERIAL_COLORG,CUSTOMDATATYPE_GRADIENT);   
  if (!grad || !grad->InitRender(irs)) return INITRENDERRESULT_OUTOFMEMORY;  
  return INITRENDERRESULT_OK;  
}

.h

enum  
{  
  ID_TESTGROUP = 3000,  
  SIMPLEMATERIAL_COLOR        = 1000,  
  SIMPLEMATERIAL_MAT_PREVIEW  = 1001,  
      SIMPLEMATERIAL_COLORG,  
};

.res

  
  GROUP ID_MATERIALPROPERTIES  
  {  
      DEFAULT 1;  
      COLOR     SIMPLEMATERIAL_COLOR {}  
  }  
  GROUP ID_TESTGROUP  
  {  
      GRADIENT SIMPLEMATERIAL_COLORG {ALPHA;}          
  }

.str

  
  SIMPLEMATERIAL_COLOR    "Color";  
  SIMPLEMATERIAL_COLORG "Testgradient";  
  
  ID_TESTGROUP "Test";

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

On 08/02/2011 at 02:42, xxxxxxxx wrote:

Alpha gradients have to be set their mode before any knot is set.

Example:

  
Bool SDKGradientClass::Init(GeListNode *node)  
{  
  BaseContainer *data = ((BaseShader* )node)->GetDataInstance();  
  
  AutoAlloc<Gradient> gradient;  
  if (!gradient) return FALSE;  
  
  //ust be set before any knot is set  
  gradient->SetData(GRADIENT_MODE, GeData(GRADIENTMODE_ALPHA));  
    
  GradientKnot k1,k2;  
  k1.col =Vector(0.0,0.0,1.0);  
  k1.pos =0.0;  
  
  k2.col =1.0;  
  k2.pos =1.0;  
  
  gradient->InsertKnot(k1);  
  gradient->InsertKnot(k2);  
  
  data->SetData(SDKGRADIENTSHADER_COLOR,GeData(CUSTOMDATATYPE_GRADIENT,gradient));  
    
  return TRUE;  
}  

I will update the docs accordingly.

cheers,
Matthias

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

On 08/02/2011 at 02:54, xxxxxxxx wrote:

thank you Matthias. I confirm it's working fine now. super.