Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions release_notes.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
release 6.5.2
-------------

* Fixed an issue where the Asset Browser would not load on Linux.


release 6.5.1
-------------

* Fixed incorrect scale of Swarm Trophy parts.


release 6.5.0
-------------

Expand Down
400 changes: 259 additions & 141 deletions src/addons/no_mans_sky_base_builder/__init__.py

Large diffs are not rendered by default.

94 changes: 94 additions & 0 deletions src/addons/no_mans_sky_base_builder/addon_preferences.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import bpy
from bpy.props import BoolProperty, StringProperty

from .save_editor import save_editor_utils

ADDON_ID = __package__


class NMSAddonPreferences(bpy.types.AddonPreferences):
bl_idname = ADDON_ID

nms_save_folder_path: StringProperty(
name="Save Directory",
description="Folder where save files are stored",
subtype='DIR_PATH',
default = str(save_editor_utils.get_default_save_folder())
)

share_meshes_on_duplicate: BoolProperty(
name="Share part meshes on duplicate",
description=(
"Turn off blender's Duplicate Data > Mesh, so Shift+D copies share the "
"original part's mesh, like Alt+D. Keeps big bases light"
),
default=True,
update=lambda self, context: apply_duplicate_mesh_setting(self),
)

# blender's own Duplicate Data > Mesh value, put back when sharing is turned off
original_duplicate_mesh: BoolProperty(default=True)
has_original_duplicate_mesh: BoolProperty(default=False)

def draw(self, context):
layout = self.layout
layout.prop(self, "nms_save_folder_path")
layout.prop(self, "share_meshes_on_duplicate")


def get_addon_preferences():
addon = bpy.context.preferences.addons.get(ADDON_ID)
return addon.preferences if addon else None


# the NMS save folder, None while the addon's preferences aren't available
def get_save_folder_path():
prefs = get_addon_preferences()
return prefs.nms_save_folder_path if prefs else None


# store the NMS save folder and write the user preferences to disk
# returns True when the folder was stored
def set_save_folder_path(path, save=True):
prefs = get_addon_preferences()
if prefs is None:
return False

prefs.nms_save_folder_path = str(path)
if save:
save_user_preferences()
return True


def save_user_preferences():
# the operator needs a window, there is none in background mode
try:
bpy.ops.wm.save_userpref()
except RuntimeError as error:
print("Could not save preferences:", error)


# turn blender's Duplicate Data > Mesh off while sharing is on, remembering its value
def apply_duplicate_mesh_setting(prefs=None):
prefs = prefs or get_addon_preferences()
if prefs is None:
return

if not prefs.share_meshes_on_duplicate:
restore_duplicate_mesh_setting(prefs)
return

edit_preferences = bpy.context.preferences.edit
if not prefs.has_original_duplicate_mesh:
prefs.original_duplicate_mesh = edit_preferences.use_duplicate_mesh
prefs.has_original_duplicate_mesh = True
edit_preferences.use_duplicate_mesh = False


# put blender's Duplicate Data > Mesh back the way it was
def restore_duplicate_mesh_setting(prefs=None):
prefs = prefs or get_addon_preferences()
if prefs is None or not prefs.has_original_duplicate_mesh:
return
bpy.context.preferences.edit.use_duplicate_mesh = prefs.original_duplicate_mesh
prefs.has_original_duplicate_mesh = False
22 changes: 17 additions & 5 deletions src/addons/no_mans_sky_base_builder/asset_browser/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -557,7 +557,7 @@ def send_part_command_to_blender(self, item_id):
import no_mans_sky_base_builder.preset as preset
import no_mans_sky_base_builder.utils.blend_utils as blend_utils

BUILDER = no_mans_sky_base_builder.BUILDER
BUILDER = no_mans_sky_base_builder.builder.get_builder()

selection = blend_utils.get_current_selection()

Expand Down Expand Up @@ -590,7 +590,7 @@ def send_edit_preset_command_to_blender(self, item_id):
import no_mans_sky_base_builder.preset as preset
import no_mans_sky_base_builder.utils.blend_utils as blend_utils

BUILDER = no_mans_sky_base_builder.BUILDER
BUILDER = no_mans_sky_base_builder.builder.get_builder()

nms_tool = bpy.context.scene.nms_base_tool
if item_id in preset.Preset.get_presets():
Expand All @@ -614,6 +614,7 @@ def sizeHint(self):
qt_app = None
qt_window = None
qt_thread = None
IS_LINUX = sys.platform.startswith("linux")


def qt_event_loop():
Expand All @@ -637,9 +638,20 @@ def load():
qt_app = QtWidgets.QApplication(sys.argv)
else:
qt_app = QtWidgets.QApplication.instance()
window = AssetBrowser()
window.show()
# Start Qt event loop in a separate thread to avoid blocking Blender
qt_window = AssetBrowser()
qt_window.show()

if IS_LINUX:
# Qt objects were created by Blender's main thread. Qt requires their
# event loop to run on that same thread; calling exec_() from a Python
# worker happens to work on Windows but is rejected on Linux.
# Let Blender schedule short Qt event-processing slices instead.
if not bpy.app.timers.is_registered(qt_event_loop):
bpy.app.timers.register(qt_event_loop, first_interval=0.01)
return

# Preserve the existing Windows behaviour, where the separate Qt event
# loop has historically coexisted with Blender without blocking its UI.
qt_thread = threading.Thread(target=qt_thread_func, daemon=True)
qt_thread.start()

2 changes: 1 addition & 1 deletion src/addons/no_mans_sky_base_builder/blender_manifest.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ schema_version = "1.0.0"
# Example of manifest file for a Blender extension
# Change the values according to your extension
id = "no_mans_sky_base_builder"
version = "6.5.0"
version = "6.5.2"
name = "No Man's Sky Base Builder"
tagline = "A tool to assist with base building in No Mans Sky"
maintainer = "DjMonkey <@djmonkeyuk>"
Expand Down
Loading