[Bf-blender-cvs] [ecb79a5] asset-experiments: Preview generation on Windows: attempt to fix mysterious error by using even more ID's names.

Bastien Montagne noreply at git.blender.org
Mon Feb 16 14:56:19 CET 2015


Commit: ecb79a5bd5872e75a36d08db59c904a40242ee70
Author: Bastien Montagne
Date:   Mon Feb 16 14:54:19 2015 +0100
Branches: asset-experiments
https://developer.blender.org/rBecb79a5bd5872e75a36d08db59c904a40242ee70

Preview generation on Windows: attempt to fix mysterious error by using even more ID's names.

Passing around ID's themselves is not safe - they may change their mem addresses.

Yet, I had no issue on linux, but on win build this is still not enough,
have to use a super strange hack (add an 'import sys' line just before where error happens)
to get things running...

===================================================================

M	release/scripts/modules/bl_previews_utils/bl_previews_render.py

===================================================================

diff --git a/release/scripts/modules/bl_previews_utils/bl_previews_render.py b/release/scripts/modules/bl_previews_utils/bl_previews_render.py
index b27ce99..bfb23de 100644
--- a/release/scripts/modules/bl_previews_utils/bl_previews_render.py
+++ b/release/scripts/modules/bl_previews_utils/bl_previews_render.py
@@ -72,7 +72,7 @@ def rna_backup_restore(data, backup):
 def do_previews(do_objects, do_groups, do_scenes, do_data_intern):
     # Helpers.
     RenderContext = collections.namedtuple("RenderContext", (
-        "scene", "world", "camera", "lamp", "camera_data", "lamp_data", "image",
+        "scene", "world", "camera", "lamp", "camera_data", "lamp_data", "image",  # All those are names!
         "backup_scene", "backup_world", "backup_camera", "backup_lamp", "backup_camera_data", "backup_lamp_data",
     ))
 
@@ -151,53 +151,58 @@ def do_previews(do_objects, do_groups, do_scenes, do_data_intern):
         image.filepath = scene.render.filepath
 
         return RenderContext(
-            scene, world, camera, lamp, camera_data, lamp_data, image,
+            scene.name, world.name, camera.name, lamp.name if lamp else None,
+            camera_data.name, lamp_data.name if lamp_data else None, image.name,
             backup_scene, backup_world, backup_camera, backup_lamp, backup_camera_data, backup_lamp_data,
         )
 
     def render_context_delete(render_context):
         # Do not crash here, too much things can go wrong...
         try:
-            scene = render_context.scene
+            scene = bpy.data.scenes[render_context.scene]
             if render_context.backup_scene is None:
                 scene.world = None
                 scene.camera = None
                 if render_context.camera:
-                    scene.objects.unlink(render_context.camera)
+                    scene.objects.unlink(bpy.data.objects[render_context.camera])
                 if render_context.lamp:
-                    scene.objects.unlink(render_context.lamp)
+                    scene.objects.unlink(bpy.data.objects[render_context.lamp])
                 bpy.data.scenes.remove(scene)
                 scene = None
             else:
                 rna_backup_restore(scene, render_context.backup_scene)
+            world = bpy.data.worlds[render_context.world]
             if render_context.backup_world is None:
                 if scene is not None:
                     scene.world = None
-                bpy.data.worlds.remove(render_context.world)
+                bpy.data.worlds.remove(world)
             else:
-                rna_backup_restore(render_context.world, render_context.backup_world)
+                rna_backup_restore(world, render_context.backup_world)
             if render_context.camera:
+                camera = bpy.data.objects[render_context.camera]
                 if render_context.backup_camera is None:
                     if scene is not None:
                         scene.camera = None
-                    bpy.data.objects.remove(render_context.camera)
-                    bpy.data.cameras.remove(render_context.camera_data)
+                    bpy.data.objects.remove(camera)
+                    bpy.data.cameras.remove(bpy.data.cameras[render_context.camera_data])
                 else:
-                    rna_backup_restore(render_context.camera, render_context.backup_camera)
-                    rna_backup_restore(render_context.camera_data, render_context.backup_camera_data)
+                    rna_backup_restore(camera, render_context.backup_camera)
+                    rna_backup_restore(bpy.data.cameras[render_context.camera_data], render_context.backup_camera_data)
             if render_context.lamp:
+                lamp = bpy.data.objects[render_context.lamp]
                 if render_context.backup_lamp is None:
-                    bpy.data.objects.remove(render_context.lamp)
-                    bpy.data.lamps.remove(render_context.lamp_data)
+                    bpy.data.objects.remove(lamp)
+                    bpy.data.lamps.remove(bpy.data.lamps[render_context.lamp_data])
                 else:
-                    rna_backup_restore(render_context.lamp, render_context.backup_lamp)
-                    rna_backup_restore(render_context.lamp_data, render_context.backup_lamp_data)
+                    rna_backup_restore(lamp, render_context.backup_lamp)
+                    rna_backup_restore(bpy.data.lamps[render_context.lamp_data], render_context.backup_lamp_data)
         except Exception as e:
             print("ERROR:", e)
             return False
 
