Material Plugin



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

    On 20/02/2010 at 10:07, xxxxxxxx wrote:

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

    ---------
    I am trying to create a MaterialData plugin.   I have included a Shaderlink in to a channel.   I would like that when the user selects and option afrom that shader link, that choice becomes the surface of the material.  FOr example, if they choose and image, I would like that image to become the surface of the material.  How do I go about doing this?  I assume this is done in CalcSurface().    Is there an example in the SDK that shows how to accomplish this?

    Thanks,

    ~Shawn



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

    On 24/02/2010 at 02:24, xxxxxxxx wrote:

    Yes, you have to overwrite CalcSurface(). To sample the shader link use PluginShader::Sample(). You have to generate the texure projection manually. See the example code of TexData in the SDK docu.

    here a simple example, it samples a shader using UV projection (make sure the texture tag is set to UVW projection) :

      
    /////////////////////////////////////////////////////////////  
    // CINEMA 4D SDK                                           //  
    /////////////////////////////////////////////////////////////  
    // (c) 1989-2004 MAXON Computer GmbH, all rights reserved  //  
    /////////////////////////////////////////////////////////////  
      
    // volumetric shader example that accesses particles and displays its own preview  
    // absolutely not optimized for speed  
      
    #include "c4d.h"  
    #include "c4d_symbols.h"  
      
    #include "mparticlevolume.h"  
      
      
    class ParticleVolume : public MaterialData  
    {  
      public:  
          virtual Bool Init(GeListNode *node);  
      
          virtual    LONG GetRenderInfo(PluginMaterial *mat) { return 0; }  
      
          virtual LONG InitRender(PluginMaterial *mat, InitRenderStruct *irs);  
          virtual void FreeRender(PluginMaterial *mat);  
      
          virtual    void CalcSurface(PluginMaterial *mat, VolumeData *vd);  
      
          static NodeData *Alloc(void) { return gNew ParticleVolume; }  
      
      private:  
          PluginShader *shader;  
    };  
      
    Bool ParticleVolume::Init(GeListNode *node)  
    {  
      shader=NULL;  
      
      BaseContainer *data = ((PluginShader* )node)->GetDataInstance();  
      
      data->SetLink(MY_SHADER, NULL);  
      
      return TRUE;  
    }  
      
    LONG ParticleVolume::InitRender(PluginMaterial *mat, InitRenderStruct *irs)  
    {  
      BaseContainer *data = mat->GetDataInstance();  
      
    //    cd.t = irs->time.Get();  
      
      shader  = (PluginShader* )data->GetLink(MY_SHADER,irs->doc,Xbase);  
      if (shader) return shader->InitRender(irs);  
      
      return LOAD_OK;  
    }  
      
    void ParticleVolume::FreeRender(PluginMaterial *mat)  
    {  
      if (shader) shader->FreeRender();  
      shader=NULL;  
    }  
      
    void ParticleVolume::CalcSurface(PluginMaterial *mat, VolumeData *vd)  
    {  
      vd->trans = 0.0;  
      
      ChannelData cd(vd);  
      
      Vector uv;  
      
      cd.p = vd->GetPointUVW(vd->tex, vd->lhit, vd->p);  
      
      if (shader)  
      {  
          vd->col = shader->Sample(&cd);  
      }  
    }  
      
      
    // be sure to use a unique ID obtained from www.plugincafe.com  
    #define ID_PARTICLEVOLUME    1001163  
      
    Bool RegisterParticleVolume(void)  
    {  
      // decide by name if the plugin shall be registered - just for user convenience  
      String name=GeLoadString(IDS_PARTICLEVOLUME); if (!name.Content()) return TRUE;  
      
      name = GeGetDefaultFilename(DEFAULTFILENAME_SHADER_VOLUME)+name; // place in default Shader section  
      
      return RegisterMaterialPlugin(ID_PARTICLEVOLUME,name,0,ParticleVolume::Alloc,"MParticleVolume",0);  
    }  
    

    cheers,
    Matthias


Log in to reply