[Bf-blender-cvs] [1dab208] asset-experiments: Various improvements to obj preview generation:

Bastien Montagne noreply at git.blender.org
Fri Dec 19 14:30:27 CET 2014


Commit: 1dab208eb8dcb35719f32d6abd7e8b074de72506
Author: Bastien Montagne
Date:   Fri Dec 19 14:29:06 2014 +0100
Branches: asset-experiments
https://developer.blender.org/rB1dab208eb8dcb35719f32d6abd7e8b074de72506

Various improvements to obj preview generation:

* Do not render cameras, lamps etc. for now.
* Generate bbox in camera local space, gives much better results.
* Add an op to clear previews from files.

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

M	release/scripts/modules/bl_previews_utils/bl_previews_render.py
M	release/scripts/startup/bl_operators/system_generate_blendfile_previews.py
M	source/blender/makesrna/intern/rna_ID.c

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

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 e25aac1..dbeb350 100644
--- a/release/scripts/modules/bl_previews_utils/bl_previews_render.py
+++ b/release/scripts/modules/bl_previews_utils/bl_previews_render.py
@@ -42,13 +42,13 @@ def object_children_recursive(ob):
         yield child
         yield from object_children_recursive(child)
 
-def object_merge_bbox(bbox, ob):
+def object_merge_bbox(bbox, ob, ob_space):
     if ob.bound_box:
         ob_bbox = ob.bound_box
     else:
-        ob_bbox = ((0.0, 0.0, 0.0),)
+        ob_bbox = ((-ob.scale.x, -ob.scale.y, -ob.scale.z), (ob.scale.x, ob.scale.y, ob.scale.z))
     for v in ob.bound_box:
-        v = ob.matrix_world * Vector(v)
+        v = ob_space.matrix_world.inverted() * ob.matrix_world * Vector(v)
         if bbox[0].x > v.x:
             bbox[0].x = v.x
         if bbox[0].y > v.y:
@@ -110,14 +110,19 @@ def do_previews_bi(do_objects, do_groups):
         for root in bpy.data.objects:
             if root in objects_ignored:
                 continue
+            if root.type not in {'MESH', 'CURVE', 'SURFACE', 'META', 'FONT'}:
+                continue
             bbox = (Vector((1e9, 1e9, 1e9)), Vector((-1e9, -1e9, -1e9)))
-            objects = (root,) + tuple(object_children_recursive(ob))
+            objects = (root,) # + tuple(object_children_recursive(ob))
             for ob in objects:
                 if ob.name not in render_scene.objects:
                     render_scene.objects.link(ob)
                 ob.hide_render = False
                 render_scene.update()
