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

"""
坐标轴中心位置测试脚本

测试坐标轴是否正确显示在实体中心，并且不被实体遮挡
"""

import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from main import MyWorld
from PyQt5.QtWidgets import QApplication

def test_center_gizmo():
    """测试坐标轴中心位置显示"""
    
    print("=== 坐标轴中心位置测试 ===")
    
    # 创建应用程序
    app = QApplication.instance()
    if app is None:
        app = QApplication(sys.argv)
    
    # 创建世界
    world = MyWorld()
    
    print("\n1. 测试导入模型...")
    
    # 查找FBX测试文件
    fbx_files = []
    current_dir = os.path.dirname(os.path.abspath(__file__))
    for filename in os.listdir(current_dir):
        if filename.lower().endswith('.fbx'):
            fbx_files.append(os.path.join(current_dir, filename))
    
    if not fbx_files:
        print("× 没有找到FBX测试文件")
        return
    
    # 导入第一个找到的FBX文件
    test_file = fbx_files[0]
    print(f"导入测试文件: {test_file}")
    
    model = world.scene_manager.importModel(test_file)
    if not model:
        print("× 模型导入失败")
        return
    
    print("✓ 模型导入成功")
    
    print("\n2. 测试选择模型...")
    
    # 模拟选择模型
    world.selection.updateSelection(model)
    
    if world.selection.selectedNode:
        print("✓ 模型选择成功")
        
        # 检查坐标轴是否创建
        if world.selection.gizmo:
            print("✓ 坐标轴创建成功")
            
            # 获取模型边界和坐标轴位置
            bounds = model.getBounds()
            if bounds and not bounds.isEmpty():
                center = bounds.getCenter()
                gizmo_pos = world.selection.gizmo.getPos()
                
                print(f"\n3. 位置验证:")
                print(f"   模型边界中心: {center}")
                print(f"   坐标轴位置: {gizmo_pos}")
                
                # 验证坐标轴是否在中心位置（允许小的浮点误差）
                pos_diff = abs(gizmo_pos.x - center.x) + abs(gizmo_pos.y - center.y) + abs(gizmo_pos.z - center.z)
                if pos_diff < 0.1:  # 允许0.1的误差
                    print("✓ 坐标轴位置正确设置在实体中心")
                else:
                    print(f"× 坐标轴位置不在中心，偏差: {pos_diff}")
            
            # 检查渲染设置
            print(f"\n4. 渲染设置验证:")
            print(f"   坐标轴渲染bin: {world.selection.gizmo.getBin()}")
            print(f"   坐标轴深度测试: {world.selection.gizmo.getDepthTest()}")
            print(f"   坐标轴深度写入: {world.selection.gizmo.getDepthWrite()}")
            
            if world.selection.gizmoXAxis:
                print(f"   X轴渲染bin: {world.selection.gizmoXAxis.getBin()}")
                print(f"   X轴深度测试: {world.selection.gizmoXAxis.getDepthTest()}")
            
            if world.selection.gizmoYAxis:
                print(f"   Y轴渲染bin: {world.selection.gizmoYAxis.getBin()}")
                print(f"   Y轴深度测试: {world.selection.gizmoYAxis.getDepthTest()}")
            
            if world.selection.gizmoZAxis:
                print(f"   Z轴渲染bin: {world.selection.gizmoZAxis.getBin()}")
                print(f"   Z轴深度测试: {world.selection.gizmoZAxis.getDepthTest()}")
            
            print("✓ 渲染设置已应用")
        else:
            print("× 坐标轴创建失败")
    else:
        print("× 模型选择失败")
    
    print("\n5. 测试说明:")
    print("   - 坐标轴现在应该显示在实体的几何中心")
    print("   - 即使部分坐标轴在实体内部，也应该完全可见")
    print("   - 坐标轴具有最高的渲染优先级，不会被任何实体遮挡")
    print("   - 三个轴有独立的渲染优先级：X(201), Y(202), Z(203)")
    
    print("\n=== 测试完成 ===")
    
    # 启动交互模式让用户查看结果
    print("\n按任意键查看3D场景...")
    input()
    
    # 显示3D窗口
    try:
        from ui.main_window import setup_main_window
        app, main_window = setup_main_window(world)
        main_window.show()
        
        print("✓ 3D窗口已打开，请验证:")
        print("  1. 坐标轴是否显示在实体中心")
        print("  2. 坐标轴是否完全可见（不被实体遮挡）")
        print("  3. 可以正常点击和拖拽坐标轴")
        
        app.exec_()
    except Exception as e:
        print(f"显示3D窗口时出错: {e}")

if __name__ == "__main__":
    test_center_gizmo() 