@@ -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}')