Material::CopyTo() problems

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

On 16/11/2006 at 13:28, xxxxxxxx wrote:

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

---------
What is wrong with this code? I've tried without COPY_NO_INTERNALS, but the links to the Texture tags are then broken. I've tried calling AliasTrans::Translate after each and at the end (as shown). Is the AliasTrans::Init() document correct (source)? This is getting frustrating as it works to an extent, but the materials don't update properly (show the texture image) and rendering fails.

// Paste Materials  
//*---------------------------------------------------------------------------*  
Bool GeIPPPaste_Materials(BaseDocument* sdoc, BaseObject* sobj, BaseDocument* ddoc, BaseObject* dobj)  
//*---------------------------------------------------------------------------*  
{  
     BaseTag*          stag;  
     BaseTag*          dtag;  
     TextureTag*          sttag;  
     TextureTag*          dttag;  
     Material*          smat;  
     Material*          dmat;  
     GeData               data;  
     String               sname;  
     BOOL               doTranslate =     FALSE;  
  
     AutoAlloc<AliasTrans> aliastrans;  
     if (!(aliastrans && aliastrans->Init(sdoc))) return FALSE;  
     // Materials  
     for (stag = sobj->GetFirstTag(); stag; stag = stag->GetNext())  
     {  
          if (!stag->IsInstanceOf(Ttexture))     continue;  
          sttag =                                        (TextureTag* )stag;  
          sttag->GetParameter(DescID(TEXTURETAG_MATERIAL), data, NULL);  
          smat =                                        static_cast<Material*>(data.GetLink(sdoc, Mbase));  
          if (!smat)                                   continue;  
          sname =                                        stag->GetName();  
          for (dtag = dobj->GetFirstTag(); dtag; dtag = dtag->GetNext())  
          {  
               if (!dtag->IsInstanceOf(Ttexture))     continue;  
               dttag =                                        (TextureTag* )dtag;  
               dttag->GetParameter(DescID(TEXTURETAG_MATERIAL), data, NULL);  
               dmat =                                        static_cast<Material*>(data.GetLink(ddoc, Mbase));  
               if (!dmat)                                   continue;  
               if (dtag->GetName() != sname)          continue;  
               // Found matching materials, copy  
               if (!smat->CopyTo(dmat, COPY_NO_INTERNALS, aliastrans))     continue; //aliastrans->Translate(TRUE);  
               dmat->Update(TRUE, TRUE);  
               dmat->Message(MSG_CHANGE);  
               doTranslate =     TRUE;  
               break;  
          }  
     }  
     if (doTranslate)     aliastrans->Translate(TRUE);  
     return TRUE;  
}

Thanks,

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

On 16/11/2006 at 15:03, xxxxxxxx wrote:

Okay, this code is mostly working, but I still have to either render or Material Manager->Apply to get the material changes to show in the View.

How do I do that, please?

// Paste Materials  
//*---------------------------------------------------------------------------*  
Bool GeIPPPaste_Materials(BaseDocument* sdoc, BaseObject* sobj, BaseDocument* ddoc, BaseObject* dobj)  
//*---------------------------------------------------------------------------*  
{  
     AutoAlloc<AliasTrans>     aliastrans;  
     AutoAlloc<AtomArray>     matArray;  
     AutoAlloc<AtomArray>     tagArray;  
     if (!(matArray && tagArray && aliastrans && aliastrans->Init(sdoc))) return FALSE;  
  
     BaseTag*          stag;  
     BaseTag*          dtag;  
     TextureTag*          sttag;  
     TextureTag*          dttag;  
     Material*          smat;  
     Material*          dmat;  
     GeData               data;  
     String               sname;  
  
     // Materials  
     for (stag = sobj->GetFirstTag(); stag; stag = stag->GetNext())  
     {  
          if (!stag->IsInstanceOf(Ttexture))     continue;  
          sttag =                                        (TextureTag* )stag;  
          sttag->GetParameter(DescID(TEXTURETAG_MATERIAL), data, NULL);  
          smat =                                        static_cast<Material*>(data.GetLink(sdoc, Mbase));  
          if (!smat)                                   continue;  
          sname =                                        stag->GetName();  
          for (dtag = dobj->GetFirstTag(); dtag; dtag = dtag->GetNext())  
          {  
               if (!dtag->IsInstanceOf(Ttexture))     continue;  
               dttag =                                        (TextureTag* )dtag;  
               dttag->GetParameter(DescID(TEXTURETAG_MATERIAL), data, NULL);  
               dmat =                                        static_cast<Material*>(data.GetLink(ddoc, Mbase));  
               if (!dmat)                                   continue;  
               if (dtag->GetName() != sname)          continue;  
               // Found matching materials, copy  
               if (!smat->CopyTo(dmat, COPY_NO_BITS, aliastrans)) continue;  
               matArray->Append(dmat);  
               tagArray->Append(dttag);  
               break;  
          }  
     }  
     LONG     count =     matArray->GetCount();  
     if (count)  
     {  
          aliastrans->Translate(TRUE);  
          for (LONG i = 0; i < count; i++)  
          {  
               dmat =          static_cast<Material*>(matArray->GetIndex(i));  
               dttag =          static_cast<TextureTag*>(tagArray->GetIndex(i));  
               dttag->SetMaterial(dmat);  
               dmat->Update(TRUE, TRUE);  
               dmat->Message(MSG_CHANGE);  
               dttag->Message(MSG_UPDATE);  
          }  
     }  
     return TRUE;  
}

Thanks,

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

On 16/11/2006 at 15:29, xxxxxxxx wrote:

Seems that I needed this as well:

  
          ....  
          aliastrans->Translate(TRUE);  
          for (LONG i = 0; i < count; i++)  
          {  
               dmat =          static_cast<Material*>(matArray->GetIndex(i));  
               dttag =          static_cast<TextureTag*>(tagArray->GetIndex(i));  
               dttag->SetMaterial(dmat);  
               dmat->Update(TRUE, TRUE);  
               dmat->Message(MSG_CHANGE);  
               dttag->Message(MSG_UPDATE);  
               dobj->Message(MSG_UPDATE);  
          }  
          ...  

Thanks for the conversation! ;)

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

On 18/11/2006 at 08:09, xxxxxxxx wrote:

lol, you are too fast in finding your own bugs. ;-)

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

On 18/11/2006 at 10:01, xxxxxxxx wrote:

The worst part is that there is no example of using CopyTo() with Materials. They neglect the little bit about needing to relink them in the Texture tag and I still don't know why the Object needs to be updated - but heck, it works. ;)