[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