Skip to content

Commit

Permalink
fix asyncawait and add ispaused and isstopped
Browse files Browse the repository at this point in the history
  • Loading branch information
Xlinka committed Jul 2, 2024
1 parent 5b6102e commit 9c111fe
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 28 deletions.
22 changes: 22 additions & 0 deletions ProjectObsidian/ProtoFlux/Audio/IsPaused.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using Elements.Core;
using FrooxEngine;
using ProtoFlux.Core;
using ProtoFlux.Runtimes.Execution;

namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Playback
{
[NodeCategory("Obsidian/Playback")]
[NodeName("IsPaused", false)]
public class IsPaused : ValueFunctionNode<ExecutionContext, bool>
{
public ObjectInput<IPlayable> Playable;

protected override bool Compute(ExecutionContext context)
{
var target = Playable.Evaluate(context);
var isPlaying = target != null && target.IsPlaying;
var isAtStart = MathX.Approximately(target?.NormalizedPosition ?? 0f, 0f);
return !isPlaying && !isAtStart;
}
}
}
22 changes: 22 additions & 0 deletions ProjectObsidian/ProtoFlux/Audio/IsStopped.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using Elements.Core;
using FrooxEngine;
using ProtoFlux.Core;
using ProtoFlux.Runtimes.Execution;

namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Playback
{
[NodeCategory("Obsidian/Playback")]
[NodeName("IsStopped", false)]
public class IsStopped : ValueFunctionNode<ExecutionContext, bool>
{
public ObjectInput<IPlayable> Playable;

protected override bool Compute(ExecutionContext context)
{
var target = Playable.Evaluate(context);
var isPlaying = target != null && target.IsPlaying;
var isAtStart = MathX.Approximately(target?.NormalizedPosition ?? 0f, 0f);
return !isPlaying && isAtStart;
}
}
}
59 changes: 31 additions & 28 deletions ProjectObsidian/ProtoFlux/Flow/AsyncWait.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,45 +2,48 @@
using System.Threading.Tasks;
using ProtoFlux.Core;
using ProtoFlux.Runtimes.Execution;

[NodeCategory("Flow/Async")]
[NodeName("Async Wait", false)]
public class AsyncWait : AsyncActionNode<ExecutionContext>
namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Flow
{
public ValueInput<bool> Condition;
public ValueInput<float> Timeout;

public AsyncCall OnStarted;

public Continuation OnDone;
public Continuation TimedOut;

protected override async Task<IOperation> RunAsync(ExecutionContext context)
[NodeCategory("Obsidian/Flow")]
[NodeName("Async Wait", false)]
public class AsyncWait : AsyncActionNode<ExecutionContext>
{
await OnStarted.ExecuteAsync(context);
public ValueInput<bool> Condition;
public ValueInput<float> Timeout;

var timeoutInSeconds = Timeout.Evaluate(context);
var startTime = DateTime.UtcNow;
public AsyncCall OnStarted;

// Initial evaluation of the condition
if (Condition.Evaluate(context, defaultValue: false))
{
return OnDone.Target;
}
public Continuation OnDone;
public Continuation TimedOut;

while (!Condition.Evaluate(context, defaultValue: false))
protected override async Task<IOperation> RunAsync(ExecutionContext context)
{
if ((DateTime.UtcNow - startTime).TotalSeconds > timeoutInSeconds)
await OnStarted.ExecuteAsync(context);

var timeoutInSeconds = Timeout.Evaluate(context);
var startTime = DateTime.UtcNow;

// Initial evaluation of the condition
if (Condition.Evaluate(context, defaultValue: false))
{
return TimedOut.Target;
return OnDone.Target;
}

if (context.AbortExecution)
while (!Condition.Evaluate(context, defaultValue: false))
{
throw new ExecutionAbortedException(base.Runtime as IExecutionRuntime, this, TimedOut.Target, isAsync: true);
if ((DateTime.UtcNow - startTime).TotalSeconds > timeoutInSeconds)
{
return TimedOut.Target;
}

if (context.AbortExecution)
{
throw new ExecutionAbortedException(base.Runtime as IExecutionRuntime, this, TimedOut.Target, isAsync: true);
}
}
}

return OnDone.Target;
return OnDone.Target;
}
}
}

0 comments on commit 9c111fe

Please sign in to comment.