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
jensps: 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).