# Image Plane at Image Empty - sets an image plane at every image empty
# Copyright (C) 2019 Daniel Engler
# 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 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 General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
import bpy
def get_image_by_filepath(filepath):
"""find image by filepath"""
for img in bpy.data.images.values():
if img.filepath == filepath:
return img
def image_plane_at_image_emtpy(empty):
"""set image plane at given empty"""
if empty.data.filepath:
img = get_image_by_filepath(empty.data.filepath)
if not img:
return
cursor = bpy.context.scene.cursor
cursor.location = (0,0,0)
bpy.ops.mesh.primitive_plane_add(size=1, enter_editmode=False, location=(0,0,0))
plane = bpy.context.object
x = img.size[0] / 2000
y = img.size[1] / 2000
if x <= y:
plane.scale.x = x / y
else:
plane.scale.y = y / x
lx = plane.location.x
ly = plane.location.y
sx = plane.scale.x
sy = plane.scale.y
e_offx = empty.empty_image_offset[0]
e_offy = empty.empty_image_offset[1]
cursor.location.x = lx - sx / 2 - sx * e_offx
cursor.location.y = ly - sy / 2 - sy * e_offy
bpy.ops.object.origin_set(type='ORIGIN_CURSOR', center='MEDIAN')
bpy.ops.object.transform_apply(location=False, rotation=False, scale=True)
# set loc, rot, scale
plane.location = empty.location
plane.rotation_euler = empty.rotation_euler
plane.scale.x = empty.empty_display_size * empty.scale.x
plane.scale.y = empty.empty_display_size * empty.scale.y
# material setup
mat = bpy.data.materials.new(img.name)
mat.use_nodes = True
plane.data.materials.append(mat)
mat_output = mat.node_tree.nodes['Material Output']
img_node = mat.node_tree.nodes.new(type="ShaderNodeTexImage")
emit_node = mat.node_tree.nodes.new(type='ShaderNodeEmission')
mat.node_tree.links.new(img_node.outputs['Color'], emit_node.inputs['Color'])
mat.node_tree.links.new(emit_node.outputs[0], mat_output.inputs[0])
img_node.image = img
img_node.location.x = -500
emit_node.location.x = -200
for obj in bpy.data.objects.values():
if obj.type == 'EMPTY':
if obj.empty_display_type == 'IMAGE':
image_plane_at_image_emtpy(obj)
I can make this an add-on. Any suggestion for a better name instead of “Image Plane at Image Empty”?
It’s tested in 2.80 only.
I included the license just in case someone wants to use the little code snipped.