[Bf-blender-cvs] [5b48abf] experimental-build: Squashed commit of asset-experiments branch.

Bastien Montagne noreply at git.blender.org
Tue Jun 16 18:13:19 CEST 2015


Commit: 5b48abf1f19923bd205fe08edae30f028e25fc84
Author: Bastien Montagne
Date:   Tue Jun 16 18:12:24 2015 +0200
Branches: experimental-build
https://developer.blender.org/rB5b48abf1f19923bd205fe08edae30f028e25fc84

Squashed commit of asset-experiments branch.

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

A	release/scripts/modules/bl_previews_utils/bl_previews_render.py
M	release/scripts/startup/bl_operators/__init__.py
A	release/scripts/startup/bl_operators/file.py
M	release/scripts/startup/bl_operators/wm.py
M	release/scripts/startup/bl_ui/space_filebrowser.py
M	release/scripts/startup/bl_ui/space_info.py
M	source/blender/blenkernel/BKE_idcode.h
M	source/blender/blenkernel/intern/group.c
M	source/blender/blenkernel/intern/icons.c
M	source/blender/blenkernel/intern/idcode.c
M	source/blender/blenkernel/intern/object.c
M	source/blender/blenkernel/intern/scene.c
M	source/blender/blenlib/BLI_fileops.h
M	source/blender/blenlib/BLI_fileops_types.h
M	source/blender/blenlib/intern/BLI_filelist.c
M	source/blender/blenloader/BLO_readfile.h
M	source/blender/blenloader/intern/readblenentry.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/editors/include/ED_fileselect.h
M	source/blender/editors/include/UI_interface.h
M	source/blender/editors/include/UI_interface_icons.h
M	source/blender/editors/interface/interface.c
M	source/blender/editors/interface/interface_icons.c
M	source/blender/editors/interface/interface_intern.h
M	source/blender/editors/interface/interface_templates.c
M	source/blender/editors/space_file/file_draw.c
M	source/blender/editors/space_file/file_intern.h
M	source/blender/editors/space_file/file_ops.c
M	source/blender/editors/space_file/filelist.c
M	source/blender/editors/space_file/filelist.h
M	source/blender/editors/space_file/filesel.c
M	source/blender/editors/space_file/space_file.c
M	source/blender/imbuf/IMB_thumbs.h
M	source/blender/imbuf/intern/thumbs.c
M	source/blender/imbuf/intern/thumbs_blend.c
M	source/blender/makesdna/DNA_ID.h
M	source/blender/makesdna/DNA_group_types.h
M	source/blender/makesdna/DNA_object_types.h
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesdna/DNA_space_types.h
M	source/blender/makesrna/intern/rna_ID.c
M	source/blender/makesrna/intern/rna_space.c
M	source/blender/python/intern/bpy_app.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/WM_types.h
M	source/blender/windowmanager/intern/wm_operators.c
M	source/blender/windowmanager/intern/wm_window.c
M	source/blender/windowmanager/wm_event_types.h

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

