MBH_Demo_001/source/pkgexplore.py

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()