Skip to content
Snippets Groups Projects
Commit faa9fc7f authored by Julien Duroure's avatar Julien Duroure
Browse files

Fix T95300: glTF importer: fix import binary images

parent 8f83df5e
No related branches found
No related tags found
No related merge requests found
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
bl_info = { bl_info = {
'name': 'glTF 2.0 format', 'name': 'glTF 2.0 format',
'author': 'Julien Duroure, Scurest, Norbert Nopper, Urs Hanselmann, Moritz Becher, Benjamin Schmithüsen, Jim Eckerlein, and many external contributors', 'author': 'Julien Duroure, Scurest, Norbert Nopper, Urs Hanselmann, Moritz Becher, Benjamin Schmithüsen, Jim Eckerlein, and many external contributors',
"version": (1, 8, 13), "version": (1, 8, 14),
'blender': (3, 1, 0), 'blender': (3, 1, 0),
'location': 'File > Import-Export', 'location': 'File > Import-Export',
'description': 'Import-Export as glTF 2.0', 'description': 'Import-Export as glTF 2.0',
......
...@@ -34,21 +34,30 @@ class BlenderImage(): ...@@ -34,21 +34,30 @@ class BlenderImage():
"""Image creation.""" """Image creation."""
img = gltf.data.images[img_idx] img = gltf.data.images[img_idx]
import_user_extensions('gather_import_image_before_hook', gltf, img)
img_name = img.name
if img.blender_image_name is not None: if img.blender_image_name is not None:
# Image is already used somewhere # Image is already used somewhere
return return
is_binary = False import_user_extensions('gather_import_image_before_hook', gltf, img)
is_placeholder = False
num_images = len(bpy.data.images)
if img.uri is not None and not img.uri.startswith('data:'): if img.uri is not None and not img.uri.startswith('data:'):
blender_image = create_from_file(gltf, img_idx)
else:
blender_image = create_from_data(gltf, img_idx)
if blender_image:
img.blender_image_name = blender_image.name
import_user_extensions('gather_import_image_after_hook', gltf, img, blender_image)
def create_from_file(gltf, img_idx):
# Image stored in a file # Image stored in a file
num_images = len(bpy.data.images)
img = gltf.data.images[img_idx]
path = join(dirname(gltf.filename), _uri_to_path(img.uri)) path = join(dirname(gltf.filename), _uri_to_path(img.uri))
path = os.path.abspath(path) path = os.path.abspath(path)
if bpy.data.is_saved and bpy.context.preferences.filepaths.use_relative_paths: if bpy.data.is_saved and bpy.context.preferences.filepaths.use_relative_paths:
...@@ -58,43 +67,42 @@ class BlenderImage(): ...@@ -58,43 +67,42 @@ class BlenderImage():
# May happen on Windows if on different drives, eg. C:\ and D:\ # May happen on Windows if on different drives, eg. C:\ and D:\
pass pass
img_name = img_name or basename(path) img_name = img.name or basename(path)
try: try:
blender_image = bpy.data.images.load( blender_image = bpy.data.images.load(
path, path,
check_existing=True, check_existing=True,
) )
needs_pack = gltf.import_settings['import_pack_images']
if needs_pack:
blender_image.pack()
except RuntimeError: except RuntimeError:
gltf.log.error("Missing image file (index %d): %s" % (img_idx, path)) gltf.log.error("Missing image file (index %d): %s" % (img_idx, path))
blender_image = _placeholder_image(img_name, os.path.abspath(path)) blender_image = _placeholder_image(img_name, os.path.abspath(path))
is_placeholder = True
else: if len(bpy.data.images) != num_images: # If created a new image
blender_image.name = img_name
return blender_image
def create_from_data(gltf, img_idx):
# Image stored as data => pack # Image stored as data => pack
is_binary = True
img_data = BinaryData.get_image_data(gltf, img_idx) img_data = BinaryData.get_image_data(gltf, img_idx)
if img_data is None: if img_data is None:
return return
img_name = 'Image_%d' % img_idx img_name = 'Image_%d' % img_idx
# Create image, width and height are dummy values # Create image, width and height are dummy values
img_pack = bpy.data.images.new(img_name, 8, 8) blender_image = bpy.data.images.new(img_name, 8, 8)
# Set packed file data # Set packed file data
img_pack.pack(data=img_data.tobytes(), data_len=len(img_data)) blender_image.pack(data=img_data.tobytes(), data_len=len(img_data))
img_pack.source = 'FILE' blender_image.source = 'FILE'
img.blender_image_name = img_pack.name
if is_binary is False:
if len(bpy.data.images) != num_images: # If created a new image
blender_image.name = img_name
img.blender_image_name = img_name
needs_pack = gltf.import_settings['import_pack_images'] return blender_image
if not is_placeholder and needs_pack:
blender_image.pack()
import_user_extensions('gather_import_image_after_hook', gltf, img, blender_image)
def _placeholder_image(name, path): def _placeholder_image(name, path):
image = bpy.data.images.new(name, 128, 128) image = bpy.data.images.new(name, 128, 128)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment