[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [1630] trunk/py/scripts/addons: Moved light field tools from contrib
Aurel W
aurel.w at gmail.com
Mon Feb 21 14:03:34 CET 2011
Revision: 1630
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=1630
Author: aurel
Date: 2011-02-21 13:03:34 +0000 (Mon, 21 Feb 2011)
Log Message:
-----------
Moved light field tools from contrib
Added Paths:
-----------
trunk/py/scripts/addons/light_field_tools/
trunk/py/scripts/addons/light_field_tools/__init__.py
trunk/py/scripts/addons/light_field_tools/light_field_tools.py
Added: trunk/py/scripts/addons/light_field_tools/__init__.py
===================================================================
--- trunk/py/scripts/addons/light_field_tools/__init__.py (rev 0)
+++ trunk/py/scripts/addons/light_field_tools/__init__.py 2011-02-21 13:03:34 UTC (rev 1630)
@@ -0,0 +1,119 @@
+# ##### 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 #####
+
+
+bl_info = {
+ 'name': 'Light Field Tools',
+ 'author': 'Aurel Wildfellner',
+ 'description': 'Tools to create a light field camera and projector',
+ 'version': (0, 2, 1),
+ 'blender': (2, 5, 6),
+ 'api': 35001,
+ 'location': 'View3D > Tool Shelf > Light Field Tools',
+ 'url': 'http://www.jku.at/cg/',
+ "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.5/Py/Scripts/Render/Light_Field_Tools",
+ "tracker_url": "http://projects.blender.org/tracker/index.php?func=detail&aid=25719",
+ 'category': 'Render'
+}
+
+
+if "bpy" in locals():
+ import imp
+ imp.reload(light_field_tools)
+else:
+ from . import light_field_tools
+
+
+import bpy
+from bpy.props import *
+
+
+# global properties for the script, mainly for UI
+class LightFieldPropertyGroup(bpy.types.PropertyGroup):
+ angle = FloatProperty(
+ name="Angle",
+ # 40 degrees
+ default=0.69813170079,
+ min=0,
+ # 172 degrees
+ max=3.001966313430247,
+ precision=2,
+ subtype = 'ANGLE',
+ description="Field of view of camera and angle of beam for spotlights")
+ row_length = IntProperty(
+ name="Row Length",
+ default=1,
+ min=1,
+ description="The number of cameras/lights in one row")
+ create_handler = BoolProperty(
+ name="Handler",
+ default=True,
+ description="Creates an empty object, to which the cameras and spotlights are parented to")
+ do_camera = BoolProperty(
+ name="Create Camera",
+ default=True,
+ description="A light field camera is created")
+ animate_camera = BoolProperty(
+ name="Animate Camera",
+ default=True,
+ description="Animates a single camera, so not multiple cameras get created")
+ do_projection = BoolProperty(
+ name="Create Projector",
+ default=False,
+ description="A light field projector is created")
+ texture_path = StringProperty(
+ name="Texture Path",
+ description="From this path textures for the spotlights will be loaded",
+ subtype='DIR_PATH')
+ light_intensity = FloatProperty(
+ name="Light Intensity",
+ default=2,
+ min=0,
+ precision=3,
+ description="Total intensity of all lamps")
+ # blending of the spotlights
+ spot_blend = FloatProperty(
+ name="Blend",
+ default=0,
+ min=0,
+ max=1,
+ precision=3,
+ description="Blending of the spotlights")
+ # spacing in pixels on the focal plane
+ spacing = IntProperty(
+ name="Spacing",
+ default=10,
+ min=0,
+ description="The spacing in pixels between two cameras on the focal plane")
+
+
+
+def register():
+ # register properties
+ bpy.utils.register_class(LightFieldPropertyGroup)
+ bpy.types.Scene.lightfield = bpy.props.PointerProperty(type=LightFieldPropertyGroup)
+ bpy.utils.register_module(__name__)
+
+
+def unregister():
+ bpy.utils.unregister_module(__name__)
+
+
+if __name__ == "__main__":
+ register()
+
Added: trunk/py/scripts/addons/light_field_tools/light_field_tools.py
===================================================================
--- trunk/py/scripts/addons/light_field_tools/light_field_tools.py (rev 0)
+++ trunk/py/scripts/addons/light_field_tools/light_field_tools.py 2011-02-21 13:03:34 UTC (rev 1630)
@@ -0,0 +1,431 @@
+# ##### 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 #####
+
+import bpy
+from bpy.props import *
+
+import os
+import math
+
+import mathutils
+
+__bpydoc__ = """
+Light Field Tools
+
+This script helps setting up rendering of lightfields. It
+also supports the projection of lightfields with textured
+spotlights.
+
+Usage:
+A simple interface can be accessed in the tool shelf panel
+in 3D View ([T] Key).
+
+A base mesh has to be provided, which will normaly be a
+subdivided plane. The script will then create a camera rig
+and a light rig with adjustable properties. A sample camera
+and a spotlight will be created on each vertex of the
+basemesh object axis (maybe vertex normal in future
+versions).
+
+ Vertex order:
+ The user has to provide the number of cameras or
+ lights in one row in an unevenly spaced grid, the
+ basemesh. Then the right vertex order can be
+ computed as shown here.
+ 6-7-8
+ | | |
+ ^ 3-4-5
+ | | | |
+ y 0-1-2
+ x->
+
+There is also a tool to create a basemesh, which is an
+evenly spaced grid. The row length parameter is taken to
+construct such a NxN grid. Someone would start out by adding
+a rectengular plane as the slice plane of the frustrum of
+the most middle camera of the light field rig. The spacing
+parameter then places the other cameras in a way, so they
+have an offset of n pixels from the other camera on this
+plane.
+
+
+Version history:
+v0.2.1 - Empty handler, multiple camera grid, r34843
+v0.2.0 - To be included in contrib, r34456
+v0.1.4 - To work with r34261
+v0.1.3 - Fixed base mesh creation for r29998
+v0.1.2 - Minor fixes, working with r29994
+v0.1.1 - Basemesh from focal plane.
+v0.1.0 - API updates, draft done.
+v0.0.4 - Texturing.
+v0.0.3 - Creates an array of non textured spotlights.
+v0.0.2 - Renders lightfields.
+v0.0.1 - Initial version.
+
+TODO:
+* Restore view after primary camera is changed.
+* Apply object matrix to normals.
+* Allign to normals, somehow,....
+* StringPropertie with PATH tag, for proper ui.
+"""
+
+
+class OBJECT_OT_create_lightfield_rig(bpy.types.Operator):
+ """Create a lightfield rig based on the active object/mesh"""
+ bl_idname="object.create_lightfield_rig"
+ bl_label="Create a light field rig based on the active object/mesh"
+ bl_options = {'REGISTER'}
+
+ layer0 = [True] + [False]*19
+
+ numSamples = 0
+ baseObject = None
+ handler = None
+ verts = []
+ imagePaths = []
+
+
+ def arrangeVerts(self):
+ """Sorts the vertices as described in the usage part of the doc."""
+ # get mesh with applied modifer stack
+ scene = bpy.context.scene
+ mesh = self.baseObject.create_mesh(scene, True, "PREVIEW")
+ verts = []
+ row_length = scene.lightfield.row_length
+
+ for vert in mesh.vertices:
+ # world/parent origin
+ co = vert.co * self.baseObject.matrix_local
+ normal = vert.normal
+ verts.append([co, normal])
+
+ def key_x(v):
+ return v[0][0]
+ def key_y(v):
+ return v[0][1]
+ verts.sort(key=key_y)
+ sorted_verts = []
+ for i in range(0, len(verts), row_length):
+ row = verts[i:i+row_length]
+ row.sort(key=key_x)
+ sorted_verts.extend(row)
+
+ return sorted_verts
+
+
+ def createCameraAnimated(self):
+ scene = bpy.context.scene
+
+ bpy.ops.object.camera_add(view_align=False)
+ cam = bpy.context.active_object
+ cam.name = "light_field_camera"
+
+ # set props
+ cam.data.angle = scene.lightfield.angle
+
+ # display options of the camera
+ cam.data.lens_unit = 'DEGREES'
+
+ # handler parent
+ if scene.lightfield.create_handler:
+ cam.parent = self.handler
+
+ # set as primary camera
+ scene.camera = cam
+
+ ### animate ###
+ scene.frame_current = 0
+
+ for frame, vert in enumerate(self.verts):
+ scene.frame_current = frame
+ # translate
+ cam.location = vert[0]
+ # rotation
+ cam.rotation_euler = self.baseObject.rotation_euler
+ # insert LocRot keyframes
+ cam.keyframe_insert('location')
+
+ # set anim render props
+ scene.frame_current = 0
+ scene.frame_start = 0
+ scene.frame_end = self.numSamples-1
+
+
+ def createCameraMultiple(self):
+ scene = bpy.context.scene
+
+ for cam_idx, vert in enumerate(self.verts):
+ # add and name camera
+ bpy.ops.object.camera_add(view_align=False)
+ cam = bpy.context.active_object
+ cam.name = "light_field_cam_" + str(cam_idx)
+
+ # translate
+ cam.location = vert[0]
+ # rotation
+ cam.rotation_euler = self.baseObject.rotation_euler
+
+ # set camera props
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list