-        render_context.image.user_clear()
-        bpy.data.images.remove(render_context.image)
+        image = bpy.data.images[render_context.image]
+        image.user_clear()
+        bpy.data.images.remove(image)
         return True
 
     def objects_render_engine_guess(obs):
@@ -231,14 +236,14 @@ def do_previews(do_objects, do_groups, do_scenes, do_data_intern):
             if bbox[1].z < v.z:
                 bbox[1].z = v.z
 
-    def objects_bbox_calc(render_context, objects):
+    def objects_bbox_calc(camera, objects):
         bbox = (Vector((1e9, 1e9, 1e9)), Vector((-1e9, -1e9, -1e9)))
         for obname in objects:
             ob = bpy.data.objects[obname]
-            object_bbox_merge(bbox, ob, render_context.camera)
+            object_bbox_merge(bbox, ob, camera)
         # Our bbox has been generated in camera local space, bring it back in world one
-        bbox[0][:] = render_context.camera.matrix_world * bbox[0]
-        bbox[1][:] = render_context.camera.matrix_world * bbox[1]
+        bbox[0][:] = camera.matrix_world * bbox[0]
+        bbox[1][:] = camera.matrix_world * bbox[1]
         cos = (
             bbox[0].x, bbox[0].y, bbox[0].z,
             bbox[0].x, bbox[0].y, bbox[1].z,
@@ -251,22 +256,26 @@ def do_previews(do_objects, do_groups, do_scenes, do_data_intern):
         )
         return cos
 
-    def preview_render_do(render_context, item, objects):
+    def preview_render_do(render_context, item_container, item_name, objects):
+        scene = bpy.data.scenes[render_context.scene]
         if objects is not None:
-            cos = objects_bbox_calc(render_context, objects)
-            if render_context.camera:  # This shall always be valid!
-                loc, ortho_scale = render_context.camera.camera_fit_coords(render_context.scene, cos)
-                render_context.camera.location = loc
-            if render_context.lamp:
-                loc, ortho_scale = render_context.lamp.camera_fit_coords(render_context.scene, cos)
-                render_context.lamp.location = loc
-        render_context.scene.update()
+            camera = bpy.data.objects[render_context.camera]
+            lamp = bpy.data.objects[render_context.lamp] if render_context.lamp is not None else None
+            cos = objects_bbox_calc(camera, objects)
+            loc, ortho_scale = camera.camera_fit_coords(scene, cos)
+            camera.location = loc
+            if lamp:
+                loc, ortho_scale = lamp.camera_fit_coords(scene, cos)
+                lamp.location = loc
+        scene.update()
 
         bpy.ops.render.render(write_still=True)
 
-        render_context.image.reload()
+        image = bpy.data.images[render_context.image]
+        item = getattr(bpy.data, item_container)[item_name]
+        image.reload()
         pix = tuple((round(r * 255)) + (round(g * 255) << 8) + (round(b * 255) << 16) + (round(a * 255) << 24)
-                    for r, g, b, a in zip(*[iter(render_context.image.pixels)] * 4))
+                    for r, g, b, a in zip(*[iter(image.pixels)] * 4))
         item.preview.image_size = (128, 128)
         item.preview.image_pixels = pix
 
@@ -302,20 +311,33 @@ def do_previews(do_objects, do_groups, do_scenes, do_data_intern):
             if render_context is None:
                 render_context = render_context_create(render_engine, objects_ignored)
                 render_contexts[render_engine] = render_context
-            bpy.context.screen.scene = render_context.scene
+
+            scene = bpy.data.scenes[render_context.scene]
+            bpy.context.screen.scene = scene
 
             for obname in objects:
                 ob = bpy.data.objects[obname]
-                if obname not in render_context.scene.objects:
-                    render_context.scene.objects.link(ob)
+                if obname not in scene.objects:
+                    scene.objects.link(ob)
                 ob.hide_render = False
-            render_context.scene.update()
-
-            preview_render_do(render_context, root, objects)
-
+            scene.update()
+
+            preview_render_do(render_context, 'objects', root.name, objects)
+
+            # XXX Hyper Super Uber Suspicious Hack!
+            #     Without this, on windows build, script excepts with following message:
+            #         Traceback (most recent call last):
+            #         File "<string>", line 1, in <module>
+            #         File "<string>", line 451, in <module>
+            #         File "<string>", line 443, in main
+            #         File "<string>", line 327, in do_previews
+            #         OverflowError: Python int too large to convert to C long
+            #    ... :(
+            import sys
+            scene = bpy.data.scenes[render_context.scene]
             for obname in objects:
                 ob = bpy.data.objects[obname]
-                render_context.scene.objects.unlink(ob)
+                scene.objects.unlink(ob)
                 ob.hide_render = True
 
         for ob, is_rendered in zip(bpy.data.objects, prev_shown):
@@ -332,16 +354,19 @@ def do_previews(do_objects, do_groups, do_scenes, do_data_intern):
             if render_context is None:
                 render_context = render_context_create(render_engine, objects_ignored)
                 render_contexts[render_engine] = render_context
-            bpy.context.screen.scene = render_context.scene
+
+            scene = bpy.data.scenes[render_context.scene]
+            bpy.context.screen.scene = scene
 
             bpy.ops.object.group_instance_add(group=grp.name)
-            grp_ob = next

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list