-                object_merge_bbox(bbox, ob)
+                object_merge_bbox(bbox, ob, render_camera)
+            # Our bbox has been generated in camera local space, bring it back in world one
+            bbox[0][:] = render_camera.matrix_world * bbox[0]
+            bbox[1][:] = render_camera.matrix_world * bbox[1]
             cos = (
                 bbox[0].x, bbox[0].y, bbox[0].z,
                 bbox[0].x, bbox[0].y, bbox[1].z,
@@ -170,6 +175,15 @@ def do_previews_bi(do_objects, do_groups):
     bpy.ops.wm.save_mainfile()
 
 
+def do_clear_previews(do_objects, do_groups):
+    if do_objects:
+        for ob in bpy.data.objects:
+            ob.preview.image_size = (0, 0)
+
+    print("Saving %s..." % bpy.data.filepath)
+    bpy.ops.wm.save_mainfile()
+
+
 def main():
     try:
         import bpy
@@ -184,11 +198,15 @@ def main():
 
     import argparse
     parser = argparse.ArgumentParser(description="Use Blender to generate previews for currently open Blender file's items.")
-    parser.add_argument('--no_objects', default=True, action="store_false", help="Do not generate previews for object IDs.")
-    parser.add_argument('--no_groups', default=True, action="store_false", help="Do not generate previews for group IDs.")
+    parser.add_argument('--clear', default=False, action="store_true", help="Clear previews instead of generating them.")
+    parser.add_argument('--no_objects', default=True, action="store_false", help="Do not generate/clear previews for object IDs.")
+    parser.add_argument('--no_groups', default=True, action="store_false", help="Do not generate/clear previews for group IDs.")
     args = parser.parse_args()
 
-    do_previews_bi(do_objects=args.no_objects, do_groups=args.no_groups)
+    if args.clear:
+        do_clear_previews(do_objects=args.no_objects, do_groups=args.no_groups)
+    else:
+        do_previews_bi(do_objects=args.no_objects, do_groups=args.no_groups)
 
     sys.argv = back_argv
 
diff --git a/release/scripts/startup/bl_operators/system_generate_blendfile_previews.py b/release/scripts/startup/bl_operators/system_generate_blendfile_previews.py
index 4638595..213dc4a 100644
--- a/release/scripts/startup/bl_operators/system_generate_blendfile_previews.py
+++ b/release/scripts/startup/bl_operators/system_generate_blendfile_previews.py
@@ -42,7 +42,7 @@ import subprocess
 
 
 class SYSTEM_OT_generate_previews(Operator):
-    """Generate .blend file's branches (po files)"""
+    """Generate selected .blend file's object previews"""
     bl_idname = "system.blend_generate_previews"
     bl_label = "Generate Blend Files Previews"
     bl_options = {'REGISTER'}
@@ -86,3 +86,50 @@ class SYSTEM_OT_generate_previews(Operator):
         context.window_manager.progress_end()
 
         return {'FINISHED'}
+
+class SYSTEM_OT_clear_previews(Operator):
+    """Clear selected .blend file's object previews"""
+    bl_idname = "system.blend_clear_previews"
+    bl_label = "Clear Blend Files Previews"
+    bl_options = {'REGISTER'}
+
+    # -----------
+    # File props.
+    files = CollectionProperty(type=bpy.types.OperatorFileListElement, options={'HIDDEN', 'SKIP_SAVE'})
+
+    directory = StringProperty(maxlen=1024, subtype='FILE_PATH', options={'HIDDEN', 'SKIP_SAVE'})
+
+    # Show only images/videos, and directories!
+    filter_blender = BoolProperty(default=True, options={'HIDDEN', 'SKIP_SAVE'})
+    filter_folder = BoolProperty(default=True, options={'HIDDEN', 'SKIP_SAVE'})
+
+    def invoke(self, context, event):
+        context.window_manager.fileselect_add(self)
+        return {'RUNNING_MODAL'}
+
+    def execute(self, context):
+        context.window_manager.progress_begin(0, len(self.files))
+        context.window_manager.progress_update(0)
+        for i, fn in enumerate(self.files):
+            blen_path = os.path.join(self.directory, fn.name)
+            cmmd = (
+                bpy.app.binary_path,
+                #~ "--background",
+                "--factory-startup",
+                blen_path,
+                "--python",
+                os.path.join(os.path.dirname(preview_render.__file__), "bl_previews_render.py"),
+                "--",
+                "bl_previews_render.py",  # arg parser expects first arg to be prog name!
+                "--clear",
+            )
+            # Not working (UI is not refreshed...).
+            #self.report({'INFO'}, "Extracting messages, this will take some time...")
+            if subprocess.call(cmmd):
+                self.report({'ERROR'}, "Previews clearing process failed for file '%s'!" % blend_path)
+                context.window_manager.progress_end()
+                return {'CANCELLED'}
+            context.window_manager.progress_update(i + 1)
+        context.window_manager.progress_end()
+
+        return {'FINISHED'}
diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c
index 1f80083..5f23729 100644
--- a/source/blender/makesrna/intern/rna_ID.c
+++ b/source/blender/makesrna/intern/rna_ID.c
@@ -441,7 +441,9 @@ static void rna_IDPreview_size_set(PointerRNA *ptr, const int *values, enum eIco
 
 	BKE_previewimg_clear(prv_img, size);
 
-	prv_img->rect[size] = MEM_callocN(values[0] * values[1] * sizeof(unsigned int), "prv_rect");
+	if (values[0] && values[1]) {
+		prv_img->rect[size] = MEM_callocN(values[0] * values[1] * sizeof(unsigned int), "prv_rect");
+	}
 
 	prv_img->w[size] = values[0];
 	prv_img->h[size] = values[1];




More information about the Bf-blender-cvs mailing list