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:
Diffstat (limited to 'io_scene_gltf2/blender/com/gltf2_blender_extras.py')
-rw-r--r--io_scene_gltf2/blender/com/gltf2_blender_extras.py91
1 files changed, 91 insertions, 0 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
+