Reading Materials



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

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

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

    ---------
    Hello,

    Am writing a C4D importer using melange , the problem is I can read materials using 
    baseDoc->GetFirstMaterial(); and then loop to read all materials , the problem is that I can't find which material is assigned to what object ( by object I mean PolygonObject) ?

    I appreciate any help , 
    Regards. 
    Mohammad



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

    On 21/10/2010 at 02:40, xxxxxxxx wrote:

    now I figured out how to find which material is assigned to what object , but can't read material properties using melange,  is that even possible ?



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

    On 08/11/2010 at 06:36, xxxxxxxx wrote:

    hi,

    here's an example (without error checking) :

    // get object
    BaseObject *myImportedObject = myImportedDocument->GetFirstObject();

    // get texture tag
    TextureTag *tTag = myImportedObject->GetTag(Ttexture);

    // get material
    BaseMaterial *mat = tTag->GetMaterial();

    // get color parameter of color channel
    GeData data;
    mat->GetParameter(MATERIAL_COLOR_COLOR, data))
    Vector col = data.GetVector();

    // shader
    BaseShader* sh = mat->GetShader(MATERIAL_COLOR_SHADER);
    ...

    btw. if you need the internal name of a paramter the console window can show it, just drag the parameter into the edit field of the console windwow (menu Window->Console...)

    cheers
    jens

    ps: the included commandline project shows shows a lot of examples like this, please have a look into "C4DImportExport.cpp"



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

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

    BTW, I'm not sure if this is still the case with R12 and/or Melange, but tTag->GetMaterial() doesn't always mean that you'll be looking at a standard material (it could be a shader). I always do a: if(mat->GetType() == Mmaterial) check on it.

    As mentioned, this may no longer be necessary (?).



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

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

    Originally posted by xxxxxxxx

    BTW, I'm not sure if this is still the case with R12 and/or Melange, but tTag->GetMaterial() doesn't always mean that you'll be looking at a standard material (it could be a shader)

    Could you elaborate what you mean by this? how could it be a shader? A material tag does only take a material.



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

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

    May be an issue of Symantics... what I mean is things like plugin materials (VRay), or Banzi, Danel, Cheen, etc. Create one of those in a document, then drop it on a model... you get a Texture Tag. When you call that tag's GetMaterial() method, you get a result, but the type is not Mmaterial... meaning that it's also _not_ a BaseMaterial*, so calling BaseMaterial::() methods on it will crash the app.

    Again.. this is from my early experience (and much to my chagrin) starting back with R7. I don't know if it's still an issue or not.



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

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

    ...actually, I may be mis-remembering this situation. I _think_ what happens is that tTag->GetMaterial() returns NULL if it's not a Mmaterial - and I was accessing the NULL pointer (no error-checking) causing the crash. But I'm also doing that type-check, so I may have run into some other (or similar) issue as described above.



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

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

    Originally posted by xxxxxxxx

    May be an issue of Symantics... what I mean is things like plugin materials (VRay), or Banzi, Danel, Cheen, etc. Create one of those in a document, then drop it on a model... you get a Texture Tag. When you call that tag's GetMaterial() method, you get a result, but the type is not Mmaterial... meaning that it's also _not_ a BaseMaterial*, so calling BaseMaterial::() methods on it will crash the app.

    Again.. this is from my early experience (and much to my chagrin) starting back with R7. I don't know if it's still an issue or not.

    Hmm, it should still be a BaseMaterial. Every material, may it be from a plugin or the standard material, is a basematerial, it was just an inherited type namely PluginMaterial (in preR12) and then probably of type Mplugin (or the according plugin id). Or do you mean something else? At least that´s my understanding.



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

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

    Frankly, it's been several years since I worked through this issue, so my memory on the subject is a little iffy :) ... but what I am basically doing is some of:

      
         if( pBaseMat->GetChannelState(CHANNEL_COLOR) )   
         {   
              pChannel = pBaseMat->GetChannel(CHANNEL_COLOR);   
              bc = pChannel->GetData();   
              preset = Vector(1.0, 1.0, 1.0);   
              vVal = bc.GetVector(BASECHANNEL_COLOR_EX, preset);   
              rBright = bc.GetReal(BASECHANNEL_BRIGHTNESS_EX, 1.0);   
              pMat->diffuse[0] = vVal.x * rBright;   
              pMat->diffuse[1] = vVal.y * rBright;   
              pMat->diffuse[2] = vVal.z * rBright;   
              txName = bc.GetString(BASECHANNEL_TEXTURE);   
              cmpGetCString7(txName, pMat->szMap_Kd, MAX_MAPNAME_LEN);   
              pMat->kd = true;   
         }   
    

    ...and similar code for other channels (transparency, luminance, etc). Somewhere in the mix of all that is an issue - if it's a Plugin material, or a Banzi/Banji type shader (they don't have those channels).

    EDIT: Hmm... actually, I was casting it to a Material* (not BaseMaterial), so that's probably where the issue was. It's only a " Material " if the type is Mmaterial (GetChannelState() is a member of the Material class).


Log in to reply