Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware 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

    Material::CopyTo() problems

    SDK Help
    0
    5
    446
    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

      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,

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

        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,

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

          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! 😉

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

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

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

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

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