/
HomeButtonViewModel.js
156 lines (141 loc) · 4.67 KB
/
HomeButtonViewModel.js
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/*global define*/
define([
'../../Core/Cartesian3',
'../../Core/defaultValue',
'../../Core/defined',
'../../Core/defineProperties',
'../../Core/DeveloperError',
'../../Core/Matrix4',
'../../Core/Rectangle',
'../../Scene/Camera',
'../../Scene/SceneMode',
'../../ThirdParty/knockout',
'../createCommand'
], function(
Cartesian3,
defaultValue,
defined,
defineProperties,
DeveloperError,
Matrix4,
Rectangle,
Camera,
SceneMode,
knockout,
createCommand) {
"use strict";
var pitchScratch = new Cartesian3();
function viewHome(scene, duration) {
var mode = scene.mode;
if (defined(scene) && mode === SceneMode.MORPHING) {
scene.completeMorph();
}
if (mode === SceneMode.SCENE2D) {
scene.camera.flyTo({
destination : Rectangle.MAX_VALUE,
duration : duration,
endTransform : Matrix4.IDENTITY
});
} else if (mode === SceneMode.SCENE3D) {
var destination = scene.camera.getRectangleCameraCoordinates(Camera.DEFAULT_VIEW_RECTANGLE);
var mag = Cartesian3.magnitude(destination);
mag += mag * Camera.DEFAULT_VIEW_FACTOR;
Cartesian3.normalize(destination, destination);
Cartesian3.multiplyByScalar(destination, mag, destination);
scene.camera.flyTo({
destination : destination,
duration : duration,
endTransform : Matrix4.IDENTITY
});
} else if (mode === SceneMode.COLUMBUS_VIEW) {
var maxRadii = scene.globe.ellipsoid.maximumRadius;
var position = new Cartesian3(0.0, -1.0, 1.0);
position = Cartesian3.multiplyByScalar(Cartesian3.normalize(position, position), 5.0 * maxRadii, position);
scene.camera.flyTo({
destination : position,
duration : duration,
orientation : {
heading : 0.0,
pitch : -Math.acos(Cartesian3.normalize(position, pitchScratch).z),
roll : 0.0
},
endTransform : Matrix4.IDENTITY,
convert : false
});
}
}
/**
* The view model for {@link HomeButton}.
* @alias HomeButtonViewModel
* @constructor
*
* @param {Scene} scene The scene instance to use.
* @param {Number} [duration] The duration of the camera flight in seconds.
*/
var HomeButtonViewModel = function(scene, duration) {
//>>includeStart('debug', pragmas.debug);
if (!defined(scene)) {
throw new DeveloperError('scene is required.');
}
//>>includeEnd('debug');
this._scene = scene;
this._duration = duration;
var that = this;
this._command = createCommand(function() {
viewHome(that._scene, that._duration);
});
/**
* Gets or sets the tooltip. This property is observable.
*
* @type {String}
*/
this.tooltip = 'View Home';
knockout.track(this, ['tooltip']);
};
defineProperties(HomeButtonViewModel.prototype, {
/**
* Gets the scene to control.
* @memberof HomeButtonViewModel.prototype
*
* @type {Scene}
*/
scene : {
get : function() {
return this._scene;
}
},
/**
* Gets the Command that is executed when the button is clicked.
* @memberof HomeButtonViewModel.prototype
*
* @type {Command}
*/
command : {
get : function() {
return this._command;
}
},
/**
* Gets or sets the the duration of the camera flight in seconds.
* A value of zero causes the camera to instantly switch to home view.
* The duration will be computed based on the distance when undefined.
* @memberof HomeButtonViewModel.prototype
*
* @type {Number|undefined}
*/
duration : {
get : function() {
return this._duration;
},
set : function(value) {
//>>includeStart('debug', pragmas.debug);
if (defined(value) && value < 0) {
throw new DeveloperError('value must be positive.');
}
//>>includeEnd('debug');
this._duration = value;
}
}
});
return HomeButtonViewModel;
});