diff options
author | Julien Duroure <julien.duroure@gmail.com> | 2019-10-12 18:15:22 +0300 |
---|---|---|
committer | Julien Duroure <julien.duroure@gmail.com> | 2019-10-12 18:15:22 +0300 |
commit | ecdaef952383c28aa3793f86cee160202f46913b (patch) | |
tree | be6556bc3a4af75a793cca17a788b187e87b0c72 /io_scene_gltf2/blender | |
parent | b9b1814a4c26f73aae7f306c9ff2e21b7b7bdcee (diff) |
glTF importer: Import extra data as custom properties
Diffstat (limited to 'io_scene_gltf2/blender')
12 files changed, 122 insertions, 10 deletions
diff --git a/io_scene_gltf2/blender/com/gltf2_blender_extras.py b/io_scene_gltf2/blender/com/gltf2_blender_extras.py new file mode 100644 index 00000000..0be942a0 --- /dev/null +++ b/io_scene_gltf2/blender/com/gltf2_blender_extras.py @@ -0,0 +1,91 @@ +# Copyright 2018-2019 The glTF-Blender-IO authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import bpy +from .gltf2_blender_json import is_json_convertible + + +# Custom properties, which are in most cases present and should not be imported/exported. +BLACK_LIST = ['cycles', 'cycles_visibility', 'cycles_curves', '_RNA_UI'] + + +def generate_extras(blender_element): + """Filter and create a custom property, which is stored in the glTF extra field.""" + if not blender_element: + return None + + extras = {} + + for custom_property in blender_element.keys(): + if custom_property in BLACK_LIST: + continue + + value = __to_json_compatible(blender_element[custom_property]) + + if value is not None: + extras[custom_property] = value + + if not extras: + return None + + return extras + + +def __to_json_compatible(value): + """Make a value (usually a custom property) compatible with json""" + + if isinstance(value, bpy.types.ID): + return value + + elif isinstance(value, str): + return value + + elif isinstance(value, (int, float)): + return value + + # for list classes + elif isinstance(value, list): + value = list(value) + # make sure contents are json-compatible too + for index in range(len(value)): + value[index] = __to_json_compatible(value[index]) + return value + + # for IDPropertyArray classes + elif hasattr(value, "to_list"): + value = value.to_list() + return value + + elif hasattr(value, "to_dict"): + value = value.to_dict() + if is_json_convertible(value): + return value + + return None + + +def set_extras(blender_element, extras, exclude=[]): + """Copy extras onto a Blender object.""" + if not extras or not isinstance(extras, dict): + return + + for custom_property, value in extras.items(): + if custom_property in BLACK_LIST: + continue + if custom_property in exclude: + continue + + blender_element[custom_property] = value + diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather.py index 2e4bfe31..80e0c3b2 100755 --- a/io_scene_gltf2/blender/exp/gltf2_blender_gather.py +++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather.py @@ -19,7 +19,7 @@ from io_scene_gltf2.io.com.gltf2_io_debug import print_console from io_scene_gltf2.blender.exp import gltf2_blender_gather_nodes from io_scene_gltf2.blender.exp import gltf2_blender_gather_animations from io_scene_gltf2.blender.exp.gltf2_blender_gather_cache import cached -from io_scene_gltf2.blender.exp import gltf2_blender_generate_extras +from ..com.gltf2_blender_extras import generate_extras from io_scene_gltf2.blender.exp import gltf2_blender_export_keys @@ -124,6 +124,6 @@ def __gather_animations(blender_scene, export_settings): def __gather_extras(blender_object, export_settings): if export_settings[gltf2_blender_export_keys.EXTRAS]: - return gltf2_blender_generate_extras.generate_extras(blender_object) + return generate_extras(blender_object) return None diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_cameras.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_cameras.py index e6d82121..3cde0fcb 100755 --- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_cameras.py +++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_cameras.py @@ -14,7 +14,7 @@ from . import gltf2_blender_export_keys from io_scene_gltf2.blender.exp.gltf2_blender_gather_cache import cached -from io_scene_gltf2.blender.exp import gltf2_blender_generate_extras +from ..com.gltf2_blender_extras import generate_extras from io_scene_gltf2.io.com import gltf2_io import bpy @@ -46,7 +46,7 @@ def __gather_extensions(blender_camera, export_settings): def __gather_extras(blender_camera, export_settings): if export_settings['gltf_extras']: - return gltf2_blender_generate_extras.generate_extras(blender_camera) + return generate_extras(blender_camera) return None diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_lights.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_lights.py index c87318d0..dbb59e21 100644 --- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_lights.py +++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_lights.py @@ -17,6 +17,7 @@ import math from typing import Optional, List, Dict, Any from io_scene_gltf2.blender.exp.gltf2_blender_gather_cache import cached +from ..com.gltf2_blender_extras import generate_extras from io_scene_gltf2.io.com import gltf2_io_lights_punctual from io_scene_gltf2.io.com import gltf2_io_debug @@ -112,6 +113,8 @@ def __gather_extensions(blender_lamp, export_settings) -> Optional[dict]: def __gather_extras(blender_lamp, export_settings) -> Optional[Any]: + if export_settings['gltf_extras']: + return generate_extras(blender_lamp) return None diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials.py index 3f4466f5..9b9a9abe 100755 --- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials.py +++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials.py @@ -23,7 +23,7 @@ from io_scene_gltf2.blender.exp import gltf2_blender_gather_material_occlusion_t from io_scene_gltf2.blender.exp import gltf2_blender_search_node_tree from io_scene_gltf2.blender.exp import gltf2_blender_gather_materials_pbr_metallic_roughness -from io_scene_gltf2.blender.exp import gltf2_blender_generate_extras +from ..com.gltf2_blender_extras import generate_extras from io_scene_gltf2.blender.exp import gltf2_blender_get @@ -136,7 +136,7 @@ def __gather_extensions(blender_material, export_settings): def __gather_extras(blender_material, export_settings): if export_settings['gltf_extras']: - return gltf2_blender_generate_extras.generate_extras(blender_material) + return generate_extras(blender_material) return None diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_mesh.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_mesh.py index ca79ef33..3af26ced 100755 --- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_mesh.py +++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_mesh.py @@ -18,7 +18,7 @@ from .gltf2_blender_export_keys import MORPH from io_scene_gltf2.blender.exp.gltf2_blender_gather_cache import cached from io_scene_gltf2.io.com import gltf2_io from io_scene_gltf2.blender.exp import gltf2_blender_gather_primitives -from io_scene_gltf2.blender.exp import gltf2_blender_generate_extras +from ..com.gltf2_blender_extras import generate_extras from io_scene_gltf2.io.com.gltf2_io_debug import print_console @@ -76,7 +76,7 @@ def __gather_extras(blender_mesh: bpy.types.Mesh, extras = {} if export_settings['gltf_extras']: - extras = gltf2_blender_generate_extras.generate_extras(blender_mesh) or {} + extras = generate_extras(blender_mesh) or {} if export_settings[MORPH] and blender_mesh.shape_keys: morph_max = len(blender_mesh.shape_keys.key_blocks) - 1 diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_nodes.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_nodes.py index 8af73b5d..6ab77945 100755 --- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_nodes.py +++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_nodes.py @@ -25,7 +25,7 @@ from io_scene_gltf2.blender.exp import gltf2_blender_gather_mesh from io_scene_gltf2.blender.exp import gltf2_blender_gather_joints from io_scene_gltf2.blender.exp import gltf2_blender_extract from io_scene_gltf2.blender.exp import gltf2_blender_gather_lights -from io_scene_gltf2.blender.exp import gltf2_blender_generate_extras +from ..com.gltf2_blender_extras import generate_extras from io_scene_gltf2.io.com import gltf2_io from io_scene_gltf2.io.com import gltf2_io_extensions @@ -219,7 +219,7 @@ def __gather_extensions(blender_object, export_settings): def __gather_extras(blender_object, export_settings): if export_settings['gltf_extras']: - return gltf2_blender_generate_extras.generate_extras(blender_object) + return generate_extras(blender_object) return None diff --git a/io_scene_gltf2/blender/imp/gltf2_blender_camera.py b/io_scene_gltf2/blender/imp/gltf2_blender_camera.py index d746c1b1..ec5f0ee4 100755 --- a/io_scene_gltf2/blender/imp/gltf2_blender_camera.py +++ b/io_scene_gltf2/blender/imp/gltf2_blender_camera.py @@ -13,6 +13,7 @@ # limitations under the License. import bpy +from ..com.gltf2_blender_extras import set_extras class BlenderCamera(): @@ -29,6 +30,7 @@ class BlenderCamera(): pycamera.name = "Camera" cam = bpy.data.cameras.new(pycamera.name) + set_extras(cam, pycamera.extras) # Blender create a perspective camera by default if pycamera.type == "orthographic": diff --git a/io_scene_gltf2/blender/imp/gltf2_blender_light.py b/io_scene_gltf2/blender/imp/gltf2_blender_light.py index 492c552e..6213091e 100644 --- a/io_scene_gltf2/blender/imp/gltf2_blender_light.py +++ b/io_scene_gltf2/blender/imp/gltf2_blender_light.py @@ -15,6 +15,8 @@ import bpy from math import pi +from ..com.gltf2_blender_extras import set_extras + class BlenderLight(): """Blender Light.""" @@ -45,6 +47,8 @@ class BlenderLight(): else: bpy.data.scenes[gltf.blender_scene].collection.objects.link(obj) + set_extras(obj.data, pylight.get('extras')) + return obj @staticmethod diff --git a/io_scene_gltf2/blender/imp/gltf2_blender_material.py b/io_scene_gltf2/blender/imp/gltf2_blender_material.py index 55be1626..c5e3b51c 100755 --- a/io_scene_gltf2/blender/imp/gltf2_blender_material.py +++ b/io_scene_gltf2/blender/imp/gltf2_blender_material.py @@ -13,6 +13,8 @@ # limitations under the License. import bpy + +from ..com.gltf2_blender_extras import set_extras from .gltf2_blender_pbrMetallicRoughness import BlenderPbr from .gltf2_blender_KHR_materials_pbrSpecularGlossiness import BlenderKHR_materials_pbrSpecularGlossiness from .gltf2_blender_KHR_materials_unlit import BlenderKHR_materials_unlit @@ -49,6 +51,8 @@ class BlenderMaterial(): mat = bpy.data.materials.new(name) pymaterial.blender_material[vertex_color] = mat.name + set_extras(mat, pymaterial.extras) + mat.use_backface_culling = (pymaterial.double_sided != True) ignore_map = False diff --git a/io_scene_gltf2/blender/imp/gltf2_blender_mesh.py b/io_scene_gltf2/blender/imp/gltf2_blender_mesh.py index 1f7f7b66..eb92d9a3 100755 --- a/io_scene_gltf2/blender/imp/gltf2_blender_mesh.py +++ b/io_scene_gltf2/blender/imp/gltf2_blender_mesh.py @@ -16,6 +16,7 @@ import bpy import bmesh from mathutils import Vector +from ..com.gltf2_blender_extras import set_extras from .gltf2_blender_material import BlenderMaterial from .gltf2_blender_primitive import BlenderPrimitive from ...io.imp.gltf2_io_binary import BinaryData @@ -75,6 +76,8 @@ class BlenderMesh(): mesh.materials.append(bpy.data.materials[name_material]) mesh.update() + set_extras(mesh, pymesh.extras, exclude=['targetNames']) + pymesh.blender_name = mesh.name # Clear accessor cache after all primitives are done diff --git a/io_scene_gltf2/blender/imp/gltf2_blender_node.py b/io_scene_gltf2/blender/imp/gltf2_blender_node.py index 6a40aecc..a02514de 100755 --- a/io_scene_gltf2/blender/imp/gltf2_blender_node.py +++ b/io_scene_gltf2/blender/imp/gltf2_blender_node.py @@ -13,6 +13,7 @@ # limitations under the License. import bpy +from ..com.gltf2_blender_extras import set_extras from .gltf2_blender_mesh import BlenderMesh from .gltf2_blender_camera import BlenderCamera from .gltf2_blender_skin import BlenderSkin @@ -76,6 +77,7 @@ class BlenderNode(): name = "Object_" + str(node_idx) obj = bpy.data.objects.new(name, mesh) + set_extras(obj, pynode.extras) obj.rotation_mode = 'QUATERNION' if gltf.blender_active_collection is not None: bpy.data.collections[gltf.blender_active_collection].objects.link(obj) @@ -104,6 +106,7 @@ class BlenderNode(): else: gltf.log.info("Blender create Camera node") obj = BlenderCamera.create(gltf, pynode.camera) + set_extras(obj, pynode.extras) BlenderNode.set_transforms(gltf, node_idx, pynode, obj, parent) # TODO default rotation of cameras ? pynode.blender_object = obj.name BlenderNode.set_parent(gltf, obj, parent) @@ -134,6 +137,7 @@ class BlenderNode(): if pynode.extensions is not None: if 'KHR_lights_punctual' in pynode.extensions.keys(): obj = BlenderLight.create(gltf, pynode.extensions['KHR_lights_punctual']['light']) + set_extras(obj, pynode.extras) obj.rotation_mode = 'QUATERNION' BlenderNode.set_transforms(gltf, node_idx, pynode, obj, parent, correction=True) pynode.blender_object = obj.name @@ -154,6 +158,7 @@ class BlenderNode(): else: gltf.log.info("Blender create Empty node") obj = bpy.data.objects.new("Node", None) + set_extras(obj, pynode.extras) obj.rotation_mode = 'QUATERNION' if gltf.blender_active_collection is not None: bpy.data.collections[gltf.blender_active_collection].objects.link(obj) |