refactor(runtime): cut graphical host over to canonical root
Make every App composition phase borrow one GameRuntime, retire the duplicate view/event adapters, and dispose the root only after its graphical borrowers release. This preserves synchronous UI commands while giving shutdown one exact ownership ledger. Co-authored-by: OpenAI Codex <codex@openai.com>
This commit is contained in:
parent
ecb9f79444
commit
ce41efb9e5
29 changed files with 613 additions and 778 deletions
|
|
@ -12,6 +12,7 @@ using AcDream.Core.Physics;
|
|||
using AcDream.Core.Rendering;
|
||||
using AcDream.Core.Spells;
|
||||
using AcDream.Core.Vfx;
|
||||
using AcDream.Runtime;
|
||||
using AcDream.Runtime.Gameplay;
|
||||
using DatReaderWriter;
|
||||
using Silk.NET.Input;
|
||||
|
|
@ -49,7 +50,7 @@ internal sealed record ContentEffectsAudioDependencies(
|
|||
ResidencyBudgetOptions ResidencyBudgets,
|
||||
PhysicsDataCache PhysicsDataCache,
|
||||
bool DumpMotionEnabled,
|
||||
RuntimeCharacterState Character,
|
||||
GameRuntime Runtime,
|
||||
AnimationHookRouter HookRouter,
|
||||
EntityEffectPoseRegistry EffectPoses,
|
||||
DeferredEntityEffectAdvanceSource EntityEffectAdvance,
|
||||
|
|
@ -57,7 +58,10 @@ internal sealed record ContentEffectsAudioDependencies(
|
|||
TranslucencyFadeManager TranslucencyFades,
|
||||
bool NoAudio,
|
||||
Action<string> Log,
|
||||
Action<string> Error);
|
||||
Action<string> Error)
|
||||
{
|
||||
public RuntimeCharacterState Character => Runtime.CharacterOwner;
|
||||
}
|
||||
|
||||
internal interface IGameWindowContentEffectsAudioPublication
|
||||
{
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ using AcDream.App.Runtime;
|
|||
using AcDream.App.Settings;
|
||||
using AcDream.App.Update;
|
||||
using AcDream.App.World;
|
||||
using AcDream.Runtime;
|
||||
using AcDream.Runtime.Session;
|
||||
using AcDream.Core.Combat;
|
||||
using AcDream.Core.Lighting;
|
||||
|
|
@ -21,6 +22,7 @@ namespace AcDream.App.Composition;
|
|||
|
||||
internal sealed record FrameRootDependencies(
|
||||
RuntimeOptions Options,
|
||||
GameRuntime Runtime,
|
||||
GL Gl,
|
||||
IWindow Window,
|
||||
IInputContext Input,
|
||||
|
|
@ -33,7 +35,6 @@ internal sealed record FrameRootDependencies(
|
|||
LocalPlayerModeState PlayerMode,
|
||||
LocalPlayerIdentityState PlayerIdentity,
|
||||
ChaseCameraInputState ChaseCameraInput,
|
||||
RuntimeLocalPlayerMovementState PlayerController,
|
||||
LiveWorldOriginState WorldOrigin,
|
||||
ParticleVisibilityController ParticleVisibility,
|
||||
EntityEffectPoseRegistry EffectPoses,
|
||||
|
|
@ -48,12 +49,18 @@ internal sealed record FrameRootDependencies(
|
|||
DebugVmRenderFactsPublisher DebugVmRenderFacts,
|
||||
IInputCaptureSource InputCapture,
|
||||
DispatcherCameraInputSource CameraInput,
|
||||
SelectionState Selection,
|
||||
LiveEntityAnimationRuntimeView<LiveEntityAnimationState> Animations,
|
||||
UpdateFrameClock UpdateClock,
|
||||
CombatState Combat,
|
||||
GameFrameGraphSlot FrameGraphs,
|
||||
Action<string> Log);
|
||||
Action<string> Log)
|
||||
{
|
||||
public RuntimeLocalPlayerMovementState PlayerController =>
|
||||
Runtime.MovementOwner;
|
||||
|
||||
public SelectionState Selection => Runtime.ActionOwner.Selection;
|
||||
|
||||
public CombatState Combat => Runtime.ActionOwner.Combat;
|
||||
}
|
||||
|
||||
internal sealed record FrameRootResult(
|
||||
UpdateFrameOrchestrator Update,
|
||||
|
|
|
|||
|
|
@ -44,19 +44,15 @@ internal sealed record InteractionRetainedUiDependencies(
|
|||
RetainedUiInputCaptureSlot RetainedInputCapture,
|
||||
InputDispatcher? InputDispatcher,
|
||||
RuntimeSettingsController Settings,
|
||||
RuntimeActionState Actions,
|
||||
GameRuntime Runtime,
|
||||
IRuntimeCombatAttackOperations CombatAttackOperations,
|
||||
RuntimeCombatTargetOperationsSlot CombatTargetOperations,
|
||||
RuntimeSpellCastOperationsSlot SpellCastOperations,
|
||||
RuntimeInventoryState Inventory,
|
||||
MagicCatalog MagicCatalog,
|
||||
RuntimeCharacterState Character,
|
||||
RuntimeCommunicationState Communication,
|
||||
StackSplitQuantityState StackSplitQuantity,
|
||||
BufferedUiRegistry? UiRegistry,
|
||||
LiveCombatModeCommandSlot CombatModeCommands,
|
||||
ILocalPlayerIdentitySource PlayerIdentity,
|
||||
IRuntimeLocalPlayerControllerSource PlayerController,
|
||||
ILocalPlayerModeSource PlayerMode,
|
||||
Func<DeferredSelectionViewPlaneSource, SelectionCameraSource>
|
||||
SelectionCameraFactory,
|
||||
|
|
@ -64,7 +60,20 @@ internal sealed record InteractionRetainedUiDependencies(
|
|||
VitalsVM? ExistingVitals,
|
||||
Action<string>? Toast,
|
||||
Func<double> ClientTime,
|
||||
Action<string> Log);
|
||||
Action<string> Log)
|
||||
{
|
||||
public RuntimeActionState Actions => Runtime.ActionOwner;
|
||||
|
||||
public RuntimeInventoryState Inventory => Runtime.InventoryOwner;
|
||||
|
||||
public RuntimeCharacterState Character => Runtime.CharacterOwner;
|
||||
|
||||
public RuntimeCommunicationState Communication =>
|
||||
Runtime.CommunicationOwner;
|
||||
|
||||
public IRuntimeLocalPlayerControllerSource PlayerController =>
|
||||
Runtime.MovementOwner;
|
||||
}
|
||||
|
||||
internal sealed record RetainedUiComposition(
|
||||
UiHost Host,
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ using AcDream.Core.Rendering;
|
|||
using AcDream.Core.Selection;
|
||||
using AcDream.Core.Vfx;
|
||||
using AcDream.Core.World;
|
||||
using AcDream.Runtime;
|
||||
using AcDream.Runtime.Entities;
|
||||
using AcDream.Runtime.World;
|
||||
using DatReaderWriter;
|
||||
|
|
@ -45,8 +46,7 @@ internal sealed record LivePresentationDependencies(
|
|||
PhysicsDataCache PhysicsDataCache,
|
||||
WorldGameState WorldGameState,
|
||||
WorldEvents WorldEvents,
|
||||
SelectionState Selection,
|
||||
RuntimeEntityObjectLifetime EntityObjects,
|
||||
GameRuntime Runtime,
|
||||
LiveEntityRuntimeSlot RuntimeSlot,
|
||||
DeferredLiveEntityMotionRuntimeBindings MotionBindings,
|
||||
DeferredEntityEffectAdvanceSource EffectAdvance,
|
||||
|
|
@ -61,7 +61,6 @@ internal sealed record LivePresentationDependencies(
|
|||
CellVisibility CellVisibility,
|
||||
LiveWorldOriginState WorldOrigin,
|
||||
LocalPlayerIdentityState PlayerIdentity,
|
||||
RuntimeLocalPlayerMovementState PlayerController,
|
||||
PointerPositionState PointerPosition,
|
||||
PlayerApproachCompletionState PlayerApproachCompletions,
|
||||
GameRenderResourceLifetime RenderResourceLifetime,
|
||||
|
|
@ -73,7 +72,18 @@ internal sealed record LivePresentationDependencies(
|
|||
DeferredRenderFrameDiagnosticsSource? DevFrameDiagnostics,
|
||||
DeferredRenderFrameDiagnosticsSource UiFrameDiagnostics,
|
||||
Action<string> Log,
|
||||
Action<string>? Toast);
|
||||
Action<string>? Toast)
|
||||
{
|
||||
public SelectionState Selection => Runtime.ActionOwner.Selection;
|
||||
|
||||
public RuntimeEntityObjectLifetime EntityObjects =>
|
||||
Runtime.EntityObjects;
|
||||
|
||||
public RuntimeWorldTransitState WorldTransit => Runtime.TransitOwner;
|
||||
|
||||
public RuntimeLocalPlayerMovementState PlayerController =>
|
||||
Runtime.MovementOwner;
|
||||
}
|
||||
|
||||
internal sealed record LivePresentationResult(
|
||||
DeferredLiveEntityRuntimeComponentLifecycle ComponentLifecycle,
|
||||
|
|
@ -336,7 +346,7 @@ internal sealed class LivePresentationCompositionPhase
|
|||
staticAnimationScheduler.Unregister,
|
||||
(entity, info) => staticAnimationScheduler.Rebind(entity, info));
|
||||
|
||||
var worldTransit = new RuntimeWorldTransitState(d.Log);
|
||||
RuntimeWorldTransitState worldTransit = d.WorldTransit;
|
||||
var worldAvailability =
|
||||
new WorldGenerationAvailabilityState(worldTransit);
|
||||
var worldState = new GpuWorldState(
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ using AcDream.Core.Player;
|
|||
using AcDream.Core.Social;
|
||||
using AcDream.Core.Spells;
|
||||
using AcDream.Core.World;
|
||||
using AcDream.Runtime;
|
||||
using AcDream.Runtime.Entities;
|
||||
using AcDream.Runtime.Gameplay;
|
||||
using AcDream.Runtime.Session;
|
||||
|
|
@ -35,6 +36,7 @@ namespace AcDream.App.Composition;
|
|||
|
||||
internal sealed record SessionPlayerDependencies(
|
||||
RuntimeOptions Options,
|
||||
GameRuntime Runtime,
|
||||
IWindow Window,
|
||||
object DatLock,
|
||||
RuntimeSettingsController Settings,
|
||||
|
|
@ -49,8 +51,6 @@ internal sealed record SessionPlayerDependencies(
|
|||
PhysicsDataCache PhysicsDataCache,
|
||||
WorldGameState WorldGameState,
|
||||
WorldEvents WorldEvents,
|
||||
RuntimeActionState Actions,
|
||||
RuntimeEntityObjectLifetime EntityObjects,
|
||||
EntityClassificationCache ClassificationCache,
|
||||
LiveEntityRuntimeSlot RuntimeSlot,
|
||||
LiveEntityAnimationRuntimeView<LiveEntityAnimationState> AnimatedEntities,
|
||||
|
|
@ -60,7 +60,6 @@ internal sealed record SessionPlayerDependencies(
|
|||
RetailInboundEventDispatcher InboundEntityEvents,
|
||||
DeferredLiveEntityMotionRuntimeBindings MotionBindings,
|
||||
LocalPlayerIdentityState PlayerIdentity,
|
||||
RuntimeLocalPlayerMovementState PlayerController,
|
||||
LocalPlayerPhysicsHostSlot PlayerHost,
|
||||
LocalPlayerModeState PlayerMode,
|
||||
ChaseCameraInputState ChaseCameraInput,
|
||||
|
|
@ -71,7 +70,6 @@ internal sealed record SessionPlayerDependencies(
|
|||
LocalPlayerShadowState PlayerShadow,
|
||||
ViewportAspectState ViewportAspect,
|
||||
PlayerApproachCompletionState PlayerApproachCompletions,
|
||||
RuntimeInventoryState Inventory,
|
||||
PointerPositionState PointerPosition,
|
||||
DispatcherMovementInputSource MovementInput,
|
||||
IInputCaptureSource InputCapture,
|
||||
|
|
@ -82,10 +80,24 @@ internal sealed record SessionPlayerDependencies(
|
|||
MovementTruthDiagnosticController MovementDiagnostics,
|
||||
CombatAttackOperationsSlot CombatAttackOperations,
|
||||
CombatFeedbackSlot CombatFeedback,
|
||||
RuntimeCommunicationState Communication,
|
||||
RuntimeCharacterState Character,
|
||||
TransferableResourceSlot<PortalTunnelPresentation> PortalTunnelFallback,
|
||||
Action<string> Log);
|
||||
Action<string> Log)
|
||||
{
|
||||
public RuntimeActionState Actions => Runtime.ActionOwner;
|
||||
|
||||
public RuntimeEntityObjectLifetime EntityObjects =>
|
||||
Runtime.EntityObjects;
|
||||
|
||||
public RuntimeLocalPlayerMovementState PlayerController =>
|
||||
Runtime.MovementOwner;
|
||||
|
||||
public RuntimeInventoryState Inventory => Runtime.InventoryOwner;
|
||||
|
||||
public RuntimeCommunicationState Communication =>
|
||||
Runtime.CommunicationOwner;
|
||||
|
||||
public RuntimeCharacterState Character => Runtime.CharacterOwner;
|
||||
}
|
||||
|
||||
internal sealed record SessionPlayerResult(
|
||||
LandblockStreamer Streamer,
|
||||
|
|
@ -430,11 +442,7 @@ internal sealed class SessionPlayerCompositionPhase
|
|||
sealedDungeonCells,
|
||||
d.Log);
|
||||
|
||||
var liveSessionLease = scope.Acquire(
|
||||
"live-session controller",
|
||||
static () => new LiveSessionController(),
|
||||
static value => value.Dispose());
|
||||
LiveSessionController liveSession = liveSessionLease.Resource;
|
||||
LiveSessionController liveSession = d.Runtime.Session;
|
||||
var liveSessionCommands = new LiveSessionCommandSurface();
|
||||
var liveSessionSource = new LiveSessionAppSource(
|
||||
liveSession,
|
||||
|
|
@ -869,19 +877,9 @@ internal sealed class SessionPlayerCompositionPhase
|
|||
"live combat-mode commands",
|
||||
d.CombatModeCommands.BindOwned(combatCommand));
|
||||
var gameRuntime = new CurrentGameRuntimeAdapter(
|
||||
liveSession,
|
||||
d.Runtime,
|
||||
sessionHost,
|
||||
liveSessionCommands,
|
||||
d.PlayerIdentity,
|
||||
d.EntityObjects,
|
||||
d.Inventory,
|
||||
d.Character,
|
||||
d.Communication,
|
||||
d.Actions,
|
||||
d.PlayerController,
|
||||
d.WorldEnvironment.Runtime,
|
||||
live.WorldTransit,
|
||||
d.UpdateClock,
|
||||
live.SelectionInteractions);
|
||||
bindings.Adopt("current game runtime adapter", gameRuntime);
|
||||
bindings.Adopt(
|
||||
|
|
@ -987,7 +985,6 @@ internal sealed class SessionPlayerCompositionPhase
|
|||
_publication.PublishSessionPlayer(result);
|
||||
|
||||
streamerLease.Transfer();
|
||||
liveSessionLease.Transfer();
|
||||
teleportLease.Transfer();
|
||||
gameplayActionsLease?.Transfer();
|
||||
componentLifecycleLease.Transfer();
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ using AcDream.App.Settings;
|
|||
using AcDream.Core.Chat;
|
||||
using AcDream.Core.Combat;
|
||||
using AcDream.Core.Player;
|
||||
using AcDream.Runtime;
|
||||
using AcDream.Runtime.Gameplay;
|
||||
using AcDream.UI.Abstractions.Input;
|
||||
using AcDream.UI.Abstractions.Panels.Chat;
|
||||
|
|
@ -35,16 +36,22 @@ internal sealed record SettingsDevToolsDependencies(
|
|||
RuntimeSettingsController Settings,
|
||||
IRuntimeSettingsStartupTarget StartupTarget,
|
||||
HostQuiescenceGate HostQuiescence,
|
||||
RuntimeCommunicationState Communication,
|
||||
CombatState Combat,
|
||||
LocalPlayerState LocalPlayer,
|
||||
GameRuntime Runtime,
|
||||
SettingsDevToolsOptionalDependencies? DevTools,
|
||||
RuntimeDiagnosticCommandSlot DiagnosticCommands,
|
||||
CombatFeedbackSlot CombatFeedback,
|
||||
KeyBindings KeyBindings,
|
||||
FrameProfiler FrameProfiler,
|
||||
FramebufferResizeController FramebufferResize,
|
||||
Action<string> Log);
|
||||
Action<string> Log)
|
||||
{
|
||||
public RuntimeCommunicationState Communication =>
|
||||
Runtime.CommunicationOwner;
|
||||
|
||||
public CombatState Combat => Runtime.ActionOwner.Combat;
|
||||
|
||||
public LocalPlayerState LocalPlayer => Runtime.CharacterOwner.LocalPlayer;
|
||||
}
|
||||
|
||||
internal interface IGameWindowSettingsDevToolsPublication
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue