Blender 2.8 - 4.5 Support

This commit is contained in:
2025-09-28 12:44:04 -07:00
parent 8f8d4b1376
commit f97d8fd846
34 changed files with 581 additions and 399 deletions

View File

@ -12,9 +12,18 @@ import bpy.utils.previews
import lnx.make as make
from lnx.props_traits_props import *
import lnx.ui_icons as ui_icons
def compatible_prop(property_func, **kwargs):
"""Create properties compatible with different Blender versions."""
if bpy.app.version < (2, 90, 0):
# Remove override parameter for Blender 2.83
kwargs.pop('override', None)
return property_func(**kwargs)
import lnx.utils
import lnx.write_data as write_data
if lnx.is_reload(__name__):
lnx.make = lnx.reload_module(lnx.make)
lnx.props_traits_props = lnx.reload_module(lnx.props_traits_props)
@ -91,20 +100,20 @@ class LnxTraitListItem(bpy.types.PropertyGroup):
"""Ensure that only logic node trees show up as node traits"""
return tree.bl_idname == 'LnxLogicTreeType'
name: StringProperty(name="Name", description="The name of the trait", default="", override={"LIBRARY_OVERRIDABLE"})
enabled_prop: BoolProperty(name="", description="Whether this trait is enabled", default=True, update=trigger_recompile, override={"LIBRARY_OVERRIDABLE"})
is_object: BoolProperty(name="", default=True)
fake_user: BoolProperty(name="Fake User", description="Export this trait even if it is deactivated", default=False, override={"LIBRARY_OVERRIDABLE"})
type_prop: EnumProperty(name="Type", items=PROP_TYPES_ENUM)
name = compatible_prop(StringProperty, name="Name", description="The name of the trait", default="", override={"LIBRARY_OVERRIDABLE"})
enabled_prop = compatible_prop(BoolProperty, name="", description="Whether this trait is enabled", default=True, update=trigger_recompile, override={"LIBRARY_OVERRIDABLE"})
is_object = BoolProperty(name="", default=True)
fake_user = compatible_prop(BoolProperty, name="Fake User", description="Export this trait even if it is deactivated", default=False, override={"LIBRARY_OVERRIDABLE"})
type_prop = EnumProperty(name="Type", items=PROP_TYPES_ENUM)
class_name_prop: StringProperty(name="Class", description="A name for this item", default="", update=update_trait_group, override={"LIBRARY_OVERRIDABLE"})
canvas_name_prop: StringProperty(name="Canvas", description="A name for this item", default="", update=update_trait_group, override={"LIBRARY_OVERRIDABLE"})
webassembly_prop: StringProperty(name="Module", description="A name for this item", default="", update=update_trait_group, override={"LIBRARY_OVERRIDABLE"})
node_tree_prop: PointerProperty(type=NodeTree, update=update_trait_group, override={"LIBRARY_OVERRIDABLE"}, poll=poll_node_trees)
class_name_prop = compatible_prop(StringProperty, name="Class", description="A name for this item", default="", update=update_trait_group, override={"LIBRARY_OVERRIDABLE"})
canvas_name_prop = compatible_prop(StringProperty, name="Canvas", description="A name for this item", default="", update=update_trait_group, override={"LIBRARY_OVERRIDABLE"})
webassembly_prop = compatible_prop(StringProperty, name="Module", description="A name for this item", default="", update=update_trait_group, override={"LIBRARY_OVERRIDABLE"})
node_tree_prop = compatible_prop(PointerProperty, type=NodeTree, update=update_trait_group, override={"LIBRARY_OVERRIDABLE"}, poll=poll_node_trees)
lnx_traitpropslist: CollectionProperty(type=LnxTraitPropListItem)
lnx_traitpropslist_index: IntProperty(name="Index for my_list", default=0, options={"LIBRARY_EDITABLE"}, override={"LIBRARY_OVERRIDABLE"})
lnx_traitpropswarnings: CollectionProperty(type=LnxTraitPropWarning)
lnx_traitpropslist = CollectionProperty(type=LnxTraitPropListItem)
lnx_traitpropslist_index = compatible_prop(IntProperty, name="Index for my_list", default=0, options={"LIBRARY_EDITABLE"}, override={"LIBRARY_OVERRIDABLE"})
lnx_traitpropswarnings = CollectionProperty(type=LnxTraitPropWarning)
class LNX_UL_TraitList(bpy.types.UIList):
"""List of traits."""
@ -475,10 +484,12 @@ class LeenkxGenerateNavmeshButton(bpy.types.Operator):
# If not, append vertex
traversed_indices.append(vertex_index)
vertex = export_mesh.vertices[vertex_index].co
# Apply world transform and maintain coordinate system
# Apply world transform
tv = world_matrix @ vertex
# Write to OBJ without flipping coordinates
f.write("v %.4f %.4f %.4f\n" % (tv[0], tv[1], tv[2]))
# Write to OBJ
f.write("v %.4f " % (tv[0]))
f.write("%.4f " % (tv[2]))
f.write("%.4f\n" % (tv[1])) # Flipped
# Max index of this object
max_index = 0
@ -522,10 +533,8 @@ class LeenkxGenerateNavmeshButton(bpy.types.Operator):
# NavMesh preview settings, cleanup
navmesh.name = nav_mesh_name
# Match the original object's transform
navmesh.location = obj.location
navmesh.rotation_euler = obj.rotation_euler
navmesh.scale = (1, 1, 1) # Reset scale to avoid distortion
navmesh.rotation_euler = (0, 0, 0)
navmesh.location = (0, 0, 0)
navmesh.lnx_export = False
bpy.context.view_layer.objects.active = navmesh
@ -756,7 +765,8 @@ class LnxRefreshObjectScriptsButton(bpy.types.Operator):
@classmethod
def poll(cls, context):
cls.poll_message_set(LnxRefreshScriptsButton.poll_msg)
if bpy.app.version >= (2, 90, 0):
cls.poll_message_set(LnxRefreshScriptsButton.poll_msg)
# Technically we could keep the operator enabled here since
# fetch_trait_props() checks for overrides and the operator does
# not depend on the current object, but this way the user
@ -1064,11 +1074,10 @@ __REG_CLASSES = (
)
__reg_classes, unregister = bpy.utils.register_classes_factory(__REG_CLASSES)
def register():
__reg_classes()
bpy.types.Object.lnx_traitlist = CollectionProperty(type=LnxTraitListItem, override={"LIBRARY_OVERRIDABLE", "USE_INSERTION"})
bpy.types.Object.lnx_traitlist_index = IntProperty(name="Index for lnx_traitlist", default=0, options={"LIBRARY_EDITABLE"}, override={"LIBRARY_OVERRIDABLE"})
bpy.types.Scene.lnx_traitlist = CollectionProperty(type=LnxTraitListItem, override={"LIBRARY_OVERRIDABLE", "USE_INSERTION"})
bpy.types.Scene.lnx_traitlist_index = IntProperty(name="Index for lnx_traitlist", default=0, options={"LIBRARY_EDITABLE"}, override={"LIBRARY_OVERRIDABLE"})
bpy.types.Object.lnx_traitlist = compatible_prop(CollectionProperty, type=LnxTraitListItem)
bpy.types.Object.lnx_traitlist_index = compatible_prop(IntProperty, name="Index for lnx_traitlist", default=0)
bpy.types.Scene.lnx_traitlist = compatible_prop(CollectionProperty, type=LnxTraitListItem)
bpy.types.Scene.lnx_traitlist_index = compatible_prop(IntProperty, name="Index for lnx_traitlist", default=0)