acdream/src/AcDream.App/AcDream.App.csproj
Erik 897e262eda refactor(vtank): slice 7 fix round B item 13 — glob mosstank*.xml everywhere it's named
Reordered ahead of items 5-12 on purpose: item 5 adds a fourth popup
(mosstank-metaeditor.xml) and would otherwise need the same three-file
manual edit this item retires. Every place a mosstank-*.xml file used to be
named one at a time now globs mosstank*.xml instead, so adding a new popup
panel needs exactly one new file, not four matching edits:

- AcDream.Plugins.MossTank.csproj: <None Update="mosstank*.xml"> replaces
  four separate <None Update> entries.
- AcDream.Plugins.MossTank.Tests.csproj: one globbed <None Include> with
  Link="%(Filename)%(Extension)" replaces four separate Include/Link pairs.
- AcDream.App.csproj: a new _MossTankPluginMarkup item
  (Include="…/mosstank*.xml") replaces the literal four-file semicolon list
  in both CopyMossTankPluginToBuildOutput and …ToPublishOutput's Copy
  SourceFiles.
- MossTankMarkupContractTests: AuthoredControlsInTheSameContainerNeverOverlapASibling
  (item 2's new pin) and NoButtonAnywhereUsesTheUnrenderableArrowGlyphs now
  iterate Directory.GetFiles(AppContext.BaseDirectory, "mosstank*.xml")
  instead of a hardcoded 4-file array/Theory. Left
  SecondaryPopupPanelsFitTheirOwnBoundsAndEveryBindingResolves alone — it
  pairs each file with its OWN expected w/h, which a glob can't supply.
- LinuxPlatformBoundaryTests.ShippedPluginCopiesUseResolvedTargetPathsForBuildAndPublish
  now asserts on the glob pattern instead of the literal mosstank.xml
  substring the old Copy SourceFiles list contained.

A missed file in any of these four places used to silently drop a panel at
mount (fix round A's own #missing-popup-files near-miss) instead of failing
the build; the glob makes that failure mode structurally impossible.

tests/AcDream.Plugins.MossTank.Tests: 662/662 (665 -> 662: the 4-case
Theory collapsed into 1 Fact with an internal loop — same coverage, 3 fewer
reported xunit tests).
tests/AcDream.App.Tests --filter Markup|Plugin|UiMenu|Slider: 276/3 skipped/279 (unchanged).
Verified the glob actually copies all four files: `ls
src/AcDream.App/bin/Release/net10.0/plugins/AcDream.Plugins.MossTank/*.xml`
lists all four post-build.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-07 11:53:01 +02:00

168 lines
9.4 KiB
XML

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>latest</LangVersion>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<RootNamespace>AcDream.App</RootNamespace>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<!-- Windows shell/Explorer icon for the client executable. The runtime
window icon is a separate mechanism (WindowIconLoader) because the exe
icon is baked into the PE and never reaches GLFW. -->
<ApplicationIcon>..\..\assets\icons\acdream-client.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<InternalsVisibleTo Include="AcDream.Core.Tests" />
<InternalsVisibleTo Include="AcDream.App.Tests" />
</ItemGroup>
<ItemGroup>
<!-- T3 originally cited: "extracted GL infra (ManagedGLUniformBuffer,
OpenGLGraphicsDevice) directly implement IUniformBuffer from
Chorizite.Core". Campaign V slice V11 deleted both classes along with
the rest of the raw-GL arm, and neither IUniformBuffer nor any other
Chorizite.Core.Render type is implemented by acdream code any more —
but the package audit is NOT clean: TextureAtlasManager.cs,
WorldTextureArray.cs, ObjectMeshManager.cs, TextureFormatExtensions.cs
and others consume Chorizite.Core.Render.Enums.TextureFormat/BufferUsage
and Chorizite.Core.Lib.BoundingBox directly and extensively, entirely
independent of the deleted GL classes. The package stays; NuGet
PackageReferences are not forwarded from ProjectReferences so we must
declare it explicitly here. -->
<PackageReference Include="Chorizite.Core" />
<!-- Phase O-T7: BCnEncoder.Net.ImageSharp + SixLabors.ImageSharp were previously
transitive via the WorldBuilder project reference. Now direct deps of
ObjectMeshManager.cs (extracted in T2). -->
<PackageReference Include="BCnEncoder.Net.ImageSharp" />
<PackageReference Include="SixLabors.ImageSharp" />
<!-- Slice F: contained render-projection storage. Arch types are confined to
Rendering/Scene/Arch and never cross an acdream-owned interface. -->
<PackageReference Include="Arch" />
<!-- Campaign V slice V5: dark Vulkan bring-up. Pinned to the same 2.23.0 as
the rest of the Silk family so the shared Silk.NET.Core does not fork. -->
<PackageReference Include="Silk.NET.Vulkan" />
<PackageReference Include="Silk.NET.Vulkan.Extensions.KHR" />
<!-- Campaign V slice V6: VK_EXT_debug_utils object naming and command labels.
Optional at runtime (VulkanDebugNames.Disabled when absent), but the
entry points have to be loadable for the dev-tools path to name anything. -->
<PackageReference Include="Silk.NET.Vulkan.Extensions.EXT" />
<PackageReference Include="Silk.NET.Windowing" />
<PackageReference Include="Silk.NET.Input" />
<PackageReference Include="Silk.NET.OpenAL" />
<PackageReference Include="Silk.NET.OpenAL.Extensions.Creative" />
<PackageReference Include="Silk.NET.OpenAL.Extensions.EXT" />
<PackageReference Include="Silk.NET.OpenAL.Soft.Native" />
<PackageReference Include="Serilog" />
<PackageReference Include="Serilog.Sinks.Console" />
<PackageReference Include="StbTrueTypeSharp" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\AcDream.Runtime\AcDream.Runtime.csproj" />
<ProjectReference Include="..\AcDream.Core\AcDream.Core.csproj" />
<ProjectReference Include="..\AcDream.Core.Net\AcDream.Core.Net.csproj" />
<ProjectReference Include="..\AcDream.Content\AcDream.Content.csproj" />
<!-- Campaign LA LA0 review finding 6: App consumes AcDream.Platform
types directly (GraphicalHostPlatformServices, Program, GameWindow),
so the reference is declared explicitly per this file's convention
rather than ridden transitively through Runtime. -->
<ProjectReference Include="..\AcDream.Platform\AcDream.Platform.csproj" />
<ProjectReference Include="..\AcDream.UI.Abstractions\AcDream.UI.Abstractions.csproj" />
</ItemGroup>
<ItemGroup>
<None Update="Rendering\Shaders\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<!-- Campaign V slice V6c: the committed SPIR-V the Vulkan backend loads at
startup, plus the manifest the freshness test re-hashes. Regenerated by
tools/compile-shaders.ps1; never compiled at runtime (plan §4.6). -->
<None Update="Rendering\Shaders\spv\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<!-- Phase D.2b: KSML-style panel markup assets (vitals.xml etc.) ship
next to the binary so MarkupDocument.Build can load them at runtime. -->
<None Include="UI\assets\**\*.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<!-- Runtime window icon (WindowIconLoader). Embedded rather than copied:
a window icon has no sensible fallback if the file goes missing, and
embedding survives single-file publish. Included from assets/icons
with an explicit LogicalName so the art has ONE source of truth and is
not duplicated into this project's tree. -->
<EmbeddedResource Include="..\..\assets\icons\acdream-client-16.png"
LogicalName="AcDream.App.Rendering.Icons.acdream-client-16.png" />
<EmbeddedResource Include="..\..\assets\icons\acdream-client-32.png"
LogicalName="AcDream.App.Rendering.Icons.acdream-client-32.png" />
<EmbeddedResource Include="..\..\assets\icons\acdream-client-48.png"
LogicalName="AcDream.App.Rendering.Icons.acdream-client-48.png" />
<EmbeddedResource Include="..\..\assets\icons\acdream-client-256.png"
LogicalName="AcDream.App.Rendering.Icons.acdream-client-256.png" />
</ItemGroup>
<!-- MossTank ships as a copy-only plugin, plus its panel markup:
MossTankPlugin resolves mosstank.xml and every mosstank-*.xml popup
panel relative to its own assembly, so all of them must land in the
same plugin directory. Fix round B item 13: globbed (mosstank*.xml)
instead of named one by one — a new popup used to need a matching
manual edit in both Copy targets below, the plugin csproj's own
CopyToOutputDirectory list, and the test project's Link list; a
missed one silently dropped a panel at mount instead of failing the
build. -->
<ItemGroup>
<ProjectReference Include="..\AcDream.Plugins.MossTank\AcDream.Plugins.MossTank.csproj">
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
<SkipGetTargetFrameworkProperties>true</SkipGetTargetFrameworkProperties>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<_MossTankPluginMarkup Include="$(MSBuildProjectDirectory)/../AcDream.Plugins.MossTank/mosstank*.xml" />
</ItemGroup>
<Target
Name="CopyMossTankPluginToBuildOutput"
AfterTargets="Build"
Condition="'$(IsCrossTargetingBuild)' != 'true'">
<PropertyGroup>
<_MossTankDestDir>$(OutputPath)plugins/AcDream.Plugins.MossTank</_MossTankDestDir>
</PropertyGroup>
<MSBuild
Projects="$(MSBuildProjectDirectory)/../AcDream.Plugins.MossTank/AcDream.Plugins.MossTank.csproj"
Targets="GetTargetPath"
Properties="Configuration=$(Configuration);TargetFramework=$(TargetFramework);RuntimeIdentifier=$(RuntimeIdentifier);OutputPath=$(OutputPath)">
<Output TaskParameter="TargetOutputs" ItemName="_MossTankPluginBuildTarget" />
</MSBuild>
<MakeDir Directories="$(_MossTankDestDir)" />
<Copy
SourceFiles="@(_MossTankPluginBuildTarget);@(_MossTankPluginMarkup)"
DestinationFolder="$(_MossTankDestDir)"
SkipUnchangedFiles="true" />
<WriteLinesToFile
File="$(_MossTankDestDir)/plugin.json"
Overwrite="true"
Lines="{ &quot;id&quot;: &quot;acdream.mosstank&quot;, &quot;displayName&quot;: &quot;MossTank&quot;, &quot;version&quot;: &quot;0.1.0&quot;, &quot;entryDll&quot;: &quot;AcDream.Plugins.MossTank.dll&quot;, &quot;apiVersion&quot;: 1 }" />
</Target>
<Target
Name="CopyMossTankPluginToPublishOutput"
AfterTargets="Publish"
Condition="'$(IsCrossTargetingBuild)' != 'true'">
<PropertyGroup>
<_MossTankPublishDestDir>$(PublishDir)plugins/AcDream.Plugins.MossTank</_MossTankPublishDestDir>
</PropertyGroup>
<MSBuild
Projects="$(MSBuildProjectDirectory)/../AcDream.Plugins.MossTank/AcDream.Plugins.MossTank.csproj"
Targets="GetTargetPath"
Properties="Configuration=$(Configuration);TargetFramework=$(TargetFramework);RuntimeIdentifier=$(RuntimeIdentifier);OutputPath=$(OutputPath)">
<Output TaskParameter="TargetOutputs" ItemName="_MossTankPluginPublishTarget" />
</MSBuild>
<MakeDir Directories="$(_MossTankPublishDestDir)" />
<Copy
SourceFiles="@(_MossTankPluginPublishTarget);@(_MossTankPluginMarkup)"
DestinationFolder="$(_MossTankPublishDestDir)"
SkipUnchangedFiles="true" />
<WriteLinesToFile
File="$(_MossTankPublishDestDir)/plugin.json"
Overwrite="true"
Lines="{ &quot;id&quot;: &quot;acdream.mosstank&quot;, &quot;displayName&quot;: &quot;MossTank&quot;, &quot;version&quot;: &quot;0.1.0&quot;, &quot;entryDll&quot;: &quot;AcDream.Plugins.MossTank.dll&quot;, &quot;apiVersion&quot;: 1 }" />
</Target>
</Project>