diff --git a/release/scripts/modules/bl_previews_utils/bl_previews_render.py b/release/scripts/modules/bl_previews_utils/bl_previews_render.py
new file mode 100644
index 0000000..673f182
--- /dev/null
+++ b/release/scripts/modules/bl_previews_utils/bl_previews_render.py
@@ -0,0 +1,460 @@
+# ***** BEGIN GPL LICENSE BLOCK *****
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ***** END GPL LICENSE BLOCK *****
+
+# <pep8 compliant>
+
+# Populate a template file (POT format currently) from Blender RNA/py/C data.
+# Note: This script is meant to be used from inside Blender!
+
+import collections
+import os
+import sys
+
+import bpy
+from mathutils import Vector, Euler
+
+
+INTERN_PREVIEW_TYPES = {'MATERIAL', 'LAMP', 'WORLD', 'TEXTURE', 'IMAGE'}
+OBJECT_TYPES_RENDER = {'MESH', 'CURVE', 'SURFACE', 'META', 'FONT'}
+
+
+def rna_backup_gen(data, include_props=None, exclude_props=None, root=()):
+    # only writable properties...
+    for p in data.bl_rna.properties:
+        pid = p.identifier
+        if pid in {'rna_type',}:
+            continue
+        path = root + (pid,)
+        if include_props is not None and path not in include_props:
+            continue
+        if exclude_props is not None and path in exclude_props:
+            continue
+        val = getattr(data, pid)
+        if val is not None and p.type == 'POINTER':
+            # recurse!
+            yield from rna_backup_gen(val, include_props, exclude_props, root=path)
+        elif data.is_property_readonly(pid):
+            continue
+        else:
+            yield path, val
+
+
+def rna_backup_restore(data, backup):
+    for path, val in backup:
+        dt = data
+        for pid in path[:-1]:
+            dt = getattr(dt, pid)
+        setattr(dt, path[-1], val)
+
+
+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",  # All those are names!
+        "backup_scene", "backup_world", "backup_camera", "backup_lamp", "backup_camera_data", "backup_lamp_data",
+    ))
+
+    RENDER_PREVIEW_SIZE = bpy.app.render_preview_size
+
+    def render_context_create(engine, objects_ignored):
+        if engine == '__SCENE':
+            backup_scene, backup_world, backup_camera, backup_lamp, backup_camera_data, backup_lamp_data = [()] * 6
+            scene = bpy.context.screen.scene
+            exclude_props = {('world',), ('camera',), ('tool_settings',), ('preview',)}
+            backup_scene = tuple(rna_backup_gen(scene, exclude_props=exclude_props))
+            world = scene.world
+            camera = scene.camera
+            if camera:
+                camera_data = camera.data
+            else:
+                backup_camera, backup_camera_data = [None] * 2
+                camera_data = bpy.data.cameras.new("TEMP_preview_render_camera")
+                camera = bpy.data.objects.new("TEMP_preview_render_camera", camera_data)
+                camera.rotation_euler = Euler((1.1635528802871704, 0.0, 0.7853981852531433), 'XYZ')  # (66.67, 0.0, 45.0)
+                scene.camera = camera
+                scene.objects.link(camera)
+            # TODO: add lamp if none found in scene?
+            lamp = None
+            lamp_data = None
+        else:
+            backup_scene, backup_world, backup_camera, backup_lamp, backup_camera_data, backup_lamp_data = [None] * 6
+
+            scene = bpy.data.scenes.new("TEMP_preview_render_scene")
+            world = bpy.data.worlds.new("TEMP_preview_render_world")
+            camera_data = bpy.data.cameras.new("TEMP_preview_render_camera")
+            camera = bpy.data.objects.new("TEMP_preview_render_camera", camera_data)
+            lamp_data = bpy.data.lamps.new("TEMP_preview_render_lamp", 'SPOT')
+            lamp = bpy.data.objects.new("TEMP_preview_render_lamp", lamp_data)
+
+            objects_ignored.add((camera.name, lamp.name))
+
+            scene.world = world
+
+            camera.rotation_euler = Euler((1.1635528802871704, 0.0, 0.7853981852531433), 'XYZ')  # (66.67, 0.0, 45.0)
+            scene.camera = camera
+            scene.objects.link(camera)
+
+            lamp.rotation_euler = Euler((0.7853981852531433, 0.0, 1.7453292608261108), 'XYZ')  # (45.0, 0.0, 100.0)
+            lamp_data.falloff_type = 'CONSTANT'
+            lamp_data.spot_size = 1.0471975803375244  # 60
+            scene.objects.link(lamp)
+
+            if engine == 'BLENDER_RENDER':
+                scene.render.engine = 'BLENDER_RENDER'
+                scene.render.alpha_mode = 'TRANSPARENT'
+
+                world.use_sky_blend = True
+                world.horizon_color = 0.9, 0.9, 0.9
+                world.zenith_color = 0.5, 0.5, 0.5
+                world.ambient_color = 0.1, 0.1, 0.1
+                world.light_settings.use_environment_light = True
+                world.light_settings.environment_energy = 1.0
+                world.light_settings.environment_color = 'SKY_COLOR'
+            elif engine == 'CYCLES':
+                scene.render.engine = 'CYCLES'
+                scene.cycles.film_transparent = True
+                # TODO: define Cycles world?
+
+        scene.render.image_settings.file_format = 'PNG'
+        scene.render.image_settings.color_depth = '8'
+        scene.render.image_settings.color_mode = 'RGBA'
+        scene.render.image_settings.compression = 25
+        scene.render.resolution_x = RENDER_PREVIEW_SIZE
+        scene.render.resolution_y = RENDER_PREVIEW_SIZE
+        scene.render.resolution_percentage = 100
+        scene.render.filepath = os.path.join(bpy.app.tempdir, 'TEMP_preview_render.png')
+        scene.render.use_overwrite = True
+        scene.render.use_stamp = False
+
+        image = bpy.data.images.new("TEMP_render_image", RENDER_PREVIEW_SIZE, RENDER_PREVIEW_SIZE, alpha=True)
+        image.source = 'FILE'
+        image.filepath = scene.render.filepath
+
+        return RenderContext(
+            scene.name, world.name if world else None, 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 = 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(bpy.data.objects[render_context.camera])
+                if 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)
+            if render_context.world is not None:
+                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(world)
+                else:
+                    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(camera)
+                    bpy.data.cameras.remove(bpy.data.cameras[render_context.camera_data])
+                else:
+                    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(lamp)
+                    bpy.data.lamps.remove(bpy.data.lamps[render_context.lamp_data])
+                else:
+                    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
+
+        image = bpy.data.images[render_context.image]
+        image.user_clear()
+        bpy.data.images.remove(image)
+        return True
+
+    def objects_render_engine_guess(obs):
+        for obname in obs:
+            ob = bpy.data.objects[obname]
+            for matslot in ob.material_slots:
+                mat = matslot.material
+                if mat and mat.use_nodes and mat.node_tree:
+                    for nd in mat.node_tree.nodes:
+                        if nd.shading_compatibility == {'NEW_SHADING'}:
+                            return 'CYCLES'
+        return 'BLENDER_RENDER'
+
+    def object_bbox_merge(bbox, ob, ob_space):
+        if ob.bound_box:
+            ob_bbox = ob.bound_box
+        else:
+            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

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list