Files
opendance-windows/build/verify.sh
T
zijunchiang 14ee5f7ec9 fix(scene): 包围盒沿树累乘变换(修掉入树前的 ERROR 与范围偏位)+ 21 项"真机等价"测试
缺陷:SceneRuntime._compute_aabb() 用 MeshInstance3D.global_transform 计算包围盒,
而它在 _assemble() 里调用 —— 那时运行时节点**还没入树**。两个后果:
- Godot 打一行 `ERROR: Condition "!is_inside_tree()" is true. Returning: Transform3D()`
  (真机每次载入场景都刷一条,与"日志里不应有 ERROR"的排查约定冲突);
- 树外的 global_transform 返回单位变换,算出来的只是各网格的**局部** AABB,
  于是重力/风 Area3D 的碰撞盒与兜底地面会偏小或偏位 —— 对把网格摆在非原点位置的
  场景(导出 GLB 的常见情况)**风力可能作用不到物体上**。

修复:改为从根往下累乘 `Node3D.transform`,不依赖是否入树;挂在单位变换父节点下时
结果与旧语义一致。

新增 21 项无头"真机等价"测试(不需要设备):
- tests/test_scene_config.gd:在代码里手写合法 GLB(三角形 + BIN chunk)落盘后
  **真实加载**:warnings 为空、按 colliders 三种取值分别核对碰撞体(mesh / auto 命中
  *_col / auto 未命中的兜底地面 / none)、重力 Area3D 的 gravity 与方向、
  SPACE_OVERRIDE_REPLACE、风力与 WIND_FORCE_SCALE 对齐,以及**带位移网格**
  (translation [10,0,0])时重力区域与兜底地面都跟着位移(该缺陷的回归测试);
- tests/test_pose_server.gd:**时间维度**验证保活 —— 只发应用层 ping、不发关键点帧的
  客户端在 17 秒(> 15 秒静默超时)后仍保持连接("画面里没人就掉线、疯狂重连"的根因
  对照),而完全不发数据的客户端被 close(1001) 断开。

新增 build/check-version.sh:强制 project.godot 的 application/config/version
(「关于」清单与 .pck 的来源)与 project.yaml、发布版本号三者一致;已接入
build/package-release.sh(打包前)与 build/verify.sh(第 0/4 步),并做过反向验证。
此前没有任何机制保证这两个文件同步 —— 界面显示的版本可能和产物名不一致。

版本升至 0.2.1(project.godot / project.yaml / README / 产物名 / tag 全部一致),
About 清单与 .pck 内版本号均为 0.2.1(已用 strings 核对)。

验证:build/verify.sh 四步全通过(版本一致性 → 编译 → 751 项断言 → 180 帧启动无错误);
产物 opendance-windows-v0.2.1.zip(LZMA,26,627,191 B)
sha256 d49885327047f5a52de6c732431ea080cd1a030ae1c581a8bc0ec0d99bfb792c。
2026-09-17 03:59:29 +08:00

101 lines
3.2 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# ============================================================
# OpenDance Studio —— Windows 客户端一键验证
#
# 依次执行:脚本编译检查 → 无头单元/集成测试 → 应用启动检查
# 任一环节失败即退出非 0。
#
# 用法:GODOT_BIN=/path/to/godot bash build/verify.sh
# ============================================================
set -uo pipefail
PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
cd "$PROJECT_DIR"
GODOT_BIN="${GODOT_BIN:-}"
if [ -z "$GODOT_BIN" ]; then
for candidate in godot godot4 Godot; do
if command -v "$candidate" >/dev/null 2>&1; then GODOT_BIN="$candidate"; break; fi
done
fi
if [ -z "$GODOT_BIN" ]; then
echo "错误:未找到 Godot。请用 GODOT_BIN=<路径> 指定。" >&2
exit 1
fi
FAILED=0
echo "============================================================"
echo " 0/4 版本号一致性(project.godot / project.yaml)"
echo "============================================================"
if bash "$PROJECT_DIR/build/check-version.sh"; then
:
else
echo "✗ 版本一致性校验失败"
FAILED=1
fi
echo ""
echo "============================================================"
echo " 1/4 脚本编译检查"
echo "============================================================"
IMPORT_LOG=$(mktemp)
"$GODOT_BIN" --headless --path "$PROJECT_DIR" --import >"$IMPORT_LOG" 2>&1
if grep -qE "SCRIPT ERROR|Parse Error|Compile Error" "$IMPORT_LOG"; then
echo "✗ 存在脚本编译错误:"
grep -E "SCRIPT ERROR|Parse Error|Compile Error" "$IMPORT_LOG" | head -20
FAILED=1
else
echo "✓ 全部脚本编译通过"
fi
rm -f "$IMPORT_LOG"
echo ""
echo "============================================================"
echo " 2/4 无头测试(单元 + 真实 API 集成)"
echo "============================================================"
TEST_LOG=$(mktemp)
"$GODOT_BIN" --headless --path "$PROJECT_DIR" --script res://tests/run_tests.gd >"$TEST_LOG" 2>&1
TEST_STATUS=$?
grep -E "^(== 结果|全部通过)" "$TEST_LOG" || true
if [ "$TEST_STATUS" -ne 0 ]; then
echo "✗ 测试失败(退出码 $TEST_STATUS)"
grep -E "✗" "$TEST_LOG" | head -20
FAILED=1
else
echo "✓ 测试全部通过"
fi
rm -f "$TEST_LOG"
echo ""
echo "============================================================"
echo " 3/4 应用启动检查(180 帧)"
echo "============================================================"
RUN_LOG=$(mktemp)
timeout 120 "$GODOT_BIN" --headless --path "$PROJECT_DIR" --quit-after 180 >"$RUN_LOG" 2>&1
RUN_STATUS=$?
if [ "$RUN_STATUS" -ne 0 ]; then
echo "✗ 启动失败(退出码 $RUN_STATUS)"
tail -20 "$RUN_LOG"
FAILED=1
elif grep -qE "SCRIPT ERROR|ERROR:" "$RUN_LOG"; then
echo "✗ 启动过程有错误:"
grep -E "SCRIPT ERROR|ERROR:" "$RUN_LOG" | head -10
FAILED=1
else
echo "✓ 应用启动正常,无运行时错误"
fi
rm -f "$RUN_LOG"
echo ""
if [ "$FAILED" -ne 0 ]; then
echo "============================================================"
echo " 验证失败"
echo "============================================================"
exit 1
fi
echo "============================================================"
echo " 验证全部通过"
echo "============================================================"