#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
测试脚本：验证旋转后模型的子节点拖拽方向是否正确
"""

import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))

from main import MyWorld
from panda3d.core import Vec3, Point3, CardMaker
from direct.task.TaskManagerGlobal import taskMgr
import time
import math

def test_rotation_drag():
    """测试旋转后模型的子节点拖拽方向"""
    print("=== 测试旋转后模型的子节点拖拽方向 ===")
    
    # 创建世界
    world = MyWorld()
    
    # 创建父模型（立方体）
    cm_parent = CardMaker("parent_cube")
    cm_parent.setFrame(-2, 2, -2, 2)
    parent_model = world.render.attachNewNode(cm_parent.generate())
    parent_model.setName("parent_model")
    parent_model.setPos(0, 0, 1)  # 在地面上方
    parent_model.setColor(0.5, 0.5, 1, 1)  # 蓝色
    
    # 创建子节点（小立方体）
    cm_child = CardMaker("child_cube")
    cm_child.setFrame(-0.5, 0.5, -0.5, 0.5)
    child_model = parent_model.attachNewNode(cm_child.generate())
    child_model.setName("child_model")
    child_model.setPos(3, 0, 0)  # 相对于父节点的位置（父节点右侧）
    child_model.setColor(1, 0, 0, 1)  # 红色
    
    # 将父模型添加到模型列表
    world.models.append(parent_model)
    
    # 设置碰撞检测
    world.scene_manager.setupCollision(parent_model)
    world.scene_manager.setupCollision(child_model)
    
    print(f"父模型位置: {parent_model.getPos()}")
    print(f"父模型旋转: {parent_model.getHpr()}")
    print(f"子模型位置: {child_model.getPos()}")
    print(f"子模型世界位置: {child_model.getPos(world.render)}")
    
    # 测试1：选择父模型，验证其拖拽方向
    print("\n=== 测试1：选择父模型 ===")
    world.selection.updateSelection(parent_model)
    
    def test_parent_drag(task):
        print("父模型拖拽测试开始...")
        
        # 检查坐标轴
        if world.selection.gizmo:
            gizmo_pos = world.selection.gizmo.getPos()
            gizmo_hpr = world.selection.gizmo.getHpr()
            print(f"父模型坐标轴位置: {gizmo_pos}")
            print(f"父模型坐标轴朝向: {gizmo_hpr}")
            print("✓ 父模型坐标轴应该使用世界坐标系（H=0, P=0, R=0）")
        
        # 等待3秒后旋转父模型
        taskMgr.doMethodLater(3.0, rotate_parent, "rotate_parent")
        return task.done
    
    def rotate_parent(task):
        print("\n=== 旋转父模型45度 ===")
        parent_model.setHpr(45, 0, 0)  # 绕Z轴旋转45度
        print(f"父模型新旋转: {parent_model.getHpr()}")
        print(f"子模型新世界位置: {child_model.getPos(world.render)}")
        
        # 选择子节点进行测试
        taskMgr.doMethodLater(1.0, test_child_drag, "test_child_drag")
        return task.done
    
    def test_child_drag(task):
        print("\n=== 测试2：选择子模型 ===")
        world.selection.updateSelection(child_model)
        
        # 检查子节点的坐标轴
        if world.selection.gizmo:
            gizmo_pos = world.selection.gizmo.getPos()
            gizmo_hpr = world.selection.gizmo.getHpr()
            parent_hpr = parent_model.getHpr()
            print(f"子模型坐标轴位置: {gizmo_pos}")
            print(f"子模型坐标轴朝向: {gizmo_hpr}")
            print(f"父模型朝向: {parent_hpr}")
            
            # 验证坐标轴朝向
            if abs(gizmo_hpr.x - parent_hpr.x) < 0.1:
                print("✓ 子模型坐标轴朝向正确跟随父模型")
            else:
                print("✗ 子模型坐标轴朝向未跟随父模型")
        
        # 模拟拖拽测试
        taskMgr.doMethodLater(2.0, simulate_drag_test, "simulate_drag_test")
        return task.done
    
    def simulate_drag_test(task):
        print("\n=== 模拟拖拽测试 ===")
        print("请手动测试以下操作：")
        print("1. 点击子模型的红色X轴并拖拽")
        print("   - 应该沿着父模型的局部X轴方向移动（已旋转45度）")
        print("   - 而不是沿着世界X轴方向移动")
        print("2. 点击子模型的绿色Y轴并拖拽")
        print("   - 应该沿着父模型的局部Y轴方向移动（已旋转45度）")
        print("3. 点击子模型的蓝色Z轴并拖拽")
        print("   - 应该沿着Z轴方向移动（Z轴未旋转）")
        
        # 添加更多旋转测试
        taskMgr.doMethodLater(5.0, test_more_rotations, "test_more_rotations")
        return task.done
    
    def test_more_rotations(task):
        print("\n=== 测试更复杂的旋转 ===")
        
        # 旋转父模型到不同角度
        parent_model.setHpr(30, 45, 15)  # 复杂旋转
        print(f"父模型复杂旋转: {parent_model.getHpr()}")
        
        # 强制更新坐标轴
        world.selection.updateSelection(child_model)
        
        if world.selection.gizmo:
            gizmo_hpr = world.selection.gizmo.getHpr()
            print(f"子模型坐标轴新朝向: {gizmo_hpr}")
            print("坐标轴朝向应该与父模型一致")
        
        # 添加视觉验证指南
        taskMgr.doMethodLater(2.0, visual_guide, "visual_guide")
        return task.done
    
    def visual_guide(task):
        print("\n=== 视觉验证指南 ===")
        print("观察要点：")
        print("1. 子模型的坐标轴应该与父模型保持相同的旋转角度")
        print("2. 拖拽子模型时，移动方向应该遵循坐标轴的视觉方向")
        print("3. 红色X轴拖拽 → 沿红色轴方向移动")
        print("4. 绿色Y轴拖拽 → 沿绿色轴方向移动")
        print("5. 蓝色Z轴拖拽 → 沿蓝色轴方向移动")
        print("\n如果拖拽方向与坐标轴视觉方向一致，则修复成功！")
        
        return task.done
    
    # 启动测试
    taskMgr.doMethodLater(1.0, test_parent_drag, "test_parent_drag")
    
    # 运行引擎
    world.run()

if __name__ == "__main__":
    test_rotation_drag() 