Shader Tree

下面的代码递归遍历C4D中的shader。 首先遍历doc中的所有material,因每个material都是一个shader网络,要先获取其第一个shader,这是一个GeListNode实例,也是个4D列表。剩下就是遍历了。

import c4d, os
 
############################################################
# 递归函数,在其中操作shader
############################################################
def shadertree(shader):
    # 遍历 BaseList
    while(shader):         
        # 操作shader,这里简单输出其名字
        print shader.GetName()
        # 查看文件名
        if shader.GetType() == c4d.Xbitmap:
            filename = shader[c4d.BITMAPSHADER_FILENAME]
            print filename
            # 修改实例的文件名
            filename = os.path.basename(filename)
            shader[c4d.BITMAPSHADER_FILENAME] = filename
         
        # 检查是否有子类,递归处理
        if shader.GetDown():
             shadertree(shader.GetDown())       
        shader = shader.GetNext()
         
############################################################
# main function
############################################################
def main():
    # 获取第一个material
    mat = doc.GetFirstMaterial()
    # 遍历 materials
    while(mat):
        # 拿第一个shader
        # 这是个4D列表
        shd = mat.GetFirstShader()
        # 用上面的递归函数处理
        shadertree(shd)
        # 来,下一个
        mat = mat.GetNext()
 
if__name__=='__main__':
    main()

推荐阅读更多精彩内容