refactor(runtime): own per-session physics simulation
Move the sole PhysicsEngine, production cache, collision admissions, canonical bodies and hosts, remote components, ordinary/remote worksets, simulation, cell commits, and shadow synchronization under RuntimeEntityObjectLifetime. Keep App as the prepared-asset, animation-input, and render-projection adapter while preserving the named-retail update and collision order. Add exact-incarnation, object-clock, callback-reentrancy, GUID-reuse, two-runtime isolation, source ownership, collision publication, and graphical projection coverage. Release build and the complete 8,588-test solution pass. Co-authored-by: Codex <noreply@openai.com>
This commit is contained in:
parent
0dc3bfdeff
commit
7e6033d0ad
39 changed files with 3685 additions and 1722 deletions
148
tests/AcDream.App.Tests/Runtime/RuntimePhysicsOwnershipTests.cs
Normal file
148
tests/AcDream.App.Tests/Runtime/RuntimePhysicsOwnershipTests.cs
Normal file
|
|
@ -0,0 +1,148 @@
|
|||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace AcDream.App.Tests.Runtime;
|
||||
|
||||
public sealed class RuntimePhysicsOwnershipTests
|
||||
{
|
||||
[Fact]
|
||||
public void ProductionAppBorrowsTheRuntimePhysicsWorld()
|
||||
{
|
||||
string root = FindRepositoryRoot();
|
||||
string appRoot = Path.Combine(root, "src", "AcDream.App");
|
||||
string gameWindow = File.ReadAllText(Path.Combine(
|
||||
appRoot,
|
||||
"Rendering",
|
||||
"GameWindow.cs"));
|
||||
string app = string.Join(
|
||||
"\n",
|
||||
Directory.EnumerateFiles(appRoot, "*.cs", SearchOption.AllDirectories)
|
||||
.Select(File.ReadAllText));
|
||||
|
||||
Assert.Empty(Regex.Matches(
|
||||
app,
|
||||
@"new\s+(?:AcDream\.Core\.Physics\.)?PhysicsEngine\s*(?:\(|\{)"));
|
||||
Assert.DoesNotContain(
|
||||
"PhysicsDataCache.CreateProduction()",
|
||||
app,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"_runtimeEntityObjects.Physics.Engine",
|
||||
gameWindow,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"_runtimeEntityObjects.Physics.DataCache",
|
||||
gameWindow,
|
||||
StringComparison.Ordinal);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AppPhysicsFilesArePresentationAndPreparedAssetAdapters()
|
||||
{
|
||||
string root = FindRepositoryRoot();
|
||||
string appRoot = Path.Combine(root, "src", "AcDream.App");
|
||||
string runtimeRoot = Path.Combine(root, "src", "AcDream.Runtime");
|
||||
string remoteAdapter = File.ReadAllText(Path.Combine(
|
||||
appRoot,
|
||||
"Physics",
|
||||
"RemotePhysicsUpdater.cs"));
|
||||
string ordinaryAdapter = File.ReadAllText(Path.Combine(
|
||||
appRoot,
|
||||
"Physics",
|
||||
"LiveEntityOrdinaryPhysicsUpdater.cs"));
|
||||
string liveRuntime = File.ReadAllText(Path.Combine(
|
||||
appRoot,
|
||||
"World",
|
||||
"LiveEntityRuntime.cs"));
|
||||
string collisionPublisher = File.ReadAllText(Path.Combine(
|
||||
appRoot,
|
||||
"Streaming",
|
||||
"LandblockPhysicsPublisher.cs"));
|
||||
string runtimeRemote = File.ReadAllText(Path.Combine(
|
||||
runtimeRoot,
|
||||
"Physics",
|
||||
"RuntimeRemotePhysicsUpdater.cs"));
|
||||
string runtimeOrdinary = File.ReadAllText(Path.Combine(
|
||||
runtimeRoot,
|
||||
"Physics",
|
||||
"RuntimeOrdinaryPhysicsUpdater.cs"));
|
||||
string runtimePhysics = File.ReadAllText(Path.Combine(
|
||||
runtimeRoot,
|
||||
"Physics",
|
||||
"RuntimePhysicsState.cs"));
|
||||
|
||||
Assert.DoesNotContain(
|
||||
"ResolveWithTransition(",
|
||||
remoteAdapter,
|
||||
StringComparison.Ordinal);
|
||||
Assert.DoesNotContain(
|
||||
"RetailObjectManagerTail.Run(",
|
||||
remoteAdapter,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"ResolveWithTransition(",
|
||||
runtimeRemote,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"RetailObjectManagerTail.Run(",
|
||||
runtimeRemote,
|
||||
StringComparison.Ordinal);
|
||||
Assert.DoesNotContain(
|
||||
"ResolveWithTransition(",
|
||||
ordinaryAdapter,
|
||||
StringComparison.Ordinal);
|
||||
Assert.DoesNotContain(
|
||||
"RebucketLiveEntity(",
|
||||
ordinaryAdapter,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"ResolveWithTransition(",
|
||||
runtimeOrdinary,
|
||||
StringComparison.Ordinal);
|
||||
|
||||
Assert.Contains(
|
||||
"_physics.GetOrCreatePhysicsBody(",
|
||||
liveRuntime,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"_physics.TryGetPhysicsHost(",
|
||||
liveRuntime,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"BeginCollisionAdmission(",
|
||||
collisionPublisher,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"AdmitCollisionAssets(",
|
||||
collisionPublisher,
|
||||
StringComparison.Ordinal);
|
||||
Assert.DoesNotContain(
|
||||
".AddLandblock(",
|
||||
collisionPublisher,
|
||||
StringComparison.Ordinal);
|
||||
Assert.DoesNotContain(
|
||||
".RemoveLandblock(",
|
||||
collisionPublisher,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"public PhysicsBody GetOrCreatePhysicsBody(",
|
||||
runtimePhysics,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains(
|
||||
"public bool TryGetPhysicsHost(",
|
||||
runtimePhysics,
|
||||
StringComparison.Ordinal);
|
||||
}
|
||||
|
||||
private static string FindRepositoryRoot()
|
||||
{
|
||||
var current = new DirectoryInfo(AppContext.BaseDirectory);
|
||||
while (current is not null)
|
||||
{
|
||||
if (File.Exists(Path.Combine(current.FullName, "AcDream.slnx")))
|
||||
return current.FullName;
|
||||
current = current.Parent;
|
||||
}
|
||||
|
||||
throw new DirectoryNotFoundException("AcDream.slnx was not found.");
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue