forked from Snapchat/Spectacles-Sample
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPlacingStartState.ts
More file actions
76 lines (58 loc) · 3 KB
/
Copy pathPlacingStartState.ts
File metadata and controls
76 lines (58 loc) · 3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import { SurfaceDetection } from "../../Surface Detection/Scripts/SurfaceDetection";
import { LensInitializer } from "../LensInitializer";
import { GetVectorsFromQuaternion } from "../Helpers/GetVectorsFromQuaternion";
import { SoundController } from "../SoundController";
import { LinearAlgebra } from "../Helpers/LinearAlgebra";
import { LineController } from "../LineController";
export class PlacingStartState {
constructor(
protected ownerScript: ScriptComponent,
protected surfaceDetection: SurfaceDetection,
protected startLinePrefab: ObjectPrefab,
protected cameraTransform: Transform,
protected startLineForwardDisplace: number,
protected onStartPlaced: (startPosition: vec3, startRotation: quat, startObject: SceneObject) => void) {
}
protected startLineTransform: Transform | undefined;
start(){
this.surfaceDetection.startGroundCalibration((pos, rot) => { this.onPlacing(pos, rot) }, (pos, rot) => { this.onPlaced(pos, rot) });
this.startLineTransform = this.startLinePrefab.instantiate(this.ownerScript.getSceneObject()).getTransform();
const startLineController = this.startLineTransform.getSceneObject().getComponent(LineController.getTypeName());
if (!startLineController){
throw new Error(`StartFinishLine cannot be found on object: ${this.startLineTransform.getSceneObject().name}`);
}
startLineController.init(true);
this.hideStartLine();
}
onPlacing(pos:vec3, rot:quat){
// Rot is upside down and turned around
const { forward, right, up } = GetVectorsFromQuaternion.getInstance().getVectorsFromQuaternion(rot);
rot = quat.angleAxis(-Math.PI/2, right).multiply(rot);
rot = quat.angleAxis(Math.PI, up).multiply(rot);
// Displaces obj away from surface placement ui
pos = this.displaceAwayFromCamera(pos);
this.setStartLineTransform(pos, rot);
}
onPlaced(pos:vec3, rot:quat){
// Bug: this rot does not match onPlacing one frame earlier
const { forward, right, up } = GetVectorsFromQuaternion.getInstance().getVectorsFromQuaternion(rot);
rot = quat.angleAxis(Math.PI, up).multiply(rot);
// Displaces obj away from surface placement ui
pos = this.displaceAwayFromCamera(pos);
LensInitializer.getInstance().setFloorOffsetFromCamera(pos);
this.onStartPlaced(pos, rot, this.startLineTransform.getSceneObject());
SoundController.getInstance().playSound("stopCreatePath");
}
private displaceAwayFromCamera(pos:vec3){
return pos.add(LinearAlgebra.flatNor(this.cameraTransform.back).uniformScale(30));
}
private setStartLineTransform(pos:vec3, rot:quat){
this.startLineTransform.setWorldPosition(pos);
this.startLineTransform.setWorldRotation(rot);
}
private hideStartLine(){
this.startLineTransform.setWorldPosition(this.cameraTransform.getWorldPosition().add(vec3.up().uniformScale(1000)));
}
stop(){
}
}