Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 36 additions & 2 deletions .github/workflows/v037-acceptance.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ name: SpatialViewer v0.3.7 Acceptance Package

on:
push:
branches: ['codex/v0.3.7-startup-screen']
branches:
- 'codex/v0.3.7-startup-screen'
- 'codex/v0.3.7-cadcore-v0.12.3-integration'
workflow_dispatch:

permissions:
Expand Down Expand Up @@ -37,15 +39,19 @@ jobs:
$release = Get-Content release/release.json -Raw | ConvertFrom-Json
$version = @($project.Project.PropertyGroup | ForEach-Object Version | Where-Object { $_ })[0]
$assemblyVersion = @($project.Project.PropertyGroup | ForEach-Object AssemblyVersion | Where-Object { $_ })[0]
$bundledCadCoreVersion = @($project.Project.PropertyGroup | ForEach-Object CadCoreBundledVersion | Where-Object { $_ })[0]
$sourceCadCoreCommit = (git rev-parse HEAD:external/SpatialViewer.CadCore).Trim()
if ([string]$version -cne '0.3.7') { throw "Project version is not 0.3.7: $version" }
if ([string]$assemblyVersion -cne '0.3.7.0') { throw "Assembly version is not 0.3.7.0: $assemblyVersion" }
if ([string]$manifest.Package.Identity.Version -cne '0.3.7.0' -or [string]$manifest.Package.Identity.Publisher -cne 'CN=AppPublisher') { throw 'MSIX identity is not the v0.3.7 release identity.' }
if ([string]$release.product.version -cne '0.3.7' -or [string]$release.product.packageVersion -cne '0.3.7.0') { throw 'Release metadata is not v0.3.7.' }
if ([string]$bundledCadCoreVersion -cne '0.12.3') { throw "Source build still declares an obsolete CadCore bundle: $bundledCadCoreVersion" }
if ($sourceCadCoreCommit -cne '2f150fbdcf380fba6f60df7f8a41361322afdd8f') { throw "Source submodule is not CadCore v0.12.3: $sourceCadCoreCommit" }
foreach ($asset in @('Square44x44Logo.png','Square150x150Logo.png','StoreLogo.png','SplashScreen.png','Square44x44Logo.targetsize-24.png','Square44x44Logo.targetsize-24_altform-unplated.png','AppIcon.ico')) {
$path = Join-Path 'src/SpatialViewer.App/Assets' $asset
if (-not (Test-Path -LiteralPath $path -PathType Leaf) -or (Get-Item -LiteralPath $path).Length -le 0) { throw "Required branding/startup asset missing or empty: $asset" }
}
Write-Host 'v0.3.7 source, localization, update, branding, and startup contracts PASS.'
Write-Host "v0.3.7 source contracts PASS; source CadCore=v$bundledCadCoreVersion @ $sourceCadCoreCommit."

- name: Restore and test
shell: pwsh
Expand All @@ -68,6 +74,8 @@ jobs:
$payload = Join-Path $env:RUNNER_TEMP 'SpatialViewer-v037-CadCore'
$resolved = @(./packaging/Resolve-LatestIntegratedCadCore.ps1 -OutputDirectory $payload) | Select-Object -Last 1
if (-not $resolved -or [string]::IsNullOrWhiteSpace([string]$resolved.version)) { throw 'Latest integrated CadCore resolution failed.' }
if ([string]$resolved.version -cne '0.12.3') { throw "v0.3.7 acceptance must exercise CadCore v0.12.3, resolved v$($resolved.version)." }
if ([string]$resolved.commit -cne '2f150fbdcf380fba6f60df7f8a41361322afdd8f') { throw "Resolved CadCore v0.12.3 commit mismatch: $($resolved.commit)" }
"CADCORE_PAYLOAD=$payload" | Out-File $env:GITHUB_ENV -Encoding utf8 -Append
"CADCORE_VERSION=$($resolved.version)" | Out-File $env:GITHUB_ENV -Encoding utf8 -Append
"CADCORE_ABI=$($resolved.abiVersion)" | Out-File $env:GITHUB_ENV -Encoding utf8 -Append
Expand All @@ -93,6 +101,30 @@ jobs:
"BUNDLE_PATH=$finalBundle" | Out-File $env:GITHUB_ENV -Encoding utf8 -Append
"ASSETS_DIRECTORY=$assets" | Out-File $env:GITHUB_ENV -Encoding utf8 -Append

