4
$\begingroup$

I'm working on a simple bake script - if the materials are just colors the script works - but if any of the materials include a texture - then I get a "Circular dependency for image.."

when I manually replicate process of this script - baking works fine.

The script works like this:

for each object within a group named 'bake':

  • create a new image to hold baked texture
  • loop thru each object material + add extra image node
  • bake object
  • remove extra image node

test file: http://www.pasteall.org/blend/39951

# list items in a group names 'bake'

import bpy

# bpy.ops.baketool.bibake() - quick test to use BAKETOOL addon for baking from CI - it works well

bake_size = 512
uv_channel_name = "B"


# function to create new image
def create_new_image(name):
    # create blank image
    bpy.ops.image.new(name=name, width=bake_size, height=bake_size) # new image

    return

# function to add nodes
def add_bake_nodes(mat, name):

    # make sure using nodes
    if mat.use_nodes == False:
        mat.use_nodes = True

    nodes = mat.node_tree.nodes

    node = nodes.new(type="ShaderNodeTexImage")
    bake_img_txt = "bake_img_" + name
    node.name = bake_img_txt
    nodes[bake_img_txt].location = 300, 160
    nodes[bake_img_txt].image = bpy.data.images[name] 
    nodes[bake_img_txt].select = True

    node = nodes.new(type="ShaderNodeUVMap")
    bake_uv_map = "bake_uv_" + name
    node.name = bake_uv_map
    nodes[bake_uv_map].location = 100, 160
    nodes[bake_uv_map].uv_map = uv_channel_name
    # connect nodes
    outn = nodes[bake_uv_map].outputs[0]
    inn = nodes[bake_img_txt].inputs[0]
    mat.node_tree.links.new(outn, inn)

    return

def remove_bake_nodes (mat, name):

    nodes = mat.node_tree.nodes
    bake_img_txt = "bake_img_" + name
    nodes.remove(nodes[bake_img_txt])
    bake_uv_map = "bake_uv_" + name
    nodes.remove(nodes[bake_uv_map])

    return

def select_none():
    for obj in bpy.context.scene.objects:
        obj.select = False
    return

bakegroup = bpy.data.groups['bake']

print ("ITEMS TO BAKE: " + str(len(bakegroup.objects)))

# select none
select_none ()

for object in bakegroup.objects:
    objName = object.name
    print ("name: "+ objName)
    object.select = True
    bpy.context.scene.objects.active = object

    # num materials
    num_materials = len(object.data.materials)

    # create new image for bake
    create_new_image(objName)

    # add bake nodes
    for num in range(0,num_materials):
        print("  -material "+ str(num) + ": "+ object.data.materials[num].name)
        object.active_material_index = num
        material = object.active_material
        # add bake nodes to material
        add_bake_nodes(material, objName)


    # bake object to internal img data
    # assume bake settings are set
    # select UV channel B
    uv_textures = object.data.uv_textures
    uv_textures.active = object.data.uv_textures[uv_channel_name]
    bpy.ops.object.bake(type='COMBINED')

    # remove bake nodes
    for num in range(0,num_materials):
        object.active_material_index = num
        material = object.active_material
        remove_bake_nodes(material, objName)

    object.select = False
$\endgroup$
3
$\begingroup$

Cycles is backing on the texture ( not the new image ) itself because you hasn't changed the active node through the script just add nodes.active = node inside add_bake_nodes() like this :

# function to add nodes
def add_bake_nodes(mat, name):

    # make sure using nodes
    if mat.use_nodes == False:
        mat.use_nodes = True

    nodes = mat.node_tree.nodes

    node = nodes.new(type="ShaderNodeTexImage")
    bake_img_txt = "bake_img_" + name
    node.name = bake_img_txt
    nodes[bake_img_txt].location = 300, 160
    nodes[bake_img_txt].image = bpy.data.images[name] 
    nodes[bake_img_txt].select = True
    nodes.active = node   # set it as active node


   ......

"Circular dependency for image" because the image that is used as a texture (read from ) is the target of the baking (written to )

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.