Create Material Filename Track

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

On 01/09/2008 at 03:45, xxxxxxxx wrote:

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

---------
Hi,

I am currently trying to set a material's Filename property by using a timeline Track. I successfully did this for object animation in C++ already. I can't seem to find the correct way to create the following Track:

Material->Bitmap->File

How do I create this track to change the Filename for specific frames? (I somehow don't seem to fully understand the correct use of DescID, DescLevel)

Many thanks

Markus

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

On 01/09/2008 at 04:01, xxxxxxxx wrote:

Here is how you access the filename of a texture in the color channel of a standard material.

> \> Bool MenuTest::Execute(BaseDocument \*doc) \> { \>      BaseMaterial \*mat = NULL; \>      mat = doc->GetFirstMaterial(); \>      if(!mat) return TRUE; \> \>      BaseChannel \*ch = NULL; \>      ch = mat->GetChannel(CHANNEL_COLOR); \>      if(!ch) return TRUE; \> \>      PluginShader \*sh = NULL; \>      sh = ch->GetShader(); \>      if(!sh || sh->GetType()!=Xbitmap) return TRUE; \> \>      BaseContainer \*data = sh->GetDataInstance(); \> \>      Filename fn = data->GetFilename(BITMAPSHADER_FILENAME); \> \>      GePrint(fn.GetString()); \> \> \> \>      return TRUE; \> } \>

cheers,
Matthias

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

On 01/09/2008 at 05:43, xxxxxxxx wrote:

Hello Matthias,

thanks for your quick answer.

I already found an example like this, what I'd like to achieve though, is to create a CTrack which changes the Filename based on a certain Frame. I was able to create a Timeline track in Cinema 4D (Material->Bitmap->File) and change the filename manually inserting new keys. How do I replicate this behaviour in C++?

I am tryint to create the CTrack but couldn't figure out how to access the Filename property. Furthermore SetValue only seems to work with "Real" values and there doesn't seem to be a SetString method for keys (although I seem to be able to insert "String"-keys using the Cinema 4D timeline interface.

Many Thanks

Markus

edit:

To clear up what I mean:

In Cinema 4D I open the timeline, open the material (which displays Bitmap), right click on Bitmap, add property track->File. On this track I can create keys being strings that point to a specific file. This is the behaviour I am trying to duplicate in C++.

edit2:

have been trying this so far:

> \>      CTrack\* texture_track; \>      CKey\* current_key = NULL; \> \>      current_key = CKey::Alloc(); \> \>      texture_track = CTrack::Alloc   (bg_material,   DescID(DescLevel(BASECHANNEL_TEXTURE,DTYPE_TEXTURE,0))); \> \>      current_key->SetTime(texture_track->GetCurve(),BaseTime(1, 30)); \>      current_key->SetGeData(texture_track->GetCurve(), GeData("Text")); \>      texture_track->GetCurve()->InsertKey(current_key); \>

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

On 01/09/2008 at 07:54, xxxxxxxx wrote:

This should work:

> \>      BaseMaterial \*mat = NULL; \>      mat = doc->GetFirstMaterial(); \>      if(!mat) return TRUE; \> \>      BaseChannel \*ch = NULL; \>      ch = mat->GetChannel(CHANNEL_COLOR); \>      if(!ch) return TRUE; \> \>      PluginShader \*sh = NULL; \>      sh = ch->GetShader(); \>      if(!sh) \>      { \>           sh = PluginShader::Alloc(Xbitmap); \>           if(!sh) return FALSE; \>           BaseContainer \*data = mat->GetDataInstance(); \>           data->SetLink(MATERIAL_COLOR_SHADER, sh); \>           mat->InsertShader(sh, NULL); \>      } \> \>      else if(sh->GetType()!=Xbitmap) return TRUE; \> \>      CTrack \*track = NULL; \>      track = CTrack::Alloc(sh,DescLevel(BITMAPSHADER_FILENAME,DTYPE_FILENAME,0)); \>      if(!track) return FALSE; \> \>      sh->InsertTrackSorted(track); \> \>      BaseTime time = doc->GetTime(); \> \>      CKey \*key = NULL; \>      key = track->GetCurve()->AddKey(time); if (!key) return FALSE; \> \>      Filename fn("test.jpg"); \> \>      GeData data(fn); \> \>      key->SetGeData(track->GetCurve(), data); \>      key->SetInterpolation(track->GetCurve(), CINTER_STEP); \>

cheers,
Matthias

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

On 01/09/2008 at 08:47, xxxxxxxx wrote:

Many Thanks Matthias,

getting the shader was what I was missing.

Works like charm.

Markus