From 08c58bd8b44f4b89234e6b780f733f9c0a7126e6 Mon Sep 17 00:00:00 2001 From: jacobbclr <120661261+jacobbclr@users.noreply.github.com> Date: Fri, 31 May 2024 10:23:22 +0200 Subject: [PATCH 1/4] Editor options (missing persistence) --- web/editor.html | 80 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 77 insertions(+), 3 deletions(-) diff --git a/web/editor.html b/web/editor.html index 455d792..8803731 100644 --- a/web/editor.html +++ b/web/editor.html @@ -1,5 +1,5 @@ -
-
+
+
@@ -152,7 +152,32 @@

Settings

@@ -694,13 +719,16 @@

Tweakables

this.DeselectAttachment(); this.DeselectLink(); if (this.mode == "View") { + showGrid(true); } if (this.mode == "Tweakables") { + showGrid(true); } if (this.mode == "Attachments") { setTransparency(0.2); + showGrid(false); } else { setTransparency(1); } @@ -967,6 +995,9 @@

Tweakables

container = document.getElementById('3js'); WIDTH = container.offsetWidth; HEIGHT = container.offsetHeight; + line = null; + gridHelper = null; + axisHelper = null; scene = new THREE.Scene(); camera = new THREE.PerspectiveCamera(60, WIDTH/HEIGHT, 0.01, 100); @@ -978,6 +1009,9 @@

Tweakables

renderer.setSize(WIDTH, HEIGHT); container.appendChild(renderer.domElement); + showGrid( true ); + showAxis( true ); + // Add some lights var light = new THREE.HemisphereLight(0xffffff, 0x444444, 1.0); light.position.set(0, 1, 0); @@ -1027,6 +1061,46 @@

Tweakables

scene.add(loaded_obj); } + function showWireframe( boolean ) { + if ( loaded_obj ) { + if (!line && boolean ) { + wireframe = new THREE.WireframeGeometry(loaded_obj.geometry); + line = new THREE.LineSegments(wireframe); + line.material.depthTest = true; + line.material.color = new THREE.Color(0xffa500); + line.material.opacity = 0.9; + line.material.transparent = true; + scene.add(line); + } else if (line && !boolean ) { + console.log('Deleting Wireframe'); + scene.remove(line); + line = null; + } + } + } + + function showGrid( boolean ) { + if ( !gridHelper && boolean ) { + gridHelper = new THREE.GridHelper( 4.5, 45 ); + scene.add(gridHelper); + } else if ( gridHelper && !boolean ) { + scene.remove(gridHelper); + gridHelper = null; + } else { + console.log('no gridHelper'); + } + } + + function showAxis( boolean ) { + if ( !axisHelper && boolean ) { + axisHelper = new THREE.AxesHelper( 2.25 ); + scene.add(axisHelper); + } else if ( axisHelper && !boolean ) { + scene.remove(axisHelper); + axisHelper = null; + } + } + function setTransparency(transparency) { // Iterate through the children of the loaded object loaded_obj.traverse(function(child) { From a0cfc76fa368b1563ae4eeadca28a1d24d0d7fca Mon Sep 17 00:00:00 2001 From: jacobbclr <120661261+jacobbclr@users.noreply.github.com> Date: Sun, 2 Jun 2024 14:11:21 +0200 Subject: [PATCH 2/4] Added options for cosmetic custom colliders --- classes/Part.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/classes/Part.py b/classes/Part.py index ce670f5..6147e9d 100644 --- a/classes/Part.py +++ b/classes/Part.py @@ -9,7 +9,7 @@ from classes.JoystickTweakable import JoystickTweakable from classes.Link import Link from classes.StringTweakable import StringTweakable - +from classes.Vector3 import Vector3 @dataclass class Part: @@ -39,6 +39,8 @@ class Part: is_paintable: bool = field(default=False, metadata={'label': 'Paintable'}) is_swappable_material: bool = field(default=False, metadata={'label': 'Swappable Material'}) mesh_collider: bool = field(default=False, metadata={'label': '(EXPERIMENTAL) Use Mesh Collider'}) + custom_collider: bool = field(default=False, metadata={'label': '(EXPERIMENTAL) Custom Collider'}) + custom_collider_position: Vector3 = field(default='', metadata={'label': 'Custom Collider Position'}) script: str = field(default='', metadata={'label': 'Script', 'hidden': True}) int_tweakables: List[IntTweakable] = field(default_factory=list, metadata={'hidden': True}) string_tweakables: List[StringTweakable] = field(default_factory=list, metadata={'hidden': True}) From 488e1086d37ed10bac9518b7d1becc3c86ac8efc Mon Sep 17 00:00:00 2001 From: jacobbclr <120661261+jacobbclr@users.noreply.github.com> Date: Sun, 2 Jun 2024 14:47:02 +0200 Subject: [PATCH 3/4] Fixed Custom Collider Position --- classes/Part.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/Part.py b/classes/Part.py index 6147e9d..1badab5 100644 --- a/classes/Part.py +++ b/classes/Part.py @@ -40,7 +40,7 @@ class Part: is_swappable_material: bool = field(default=False, metadata={'label': 'Swappable Material'}) mesh_collider: bool = field(default=False, metadata={'label': '(EXPERIMENTAL) Use Mesh Collider'}) custom_collider: bool = field(default=False, metadata={'label': '(EXPERIMENTAL) Custom Collider'}) - custom_collider_position: Vector3 = field(default='', metadata={'label': 'Custom Collider Position'}) + custom_collider_position: Vector3 = field(default_factory=lambda: Vector3(0, 0, 0), metadata={'label': 'Custom Collider Position'}) script: str = field(default='', metadata={'label': 'Script', 'hidden': True}) int_tweakables: List[IntTweakable] = field(default_factory=list, metadata={'hidden': True}) string_tweakables: List[StringTweakable] = field(default_factory=list, metadata={'hidden': True}) From beac2be0e2684cfb63c9838053e8bf447ab60931 Mon Sep 17 00:00:00 2001 From: jacobbclr <120661261+jacobbclr@users.noreply.github.com> Date: Sun, 2 Jun 2024 17:00:43 +0200 Subject: [PATCH 4/4] Fix for filedialog focus --- backend/mod.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/backend/mod.py b/backend/mod.py index 05be3f1..0ea45f0 100644 --- a/backend/mod.py +++ b/backend/mod.py @@ -3,6 +3,7 @@ import os from pathlib import Path import shutil +import tkinter from tkinter import filedialog import zipfile from dacite import from_dict @@ -114,8 +115,12 @@ def rename_mod(name, new_name, new_description): @eel.expose def import_mod(): - path = filedialog.askopenfilename(defaultextension='.gearthon', filetypes=[('Gearthon Mods', '*.gearthon')]) - + root = tkinter.Tk() + root.focus_force() + root.overrideredirect(True) + root.geometry('0x0+0+0') + path = filedialog.askopenfilename(defaultextension='.gearthon', filetypes=[('Gearthon Mods', '*.gearthon')], title='Import Mod') + root.destroy() with zipfile.ZipFile(path) as zip: first_dir = zip.filelist[0].filename from backend.appdata import appdata @@ -128,7 +133,12 @@ def import_mod(): @eel.expose def export_mod(name): + root = tkinter.Tk() + root.focus_force() + root.overrideredirect(True) + root.geometry('0x0+0+0') path = filedialog.askdirectory() + root.destroy() from backend.appdata import appdata mod_path = Path(f'{appdata.mods_folder()}/{name}') shutil.make_archive(f'{path}/{name}.gearthon', 'zip', root_dir=mod_path.parent, base_dir=f'./{name}')