[Bf-extensions-cvs] [04a48015] master: light_field_tools: moved to contrib; T63750

meta-androcto noreply at git.blender.org
Fri May 24 10:07:21 CEST 2019


Commit: 04a48015ced2ab2a4f017bb406062fc519f0cece
Author: meta-androcto
Date:   Fri May 24 18:06:59 2019 +1000
Branches: master
https://developer.blender.org/rBAC04a48015ced2ab2a4f017bb406062fc519f0cece

light_field_tools: moved to contrib; T63750

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

A	light_field_tools/__init__.py
A	light_field_tools/light_field_tools.py

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

diff --git a/light_field_tools/__init__.py b/light_field_tools/__init__.py
new file mode 100644
index 00000000..17e32c8b
--- /dev/null
+++ b/light_field_tools/__init__.py
@@ -0,0 +1,182 @@
+# ##### 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, 3, 1),
+    "blender": (2, 64, 0),
+    "location": "View3D > Tool Shelf > Light Field Tools",
+    "url": "http://www.jku.at/cg/",
+    "wiki_url": "https://wiki.blender.org/index.php/Extensions:2.6/Py/"
+                "Scripts/Render/Light_Field_Tools",
+    "category": "Render"
+}
+
+
+if "bpy" in locals():
+    import importlib
+    importlib.reload(light_field_tools)
+else:
+    from . import light_field_tools
+
+
+import bpy
+from bpy.types import (
+        AddonPreferences,
+        PropertyGroup,
+        )
+from bpy.props import (
+        BoolProperty,
+        FloatProperty,
+        IntProperty,
+        StringProperty,
+        PointerProperty,
+        )
+
+
+# global properties for the script, mainly for UI
+class LightFieldPropertyGroup(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"
+            )
+
+
+# Add-ons Preferences Update Panel
+
+# Define Panel classes for updating
+panels = (
+    light_field_tools.VIEW3D_PT_lightfield_tools,
+)
+
+
+def update_panel(self, context):
+    message = "Light Field Tools: Updating Panel locations has failed"
+    try:
+        for panel in panels:
+            if "bl_rna" in panel.__dict__:
+                bpy.utils.unregister_class(panel)
+
+        for panel in panels:
+            panel.bl_category = context.preferences.addons[__name__].preferences.category
+            bpy.utils.register_class(panel)
+
+    except Exception as e:
+        print("\n[{}]\n{}\n\nError:\n{}".format(__name__, message, e))
+        pass
+
+
+class LFTPreferences(AddonPreferences):
+    # this must match the addon name, use '__package__'
+    # when defining this in a submodule of a python package.
+    bl_idname = __name__
+
+    category: StringProperty(
+            name="Tab Category",
+            description="Choose a name for the category of the panel",
+            default="Tools",
+            update=update_panel
+            )
+
+    def draw(self, context):
+        layout = self.layout
+
+        row = layout.row()
+        col = row.column()
+        col.label(text="Tab Category:")
+        col.prop(self, "category", text="")
+
+
+def register():
+    # register properties
+    # bpy.utils.register_class(LightFieldPropertyGroup)
+    bpy.utils.register_module(__name__)
+    bpy.types.Scene.lightfield = PointerProperty(type=LightFieldPropertyGroup)
+
+
+def unregister():
+    bpy.utils.unregister_module(__name__)
+    del bpy.types.Scene.lightfield
+
+
+if __name__ == "__main__":
+    register()
diff --git a/light_field_tools/light_field_tools.py b/light_field_tools/light_field_tools.py
new file mode 100644
index 00000000..981905d5
--- /dev/null
+++ b/light_field_tools/light_field_tools.py
@@ -0,0 +1,421 @@
+# ##### 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.types import (
+        Operator,
+        Panel,
+        )
+import os
+from math import (
+        degrees, tan,
+        radians,
+        )
+from mathutils import Vector
+
+__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 normally 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.3.0 - Make compatible with 2.64
+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.
+* Align to normals, somehow,....
+* StringProperties with PATH tag, for proper ui.
+"""
+
+
+class OBJECT_OT_create_lightfield_rig(Operator):
+    bl_idname = "object.create_lightfield_rig"
+    bl_label = "Create a light field rig"
+    bl_description = "Create a lightfield 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."""
+        # FIXME get mesh with applied modifer stack
+        scene = bpy.context.scene
+        mesh = self.baseObject.data
+        verts = []
+        row_length = scene.lightfield.row_length
+        matrix = self.baseObject.matrix_local.copy()
+        for vert in mesh.vertices:
+            # world/parent origin
+            # ???, normal and co are in different spaces, sure you want this?
+            co = matrix * vert.co
+            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, 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list