Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulien Duroure <julien.duroure@gmail.com>2019-10-12 18:15:22 +0300
committerJulien Duroure <julien.duroure@gmail.com>2019-10-12 18:15:22 +0300
commitecdaef952383c28aa3793f86cee160202f46913b (patch)
treebe6556bc3a4af75a793cca17a788b187e87b0c72 /io_scene_gltf2
parentb9b1814a4c26f73aae7f306c9ff2e21b7b7bdcee (diff)
glTF importer: Import extra data as custom properties
Diffstat (limited to 'io_scene_gltf2')
-rwxr-xr-xio_scene_gltf2/__init__.py2
-rw-r--r--io_scene_gltf2/blender/com/gltf2_blender_extras.py91
-rwxr-xr-xio_scene_gltf2/blender/exp/gltf2_blender_gather.py4
-rwxr-xr-xio_scene_gltf2/blender/exp/gltf2_blender_gather_cameras.py4
-rw-r--r--io_scene_gltf2/blender/exp/gltf2_blender_gather_lights.py3
-rwxr-xr-xio_scene_gltf2/blender/exp/gltf2_blender_gather_materials.py4
-rwxr-xr-xio_scene_gltf2/blender/exp/gltf2_blender_gather_mesh.py4
-rwxr-xr-xio_scene_gltf2/blender/exp/gltf2_blender_gather_nodes.py4
-rwxr-xr-xio_scene_gltf2/blender/imp/gltf2_blender_camera.py2
-rw-r--r--io_scene_gltf2/blender/imp/gltf2_blender_light.py4
-rwxr-xr-xio_scene_gltf2/blender/imp/gltf2_blender_material.py4
-rwxr-xr-xio_scene_gltf2/blender/imp/gltf2_blender_mesh.py3
-rwxr-xr-xio_scene_gltf2/blender/imp/gltf2_blender_node.py5
13 files changed, 123 insertions, 11 deletions
diff --git a/io_scene_gltf2/__init__.py b/io_scene_gltf2/__init__.py
index 3852f105..faade612 100755
--- a/io_scene_gltf2/__init__.py
+++ b/io_scene_gltf2/__init__.py
@@ -15,7 +15,7 @@
bl_info = {
'name': 'glTF 2.0 format',
'author': 'Julien Duroure, Norbert Nopper, Urs Hanselmann, Moritz Becher, Benjamin Schmithüsen, Jim Eckerlein, and many external contributors',
- "version": (1, 0, 6),
+ "version": (1, 0, 7),
'blender': (2, 81, 6),
'location': 'File > Import-Export',
'description': 'Import-Export as glTF 2.0',
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)