98 lines
3.3 KiB
Python
98 lines
3.3 KiB
Python
|
|
import tkinter as tk
|
|
from source.packages import PackageManager
|
|
from source.packages.gui import *
|
|
from direct.showbase.ShowBase import ShowBase
|
|
from panda3d.core import VirtualFileSystem, Material
|
|
|
|
class PackageExplorer:
|
|
def __init__(self, args):
|
|
self.gui = tk.Tk()
|
|
self.panda = ShowBase()
|
|
self.package_manager = PackageManager(VirtualFileSystem.getGlobalPtr())
|
|
self.package_manager.set_main_package(args.main)
|
|
self.icons = get_icons()
|
|
self.prev = None
|
|
if args.package:
|
|
for include in args.package:
|
|
self.package_manager.include_package(include)
|
|
self.tree_packages = None
|
|
self.tree_scene = None
|
|
self.running = True
|
|
self.panda_keymap = {
|
|
'mouse1': False
|
|
}
|
|
init_gui(self, args)
|
|
init_packages_tree(self.tree_packages, self.package_manager, self.icons)
|
|
init_panda(self, args)
|
|
|
|
def on_tk_close(self):
|
|
self.running = False
|
|
|
|
def on_packagetree_doubleclick(self, event):
|
|
item = self.tree_packages.selection()[0]
|
|
if item.lower().endswith(('.glb', '.gltf', '.obj', '.egg')):
|
|
for child in self.scene_root.getChildren():
|
|
child.removeNode()
|
|
mat = Material()
|
|
mat.setAmbient((1, 0, 0, 1))
|
|
node = self.panda.loader.loadModel(item)
|
|
node.reparentTo(self.scene_root)
|
|
node.setMaterial(mat)
|
|
self.display_scenegraph(node, item)
|
|
self.prev = node
|
|
|
|
def display_scenegraph(self, node, item):
|
|
self.tree_scene.delete(*self.tree_scene.get_children())
|
|
self.tree_scene.insert('', 'end', '/', text=f' {item}', open=True, image=self.icons.shape_square)
|
|
self.add_scene_nodes(node, '/')
|
|
|
|
def add_scene_nodes(self, node, parent):
|
|
pn = node.node()
|
|
tree_id = f'{pn.getType().getName()} {node.getName()}'
|
|
tree_name = tree_id
|
|
image = ''
|
|
match pn.getType().getName():
|
|
case 'ModelRoot':
|
|
image = self.icons.chart_organisation
|
|
case 'PandaNode':
|
|
image = self.icons.anchor
|
|
case 'GeomNode':
|
|
image = self.icons.shape_flip_horizontal
|
|
case 'AnimBundleNode':
|
|
bundle = pn.getBundle().getName()
|
|
tree_id = f'{tree_id}_{bundle}'
|
|
tree_name = f'{bundle}'
|
|
image = self.icons.film
|
|
case 'Character':
|
|
image = self.icons.user
|
|
self.tree_scene.insert(parent, 'end', tree_id, text=f' {tree_name}', open=True, image=image)
|
|
for child in node.getChildren():
|
|
self.add_scene_nodes(child, tree_id)
|
|
|
|
def mouse1_down(self):
|
|
self.panda_keymap['mouse1'] = True
|
|
|
|
def mouse1_up(self):
|
|
self.panda_keymap['mouse1'] = False
|
|
|
|
def update_input(self, task):
|
|
dt = self.panda.clock.getDt()
|
|
if self.panda_keymap['mouse1']:
|
|
print('Mouse1 down')
|
|
|
|
return task.cont
|
|
|
|
def loop(self):
|
|
try:
|
|
while self.running:
|
|
self.gui.update_idletasks()
|
|
self.gui.update()
|
|
self.panda.taskMgr.step()
|
|
except KeyboardInterrupt:
|
|
return
|
|
|
|
|
|
def start_explorer(args):
|
|
app = PackageExplorer(args)
|
|
app.loop() |