Skip to content

Commit

Permalink
Support user extensions
Browse files Browse the repository at this point in the history
The extension plugin should receive a dictionary with the properties
  • Loading branch information
Juan Jose Casafranca committed Oct 16, 2019
1 parent 460c531 commit 08215da
Show file tree
Hide file tree
Showing 20 changed files with 446 additions and 51 deletions.
75 changes: 72 additions & 3 deletions addons/io_scene_gltf2/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,12 @@ def reload_package_recursive(current_dir, module_dict):
CollectionProperty)
from bpy.types import Operator
from bpy_extras.io_utils import ImportHelper, ExportHelper

from io_scene_gltf2.io.exp import gltf2_io_user_extensions

#
# Functions / Classes.
#


class ExportGLTF2_Base:
# TODO: refactor to avoid boilerplate

Expand All @@ -77,6 +76,7 @@ def __init__(self):

bl_options = {'UNDO', 'PRESET'}


export_format = EnumProperty(
name='Format',
items=(('GLB', 'glTF Binary (.glb)',
Expand Down Expand Up @@ -318,6 +318,21 @@ def __init__(self):
description='Store glTF export settings in the Blender project',
default=False)

# Look for user extensions
user_extensions = {
# Record name and new instance for each extension
user_extension.meta['name'] : user_extension()
for user_extension in gltf2_io_user_extensions.UserExtensionLoader().extensions
if 'name' in user_extension.meta
}

for extension_name, user_extension in user_extensions.items():
properties = user_extension.properties()
for property_name, extension_property in properties.items():
print("export_" + extension_name + "_" + property_name)
print(extension_property)
exec("{}=extension_property".format("export_" + extension_name + "_" + property_name))

# Custom scene property for saving settings
scene_key = "glTF2ExportSettings"

Expand Down Expand Up @@ -429,6 +444,25 @@ def execute(self, context):
export_settings['gltf_binaryfilename'] = os.path.splitext(os.path.basename(
bpy.path.ensure_ext(self.filepath,self.filename_ext)))[0] + '.bin'

# Get the enabled user extensions
export_settings['gltf_user_extensions'] = {
extension_name : self.user_extensions[extension_name]
for extension_name, user_extension in self.user_extensions.items()
if getattr(self, "export_" + extension_name + "_enabled")
}
print("Enabled extensions")
print(export_settings['gltf_user_extensions'])

export_settings['gltf_user_extensions_properties'] = {
extension_name : {
property_name : getattr(self, "export_" + extension_name + "_" + property_name)
for property_name, extension_property in self.user_extensions[extension_name].properties().items()
}
for extension_name, user_extension in self.user_extensions.items()
if getattr(self, "export_" + extension_name + "_enabled")
}
print(export_settings['gltf_user_extensions_properties'])

return gltf2_blender_export.save(context, export_settings)
if bpy.app.version < (2, 80, 0):
def draw(self, context):
Expand All @@ -443,6 +477,8 @@ def draw(self, context):
self.draw_material_settings()
elif self.ui_tab == 'ANIMATION':
self.draw_animation_settings()
elif self.ui_tab == 'EXTENSIONS':
self.draw_user_extensions()

def draw_general_settings(self):
col = self.layout.box().column()
Expand Down Expand Up @@ -788,6 +824,27 @@ def draw(self, context):
layout.active = operator.export_skins
layout.prop(operator, 'export_all_influences')

class GLTF_PT_export_user_extensions(bpy.types.Panel):
bl_space_type = 'FILE_BROWSER'
bl_region_type = 'TOOL_PROPS'
bl_label = "Extensions"
bl_parent_id = "FILE_PT_operator"
bl_options = {'DEFAULT_CLOSED'}

@classmethod
def poll(cls, context):
sfile = context.space_data
operator = sfile.active_operator

return operator.bl_idname == "EXPORT_SCENE_OT_gltf"

def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False # No animation.

sfile = context.space_data
operator = sfile.active_operator

class ExportGLTF2(bpy.types.Operator, ExportGLTF2_Base, ExportHelper):
"""Export scene as glTF 2.0 file"""
Expand Down Expand Up @@ -919,15 +976,27 @@ def menu_func_import(self, context):
GLTF_PT_export_animation_export,
GLTF_PT_export_animation_shapekeys,
GLTF_PT_export_animation_skinning,
GLTF_PT_export_user_extensions,
ImportGLTF2
)


def register():
for c in classes:
bpy.utils.register_class(c)
# bpy.utils.register_module(__name__)

# Look for user extensions
user_extensions = {
# Record name and new instance for each extension
user_extension.meta['name'] : user_extension()
for user_extension in gltf2_io_user_extensions.UserExtensionLoader().extensions
if 'name' in user_extension.meta
}

for name, user_extension in user_extensions.items():
user_extension.register_extension()
# bpy.utils.register_module(__name__)

# add to the export / import menu
if bpy.app.version < (2, 80, 0):
bpy.types.INFO_MT_file_export.append(menu_func_export)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
from io_scene_gltf2.blender.exp import gltf2_blender_gather_nodes
from io_scene_gltf2.blender.exp import gltf2_blender_gather_joints
from io_scene_gltf2.blender.exp import gltf2_blender_gather_skins
from io_scene_gltf2.io.exp.gltf2_io_user_extensions import GLTF2ExtensionAnimationChannelTarget
from io_scene_gltf2.io.exp.gltf2_io_user_extensions import export_user_extensions

@cached
def gather_animation_channel_target(channels: typing.Tuple[bpy.types.FCurve],
Expand All @@ -40,8 +42,10 @@ def __gather_extensions(channels: typing.Tuple[bpy.types.FCurve],
blender_object: bpy.types.Object,
export_settings,
bake_bone: typing.Union[str, None]
) -> typing.Any:
return None
):
extension_wrapper = GLTF2ExtensionAnimationChannelTarget(channels, blender_object, bake_bone)
extensions = export_user_extensions(extension_wrapper, export_settings)
return extensions


def __gather_extras(channels: typing.Tuple[bpy.types.FCurve],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
from io_scene_gltf2.blender.exp import gltf2_blender_gather_animation_channel_target
from io_scene_gltf2.blender.exp import gltf2_blender_get
from io_scene_gltf2.blender.exp import gltf2_blender_gather_skins
from io_scene_gltf2.io.exp.gltf2_io_user_extensions import GLTF2ExtensionAnimationChannels
from io_scene_gltf2.io.exp.gltf2_io_user_extensions import export_user_extensions


@cached
Expand Down Expand Up @@ -155,8 +157,10 @@ def __gather_extensions(channels: typing.Tuple[bpy.types.FCurve],
blender_object: bpy.types.Object,
export_settings,
bake_bone: typing.Union[str, None]
) -> typing.Any:
return None
):
extension_wrapper = GLTF2ExtensionAnimationChannels(channels, blender_object, bake_bone)
extensions = export_user_extensions(extension_wrapper, export_settings)
return extensions


def __gather_extras(channels: typing.Tuple[bpy.types.FCurve],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
from io_scene_gltf2.io.com import gltf2_io_constants
from io_scene_gltf2.io.exp import gltf2_io_binary_data
from . import gltf2_blender_export_keys
from io_scene_gltf2.io.exp.gltf2_io_user_extensions import GLTF2ExtensionAnimationSamplers
from io_scene_gltf2.io.exp.gltf2_io_user_extensions import export_user_extensions


@cached
Expand Down Expand Up @@ -178,8 +180,10 @@ def __gather_extensions(channels: typing.Tuple[bpy.types.FCurve],
export_settings,
bake_bone: typing.Union[str, None],
bake_channel: typing.Union[str, None]
) -> typing.Any:
return None
):
extension_wrapper = GLTF2ExtensionAnimationSamplers(channels, blender_object_if_armature, bake_bone, bake_channel)
extensions = export_user_extensions(extension_wrapper, export_settings)
return extensions


def __gather_extras(channels: typing.Tuple[bpy.types.FCurve],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
from io_scene_gltf2.blender.exp import gltf2_blender_gather_animation_channels
from io_scene_gltf2.io.com.gltf2_io_debug import print_console
from ..com.gltf2_blender_extras import generate_extras
from io_scene_gltf2.io.exp.gltf2_io_user_extensions import GLTF2ExtensionAnimations
from io_scene_gltf2.io.exp.gltf2_io_user_extensions import export_user_extensions


def gather_animations(blender_object: bpy.types.Object,
Expand Down Expand Up @@ -132,8 +134,10 @@ def __gather_channels(blender_action: bpy.types.Action,
def __gather_extensions(blender_action: bpy.types.Action,
blender_object: bpy.types.Object,
export_settings
) -> typing.Any:
return None
):
extension_wrapper = GLTF2ExtensionAnimations(blender_action, blender_object)
extensions = export_user_extensions(extension_wrapper, export_settings)
return extensions


def __gather_extras(blender_action: bpy.types.Action,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
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
from io_scene_gltf2.io.exp.gltf2_io_user_extensions import GLTF2ExtensionCameras
from io_scene_gltf2.io.exp.gltf2_io_user_extensions import export_user_extensions

import bpy
import math
Expand All @@ -41,7 +43,9 @@ def __filter_camera(blender_camera, export_settings):


def __gather_extensions(blender_camera, export_settings):
return None
extension_wrapper = GLTF2ExtensionCameras(blender_camera)
extensions = export_user_extensions(extension_wrapper, export_settings)
return extensions


def __gather_extras(blender_camera, export_settings):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
from io_scene_gltf2.io.com import gltf2_io_debug
from io_scene_gltf2.blender.exp import gltf2_blender_image
from io_scene_gltf2.blender.exp.gltf2_blender_gather_cache import cached
from io_scene_gltf2.io.exp.gltf2_io_user_extensions import GLTF2ExtensionImage
from io_scene_gltf2.io.exp.gltf2_io_user_extensions import export_user_extensions


@cached
Expand Down Expand Up @@ -83,7 +85,9 @@ def __gather_buffer_view(image_data, mime_type, name, export_settings):


def __gather_extensions(sockets_or_slots, export_settings):
return None
extension_wrapper = GLTF2ExtensionImage(sockets_or_slots)
extensions = export_user_extensions(extension_wrapper, export_settings)
return extensions


def __gather_extras(sockets_or_slots, export_settings):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
from io_scene_gltf2.blender.exp import gltf2_blender_export_keys
from io_scene_gltf2.blender.exp import gltf2_blender_get
from io_scene_gltf2.io.com.gltf2_io_extensions import Extension
from io_scene_gltf2.io.exp.gltf2_io_user_extensions import GLTF2ExtensionMaterialNormalTextureInfo
from io_scene_gltf2.io.exp.gltf2_io_user_extensions import export_user_extensions


@cached
Expand Down Expand Up @@ -60,16 +62,24 @@ def __gather_extensions(blender_shader_sockets_or_texture_slots, export_settings
if not hasattr(blender_shader_sockets_or_texture_slots[0], 'links'):
return None

extension_wrapper = GLTF2ExtensionMaterialNormalTextureInfo(blender_shader_sockets_or_texture_slots)
extensions = export_user_extensions(extension_wrapper, export_settings)

tex_nodes = [__get_tex_from_socket(socket).shader_node for socket in blender_shader_sockets_or_texture_slots]
texture_node = tex_nodes[0] if (tex_nodes is not None and len(tex_nodes) > 0) else None
if texture_node is None:
return None
texture_transform = gltf2_blender_get.get_texture_transform_from_texture_node(texture_node)
if texture_transform is None:
return None
if texture_node is not None:
texture_transform = gltf2_blender_get.get_texture_transform_from_texture_node(texture_node)
if texture_transform is not None:
extension = Extension("KHR_texture_transform", texture_transform)
if extensions is None:
return {"KHR_texture_transform": extension}
else:
extensions["KHR_texture_transform"] = extension
return extensions
return None

extension = Extension("KHR_texture_transform", texture_transform)
return {"KHR_texture_transform": extension}



def __gather_extras(blender_shader_sockets_or_texture_slots, export_settings):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
from io_scene_gltf2.blender.exp import gltf2_blender_search_node_tree
from io_scene_gltf2.blender.exp import gltf2_blender_get
from io_scene_gltf2.io.com.gltf2_io_extensions import Extension
from io_scene_gltf2.io.exp.gltf2_io_user_extensions import GLTF2ExtensionMaterialAOTextureInfo
from io_scene_gltf2.io.exp.gltf2_io_user_extensions import export_user_extensions


@cached
Expand Down Expand Up @@ -59,16 +61,21 @@ def __gather_extensions(blender_shader_sockets_or_texture_slots, export_settings
if not hasattr(blender_shader_sockets_or_texture_slots[0], 'links'):
return None

extension_wrapper = GLTF2ExtensionMaterialAOTextureInfo(blender_shader_sockets_or_texture_slots)
extensions = export_user_extensions(extension_wrapper, export_settings)

tex_nodes = [__get_tex_from_socket(socket).shader_node for socket in blender_shader_sockets_or_texture_slots]
texture_node = tex_nodes[0] if (tex_nodes is not None and len(tex_nodes) > 0) else None
if texture_node is None:
return None
texture_transform = gltf2_blender_get.get_texture_transform_from_texture_node(texture_node)
if texture_transform is None:
return None

extension = Extension("KHR_texture_transform", texture_transform)
return {"KHR_texture_transform": extension}
if texture_node is not None:
texture_transform = gltf2_blender_get.get_texture_transform_from_texture_node(texture_node)
if texture_transform is not None:
extension = Extension("KHR_texture_transform", texture_transform)
if extensions is None:
return {"KHR_texture_transform": extension}
else:
extensions["KHR_texture_transform"] = extension
return extensions
return None


def __gather_extras(blender_shader_sockets_or_texture_slots, export_settings):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
from io_scene_gltf2.blender.exp import gltf2_blender_gather_materials_pbr_metallic_roughness
from ..com.gltf2_blender_extras import generate_extras
from io_scene_gltf2.blender.exp import gltf2_blender_get
from io_scene_gltf2.io.exp.gltf2_io_user_extensions import GLTF2ExtensionMaterials
from io_scene_gltf2.io.exp.gltf2_io_user_extensions import export_user_extensions


@cached
Expand Down Expand Up @@ -130,7 +132,8 @@ def __gather_emissive_texture(blender_material, export_settings):


def __gather_extensions(blender_material, export_settings):
extensions = {}
extension_wrapper = GLTF2ExtensionMaterials(blender_material)
extensions = export_user_extensions(extension_wrapper, export_settings)

if bpy.app.version < (2, 80, 0):
if blender_material.use_shadeless:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
from io_scene_gltf2.blender.exp import gltf2_blender_get
from io_scene_gltf2.blender.exp.gltf2_blender_gather_cache import cached
from io_scene_gltf2.io.com.gltf2_io_debug import print_console
from io_scene_gltf2.io.exp.gltf2_io_user_extensions import GLTF2ExtensionMaterialPBRMetallicRoughness
from io_scene_gltf2.io.exp.gltf2_io_user_extensions import export_user_extensions


@cached
Expand Down Expand Up @@ -114,7 +116,9 @@ def __get_tex_from_socket(blender_shader_socket: bpy.types.NodeSocket):


def __gather_extensions(blender_material, export_settings):
return None
extension_wrapper = GLTF2ExtensionMaterialPBRMetallicRoughness(blender_material)
extensions = export_user_extensions(extension_wrapper, export_settings)
return extensions


def __gather_extras(blender_material, export_settings):
Expand Down
Loading

0 comments on commit 08215da

Please sign in to comment.