diff --git a/multi_user/bl_types/__init__.py b/multi_user/bl_types/__init__.py
index 498bc10..a094329 100644
--- a/multi_user/bl_types/__init__.py
+++ b/multi_user/bl_types/__init__.py
@@ -34,7 +34,8 @@ __all__ = [
'bl_metaball',
'bl_lattice',
'bl_lightprobe',
- 'bl_speaker'
+ 'bl_speaker',
+ 'bl_font'
] # Order here defines execution order
from . import *
diff --git a/multi_user/bl_types/bl_curve.py b/multi_user/bl_types/bl_curve.py
index 517519e..4691a93 100644
--- a/multi_user/bl_types/bl_curve.py
+++ b/multi_user/bl_types/bl_curve.py
@@ -62,6 +62,11 @@ class BlCurve(BlDatablock):
loader = Loader()
loader.load(target, data)
+ # if isinstance(curve, T.TextCurve):
+ # curve.font = data['font']
+ # curve.font_bold = data['font']
+ # curve.font_bold_italic = data['font']
+ # curve.font_italic = data['font']
target.splines.clear()
# load splines
for spline in data['splines'].values():
@@ -84,6 +89,7 @@ class BlCurve(BlDatablock):
# new_spline.points[point_index], data['splines'][spline]["points"][point_index])
loader.load(new_spline, spline)
+
def _dump_implementation(self, data, instance=None):
assert(instance)
dumper = Dumper()
@@ -119,3 +125,17 @@ class BlCurve(BlDatablock):
elif isinstance(instance, T.Curve):
data['type'] = 'CURVE'
return data
+
+ def _resolve_deps_implementation(self):
+ # TODO: resolve material
+ deps = []
+ curve = self.instance
+
+ if isinstance(curve, T.TextCurve):
+ deps.extend([
+ curve.font,
+ curve.font_bold,
+ curve.font_bold_italic,
+ curve.font_italic])
+
+ return deps
\ No newline at end of file
diff --git a/multi_user/bl_types/bl_font.py b/multi_user/bl_types/bl_font.py
new file mode 100644
index 0000000..00ca04e
--- /dev/null
+++ b/multi_user/bl_types/bl_font.py
@@ -0,0 +1,73 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# 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 .
+#
+# ##### END GPL LICENSE BLOCK #####
+
+
+import bpy
+import mathutils
+import os
+import logging
+from .. import utils
+from .dump_anything import Loader, Dumper
+from .bl_datablock import BlDatablock
+
+class BlFont(BlDatablock):
+ bl_id = "fonts"
+ bl_class = bpy.types.VectorFont
+ bl_delay_refresh = 1
+ bl_delay_apply = 1
+ bl_automatic_push = True
+ bl_check_common = False
+ bl_icon = 'FILE_FONT'
+
+ def _construct(self, data):
+ if data['filepath'] == '':
+ return bpy.data.fonts[data['name']]
+ elif 'font_file' in data.keys():
+ prefs = utils.get_preferences()
+ font_name = f"{self.uuid}.ttf"
+ font_path = os.path.join(prefs.cache_directory, font_name)
+
+ os.makedirs(prefs.cache_directory, exist_ok=True)
+ file = open(font_path, 'wb')
+ file.write(data["font_file"])
+ file.close()
+
+ logging.info(f'loading {font_path}')
+ return bpy.data.fonts.load(font_path)
+
+ return bpy.data.images.new(
+ name=data['name'],
+ width=data['size'][0],
+ height=data['size'][1]
+ )
+
+ def _load(self, data, target):
+ pass
+
+ def _dump(self, instance=None):
+ data = {
+ 'filepath':instance.filepath,
+ 'name':instance.name
+ }
+ if instance.filepath != '' and not instance.is_embedded_data:
+ file = open(instance.filepath, "rb")
+ data['font_file'] = file.read()
+ file.close()
+ return data
+
+ def diff(self):
+ return False
diff --git a/multi_user/bl_types/dump_anything.py b/multi_user/bl_types/dump_anything.py
index 76a558c..c5828de 100644
--- a/multi_user/bl_types/dump_anything.py
+++ b/multi_user/bl_types/dump_anything.py
@@ -593,6 +593,8 @@ class Loader:
instance.write(bpy.data.materials.get(dump))
elif isinstance(rna_property_type, T.Collection):
instance.write(bpy.data.collections.get(dump))
+ elif isinstance(rna_property_type, T.VectorFont):
+ instance.write(bpy.data.fonts.get(dump))
def _load_matrix(self, matrix, dump):
matrix.write(mathutils.Matrix(dump))
diff --git a/multi_user/utils.py b/multi_user/utils.py
index f66ab90..6701c10 100644
--- a/multi_user/utils.py
+++ b/multi_user/utils.py
@@ -57,11 +57,13 @@ def get_datablock_users(datablock):
def clean_scene():
+ builtin = ['Bfont']
for type_name in dir(bpy.data):
try:
type_collection = getattr(bpy.data, type_name)
for item in type_collection:
- type_collection.remove(item)
+ if item.name not in builtin:
+ type_collection.remove(item)
except:
continue