222 lines
7.8 KiB
Python
222 lines
7.8 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
#===================================== 1. Module Imports =====================================
|
|
import maya.cmds as cmds
|
|
import maya.mel as mel
|
|
import sys
|
|
import os
|
|
from scripts.config import data
|
|
from scripts.ui import define_utils as define_utils
|
|
from scripts.ui import widgets as widgets
|
|
|
|
try:
|
|
from PySide2 import QtCore, QtGui, QtWidgets
|
|
from shiboken2 import wrapInstance
|
|
except ImportError:
|
|
try:
|
|
from PySide6 import QtCore, QtGui, QtWidgets
|
|
from shiboken6 import wrapInstance
|
|
except ImportError:
|
|
try:
|
|
from PySide import QtCore, QtGui, QtWidgets
|
|
from shiboken import wrapInstance
|
|
except ImportError as e:
|
|
QtCore = QtGui = QtWidgets = None
|
|
wrapInstance = None
|
|
#===================================== 2. Define Tab Class =====================================
|
|
class DefineTab(widgets.BaseWidget):
|
|
"""定义标签页"""
|
|
def __init__(self, parent=None):
|
|
self.lod_tree = None
|
|
self.mesh_tree = None
|
|
self.joint_tree = None
|
|
self.blend_tree = None
|
|
self.anim_tree = None
|
|
super(DefineTab, self).__init__(parent)
|
|
|
|
def setup_ui(self):
|
|
"""初始化UI"""
|
|
layout = QtWidgets.QVBoxLayout(self)
|
|
layout.setSpacing(self.SPACING)
|
|
layout.setContentsMargins(self.MARGINS, self.MARGINS,
|
|
self.MARGINS, self.MARGINS)
|
|
|
|
# 创建左右分栏布局
|
|
splitter = QtWidgets.QSplitter(QtCore.Qt.Horizontal)
|
|
layout.addWidget(splitter)
|
|
|
|
# 左侧树形结构
|
|
left_widget = QtWidgets.QWidget()
|
|
left_layout = QtWidgets.QVBoxLayout(left_widget)
|
|
|
|
# LODs树
|
|
lod_group = QtWidgets.QGroupBox("LODs")
|
|
lod_layout = QtWidgets.QVBoxLayout()
|
|
self.lod_tree = QtWidgets.QTreeWidget()
|
|
self.lod_tree.setHeaderHidden(True)
|
|
|
|
# 添加LOD项
|
|
for i in range(8):
|
|
lod_item = QtWidgets.QTreeWidgetItem([f"LOD {i}"])
|
|
self.lod_tree.addTopLevelItem(lod_item)
|
|
|
|
lod_layout.addWidget(self.lod_tree)
|
|
lod_group.setLayout(lod_layout)
|
|
left_layout.addWidget(lod_group)
|
|
|
|
# Meshes树
|
|
mesh_group = QtWidgets.QGroupBox("Meshes [010/54]")
|
|
mesh_layout = QtWidgets.QVBoxLayout()
|
|
self.mesh_tree = QtWidgets.QTreeWidget()
|
|
self.mesh_tree.setHeaderHidden(True)
|
|
|
|
# 添加示例网格
|
|
meshes = [
|
|
("head_lod0_mesh", "000"),
|
|
("teeth_lod0_mesh", "001"),
|
|
("saliva_lod0_mesh", "002"),
|
|
("eyeLeft_lod0_mesh", "003"),
|
|
("eyeRight_lod0_mesh", "004"),
|
|
("eyeshell_lod0_mesh", "005")
|
|
]
|
|
|
|
for name, index in meshes:
|
|
mesh_item = QtWidgets.QTreeWidgetItem([name])
|
|
mesh_item.setData(0, QtCore.Qt.UserRole, index)
|
|
self.mesh_tree.addTopLevelItem(mesh_item)
|
|
|
|
mesh_layout.addWidget(self.mesh_tree)
|
|
mesh_group.setLayout(mesh_layout)
|
|
left_layout.addWidget(mesh_group)
|
|
|
|
splitter.addWidget(left_widget)
|
|
|
|
# 右侧内容
|
|
right_widget = QtWidgets.QWidget()
|
|
right_layout = QtWidgets.QVBoxLayout(right_widget)
|
|
|
|
# Joints树
|
|
joint_group = QtWidgets.QGroupBox("Joints [840/870]")
|
|
joint_layout = QtWidgets.QVBoxLayout()
|
|
self.joint_tree = QtWidgets.QTreeWidget()
|
|
self.joint_tree.setHeaderHidden(True)
|
|
|
|
# 添加示例关节
|
|
joints = [
|
|
("FACIAL_C_NeckB", "001"),
|
|
("FACIAL_L_NeckB1", "002"),
|
|
("FACIAL_R_NeckB1", "003"),
|
|
("FACIAL_L_NeckB2", "002")
|
|
]
|
|
|
|
for name, group in joints:
|
|
joint_item = QtWidgets.QTreeWidgetItem([f"{name} Group: {group}"])
|
|
self.joint_tree.addTopLevelItem(joint_item)
|
|
|
|
joint_layout.addWidget(self.joint_tree)
|
|
joint_group.setLayout(joint_layout)
|
|
right_layout.addWidget(joint_group)
|
|
|
|
# Blend Shapes树
|
|
blend_group = QtWidgets.QGroupBox("Blend Shapes [782/782]")
|
|
blend_layout = QtWidgets.QVBoxLayout()
|
|
self.blend_tree = QtWidgets.QTreeWidget()
|
|
self.blend_tree.setHeaderHidden(True)
|
|
|
|
# 添加示例混合形状
|
|
blends = [
|
|
"brow_down_L",
|
|
"brow_down_R",
|
|
"brow_lateral_L",
|
|
"brow_lateral_R"
|
|
]
|
|
|
|
for name in blends:
|
|
blend_item = QtWidgets.QTreeWidgetItem([name])
|
|
self.blend_tree.addTopLevelItem(blend_item)
|
|
|
|
blend_layout.addWidget(self.blend_tree)
|
|
blend_group.setLayout(blend_layout)
|
|
right_layout.addWidget(blend_group)
|
|
|
|
# AnimatedMap树
|
|
anim_group = QtWidgets.QGroupBox("AnimatedMap [082/82]")
|
|
anim_layout = QtWidgets.QVBoxLayout()
|
|
self.anim_tree = QtWidgets.QTreeWidget()
|
|
self.anim_tree.setHeaderHidden(True)
|
|
|
|
# 添加示例动画贴图
|
|
anims = [
|
|
"head_cm2_color.head_wm2_browsDown_L",
|
|
"head_cm2_color.head_wm2_browsDown_R",
|
|
"head_cm2_color.head_wm2_browsLateral_L",
|
|
"head_cm2_color.head_wm2_browsLateral_R"
|
|
]
|
|
|
|
for name in anims:
|
|
anim_item = QtWidgets.QTreeWidgetItem([name])
|
|
self.anim_tree.addTopLevelItem(anim_item)
|
|
|
|
anim_layout.addWidget(self.anim_tree)
|
|
anim_group.setLayout(anim_layout)
|
|
right_layout.addWidget(anim_group)
|
|
|
|
splitter.addWidget(right_widget)
|
|
|
|
# 底部按钮组
|
|
bottom_layout = QtWidgets.QHBoxLayout()
|
|
|
|
# 导入组
|
|
write_group = QtWidgets.QGroupBox("导入")
|
|
write_layout = QtWidgets.QVBoxLayout()
|
|
write_btns = [
|
|
("导入关节和权重", define_utils.write_joints_weights),
|
|
("导入几何体", define_utils.write_geometry),
|
|
("导入蒙皮权重", define_utils.write_skin_weights),
|
|
("导入混合变形目标", define_utils.write_blend_targets)
|
|
]
|
|
|
|
for text, callback in write_btns:
|
|
btn = QtWidgets.QPushButton(text)
|
|
btn.clicked.connect(lambda checked=False, cb=callback: cb())
|
|
write_layout.addWidget(btn)
|
|
|
|
write_group.setLayout(write_layout)
|
|
bottom_layout.addWidget(write_group)
|
|
|
|
# 创建组
|
|
create_group = QtWidgets.QGroupBox("创建")
|
|
create_layout = QtWidgets.QVBoxLayout()
|
|
create_btns = [
|
|
("创建新的LOD", define_utils.create_new_lod),
|
|
("绑定蒙皮", define_utils.bind_skin),
|
|
("取消蒙皮", define_utils.unbind_skin)
|
|
]
|
|
|
|
for text, callback in create_btns:
|
|
btn = QtWidgets.QPushButton(text)
|
|
btn.clicked.connect(lambda checked=False, cb=callback: cb())
|
|
create_layout.addWidget(btn)
|
|
|
|
create_group.setLayout(create_layout)
|
|
bottom_layout.addWidget(create_group)
|
|
|
|
# 工具组
|
|
tools_group = QtWidgets.QGroupBox("工具")
|
|
tools_layout = QtWidgets.QVBoxLayout()
|
|
tools_btns = [
|
|
("更新运行时LOD", define_utils.update_runtime_lod),
|
|
("快速创建绑定", define_utils.quick_create_binding),
|
|
("创建蒙皮", define_utils.create_skin)
|
|
]
|
|
|
|
for text, callback in tools_btns:
|
|
btn = QtWidgets.QPushButton(text)
|
|
btn.clicked.connect(lambda checked=False, cb=callback: cb())
|
|
tools_layout.addWidget(btn)
|
|
|
|
tools_group.setLayout(tools_layout)
|
|
bottom_layout.addWidget(tools_group)
|
|
|
|
layout.addLayout(bottom_layout)
|
|
|