Implement movie mask transition opcode

This commit is contained in:
gamer147
2026-07-29 16:01:00 -04:00
parent cfd8809339
commit 835b0e28cd
18 changed files with 573 additions and 45 deletions

View File

@@ -2129,7 +2129,8 @@ public partial class Main : Godot.Control
public bool TryPlayMovie(byte[] mpegBytes, string assetName, long playbackId,
long resourceId, int assetId, long movieFlags,
long initialPositionMs,
long initialPositionMs, long startDelayMs,
long? presentationDurationMs,
out long? stopTimeMs)
{
stopTimeMs = null;
@@ -2138,7 +2139,7 @@ public partial class Main : Godot.Control
var payload = new Age.Engine.Sys4.MoviePayload(assetName, mpegBytes);
var runtime = MovieRuntime.Open(
assetName, assetId, resourceId, payload, _movieDecoderFactory, movieFlags,
initialPositionMs);
initialPositionMs, startDelayMs, presentationDurationMs);
stopTimeMs = runtime.Decoder.StopTimeMs;
while (!_pendingMovies.TryAdd(playbackId, runtime))
if (_pendingMovies.TryRemove(playbackId, out var prior)) prior.Decoder.Dispose();
@@ -2180,6 +2181,9 @@ public partial class Main : Godot.Control
if (_host == null) return;
foreach (var (playbackId, movie) in _movies)
{
long elapsedMs = (long)Stopwatch.GetElapsedTime(
movie.StartedAtTimestamp).TotalMilliseconds;
if (elapsedMs < movie.StartDelayMs) continue;
bool frameWasAlreadySeen = _movieFrameSeen.Contains(playbackId);
_movieAudio.TryGetValue(playbackId, out var audio);
if (frameWasAlreadySeen) audio?.Update();
@@ -2196,8 +2200,7 @@ public partial class Main : Godot.Control
audio?.Update();
}
}
bool watchdogExpired = Stopwatch.GetElapsedTime(movie.StartedAtTimestamp).TotalMilliseconds
>= movie.WatchdogMs;
bool watchdogExpired = elapsedMs >= movie.WatchdogMs;
if ((movie.Decoder.IsCompleted || watchdogExpired) && _movieCompletionNotified.Add(playbackId))
{
if (movie.Decoder.Failure is { } failure)