- name: Verify v0.12.3 is physically bundled
shell: pwsh
run: |
$ErrorActionPreference = 'Stop'
$makeappx = Get-ChildItem (Join-Path ${env:ProgramFiles(x86)} 'Windows Kits\10\bin') -Recurse -Filter makeappx.exe | Where-Object FullName -match '\\x64\\makeappx.exe$' | Sort-Object FullName -Descending | Select-Object -First 1
if (-not $makeappx) { throw 'x64 makeappx.exe was not found.' }
$unbundle = Join-Path $env:RUNNER_TEMP 'SpatialViewer-v037-unbundle'
$unpack = Join-Path $env:RUNNER_TEMP 'SpatialViewer-v037-unpack'
Remove-Item $unbundle, $unpack -Recurse -Force -ErrorAction SilentlyContinue
& $makeappx.FullName unbundle /p $env:BUNDLE_PATH /d $unbundle /o | Out-Host
if ($LASTEXITCODE -ne 0) { throw "makeappx unbundle failed: $LASTEXITCODE" }
$inner = @(Get-ChildItem $unbundle -Filter '*.msix' -File) | Select-Object -First 1
if (-not $inner) { throw 'Inner x64 MSIX was not found.' }
& $makeappx.FullName unpack /p $inner.FullName /d $unpack /o | Out-Host
if ($LASTEXITCODE -ne 0) { throw "makeappx unpack failed: $LASTEXITCODE" }
foreach ($name in @('SpatialViewer.Core.dll','SpatialViewer.Rendering.dll','SpatialViewer.Rendering.Windows.dll','SpatialViewer.Formats.Cad.dll','SpatialViewer.Formats.Cad.ACadSharp.dll')) {
if (Test-Path -LiteralPath (Join-Path $unpack $name) -PathType Leaf) { throw "CadCore resolver isolation failed; root copy still packaged: $name" }
$source = Join-Path $env:CADCORE_PAYLOAD $name
$bundled = Join-Path $unpack "Kernels\Bundled\0.12.3\$name"
if (-not (Test-Path -LiteralPath $bundled -PathType Leaf)) { throw "CadCore v0.12.3 payload missing from bundle: $bundled" }
if ((Get-FileHash $source -Algorithm SHA256).Hash -cne (Get-FileHash $bundled -Algorithm SHA256).Hash) { throw "Bundled CadCore differs from the published v0.12.3 payload: $name" }
}
Write-Host 'Physical bundle verification PASS: SpatialViewer v0.3.7 contains CadCore v0.12.3 byte-for-byte.'

- name: Sign bundle and export public certificate
shell: pwsh
env:
Expand Down Expand Up @@ -153,6 +185,8 @@ jobs:
"CadCore version: $env:CADCORE_VERSION",
"CadCore ABI: $env:CADCORE_ABI",
"CadCore commit: $env:CADCORE_COMMIT",
'CadCore source submodule pinned to v0.12.3: PASS',
'CadCore v0.12.3 physical MSIX payload hash verification: PASS',
'Signer subject: CN=AppPublisher',
"Signer thumbprint: $env:CERTIFICATE_THUMBPRINT",
"Bundle SHA256: $bundleHash",
Expand Down
39 changes: 29 additions & 10 deletions docs/RELEASE-NOTES-v0.3.7.en.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,37 @@
# SpatialViewer v0.3.7 Startup Screen
# SpatialViewer v0.3.7 Startup and CadCore v0.12.3 Integration

SpatialViewer v0.3.7 now follows the current two-stage startup design used by UrbanPlanToolbox and PageArc: the native Windows splash covers earliest process startup, then the real WinUI window takes over with a transparent in-window startup layer on Mica until the shell is ready.
SpatialViewer v0.3.7 keeps the current two-stage startup design used by UrbanPlanToolbox and PageArc and also corrects a critical acceptance gap: the Viewer builds being tested were not actually executing the CadCore v0.12.3 real-drawing fixes.

## Highlights
## Startup

- Keeps MSIX `uap:SplashScreen` as the Stage 1 cold-start bootstrap with dedicated 100%, 125%, 150%, 200%, and 400% DPI resources and `uap5:Optional="true"`.
- Adds a Stage 2 transparent `StartupOverlay` inside the real main window so the window's own `MicaBackdrop` is visible immediately instead of jumping straight from a fixed `#202020` bitmap to the complete shell.
- Builds the real shell behind the startup logo while keeping it non-interactive until the startup presentation finishes.
- Starts the minimum display timer only after the logo has actually rendered a frame; fast launches keep a complete logo visible for about 500 ms, while slower initialization naturally extends the presentation without an extra blocking delay.
- Once the shell, logo, and minimum display time are ready, reveals the complete shell first and fades the startup layer out over about 200 ms with EaseOut timing.
- Adds a 1-second logo-decode fallback and a 5-second startup watchdog so the startup layer can never become a permanent blocking state.
- Replaces the old native-only startup contract with a hybrid Stage 1 + Mica Stage 2 contract and explicitly locks the accepted title-bar geometry against regression.
- Uses a transparent `StartupOverlay` inside the real WinUI main window for Stage 2 so the window's own `MicaBackdrop` is visible immediately.
- Builds the real shell behind the startup logo and keeps it non-interactive until startup presentation completes.
- Starts the minimum timer after the logo actually renders, keeps a complete logo visible for about 500 ms on fast launches, then fades the overlay over about 200 ms with EaseOut timing.
- Retains the 1-second logo fallback and 5-second fail-open startup watchdog.

## CadCore delivery correction

Passing CadCore v0.12.3 unit tests did not prove the Viewer defects were fixed because the product was still running older kernels:

- the published SpatialViewer v0.3.6 package bundled CadCore v0.12.2;
- the v0.3.7 source project still declared `CadCoreBundledVersion=0.9.0`;
- its CadCore submodule also still pointed to v0.9.0.

v0.3.7 now pins both the source submodule and bundled source-build version to **CadCore v0.12.3 / commit `2f150fbdcf380fba6f60df7f8a41361322afdd8f`**. Acceptance adds two hard gates:

1. source builds fail unless the declared version and gitlink are exactly v0.12.3;
2. the final MSIXBundle is unpacked and all five assemblies under `Kernels/Bundled/0.12.3` must match the published CadCore v0.12.3 release payload byte-for-byte by SHA-256.

This prevents a kernel-only change from being reported as a Viewer fix while the application still runs an older kernel.

## Real-drawing acceptance boundary

The v0.12.3 changes for the long perpendicular lines, dimension text anchoring/colors/architectural ticks, and legacy CJK SHX fallback will now actually ship inside v0.3.7. Without the original failing DWG, however, they remain **candidate fixes** rather than completed visual fixes.

Final acceptance must compare the original drawing in AutoCAD and SpatialViewer. The three defects are only considered fixed after those real-drawing differences disappear.

## Preserved

- The title bar, hamburger menu, NavigationView, page surfaces, tabs, CAD rendering, and Cad Core behavior remain unchanged.
- The accepted title bar, hamburger menu, NavigationView, page surfaces, tabs, and existing interaction layout are not redesigned by this integration.
- No second standalone WinUI window, text, controls, or fake progress indicator is introduced.
37 changes: 28 additions & 9 deletions docs/RELEASE-NOTES-v0.3.7.ja.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,37 @@
# SpatialViewer v0.3.7 起動画面
# SpatialViewer v0.3.7 起動画面と CadCore v0.12.3 統合

SpatialViewer v0.3.7 はUrbanPlanToolbox と PageArc の現行実装と同じ2段階の起動方式へ修正しました。Windows ネイティブの SplashScreen が最初のプロセス起動を覆い、その後は実際の WinUI メインウィンドウ上で Mica を透過表示する起動レイヤーへ引き継ぎ、Shell の準備完了後に滑らかに消えます
SpatialViewer v0.3.7 は UrbanPlanToolbox と PageArc と同じ2段階起動方式を維持すると同時に、CAD 実図面修正の検証で見つかった重要な問題を修正します。これまでテストしていた Viewer は、実際には CadCore v0.12.3 のコードを実行していませんでした

## 主な変更
## 起動画面

- Stage 1 として MSIX `uap:SplashScreen` を残し、100%、125%、150%、200%、400% の DPI リソースと `uap5:Optional="true"` を維持します。
- Stage 2 として実際のメインウィンドウ内に透明な `StartupOverlay` を追加し、固定 `#202020` 画像から完成済み UI へ直接切り替えるのではなく、ウィンドウ自身の `MicaBackdrop` を起動直後から見せます
- Stage 2 では実際の WinUI メインウィンドウ内に透明な `StartupOverlay` を使用し、ウィンドウ自身の `MicaBackdrop` を起動直後から表示します
- 実際の Shell は Logo の背後で初期化し、起動画面終了までは操作を受け付けません。
- Logo が実際に1フレーム描画された後に最短表示時間を計測し、高速起動時でも約 500 ms は完全な Logo を表示します。初期化が長い場合は追加の固定待機を入れず、そのまま Shell 完了を待ちます。
- Shell・Logo・最短表示時間がそろった後、完成した UI を先に表示し、約 200 ms の EaseOut で起動レイヤーをフェードアウトします。
- 1 秒の Logo デコード・フォールバックと 5 秒の startup watchdog を追加し、起動レイヤー自体が停止原因にならないよう fail-open します。
- ビルド契約を「ネイティブ Stage 1 + Mica Stage 2」に変更し、既存タイトルバーのジオメトリも回帰防止対象にします。
- Logo の実描画後に最短表示時間を計測し、高速起動時でも約 500 ms 表示した後、約 200 ms の EaseOut でフェードアウトします。
- 1 秒の Logo フォールバックと 5 秒の fail-open watchdog を維持します。

## CadCore 配布経路の修正

CadCore v0.12.3 の単体テストが通っていても Viewer の表示不具合が直ったことにはなりませんでした。実際の製品側は古いカーネルを使用していたためです。

- 公開済み SpatialViewer v0.3.6 は CadCore v0.12.2 を同梱していました。
- v0.3.7 のソースプロジェクトは `CadCoreBundledVersion=0.9.0` のままでした。
- CadCore submodule も v0.9.0 を指したままでした。

v0.3.7 ではソース submodule と source-build の bundled version を **CadCore v0.12.3 / commit `2f150fbdcf380fba6f60df7f8a41361322afdd8f`** に固定します。Acceptance には次の2つの強制 gate を追加します。

1. 宣言された version または gitlink が v0.12.3 でなければ source build を失敗させます。
2. 最終 MSIXBundle を展開し、`Kernels/Bundled/0.12.3` 内の5つの assembly が公開済み CadCore v0.12.3 release payload と SHA-256 で完全一致することを確認します。

これにより「カーネルリポジトリだけ修正したが Viewer は旧カーネルを実行している」という偽の修正完了を防ぎます。

## 実図面 Acceptance の境界

長い直角線、寸法文字の anchor / color / architectural tick、旧式 CJK SHX fallback に対する v0.12.3 の変更は、v0.3.7 で初めて実際にアプリへ同梱されます。ただし問題を再現する元 DWG がない状態では、これらは **candidate fix** であり、視覚的な修正完了とは扱いません。

最終 Acceptance は元図面を AutoCAD と SpatialViewer で直接比較し、3つの差異が実際に消えた時点でのみ完了とします。

## 変更しない範囲

- タイトルバー、ハンバーガーメニュー、NavigationView、ページ背景、タブ、CAD 描画、Cad Core の挙動は変更しません
- 既存のタイトルバー、ハンバーガーメニュー、NavigationView、ページ背景、タブ、既存インタラクションのレイアウトは本統合で再設計しません
- 第2の独立 WinUI ウィンドウ、文字、ボタン、疑似プログレスバーは追加しません。
39 changes: 29 additions & 10 deletions docs/RELEASE-NOTES-v0.3.7.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,37 @@
# SpatialViewer v0.3.7 启动界面
# SpatialViewer v0.3.7 启动界面与 CadCore v0.12.3 集成

SpatialViewer v0.3.7 采用与 UrbanPlanToolbox、PageArc 当前版本一致的两阶段启动机制:Windows 原生启动页负责最早期进程启动,主窗口创建后立即切换到 Mica 上的应用内启动层,并在真实界面准备完成后平滑淡出
SpatialViewer v0.3.7 采用与 UrbanPlanToolbox、PageArc 当前版本一致的两阶段启动机制,同时修正此前验收中的一个关键问题:开发构建与已发布 v0.3.6 实际没有运行本轮 CAD 实图修复所对应的 CadCore v0.12.3

## 主要变化
## 启动界面

