Skip to content

Commit

Permalink
reconnected door/element presenters with avatar
Browse files Browse the repository at this point in the history
  • Loading branch information
DerKatsche committed Nov 14, 2023
1 parent 25e6759 commit 448a43a
Show file tree
Hide file tree
Showing 10 changed files with 67 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import AvatarViewModel from "./AvatarViewModel";
import IAvatarController from "./IAvatarController";
import IAvatarPresenter from "./IAvatarPresenter";
import { LearningSpaceTemplateType } from "src/Components/Core/Domain/Types/LearningSpaceTemplateType";
import ILearningSpacePresenter from "../LearningSpaces/ILearningSpacePresenter";

export default class AvatarBuilder extends AsyncPresentationBuilder<
AvatarViewModel,
Expand All @@ -16,6 +17,8 @@ export default class AvatarBuilder extends AsyncPresentationBuilder<
IAvatarPresenter
> {
learningSpaceTemplateType: LearningSpaceTemplateType;
learningSpacePresenter: ILearningSpacePresenter;

constructor() {
super(AvatarViewModel, AvatarController, AvatarView, undefined);
}
Expand All @@ -37,6 +40,12 @@ export default class AvatarBuilder extends AsyncPresentationBuilder<
).registerAdapter(this.presenter);
}

override buildController(): void {
super.buildController();

this.controller!.learningSpacePresenter = this.learningSpacePresenter;
}

