6
$\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$

1 Answer 1

4
$\begingroup$

Cycles is baking on the texture ( not the new image ) itself because you haven'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$
0

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .