Skip to content

Commit

Permalink
#45 implement sync-point labels and global registration
Browse files Browse the repository at this point in the history
  • Loading branch information
minecrawler committed Jun 12, 2022
1 parent bb7ecae commit af4e9bb
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 0 deletions.
39 changes: 39 additions & 0 deletions src/ecs/ecs-sync-point.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import type {ISyncPoint} from "../scheduler/pipeline/sync-point.spec";

const syncPoints = new Map<string, ISyncPoint>();

/**
* Register a sync-point by name
* @param syncPoint
*/
export function addSyncPoint(syncPoint: ISyncPoint): void {
if (!syncPoint.name) {
throw new Error('Cannot register a sync point without a name!');
}

{
const name = syncPoint.name;

if (syncPoints.has(name) && syncPoints.get(name) != syncPoint) {
throw new Error(`Another sync point with the name "${name}" has already been registered!`);
}

syncPoints.set(name, syncPoint);
}
}

/**
* Find a sync-point by name, if it exists
* @param name
*/
export function getSyncPoint(name: string): ISyncPoint | undefined {
return syncPoints.get(name);
}

/**
* Remove a sync-point from the registry by name, if it exists
* @param name
*/
export function removeSyncPoint(name: string): void {
syncPoints.delete(name);
}
1 change: 1 addition & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from './ecs/ecs-sync-point';
export * from './ecs/ecs-world';
export * from './entity';
export * from './entity-builder';
Expand Down
2 changes: 2 additions & 0 deletions src/scheduler/pipeline/sync-point.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {ISystem} from "../../system";


export interface ISyncPointPrefab {
name?: string
after?: ISyncPointPrefab
before?: ISyncPointPrefab
stages?: ISystem<any>[][]
Expand All @@ -11,6 +12,7 @@ export interface ISyncPointPrefab {
export interface ISyncPoint {
after?: ISyncPoint
before?: ISyncPoint
name?: string
stages: IStage[]

/**
Expand Down
3 changes: 3 additions & 0 deletions src/scheduler/pipeline/sync-point.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,12 @@ export * from "./sync-point.spec";
export class SyncPoint implements ISyncPoint {
after?: ISyncPoint;
before?: ISyncPoint;
name?: string
stages: IStage[] = [];
protected syncPointHandlers = new Set<Function>();



addNewStage(handler: (stage: IStage) => void): SyncPoint {
const stage = new Stage();
this.stages.push(stage);
Expand Down
34 changes: 34 additions & 0 deletions src/world-builder/world-builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,36 @@ export class WorldBuilder implements IWorldBuilder {
return world;
}

protected registerAllNamedSyncPoints(root: ISyncPoint) {
let currentSyncPoint = root;

// register root
if (root.name) {
addSyncPoint(root);
}

// register all sync-points before root
while (currentSyncPoint.before) {
currentSyncPoint = currentSyncPoint.before;

if (currentSyncPoint.name) {
addSyncPoint(currentSyncPoint);
}
}

// reset to root
currentSyncPoint = root;

// register all sync-points after root
while (currentSyncPoint.after) {
currentSyncPoint = currentSyncPoint.after;

if (currentSyncPoint.name) {
addSyncPoint(currentSyncPoint);
}
}
}

withComponent(Component: TObjectProto, options?: IComponentRegistrationOptions): WorldBuilder {
this.serde.registerTypeHandler(
Component,
Expand All @@ -63,6 +93,7 @@ export class WorldBuilder implements IWorldBuilder {

withDefaultScheduler(scheduler: IScheduler): IWorldBuilder {
this.defaultScheduler = scheduler;
this.registerAllNamedSyncPoints(scheduler.pipeline.root);
return this;
}

Expand All @@ -73,6 +104,7 @@ export class WorldBuilder implements IWorldBuilder {

withDefaultScheduling(planner: (root: ISyncPoint) => void): WorldBuilder {
planner(this.defaultScheduler.pipeline.root);
this.registerAllNamedSyncPoints(this.defaultScheduler.pipeline.root);
return this;
}

Expand All @@ -82,6 +114,7 @@ export class WorldBuilder implements IWorldBuilder {
}

this.stateSchedulers.set(state, scheduler);
this.registerAllNamedSyncPoints(scheduler.pipeline.root);
return this;
}

Expand All @@ -93,6 +126,7 @@ export class WorldBuilder implements IWorldBuilder {
{
const scheduler = new Scheduler();
this.stateSchedulers.set(state, scheduler);
this.registerAllNamedSyncPoints(scheduler.pipeline.root);
planner(scheduler.pipeline.root);
}

Expand Down

0 comments on commit af4e9bb

Please sign in to comment.