Skip to content

Commit

Permalink
Fix: camera create by matching camera from datablocks and all children (
Browse files Browse the repository at this point in the history
#53)

* Fix: camera create by matching camera from datablocks and all children

* refactor with _get_camera_from_datablocks as shared function
  • Loading branch information
Tilix4 committed May 5, 2023
1 parent fadad4a commit 843cdf3
Showing 1 changed file with 31 additions and 7 deletions.
38 changes: 31 additions & 7 deletions openpype/hosts/blender/plugins/create/create_camera.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,36 @@
"""Create a camera asset."""

from typing import List
from itertools import chain
from typing import List, Union
import bpy

from openpype.hosts.blender.api import plugin
from openpype.hosts.blender.api.properties import OpenpypeInstance

from openpype.hosts.blender.api.utils import get_all_outliner_children

def _get_camera_from_datablocks(datablocks: List[bpy.types.ID])->Union[bpy.types.Object, None]:
"""Get first camera found in given datablocks list.
Args:
datablocks (List[bpy.types.ID]):
List of datablocks to get camera from
Returns:
Union[bpy.types.Object, None]: Found camera if any.
"""
outliner_children = set(
chain.from_iterable(
get_all_outliner_children(d) for d in datablocks
)
)
return next(
(
c
for c in outliner_children | set(datablocks)
if isinstance(c, bpy.types.Object) and c.type == "CAMERA"
),
None,
)

class CreateCamera(plugin.Creator):
"""Single baked camera"""
Expand All @@ -25,11 +50,10 @@ def process(

# Rename existing camera or create one
datablocks = datablocks or []
for obj in datablocks:
if obj and obj.type == "CAMERA":
obj.name = instance_name
obj.data.name = instance_name
break
camera = _get_camera_from_datablocks(datablocks)
if camera:
camera.name = instance_name
camera.data.name = instance_name
else:
camera = bpy.data.cameras.new(instance_name)
camera_obj = bpy.data.objects.new(instance_name, camera)
Expand Down

0 comments on commit 843cdf3

Please sign in to comment.