Skip to content

Commit

Permalink
feat(blenvy):
Browse files Browse the repository at this point in the history
 * minor tweaks & improvements to assets handling
 * renamed a few auto export preferences for more coherence
 * "assets" folder is now mandatory again and used by the various sub asset types
 * blueprints/levels/materials paths in auto_export are not overwrite their relative values anymore,
but added their "full" variants & changed code using full paths to use those
 * added back gltf exporter post export callback, in a cleaner fashion
 * changing (wip) the way the various relative folders are auto generated in the folder selection UI
 * lots of other minor tweaks & improvements
  • Loading branch information
kaosat-dev committed May 14, 2024
1 parent b8a7eba commit 0fb35d6
Show file tree
Hide file tree
Showing 23 changed files with 170 additions and 102 deletions.
11 changes: 11 additions & 0 deletions tools/blenvy/TODO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
Auto export
- [ ] the original blueprints & levels path are now left as is, and there is an auto injection of xxxpath_full for absolute paths
- [ ] replace all uses of the paths with the correct ones above
- [x] levels
- [x] blueprints
- [ ] materials
- [x] move out the UI for "assets" folder out of "blueprints condition"
- [ ] fix asset path calculations
- root path => relative to blend file path
- asset path => relative to root path
- blueprints/levels/blueprints path => relative to assets path
12 changes: 8 additions & 4 deletions tools/blenvy/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from bpy.app.handlers import persistent
from bpy.props import (StringProperty)


# components management
from .bevy_components.components.operators import CopyComponentOperator, Fix_Component_Operator, OT_rename_component, RemoveComponentFromAllObjectsOperator, RemoveComponentOperator, GenerateComponent_From_custom_property_Operator, PasteComponentOperator, AddComponentOperator, RenameHelper, Toggle_ComponentVisibility

Expand All @@ -29,6 +30,7 @@
from .bevy_components.components.ui import (BEVY_COMPONENTS_PT_ComponentsPanel)

# auto export
from .gltf_auto_export import gltf_post_export_callback
from .gltf_auto_export.auto_export.operators import AutoExportGLTF
from .gltf_auto_export.auto_export.tracker import AutoExportTracker
from .gltf_auto_export.auto_export.preferences import (AutoExportGltfAddonPreferences)
Expand Down Expand Up @@ -65,11 +67,16 @@
from .core.blenvy_manager import BlenvyManager
from .core.operators import OT_switch_bevy_tooling


# this needs to be here, as it is how Blender's gltf exporter callbacks are defined, at the add-on root level
def glTF2_post_export_callback(data):
gltf_post_export_callback(data)


