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。
This commit is contained in:
Executable
+51
@@ -0,0 +1,51 @@
|
||||
#!/bin/bash
|
||||
# ============================================================
|
||||
# OpenDance Studio —— Windows 客户端版本号一致性校验
|
||||
#
|
||||
# 文档 §11.2「单一来源 / 可核对」在本端的落点:
|
||||
# * `project.godot` 的 `application/config/version` 是**运行时唯一来源**
|
||||
# (「关于」清单直接读它,导出后打进 .pck);
|
||||
# * `project.yaml` 的 `version` 是任务清单/发布记录的来源;
|
||||
# * 发布产物文件名 `opendance-windows-vX.Y.Z.zip` 与 Git tag 必须一致。
|
||||
#
|
||||
# 三者一旦漂移,就会出现"界面显示 v0.2.0、产物却叫 v0.2.1"这种不可核对的发布,
|
||||
# 因此打包前强制校验。
|
||||
#
|
||||
# 用法:bash build/check-version.sh [期望版本号]
|
||||
# ============================================================
|
||||
set -uo pipefail
|
||||
|
||||
PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
cd "$PROJECT_DIR"
|
||||
|
||||
GODOT_VERSION="$(sed -n 's/^config\/version="\(.*\)"$/\1/p' project.godot | head -1)"
|
||||
YAML_VERSION="$(sed -n 's/^version:[[:space:]]*//p' project.yaml | head -1)"
|
||||
EXPECTED="${1:-$YAML_VERSION}"
|
||||
|
||||
printf ' project.godot application/config/version = %s\n' "${GODOT_VERSION:-(未找到)}"
|
||||
printf ' project.yaml version = %s\n' "${YAML_VERSION:-(未找到)}"
|
||||
printf ' 期望版本 = %s\n' "${EXPECTED:-(未指定)}"
|
||||
|
||||
FAILED=0
|
||||
[ -n "$GODOT_VERSION" ] || { echo " ✗ 无法从 project.godot 解析 config/version" >&2; FAILED=1; }
|
||||
[ -n "$YAML_VERSION" ] || { echo " ✗ 无法从 project.yaml 解析 version" >&2; FAILED=1; }
|
||||
if [ -n "$EXPECTED" ] && [ "$GODOT_VERSION" != "$EXPECTED" ]; then
|
||||
echo " ✗ project.godot 的版本与期望不一致(界面/About 会显示错版本)" >&2
|
||||
FAILED=1
|
||||
fi
|
||||
if [ -n "$YAML_VERSION" ] && [ "$GODOT_VERSION" != "$YAML_VERSION" ]; then
|
||||
echo " ✗ project.godot 与 project.yaml 版本不一致" >&2
|
||||
FAILED=1
|
||||
fi
|
||||
# 版本号格式 X.Y.Z
|
||||
if [ -n "$GODOT_VERSION" ] && ! printf '%s' "$GODOT_VERSION" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+$'; then
|
||||
echo " ✗ 版本号应为 X.Y.Z(实际 $GODOT_VERSION)" >&2
|
||||
FAILED=1
|
||||
fi
|
||||
|
||||
if [ "$FAILED" -ne 0 ]; then
|
||||
echo " ✗ 版本一致性校验失败" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo " ✓ 版本一致:v$GODOT_VERSION(project.godot = project.yaml${EXPECTED:+ = 期望值})"
|
||||
@@ -43,6 +43,9 @@ log() { printf '\033[1;34m[package]\033[0m %s\n' "$*"; }
|
||||
warn() { printf '\033[1;33m[warn]\033[0m %s\n' "$*" >&2; }
|
||||
die() { printf '\033[1;31m[error]\033[0m %s\n' "$*" >&2; exit 1; }
|
||||
|
||||
# ---- 0. 版本号一致性(文档 §11.2:产物名 / tag / 界面展示必须一致)----
|
||||
bash "$PROJECT_DIR/build/check-version.sh" "$VERSION" || die "版本一致性校验失败,先统一 project.godot / project.yaml / 发布版本号"
|
||||
|
||||
EXE="$PROJECT_DIR/build/windows/OpenDance.exe"
|
||||
PCK="$PROJECT_DIR/build/windows/OpenDance.pck"
|
||||
|
||||
|
||||
+14
-3
@@ -26,7 +26,18 @@ fi
|
||||
FAILED=0
|
||||
|
||||
echo "============================================================"
|
||||
echo " 1/3 脚本编译检查"
|
||||
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
|
||||
@@ -41,7 +52,7 @@ rm -f "$IMPORT_LOG"
|
||||
|
||||
echo ""
|
||||
echo "============================================================"
|
||||
echo " 2/3 无头测试(单元 + 真实 API 集成)"
|
||||
echo " 2/4 无头测试(单元 + 真实 API 集成)"
|
||||
echo "============================================================"
|
||||
TEST_LOG=$(mktemp)
|
||||
"$GODOT_BIN" --headless --path "$PROJECT_DIR" --script res://tests/run_tests.gd >"$TEST_LOG" 2>&1
|
||||
@@ -58,7 +69,7 @@ rm -f "$TEST_LOG"
|
||||
|
||||
echo ""
|
||||
echo "============================================================"
|
||||
echo " 3/3 应用启动检查(180 帧)"
|
||||
echo " 3/4 应用启动检查(180 帧)"
|
||||
echo "============================================================"
|
||||
RUN_LOG=$(mktemp)
|
||||
timeout 120 "$GODOT_BIN" --headless --path "$PROJECT_DIR" --quit-after 180 >"$RUN_LOG" 2>&1
|
||||
|
||||
Reference in New Issue
Block a user