- 保留 MSIX `uap:SplashScreen` 作为 Stage 1 冷启动引导层,继续提供 100%、125%、150%、200%、400% 五档 DPI 资源并保持 `uap5:Optional="true"`。
- Stage 2 在真实 WinUI 主窗口中使用透明 `StartupOverlay`;背景直接透出窗口自身的 `MicaBackdrop`,不再把原生 `#202020` 启动图直接跳转到完整界面。
- 主界面在启动 Logo 后方同步完成布局与初始化,启动层撤除前保持不可点击,避免出现半初始化界面或标题栏后黑屏。
- 启动 Logo 首次真正渲染后开始计时,快速启动时至少完整显示约 500 ms;初始化较慢时不会额外阻塞,而是自然等待 Shell 就绪。
- Shell、Logo 与最短展示时间均满足后,先显示完整主界面,再以约 200 ms EaseOut 淡出启动层。
- 增加 1 秒 Logo 解码兜底和 5 秒启动 watchdog;任何异常都必须 fail-open,启动界面本身不能成为卡死点。
- 将构建门禁改为验证“原生 Stage 1 + Mica Stage 2”的混合启动契约,同时锁定现有标题栏几何,防止启动功能再次误改标题栏。
- Stage 2 在真实 WinUI 主窗口中使用透明 `StartupOverlay`;背景直接透出窗口自身的 `MicaBackdrop`。
- 主界面在启动 Logo 后方同步完成布局与初始化,启动层撤除前保持不可点击。
- Logo 首帧真正渲染后开始计时,快速启动时至少完整显示约 500 ms;随后以约 200 ms EaseOut 淡出。
- 增加 1 秒 Logo 解码兜底和 5 秒启动 watchdog,保持 fail-open。

## CadCore 集成修正

此前不能把“CadCore v0.12.3 的单元测试通过”视为看图器实图问题已经修复,因为:

- SpatialViewer v0.3.6 正式包随包内核仍为 CadCore v0.12.2;
- v0.3.7 源码项目此前仍声明 `CadCoreBundledVersion=0.9.0`,子模块也仍指向 CadCore v0.9.0;
- 因此直接运行/构建看图器并不会实际执行 v0.12.3 的代码。

v0.3.7 现在将源码子模块和 `CadCoreBundledVersion` 都推进到 **CadCore v0.12.3 / commit `2f150fbdcf380fba6f60df7f8a41361322afdd8f`**。验收流水线同时新增两道强制门禁:

1. 源码构建必须实际引用 v0.12.3,版本或 gitlink 不一致即失败;
2. 最终 MSIXBundle 解包后,`Kernels/Bundled/0.12.3` 中五个 CadCore 程序集必须与 CadCore v0.12.3 GitHub Release 逐文件 SHA-256 一致。

这样可以排除“内核仓库改了,但看图器仍在跑旧内核”的假修复。

## CAD 实图验收边界

CadCore v0.12.3 中针对长直角线、尺寸文字锚点/颜色/建筑 tick、旧式 CJK SHX fallback 的代码会随 v0.3.7 真正进入应用。但这些改动在没有原始问题 DWG 的情况下仍只能视为**候选修复**,不能仅凭合成测试宣布三个实图问题已解决。

后续验收必须直接使用复现问题的原始图纸,对比 AutoCAD 与 SpatialViewer 的实际画面;只有三项视觉差异均消失后才标记为完成。

## 保持不变

- 标题栏、汉堡菜单、NavigationView、页面背景、标签页、CAD 渲染与 Cad Core 行为保持原样
- 标题栏、汉堡菜单、NavigationView、页面背景、标签页及既有交互不因本次 CadCore 集成而重构
- 不创建第二个独立 WinUI 窗口,不加入文字、按钮或伪进度条。
2 changes: 1 addition & 1 deletion external/SpatialViewer.CadCore
8 changes: 4 additions & 4 deletions release/release.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
}
},
"title": {
"zh-CN": "SpatialViewer v0.3.7 启动界面与主题修复",
"ja-JP": "SpatialViewer v0.3.7 起動画面とテーマ修正",
"en-US": "SpatialViewer v0.3.7 Startup Screen and Theme Fix"
"zh-CN": "SpatialViewer v0.3.7 启动界面、主题修复与 CadCore v0.12.3 集成",
"ja-JP": "SpatialViewer v0.3.7 起動画面・テーマ修正と CadCore v0.12.3 統合",
"en-US": "SpatialViewer v0.3.7 Startup, Theme Fix, and CadCore v0.12.3 Integration"
}
}
}
Loading
Loading