Skip to content

Commit 6be2b49

Browse files
committed
Simple coroutine support
1 parent 68e4359 commit 6be2b49

7 files changed

Lines changed: 106 additions & 1 deletion

File tree

OverEngine/src/OverEngine/Core/Time/Time.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,22 @@ namespace OverEngine
88
{
99
protected:
1010
Time() = default;
11+
1112
public:
1213
Time(const Time&) = delete;
1314
Time& operator=(const Time&) = delete;
15+
1416
public:
1517
inline static float GetTime() { return s_Instance->GetTimeImpl(); }
1618
inline static double GetTimeDouble() { return s_Instance->GetTimeDoubleImpl(); }
1719

1820
inline static TimeStep GetDeltaTime() { return m_DeltaTime; }
1921
inline static void RecalculateDeltaTime() { float time = GetTime(); m_DeltaTime = time - m_LastFrameTime; m_LastFrameTime = time; }
22+
2023
protected:
2124
virtual float GetTimeImpl() = 0;
2225
virtual double GetTimeDoubleImpl() = 0;
26+
2327
private:
2428
static Time* s_Instance;
2529

OverEngine/src/OverEngine/Scripting/Wren.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ namespace WrenSources
99
#include "Wren/keycodes.wren.inc"
1010
#include "Wren/lib.wren.inc"
1111
#include "Wren/math.wren.inc"
12+
#include "Wren/scheduler.wren.inc"
1213
#include "Wren/script.wren.inc"
14+
#include "Wren/time.wren.inc"
1315
}
1416

1517
namespace OverEngine
@@ -48,6 +50,8 @@ namespace OverEngine
4850
WREN_MOD(lib)
4951
WREN_MOD(math)
5052
WREN_MOD(script)
53+
WREN_MOD(scheduler)
54+
WREN_MOD(time)
5155

5256
std::string path(mod);
5357
path += ".wren";
@@ -93,6 +97,9 @@ namespace OverEngine
9397
{
9498
wrenEnsureSlots(m_VM->GetRaw(), 1);
9599
wrenGetVariable(m_VM->GetRaw(), moduleName, className, 0);
100+
101+
OE_CORE_ASSERT(wrenGetSlotType(m_VM->GetRaw(), 0) != WREN_TYPE_NULL, "Wren class is null! Maybe it failed to compile.");
102+
96103
m_ClassHandle = wrenGetSlotHandle(m_VM->GetRaw(), 0);
97104
m_ConstructorHandle = wrenMakeCallHandle(m_VM->GetRaw(), "new(_)");
98105
}

OverEngine/src/OverEngine/Scripting/Wren.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ namespace OverEngine
8888
private:
8989
Ref<Wren> m_VM;
9090
WrenHandle* m_ClassHandle;
91+
92+
// TODO: move to Wren
9193
WrenHandle* m_ConstructorHandle;
9294
};
9395

OverEngine/src/OverEngine/Scripting/WrenBindings.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
#include "OverEngine/Scene/Components.h"
99
#include "OverEngine/Scene/TransformComponent.h"
1010

11+
#include "OverEngine/Core/Time/Time.h"
12+
1113
#define WRENPP_BIND_STATIC(f, sig) .bindFunction<decltype(&f), &f>(true, sig)
1214
#define WRENPP_BIND_STATIC_EXACT(f, args) .bindFunction<decltype(&f), &f>(true, #f "(" args ")")
1315

@@ -65,6 +67,16 @@ namespace OverEngine
6567
{
6668
entity.GetComponent<RigidBody2DComponent>().RigidBody->ApplyLinearImpulseToCenter(impulse);
6769
}
70+
71+
double Time_time()
72+
{
73+
return Time::GetTimeDouble();
74+
}
75+
76+
double Time_deltaTime()
77+
{
78+
return Time::GetDeltaTime().GetSeconds();
79+
}
6880
}
6981

7082
void Wren::InitializeBindings()
@@ -119,6 +131,13 @@ namespace OverEngine
119131
.endClass()
120132
.endModule();
121133

134+
m_VM.beginModule("time")
135+
.beginClass("Time")
136+
WRENPP_BIND_STATIC(Time_time, "time")
137+
WRENPP_BIND_STATIC(Time_deltaTime, "deltaTime")
138+
.endClass()
139+
.endModule();
140+
122141
LoadModule("lib");
123142
}
124143
}

OverEngine/src/Wren/scheduler.wren

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import "time" for Time
2+
3+
class WaitSeconds {
4+
construct new(seconds) {
5+
_seconds = seconds
6+
}
7+
8+
seconds { _seconds }
9+
}
10+
11+
class Schedule {
12+
construct new(resumeTime, fiber) {
13+
_resumeTime = resumeTime
14+
_fiber = fiber
15+
}
16+
17+
resumeTime { _resumeTime }
18+
fiber { _fiber }
19+
}
20+
21+
class Scheduler {
22+
static init() {
23+
__scheduled = []
24+
}
25+
26+
static add(fn) {
27+
addFiber(Fiber.new { fn.call() })
28+
}
29+
30+
static addFiber(fib) {
31+
var result = fib.call()
32+
33+
if (!fib.isDone) {
34+
if (!(result is WaitSeconds)) {
35+
Fiber.abort("result is not of type 'WaitSeconds'.")
36+
}
37+
38+
var resumeTime = Time.time + result.seconds
39+
__scheduled.add(Schedule.new(resumeTime, fib))
40+
}
41+
}
42+
43+
static poll() {
44+
var i = __scheduled.count - 1
45+
while (i >= 0) {
46+
var schedule = __scheduled[i]
47+
if (schedule.resumeTime <= Time.time) {
48+
addFiber(__scheduled.removeAt(i).fiber)
49+
}
50+
i = i - 1
51+
}
52+
}
53+
54+
static count { __scheduled.count }
55+
}
56+
57+
Scheduler.init()

OverEngine/src/Wren/time.wren

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
class Time {
2+
foreign static time
3+
foreign static deltaTime
4+
}

Sandbox/src/wren/scripts.wren

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import "keycodes" for KeyCode
33
import "input" for Input
44
import "math" for Math, Vector2
55
import "components" for RigidBody2DComponent
6+
import "scheduler" for Scheduler, WaitSeconds
67

78
class Player is Script {
89
construct new(e) {
@@ -12,6 +13,16 @@ class Player is Script {
1213
onCreate() {
1314
System.print("My name is '%(entity.name)'")
1415
_rb = entity.getComponent(RigidBody2DComponent)
16+
17+
Scheduler.add {
18+
var i = 10
19+
while (i >= 0) {
20+
System.print("%(this.name)'s countdown: %(i)")
21+
Fiber.yield(WaitSeconds.new(0.1))
22+
i = i - 1
23+
}
24+
System.print("Boom!")
25+
}
1526
}
1627

1728
onUpdate(delta) {
@@ -24,7 +35,8 @@ class Player is Script {
2435

2536
_rb.applyLinearImpulseToCenter(impulse * 20 * delta)
2637

27-
System.print("%(Input.mouseX) %(Input.mouseY) %(Input.mousePosition)")
38+
// System.print("%(Input.mouseX) %(Input.mouseY) %(Input.mousePosition)")
39+
Scheduler.poll()
2840
}
2941
}
3042

0 commit comments

Comments
 (0)