override buildView(): void {
super.buildView();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,26 +22,23 @@ import IScenePresenter from "../SceneManagement/IScenePresenter";
import LearningSpaceSceneDefinition from "../SceneManagement/Scenes/LearningSpaceSceneDefinition";
import AvatarViewModel from "./AvatarViewModel";
import IAvatarController from "./IAvatarController";
import ILearningWorldPort from "src/Components/Core/Application/Ports/Interfaces/ILearningWorldPort";
import PORT_TYPES from "~DependencyInjection/Ports/PORT_TYPES";
import ILearningSpacePresenter from "../LearningSpaces/ILearningSpacePresenter";

const validKeys = ["w", "a", "s", "d"];

export default class AvatarController implements IAvatarController {
learningSpacePresenter: ILearningSpacePresenter; // set by builder

private scenePresenter: IScenePresenter;
private navigation: INavigation;
private pathLine: LinesMesh;
private worldPort: ILearningWorldPort;

private keyMovementTarget: Nullable<Vector3> = null;
private pointerMovementTarget: Nullable<Vector3> = null;
private lastFramePosition: Nullable<Vector3> = null;

constructor(private viewModel: AvatarViewModel) {
this.navigation = CoreDIContainer.get<INavigation>(CORE_TYPES.INavigation);
this.worldPort = CoreDIContainer.get<ILearningWorldPort>(
PORT_TYPES.ILearningWorldPort
);
let scenePresenterFactory = CoreDIContainer.get<ScenePresenterFactory>(
SCENE_TYPES.ScenePresenterFactory
);
Expand Down Expand Up @@ -148,7 +145,7 @@ export default class AvatarController implements IAvatarController {
this.viewModel.parentNode.position
) > 0.1
) {
this.worldPort.onAvatarPositionChanged(
this.learningSpacePresenter.broadcastAvatarPosition(
this.viewModel.parentNode.position,
2
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { LearningSpaceTemplateType } from "src/Components/Core/Domain/Types/LearningSpaceTemplateType";
import IAsyncPresentationBuilder from "../../PresentationBuilder/IAsyncPresentationBuilder";
import ILearningSpacePresenter from "../LearningSpaces/ILearningSpacePresenter";

export default interface IAvatarBuilder extends IAsyncPresentationBuilder {
learningSpaceTemplateType: LearningSpaceTemplateType;
learningSpacePresenter: ILearningSpacePresenter;
}
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
export default interface IAvatarController {}
import ILearningSpacePresenter from "../LearningSpaces/ILearningSpacePresenter";

export default interface IAvatarController {
learningSpacePresenter: ILearningSpacePresenter;
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import LearningSpaceScoreTO from "src/Components/Core/Application/DataTransferObjects/LearningSpaceScoreTO";
import { Vector3 } from "@babylonjs/core";
import ILearningWorldAdapter from "src/Components/Core/Application/Ports/LearningWorldPort/ILearningWorldAdapter";

export default interface IDoorPresenter extends ILearningWorldAdapter {
openDoor(): void;
onAvatarPositionChanged(position: Vector3, interactionRadius: number): void;
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import { ComponentID } from "src/Components/Core/Domain/Types/EntityTypes";
import ILearningWorldAdapter from "src/Components/Core/Application/Ports/LearningWorldPort/ILearningWorldAdapter";
import { Vector3 } from "@babylonjs/core";

export default interface ILearningElementPresenter
extends ILearningWorldAdapter {
onLearningElementScored(hasScored: boolean, elementID: ComponentID): void;
onAvatarPositionChanged(position: Vector3, interactionRadius: number): void;
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { Vector3 } from "@babylonjs/core/Maths/math";
import ILearningElementPresenter from "./ILearningElementPresenter";
import LearningElementViewModel from "./LearningElementViewModel";

Expand All @@ -21,4 +22,16 @@ export default class LearningElementPresenter
}, this.viewModel.highlightTimeout);
}
}

onAvatarPositionChanged(position: Vector3, interactionRadius: number): void {
const distance = Vector3.Distance(position, this.viewModel.position);

// if (distance <= interactionRadius) {
// this.bottomTooltipPresenter.displayDoorTooltip(this.viewModel.isExit);
// this.viewModel.isInteractable.Value = true;
// } else if (this.viewModel.isInteractable.Value) {
// this.bottomTooltipPresenter.hide();
// this.viewModel.isInteractable.Value = false;
// }
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { Vector3 } from "@babylonjs/core";
import LearningSpaceTO from "src/Components/Core/Application/DataTransferObjects/LearningSpaceTO";

export default interface ILearningSpacePresenter {
asyncSetupSpace(spaceData: LearningSpaceTO): Promise<void>;
broadcastAvatarPosition(position: Vector3, interactionRadius: number): void;
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,16 @@ import IStandInDecorationBuilder from "../StandInDecoration/IStandInDecorationBu
import IDoorBuilder from "../Door/IDoorBuilder";
import IWindowBuilder from "../Window/IWindowBuilder";
import SeededRNG from "../../Utils/SeededRNG";
import { Vector3 } from "@babylonjs/core/Maths/math";
import IDoorPresenter from "../Door/IDoorPresenter";
import ILearningElementPresenter from "../LearningElements/ILearningElementPresenter";

@injectable()
export default class LearningSpacePresenter implements ILearningSpacePresenter {
private director: IPresentationDirector;
private decorationBuilder: IDecorationBuilder;
private doorPresenters: IDoorPresenter[] = [];
private elmentPresenters: ILearningElementPresenter[] = [];

constructor(private viewModel: LearningSpaceViewModel) {
if (!this.viewModel) {
Expand All @@ -39,10 +44,20 @@ export default class LearningSpacePresenter implements ILearningSpacePresenter {
await this.director.buildAsync(this.decorationBuilder);
}

broadcastAvatarPosition(position: Vector3, interactionRadius: number): void {
for (const doorPresenter of this.doorPresenters) {
doorPresenter.onAvatarPositionChanged(position, interactionRadius);
}
for (const elementPresenter of this.elmentPresenters) {
elementPresenter.onAvatarPositionChanged(position, interactionRadius);
}
}

private async fillLearningElementSlots(
spaceTO: LearningSpaceTO
): Promise<void> {
const loadingCompletePromises: Promise<void>[] = [];
const elementBuilders: ILearningElementBuilder[] = [];

for (let i = 0; i < spaceTO.elements.length; i++) {
let elementPosition = this.viewModel.elementPositions.shift()!;
Expand Down Expand Up @@ -79,9 +94,13 @@ export default class LearningSpacePresenter implements ILearningSpacePresenter {
elementBuilder.elementPosition = elementPosition;

loadingCompletePromises.push(this.director.buildAsync(elementBuilder));
elementBuilders.push(elementBuilder);
}
}
await Promise.all(loadingCompletePromises);

for (const elementBuilder of elementBuilders)
this.elmentPresenters.push(elementBuilder.getPresenter());
}

private async createExitDoor(spaceTO: LearningSpaceTO): Promise<void> {
Expand All @@ -95,7 +114,10 @@ export default class LearningSpacePresenter implements ILearningSpacePresenter {
exitDoorBuilder.spaceID = this.viewModel.id;
exitDoorBuilder.isExit = true;
exitDoorBuilder.isOpen = spaceTO.currentScore >= spaceTO.requiredScore;

await this.director.buildAsync(exitDoorBuilder);

this.doorPresenters.push(exitDoorBuilder.getPresenter());
}

private async createEntryDoor(): Promise<void> {
Expand All @@ -109,7 +131,10 @@ export default class LearningSpacePresenter implements ILearningSpacePresenter {
entryDoorBuilder.spaceID = this.viewModel.id;
entryDoorBuilder.isExit = false;
entryDoorBuilder.isOpen = false;

await this.director.buildAsync(entryDoorBuilder);

this.doorPresenters.push(entryDoorBuilder.getPresenter());
}

private async createWindows(): Promise<void> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ export default class LearningSpaceSceneDefinition
this.spaceBuilder.spaceData = this.spaceData;
const spaceCompleted = this.director.buildAsync(this.spaceBuilder);

// create avatar
// create avatar camera
this.avatarParentNode = new TransformNode("AvatarParentNode", this.scene);
this.director.build(this.avatarCameraBuilder);
(
Expand All @@ -95,6 +95,8 @@ export default class LearningSpaceSceneDefinition

// create avatar
this.avatarBuilder.learningSpaceTemplateType = this.spaceData?.template;
this.avatarBuilder.learningSpacePresenter =
this.spaceBuilder.getPresenter();
await this.director.buildAsync(this.avatarBuilder);
}

Expand Down

0 comments on commit 448a43a

Please sign in to comment.