classes = [
# blenvy
BLENVY_PT_SidePanel,


# bevy components
AddComponentOperator,
CopyComponentOperator,
Expand Down Expand Up @@ -181,6 +188,3 @@ def unregister():
bpy.app.handlers.load_post.remove(post_load)
bpy.app.handlers.depsgraph_update_post.remove(post_update)
bpy.app.handlers.save_post.remove(post_save)


print("TOTO")
4 changes: 2 additions & 2 deletions tools/blenvy/assets/assets_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@


def get_assets(scene, blueprints_data, addon_prefs):
export_root_folder = getattr(addon_prefs, "export_root_folder")
export_root_path = getattr(addon_prefs, "export_root_path")
export_output_folder = getattr(addon_prefs,"export_output_folder")
export_levels_path = getattr(addon_prefs,"export_levels_path")
export_blueprints_path = getattr(addon_prefs, "export_blueprints_path")
export_gltf_extension = getattr(addon_prefs, "export_gltf_extension")

relative_blueprints_path = os.path.relpath(export_blueprints_path, export_root_folder)
relative_blueprints_path = os.path.relpath(export_blueprints_path, export_root_path)
blueprint_instance_names_for_scene = blueprints_data.blueprint_instances_per_main_scene.get(scene.name, None)

blueprint_assets_list = []
Expand Down
16 changes: 12 additions & 4 deletions tools/blenvy/assets/operators.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ class OT_add_bevy_asset(Operator):
def execute(self, context):
assets = []
blueprint_assets = self.target_type == 'BLUEPRINT'
print("FOOO", self.target_name, self.target_type)
if blueprint_assets:
assets = json.loads(bpy.data.collections[self.target_name].get('assets')) if 'assets' in bpy.data.collections[self.target_name] else []
else:
Expand All @@ -60,12 +59,16 @@ def execute(self, context):
in_list = len(in_list) > 0
if not in_list:
assets.append({"name": self.asset_name, "type": self.asset_type, "path": self.asset_path, "internal": False})
# reset controls
context.window_manager.assets_registry.asset_name_selector = ""
context.window_manager.assets_registry.asset_type_selector = "MODEL"
context.window_manager.assets_registry.asset_path_selector = ""

if blueprint_assets:
bpy.data.collections[self.target_name]["assets"] = json.dumps(assets)
else:
bpy.data.scenes[self.target_name]["assets"] = json.dumps(assets)
#context.window_manager.assets_registry.add_asset(self.asset_name, self.asset_type, self.asset_path, False)

return {'FINISHED'}


Expand Down Expand Up @@ -141,8 +144,13 @@ class OT_Add_asset_filebrowser(Operator, ImportHelper):

def execute(self, context):
current_auto_settings = load_settings(".gltf_auto_export_settings")
export_root_folder = current_auto_settings.get("export_root_folder")
asset_path = os.path.relpath(self.filepath, export_root_folder)
export_root_path = current_auto_settings.get("export_root_path", "../")
export_assets_path = current_auto_settings.get("export_assets_path", "assets")
# FIXME: not sure
print("export_root_path", export_root_path, "export_assets_path", export_assets_path)
export_assets_path_absolute = os.path.join(export_root_path, export_assets_path)
asset_path = os.path.relpath(self.filepath, export_assets_path_absolute)


assets_registry = context.window_manager.assets_registry
assets_registry.asset_path_selector = asset_path
Expand Down
50 changes: 50 additions & 0 deletions tools/blenvy/gltf_auto_export/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import os
import json
import bpy
from .helpers.generate_complete_preferences_dict import generate_complete_preferences_dict_gltf

def cleanup_file():
gltf_filepath = "/home/ckaos/projects/bevy/Blender_bevy_components_worklflow/testing/bevy_example/assets/____dummy____.glb"
if os.path.exists(gltf_filepath):
os.remove(gltf_filepath)
return None
else:
return 1

def gltf_post_export_callback(data):
#print("post_export", data)
bpy.context.window_manager.auto_export_tracker.export_finished()

gltf_settings_backup = bpy.context.window_manager.gltf_settings_backup
gltf_filepath = data["gltf_filepath"]
gltf_export_id = data['gltf_export_id']
if gltf_export_id == "gltf_auto_export":
# some more absurdity: apparently the file is not QUITE done when the export callback is called, so we have to introduce this timer to remove the temporary file correctly
bpy.context.window_manager.auto_export_tracker.dummy_file_path = gltf_filepath
try:
bpy.app.timers.unregister(cleanup_file)
except:pass
bpy.app.timers.register(cleanup_file, first_interval=1)

# get the parameters
scene = bpy.context.scene
if "glTF2ExportSettings" in scene:
settings = scene["glTF2ExportSettings"]
export_settings = bpy.data.texts[".gltf_auto_export_gltf_settings"] if ".gltf_auto_export_gltf_settings" in bpy.data.texts else bpy.data.texts.new(".gltf_auto_export_gltf_settings")
# now write new settings
export_settings.clear()

current_gltf_settings = generate_complete_preferences_dict_gltf(dict(settings))
export_settings.write(json.dumps(current_gltf_settings))
# now reset the original gltf_settings
if gltf_settings_backup != "":
scene["glTF2ExportSettings"] = json.loads(gltf_settings_backup)
else:
if "glTF2ExportSettings" in scene:
del scene["glTF2ExportSettings"]
bpy.context.window_manager.gltf_settings_backup = ""

# the absurd length one has to go through to RESET THE OPERATOR because it has global state !!!!! AAAAAHHH
last_operator = bpy.context.window_manager.auto_export_tracker.last_operator
last_operator.filepath = ""
last_operator.gltf_export_id = ""
21 changes: 8 additions & 13 deletions tools/blenvy/gltf_auto_export/auto_export/auto_export.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,8 @@ def auto_export(changes_per_scene, changed_export_parameters, addon_prefs):
blend_file_path = os.path.dirname(file_path)

# get the preferences for our addon
export_root_folder = getattr(addon_prefs, "export_root_folder")
export_output_folder = getattr(addon_prefs,"export_output_folder")
export_models_path = os.path.join(blend_file_path, export_output_folder)
export_root_path = getattr(addon_prefs, "export_root_path")
export_assets_path = getattr(addon_prefs,"export_assets_path")

#should we use change detection or not
export_change_detection = getattr(addon_prefs, "export_change_detection")
Expand All @@ -49,12 +48,6 @@ def auto_export(changes_per_scene, changed_export_parameters, addon_prefs):
standard_gltf_exporter_settings = get_standard_exporter_settings()
gltf_extension = standard_gltf_exporter_settings.get("export_format", 'GLB')
gltf_extension = '.glb' if gltf_extension == 'GLB' else '.gltf'

# generate the actual complete output path
export_blueprints_path = os.path.join(blend_file_path, export_root_folder, getattr(addon_prefs,"export_blueprints_path"))
export_levels_path = os.path.join(blend_file_path, export_root_folder, getattr(addon_prefs, "export_levels_path"))

print("export_blueprints_path", export_blueprints_path)

# here we do a bit of workaround by creating an override # TODO: do this at the "UI" level
print("collection_instances_combine_mode", addon_prefs.collection_instances_combine_mode)
Expand All @@ -71,15 +64,17 @@ def auto_export(changes_per_scene, changed_export_parameters, addon_prefs):
addon_prefs = SimpleNamespace(**tmp) #copy.deepcopy(addon_prefs)
addon_prefs.__annotations__ = tmp"""
addon_prefs.export_blueprints_path = export_blueprints_path
addon_prefs.export_levels_path = export_levels_path
# generate the actual complete output paths
addon_prefs.export_assets_path_full = os.path.join(blend_file_path, export_root_path, export_assets_path)
addon_prefs.export_blueprints_path_full = os.path.join(addon_prefs.export_assets_path_full, getattr(addon_prefs,"export_blueprints_path"))
addon_prefs.export_levels_path_full = os.path.join(addon_prefs.export_assets_path_full, getattr(addon_prefs,"export_levels_path"))
addon_prefs.export_materials_path = os.path.join(addon_prefs.export_assets_path_full, getattr(addon_prefs,"export_materials_path"))
addon_prefs.export_gltf_extension = gltf_extension
addon_prefs.export_models_path = export_models_path

[main_scene_names, level_scenes, library_scene_names, library_scenes] = get_scenes(addon_prefs)

print("main scenes", main_scene_names, "library_scenes", library_scene_names)
print("export_output_folder", export_output_folder)
print("export_assets_path", export_assets_path)

blueprints_data = blueprints_scan(level_scenes, library_scenes, addon_prefs)
blueprints_per_scene = blueprints_data.blueprints_per_scenes
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@


def export_blueprints(blueprints, blend_file_path, addon_prefs, blueprints_data):
export_blueprints_path = getattr(addon_prefs,"export_blueprints_path")
export_blueprints_path_full = getattr(addon_prefs,"export_blueprints_path_full")
gltf_export_preferences = generate_gltf_export_preferences(addon_prefs)

try:
Expand All @@ -18,7 +18,7 @@ def export_blueprints(blueprints, blend_file_path, addon_prefs, blueprints_data)

for blueprint in blueprints:
print("exporting collection", blueprint.name)
gltf_output_path = os.path.join(export_blueprints_path, blueprint.name)
gltf_output_path = os.path.join(export_blueprints_path_full, blueprint.name)
export_settings = { **gltf_export_preferences, 'use_active_scene': True, 'use_active_collection': True, 'use_active_collection_with_nested':True}

# if we are using the material library option, do not export materials, use placeholder instead
Expand Down
11 changes: 5 additions & 6 deletions tools/blenvy/gltf_auto_export/auto_export/export_main_scenes.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,8 @@

def export_main_scene(scene, blend_file_path, addon_prefs, blueprints_data):
gltf_export_preferences = generate_gltf_export_preferences(addon_prefs)
export_root_folder = getattr(addon_prefs, "export_root_folder")
export_output_folder = getattr(addon_prefs,"export_output_folder")
export_levels_path = getattr(addon_prefs,"export_levels_path")
export_assets_path_full = getattr(addon_prefs,"export_assets_path_full")
export_levels_path_full = getattr(addon_prefs,"export_levels_path_full")

export_blueprints = getattr(addon_prefs,"export_blueprints")
export_separate_dynamic_and_static_objects = getattr(addon_prefs, "export_separate_dynamic_and_static_objects")
Expand All @@ -28,7 +27,7 @@ def export_main_scene(scene, blend_file_path, addon_prefs, blueprints_data):
}

if export_blueprints :
gltf_output_path = os.path.join(export_levels_path, scene.name)
gltf_output_path = os.path.join(export_levels_path_full, scene.name)

inject_blueprints_list_into_main_scene(scene, blueprints_data, addon_prefs)
return
Expand All @@ -45,7 +44,7 @@ def export_main_scene(scene, blend_file_path, addon_prefs, blueprints_data):
)

# then export all dynamic objects
gltf_output_path = os.path.join(export_levels_path, scene.name+ "_dynamic")
gltf_output_path = os.path.join(export_levels_path_full, scene.name+ "_dynamic")
generate_and_export(
addon_prefs,
temp_scene_name=TEMPSCENE_PREFIX,
Expand All @@ -67,7 +66,7 @@ def export_main_scene(scene, blend_file_path, addon_prefs, blueprints_data):
)

else:
gltf_output_path = os.path.join(export_root_folder, export_output_folder, scene.name)
gltf_output_path = os.path.join(export_assets_path_full, scene.name)
print(" exporting gltf to", gltf_output_path, ".gltf/glb")
export_gltf(gltf_output_path, export_settings)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
def get_blueprints_to_export(changes_per_scene, changed_export_parameters, blueprints_data, addon_prefs):
export_change_detection = getattr(addon_prefs, "export_change_detection")
export_gltf_extension = getattr(addon_prefs, "export_gltf_extension", ".glb")
export_blueprints_path = getattr(addon_prefs,"export_blueprints_path", "")
export_blueprints_path_full = getattr(addon_prefs,"export_blueprints_path_full", "")
collection_instances_combine_mode = getattr(addon_prefs, "collection_instances_combine_mode")

[main_scene_names, level_scenes, library_scene_names, library_scenes] = get_scenes(addon_prefs)
Expand All @@ -23,7 +23,7 @@ def get_blueprints_to_export(changes_per_scene, changed_export_parameters, bluep

# first check if all collections have already been exported before (if this is the first time the exporter is run
# in your current Blender session for example)
blueprints_not_on_disk = find_blueprints_not_on_disk(internal_blueprints, export_blueprints_path, export_gltf_extension)
blueprints_not_on_disk = find_blueprints_not_on_disk(internal_blueprints, export_blueprints_path_full, export_gltf_extension)

for scene in library_scenes:
if scene.name in changes_per_scene:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,13 @@ def changed_object_in_scene(scene_name, changes_per_scene, blueprints_data, coll
def get_levels_to_export(changes_per_scene, changed_export_parameters, blueprints_data, addon_prefs):
export_change_detection = getattr(addon_prefs, "export_change_detection")
export_gltf_extension = getattr(addon_prefs, "export_gltf_extension")
export_levels_path = getattr(addon_prefs, "export_levels_path")
export_levels_path_full = getattr(addon_prefs, "export_levels_path_full")
collection_instances_combine_mode = getattr(addon_prefs, "collection_instances_combine_mode")

[main_scene_names, level_scenes, library_scene_names, library_scenes] = get_scenes(addon_prefs)

# determine list of main scenes to export
# we have more relaxed rules to determine if the main scenes have changed : any change is ok, (allows easier handling of changes, render settings etc)
main_scenes_to_export = [scene_name for scene_name in main_scene_names if not export_change_detection or changed_export_parameters or scene_name in changes_per_scene.keys() or changed_object_in_scene(scene_name, changes_per_scene, blueprints_data, collection_instances_combine_mode) or not check_if_blueprint_on_disk(scene_name, export_levels_path, export_gltf_extension) ]
main_scenes_to_export = [scene_name for scene_name in main_scene_names if not export_change_detection or changed_export_parameters or scene_name in changes_per_scene.keys() or changed_object_in_scene(scene_name, changes_per_scene, blueprints_data, collection_instances_combine_mode) or not check_if_blueprint_on_disk(scene_name, export_levels_path_full, export_gltf_extension) ]

return (main_scenes_to_export)
18 changes: 9 additions & 9 deletions tools/blenvy/gltf_auto_export/auto_export/operators.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ class AutoExportGLTF(Operator, AutoExportGltfAddonPreferences):#, ExportHelper):
#list of settings (other than purely gltf settings) whose change should trigger a re-generation of gltf files
white_list = [
'auto_export',
'export_root_folder',
'export_output_folder',
'export_root_path',
'export_assets_path',
'export_change_detection',
'export_scene_settings',

Expand Down Expand Up @@ -363,11 +363,9 @@ def draw(self, context):
section = layout.box()
section.enabled = controls_enabled

draw_folder_browser(section, "Export root folder", self.export_root_folder, "export_root_folder")
draw_folder_browser(section, "Export root folder", self.export_root_path, "export_root_path")
row = section.row()
draw_folder_browser(row, "Assets Folder (non blueprints mode only)", self.export_root_folder, "export_output_folder")
row.enabled = not self.export_blueprints
section.prop(operator, "export_blueprints")
draw_folder_browser(row, "Assets Folder", self.export_root_path, "export_assets_path")
section.prop(operator, "export_scene_settings")

"""header, panel = layout.panel("my_panel_id", default_closed=False)
Expand Down Expand Up @@ -437,17 +435,19 @@ def draw(self, context):
if self.show_blueprint_settings:
section = layout.box()
section.enabled = controls_enabled
section.prop(operator, "export_blueprints")

section = section.box()
section.enabled = controls_enabled and self.export_blueprints

# collections/blueprints
draw_folder_browser(section, "Blueprints folder", self.export_root_folder, "export_blueprints_path")
draw_folder_browser(section, "Blueprints folder", self.export_root_path, "export_blueprints_path")
#section.prop(operator, "export_blueprints_path")
section.prop(operator, "collection_instances_combine_mode")
section.prop(operator, "export_marked_assets")
section.separator()

draw_folder_browser(section, "Levels folder", self.export_root_folder, "export_levels_path")
draw_folder_browser(section, "Levels folder", self.export_root_path, "export_levels_path")
#section.prop(operator, "export_levels_path")

section.prop(operator, "export_separate_dynamic_and_static_objects")
Expand All @@ -457,7 +457,7 @@ def draw(self, context):
section.prop(operator, "export_materials_library")
section = section.box()
section.enabled = controls_enabled and self.export_materials_library
draw_folder_browser(section, 'Materials folder', self.export_root_folder, "export_materials_path")
draw_folder_browser(section, 'Materials folder', self.export_root_path, "export_materials_path")
#section.prop(operator, "export_materials_path")


Expand Down
Loading

0 comments on commit 0fb35d6

Please sign in to comment.