From 39c340f2807a72a2f255bc9461da1054ba0941b1 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 1 Dec 2012 20:16:15 -0600 Subject: Moving blender render files to be accessed via pkg_resources Previously the .blend and .py files had to be in the same directory mediagoblin/celery launched from. This is now fixed so it pulls them out of the package proper. --- blender_render.blend | Bin 401296 -> 0 bytes blender_render.py | 84 --------------------- .../media_types/stl/assets/blender_render.blend | Bin 0 -> 401296 bytes .../media_types/stl/assets/blender_render.py | 84 +++++++++++++++++++++ mediagoblin/media_types/stl/processing.py | 39 +++++++--- 5 files changed, 112 insertions(+), 95 deletions(-) delete mode 100644 blender_render.blend delete mode 100644 blender_render.py create mode 100644 mediagoblin/media_types/stl/assets/blender_render.blend create mode 100644 mediagoblin/media_types/stl/assets/blender_render.py diff --git a/blender_render.blend b/blender_render.blend deleted file mode 100644 index dd356a06..00000000 Binary files a/blender_render.blend and /dev/null differ diff --git a/blender_render.py b/blender_render.py deleted file mode 100644 index 99d5fa31..00000000 --- a/blender_render.py +++ /dev/null @@ -1,84 +0,0 @@ -# GNU MediaGoblin -- federated, autonomous media hosting -# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 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 Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . - - -import bpy, json, os - - -try: - CONFIG = json.loads(os.environ["RENDER_SETUP"]) - MODEL_EXT = CONFIG["model_ext"] - MODEL_PATH = CONFIG["model_path"] - CAMERA_COORD = CONFIG["camera_coord"] - CAMERA_FOCUS = CONFIG["camera_focus"] - CAMERA_CLIP = CONFIG["camera_clip"] - CAMERA_TYPE = CONFIG["projection"] - CAMERA_ORTHO = CONFIG["greatest"] * 1.5 - RENDER_WIDTH = CONFIG["width"] - RENDER_HEIGHT = CONFIG["height"] - RENDER_FILE = CONFIG["out_file"] -except KeyError: - print("Failed to load RENDER_SETUP environment variable.") - exit(1) - - -# add and setup camera -bpy.ops.object.camera_add(view_align=False, enter_editmode=False, - location = CAMERA_COORD) -camera_ob = bpy.data.objects[0] -camera = bpy.data.cameras[0] -camera.clip_end = CAMERA_CLIP -camera.ortho_scale = CAMERA_ORTHO -camera.type = CAMERA_TYPE - - - -# add an empty for focusing the camera -bpy.ops.object.add(location=CAMERA_FOCUS) -target = bpy.data.objects[1] -bpy.ops.object.select_all(action="SELECT") -bpy.ops.object.track_set(type="TRACKTO") -bpy.ops.object.select_all(action="DESELECT") - - -if MODEL_EXT == 'stl': - # import an stl model - bpy.ops.import_mesh.stl(filepath=MODEL_PATH) - -elif MODEL_EXT == 'obj': - # import an obj model - bpy.ops.import_scene.obj( - filepath=MODEL_PATH, - use_smooth_groups=False, - use_image_search=False, - axis_forward="Y", - axis_up="Z") - - -# rotate the imported objects with meshes in the scene -if CAMERA_TYPE == "PERSP": - for obj in bpy.data.objects[2:]: - obj.rotation_euler[2]=-.3 - - -# attempt to render -scene = bpy.data.scenes.values()[0] -scene.camera = camera_ob -scene.render.filepath = RENDER_FILE -scene.render.resolution_x = RENDER_WIDTH -scene.render.resolution_y = RENDER_HEIGHT -scene.render.resolution_percentage = 100 -bpy.ops.render.render(write_still=True) diff --git a/mediagoblin/media_types/stl/assets/blender_render.blend b/mediagoblin/media_types/stl/assets/blender_render.blend new file mode 100644 index 00000000..dd356a06 Binary files /dev/null and b/mediagoblin/media_types/stl/assets/blender_render.blend differ diff --git a/mediagoblin/media_types/stl/assets/blender_render.py b/mediagoblin/media_types/stl/assets/blender_render.py new file mode 100644 index 00000000..99d5fa31 --- /dev/null +++ b/mediagoblin/media_types/stl/assets/blender_render.py @@ -0,0 +1,84 @@ +# GNU MediaGoblin -- federated, autonomous media hosting +# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + + +import bpy, json, os + + +try: + CONFIG = json.loads(os.environ["RENDER_SETUP"]) + MODEL_EXT = CONFIG["model_ext"] + MODEL_PATH = CONFIG["model_path"] + CAMERA_COORD = CONFIG["camera_coord"] + CAMERA_FOCUS = CONFIG["camera_focus"] + CAMERA_CLIP = CONFIG["camera_clip"] + CAMERA_TYPE = CONFIG["projection"] + CAMERA_ORTHO = CONFIG["greatest"] * 1.5 + RENDER_WIDTH = CONFIG["width"] + RENDER_HEIGHT = CONFIG["height"] + RENDER_FILE = CONFIG["out_file"] +except KeyError: + print("Failed to load RENDER_SETUP environment variable.") + exit(1) + + +# add and setup camera +bpy.ops.object.camera_add(view_align=False, enter_editmode=False, + location = CAMERA_COORD) +camera_ob = bpy.data.objects[0] +camera = bpy.data.cameras[0] +camera.clip_end = CAMERA_CLIP +camera.ortho_scale = CAMERA_ORTHO +camera.type = CAMERA_TYPE + + + +# add an empty for focusing the camera +bpy.ops.object.add(location=CAMERA_FOCUS) +target = bpy.data.objects[1] +bpy.ops.object.select_all(action="SELECT") +bpy.ops.object.track_set(type="TRACKTO") +bpy.ops.object.select_all(action="DESELECT") + + +if MODEL_EXT == 'stl': + # import an stl model + bpy.ops.import_mesh.stl(filepath=MODEL_PATH) + +elif MODEL_EXT == 'obj': + # import an obj model + bpy.ops.import_scene.obj( + filepath=MODEL_PATH, + use_smooth_groups=False, + use_image_search=False, + axis_forward="Y", + axis_up="Z") + + +# rotate the imported objects with meshes in the scene +if CAMERA_TYPE == "PERSP": + for obj in bpy.data.objects[2:]: + obj.rotation_euler[2]=-.3 + + +# attempt to render +scene = bpy.data.scenes.values()[0] +scene.camera = camera_ob +scene.render.filepath = RENDER_FILE +scene.render.resolution_x = RENDER_WIDTH +scene.render.resolution_y = RENDER_HEIGHT +scene.render.resolution_percentage = 100 +bpy.ops.render.render(write_still=True) diff --git a/mediagoblin/media_types/stl/processing.py b/mediagoblin/media_types/stl/processing.py index 35ac7ea9..97b7ac2e 100644 --- a/mediagoblin/media_types/stl/processing.py +++ b/mediagoblin/media_types/stl/processing.py @@ -18,6 +18,7 @@ import os import json import logging import subprocess +import pkg_resources from mediagoblin import mg_globals as mgg from mediagoblin.processing import create_pub_filepath, \ @@ -29,6 +30,17 @@ from mediagoblin.media_types.stl import model_loader _log = logging.getLogger(__name__) SUPPORTED_FILETYPES = ['stl', 'obj'] +BLEND_FILE = pkg_resources.resource_filename( + 'mediagoblin.media_types.stl', + os.path.join( + 'assets', + 'blender_render.blend')) +BLEND_SCRIPT = pkg_resources.resource_filename( + 'mediagoblin.media_types.stl', + os.path.join( + 'assets', + 'blender_render.py')) + def sniff_handler(media_file, **kw): if kw.get('media') is not None: @@ -55,7 +67,12 @@ def blender_render(config): arg_string = "blender -b blender_render.blend -F " arg_string +="JPEG -P blender_render.py" env = {"RENDER_SETUP" : json.dumps(config), "DISPLAY":":0"} - subprocess.call(arg_string.split(" "), env=env) + subprocess.call( + ["blender", + "-b", BLEND_FILE, + "-F", "JPEG", + "-P", BLEND_SCRIPT], + env=env) def process_stl(entry): @@ -93,16 +110,16 @@ def process_stl(entry): path = create_pub_filepath(entry, name_builder.fill(name)) render_file = mgg.public_store.get_file(path, "wb") shot = { - "model_path" : queued_filename, - "model_ext" : ext, - "camera_coord" : camera, - "camera_focus" : model.average, - "camera_clip" : greatest*10, - "greatest" : greatest, - "projection" : project, - "width" : width, - "height" : height, - "out_file" : render_file.name, + "model_path": queued_filename, + "model_ext": ext, + "camera_coord": camera, + "camera_focus": model.average, + "camera_clip": greatest*10, + "greatest": greatest, + "projection": project, + "width": width, + "height": height, + "out_file": render_file.name, } render_file.close() blender_render(shot) -- cgit v1.2.3