93 lines
3.7 KiB
Python
93 lines
3.7 KiB
Python
from imgui_bundle import imgui, imgui_ctx
|
|
|
|
class EditorPanelsRightTransformMixin:
|
|
"""Auto-split mixin from editor_panels_right.py."""
|
|
|
|
def _draw_transform_properties(self, node):
|
|
"""绘制变换属性"""
|
|
# 位置组
|
|
if imgui.collapsing_header("位置 Position"):
|
|
# 相对位置
|
|
imgui.text("相对位置")
|
|
pos = node.getPos()
|
|
|
|
# X坐标
|
|
changed, new_x = imgui.input_float("X##pos_x", pos.x, 0.1, 1.0, "%.3f")
|
|
if changed: node.setX(new_x)
|
|
|
|
# Y坐标
|
|
changed, new_y = imgui.input_float("Y##pos_y", pos.y, 0.1, 1.0, "%.3f")
|
|
if changed: node.setY(new_y)
|
|
|
|
# Z坐标
|
|
changed, new_z = imgui.input_float("Z##pos_z", pos.z, 0.1, 1.0, "%.3f")
|
|
if changed: node.setZ(new_z)
|
|
|
|
# 世界位置
|
|
imgui.text("世界位置")
|
|
world_pos = node.getPos(self.render)
|
|
|
|
imgui.text(f"世界 X: {world_pos.x:.3f}")
|
|
imgui.text(f"世界 Y: {world_pos.y:.3f}")
|
|
imgui.text(f"世界 Z: {world_pos.z:.3f}")
|
|
|
|
# 位置操作按钮
|
|
if imgui.button("重置位置##reset_pos"):
|
|
node.setPos(0, 0, 0)
|
|
imgui.same_line()
|
|
if imgui.button("复制位置##copy_pos"):
|
|
self._clipboard_pos = (pos.x, pos.y, pos.z)
|
|
imgui.same_line()
|
|
if imgui.button("粘贴位置##paste_pos") and hasattr(self, '_clipboard_pos'):
|
|
node.setPos(self._clipboard_pos[0], self._clipboard_pos[1], self._clipboard_pos[2])
|
|
|
|
# 旋转组
|
|
if imgui.collapsing_header("旋转 Rotation"):
|
|
hpr = node.getHpr()
|
|
|
|
# HPR旋转
|
|
imgui.text("HPR 旋转 (度)")
|
|
changed, new_h = imgui.input_float("H##rot_h", hpr.x, 1.0, 10.0, "%.1f")
|
|
if changed: node.setH(new_h)
|
|
|
|
changed, new_p = imgui.input_float("P##rot_p", hpr.y, 1.0, 10.0, "%.1f")
|
|
if changed: node.setP(new_p)
|
|
|
|
changed, new_r = imgui.input_float("R##rot_r", hpr.z, 1.0, 10.0, "%.1f")
|
|
if changed: node.setR(new_r)
|
|
|
|
# 旋转操作按钮
|
|
if imgui.button("重置旋转##reset_rot"):
|
|
node.setHpr(0, 0, 0)
|
|
imgui.same_line()
|
|
if imgui.button("随机旋转##random_rot"):
|
|
import random
|
|
node.setHpr(random.randint(0, 360), random.randint(0, 360), random.randint(0, 360))
|
|
|
|
# 缩放组
|
|
if imgui.collapsing_header("缩放 Scale"):
|
|
scale = node.getScale()
|
|
|
|
# XYZ缩放
|
|
imgui.text("XYZ 缩放")
|
|
changed, new_sx = imgui.input_float("X##scale_x", scale.x, 0.1, 1.0, "%.3f")
|
|
if changed: node.setSx(new_sx)
|
|
|
|
changed, new_sy = imgui.input_float("Y##scale_y", scale.y, 0.1, 1.0, "%.3f")
|
|
if changed: node.setSy(new_sy)
|
|
|
|
changed, new_sz = imgui.input_float("Z##scale_z", scale.z, 0.1, 1.0, "%.3f")
|
|
if changed: node.setSz(new_sz)
|
|
|
|
# 统一缩放
|
|
if imgui.button("统一缩放##uniform_scale"):
|
|
uniform_scale = (scale.x + scale.y + scale.z) / 3.0
|
|
node.setScale(uniform_scale, uniform_scale, uniform_scale)
|
|
imgui.same_line()
|
|
if imgui.button("重置缩放##reset_scale"):
|
|
node.setScale(1, 1, 1)
|
|
imgui.same_line()
|
|
if imgui.button("翻倍##double_scale"):
|
|
node.setScale(scale.x * 2, scale.y * 2, scale.z * 2)
|
|
|