-
Notifications
You must be signed in to change notification settings - Fork 46
/
FocusUtils.re
executable file
·127 lines (113 loc) · 3.65 KB
/
FocusUtils.re
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
let _getFixedDistance = () => 3.;
let _isFixedDistance = distance => distance === _getFixedDistance();
let _calcMoveSpeed = distance => distance /. 100.;
let _calcWheelSpeed = distance =>
_isFixedDistance(distance) ? 0.5 : distance /. 50.;
let _setArcballCameraControllerFocusRelatedAttribute =
(arcballCameraController, (distance, target), engineState) => {
let moveSpeed = _calcMoveSpeed(distance);
let wheelSpeed = _calcWheelSpeed(distance);
engineState
|> ArcballCameraEngineService.setArcballCameraControllerTarget(
arcballCameraController,
target,
)
|> ArcballCameraEngineService.setArcballCameraControllerDistance(
distance,
arcballCameraController,
)
|> ArcballCameraEngineService.setArcballCameraControllerMoveSpeedX(
arcballCameraController,
moveSpeed,
)
|> ArcballCameraEngineService.setArcballCameraControllerMoveSpeedY(
arcballCameraController,
moveSpeed,
)
|> ArcballCameraEngineService.setArcballCameraControllerWheelSpeed(
arcballCameraController,
wheelSpeed,
);
};
let _buildAllPointsAndLocalToWolrdMatrices = (targetGameObject, engineState) =>
engineState
|> HierarchyGameObjectEngineService.getAllGameObjects(targetGameObject)
|> Js.Array.filter(gameObject =>
GameObjectComponentEngineService.hasGeometryComponent(
gameObject,
engineState,
)
)
|> Js.Array.map(gameObject => {
let geometry =
engineState
|> GameObjectComponentEngineService.unsafeGetGeometryComponent(
gameObject,
);
(
engineState
|> GeometryEngineService.unsafeGetGeometryVertices(geometry),
engineState
|> TransformGameObjectEngineService.getLocalToWorldMatrixTypeArray(
gameObject,
),
);
});
let calcCenterAndDistance = (targetGameObject, engineState) =>
switch (
_buildAllPointsAndLocalToWolrdMatrices(targetGameObject, engineState)
) {
| allPointsAndLocalToWolrdMatrices
when Js.Array.length(allPointsAndLocalToWolrdMatrices) === 0 => (
TransformGameObjectEngineService.getPosition(
targetGameObject,
engineState,
),
_getFixedDistance(),
)
| allPointsAndLocalToWolrdMatrices =>
let aabb =
AABBShapeUtils.setFromAllPointsAndLocalToWolrdMatrices(
_buildAllPointsAndLocalToWolrdMatrices(targetGameObject, engineState),
);
let center = AABBShapeUtils.getCenter(aabb);
(center, AABBShapeUtils.calcRadiusOfAABB(aabb, center) *. 2.5);
};
let setEditorCameraFocusTargetGameObject =
(editCamera, targetGameObject, engineState) => {
WonderLog.Contract.requireCheck(
() =>
WonderLog.(
Contract.(
Operators.(
test(
Log.buildAssertMessage(
~expect=
{j|the editor camera should has arcballCameraController component|j},
~actual={j|not|j},
),
() =>
GameObjectComponentEngineService.hasArcballCameraControllerComponent(
editCamera,
engineState,
)
|> assertTrue
)
)
)
),
StateEditorService.getStateIsDebug(),
);
let editorCameraArcballControllerComponent =
GameObjectComponentEngineService.unsafeGetArcballCameraControllerComponent(
editCamera,
engineState,
);
let (center, distance) =
engineState |> calcCenterAndDistance(targetGameObject);
_setArcballCameraControllerFocusRelatedAttribute(
editorCameraArcballControllerComponent,
(distance, center),
engineState,
);
};