Get all shaders use in a material
On 24/10/2017 at 00:47, xxxxxxxx wrote:
Cinema 4D Version: R18
Platform: Windows ;
Language(s) : C++ ;
I need to know if there is any Color Shader in a Material parameter.
To do that I parse the inserted shaders in the material via GetFirstShader and GetNext.
I suppose I also have to parse the retrieved shaders recursively.
Is this the correct way to get all the shaders used in a material ?
Thank you for your time !
On 24/10/2017 at 01:21, xxxxxxxx wrote:
Hi Peterakos, your assumption is correct.
Actually traversing the shader tree almost behaves to the same "rules" of traversing the scene tree.
On 26/10/2017 at 05:17, xxxxxxxx wrote:
in general Riccardo's answer is correct. But we figured out, one will be missing a few corner cases with this approach.
There are some shaders which support sub-shaders, but for historic and/or architectural reasons these do not insert their sub-shaders into the shader tree of a material.
For these you will need to do a separate traversal starting with the shader(s) from their parameters.
Here are the shaders, their IDs and shader parameters:
Colorizer (ID: Xcolorizer from xslacolorizer.h, parameter SLA_COLORIZER_TEXTURE)
MoGraph MultiShader (ID: 1019397, parameters MGMULTISHADER_LAYER_LINK (first shader, next ones follow by +1) and MGMULTISHADER_LAYERCOUNT (number of shaders) from xmg_multi.h)
Sketch&Toon Art Shader (ID: 1012161, parameters ARTSHADER_TEXTURE, ARTSHADER_SHADOW_TEXTURE and ARTSHADER_BACKFACE_TEXTURE from xartshader.h)
Sketch&Toon Hatch Shader (ID: 1012166, parameter HATCHINGSHADER_TEXTURE from xhatchingshader.h)
Sketch&Toon Spots Shader (ID: 1012160, parameter SPOTSHADER_GAP_TEXTURE from xspotshader.h)
You might consider to browse the descriptions of shaders for shader links to end up with a generic implementation. But then be extra careful you don't end in an endless loop, with shaders which do insert sub-shaders intro the tree (e.g. layer shader).