3
$\begingroup$

I am trying to bake image from the script in cycles mode. In my node structure, since I am baking in cycles engine, I am adding an extra image texture node, with image input of a newly created image (named uv_image) and I am making this uv_image texture node my active node. Now I select the object and do a bake using bpy.ops.object.bake(). Here is the code I am executing :

    uv_image = "UV_image"
    bpy.data.images.new(name=uv_image,width = 1024,height = 1024)

    mat = bpy.data.materials[material.name]

    nodes = mat.node_tree.nodes
    node = nodes.new('ShaderNodeTexImage')
    node.location = 300,0
    node.label = 'uv_image'
    node.name = 'uv_image'
    node.image = bpy.data.images[uv_image]
    uv_img = bpy.data.images[uv_image]
    node.select = True
    nodes.active = node
    for area in bpy.context.screen.areas :
        if area.type == 'IMAGE_EDITOR' :
            area.spaces.active.image = uv_img

    for ob in bpy.data.objects:
        if 'pattern' in ob.name: #object of interest has the name pattern)
            ob.select = True
            bpy.context.scene.objects.active = ob
        else:
            ob.select = False   

    bpy.ops.object.bake(type='COMBINED')

The output baked image is blank when I am doing this from the script without any texture baked and it happens instantaneously. (Usually bake takes a few seconds) But when I execute the code without the bpy.ops.object.bake() statement and hit the bake button in GUI, the baked image is perfect. Another observation is that, once I bake in GUI, from then on, when I execute and bake from script, it works. So, everytime I need to bake it in GUI once to get this code working from script. It is really frustating!

EDIT 1:

By using bpy.ops.object.bake('INVOKE_DEFAULT', type='COMBINED'), I can see the texture getting baked well on the uv_image but when I tried to save the baked image through the following lines of code which follow the bake statement, I get a blank image in the destination folder. I think image is getting saved before it is getting updated with the baked texture. I tried to include image.update() before saving but that did not help.

 for image in bpy.data.images:
    if "UV_" in image.name:

        image = bpy.data.images[image.name]
        scene=bpy.context.scene
        scene.render.image_settings.file_format='JPEG'

        image_path = img_path + str(cg)+"_"+image.name+".jpg"
        image.save_render(image_path,scene)

EDIT 2:

If I add a time delay in the following way:

import time
time.sleep(60)

and I wait till the bake is complete and then save, then the image is saved after the entire bake. So, I am guessing that INVOKE_DEFAULT runs the baking in parallel without blocking the image being baked? Is this correct? Can someone help me find the documentation for INVOKE_DEFAULT along with other parameters ?

$\endgroup$
7
  • $\begingroup$ I have tried your script and it works... so there may be another contextual reason if you don't obtain the result ? $\endgroup$
    – lemon
    Jul 14, 2016 at 9:32
  • $\begingroup$ Yea, I think so too. Any idea how to get the same context from code? $\endgroup$
    – Sum-Al
    Jul 14, 2016 at 10:55
  • $\begingroup$ No... can this help you to compare ? <img src="http://blend-exchange.giantcowfilms.com/embedImage.png?bid=1580" /> $\endgroup$
    – lemon
    Jul 14, 2016 at 11:01
  • 2
    $\begingroup$ Try bpy.ops.object.bake('INVOKE_DEFAULT', type='COMBINED') $\endgroup$
    – batFINGER
    Jul 14, 2016 at 14:26
  • $\begingroup$ Seems to work for now. Thanks! I'll run it more and update the status again in a couple of days. $\endgroup$
    – Sum-Al
    Jul 15, 2016 at 7:14

0

Your Answer

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