forked from LeenkxTeam/LNXSDK
moisesjpelaez - Include external blend files on build
This commit is contained in:
@ -116,7 +116,73 @@ def remove_readonly(func, path, excinfo):
|
|||||||
os.chmod(path, stat.S_IWRITE)
|
os.chmod(path, stat.S_IWRITE)
|
||||||
func(path)
|
func(path)
|
||||||
|
|
||||||
|
|
||||||
|
appended_scenes = []
|
||||||
|
|
||||||
|
def load_external_blends():
|
||||||
|
global appended_scenes
|
||||||
|
|
||||||
|
wrd = bpy.data.worlds['Lnx']
|
||||||
|
if not hasattr(wrd, 'lnx_external_blends_path'):
|
||||||
|
return
|
||||||
|
|
||||||
|
external_path = getattr(wrd, 'lnx_external_blends_path', '')
|
||||||
|
if not external_path or not external_path.strip():
|
||||||
|
return
|
||||||
|
|
||||||
|
abs_path = bpy.path.abspath(external_path.strip())
|
||||||
|
if not os.path.exists(abs_path):
|
||||||
|
return
|
||||||
|
|
||||||
|
# Walk recursively through all subdirs
|
||||||
|
for root, dirs, files in os.walk(abs_path):
|
||||||
|
for filename in files:
|
||||||
|
if not filename.endswith(".blend"):
|
||||||
|
continue
|
||||||
|
|
||||||
|
blend_path = os.path.join(root, filename)
|
||||||
|
try:
|
||||||
|
with bpy.data.libraries.load(blend_path, link=True) as (data_from, data_to):
|
||||||
|
data_to.scenes = list(data_from.scenes)
|
||||||
|
|
||||||
|
for scn in data_to.scenes:
|
||||||
|
if scn is not None and scn not in appended_scenes:
|
||||||
|
# make name unique with file name
|
||||||
|
scn.name += "_" + filename.replace(".blend", "")
|
||||||
|
appended_scenes.append(scn)
|
||||||
|
|
||||||
|
log.info(f"Loaded external blend: {blend_path}")
|
||||||
|
except Exception as e:
|
||||||
|
log.error(f"Failed to load external blend {blend_path}: {e}")
|
||||||
|
|
||||||
|
def clear_external_scenes():
|
||||||
|
global appended_scenes
|
||||||
|
if not appended_scenes:
|
||||||
|
return
|
||||||
|
|
||||||
|
for scn in appended_scenes:
|
||||||
|
try:
|
||||||
|
bpy.data.scenes.remove(scn, do_unlink=True)
|
||||||
|
except Exception as e:
|
||||||
|
log.error(f"Failed to remove scene {scn.name}: {e}")
|
||||||
|
|
||||||
|
for lib in list(bpy.data.libraries):
|
||||||
|
try:
|
||||||
|
if lib.users == 0:
|
||||||
|
bpy.data.libraries.remove(lib)
|
||||||
|
except Exception as e:
|
||||||
|
log.error(f"Failed to remove library {lib.name}: {e}")
|
||||||
|
|
||||||
|
try:
|
||||||
|
bpy.ops.outliner.orphans_purge(do_local_ids=True, do_linked_ids=True, do_recursive=True)
|
||||||
|
except Exception as e:
|
||||||
|
log.error(f"Failed to purge orphan data: {e}")
|
||||||
|
|
||||||
|
appended_scenes = []
|
||||||
|
|
||||||
def export_data(fp, sdk_path):
|
def export_data(fp, sdk_path):
|
||||||
|
load_external_blends()
|
||||||
|
|
||||||
wrd = bpy.data.worlds['Lnx']
|
wrd = bpy.data.worlds['Lnx']
|
||||||
rpdat = lnx.utils.get_rp()
|
rpdat = lnx.utils.get_rp()
|
||||||
|
|
||||||
@ -323,6 +389,8 @@ def export_data(fp, sdk_path):
|
|||||||
state.last_resy = resy
|
state.last_resy = resy
|
||||||
state.last_scene = scene_name
|
state.last_scene = scene_name
|
||||||
|
|
||||||
|
clear_external_scenes()
|
||||||
|
|
||||||
def compile(assets_only=False):
|
def compile(assets_only=False):
|
||||||
wrd = bpy.data.worlds['Lnx']
|
wrd = bpy.data.worlds['Lnx']
|
||||||
fp = lnx.utils.get_fp()
|
fp = lnx.utils.get_fp()
|
||||||
|
Reference in New Issue
Block a user