remote-calibrator 0.3.0-beta.0 → 0.3.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/.eslintrc.js +1 -1
  2. package/.husky/pre-commit +1 -1
  3. package/.prettierignore +4 -0
  4. package/CHANGELOG.md +38 -1
  5. package/README.md +33 -13
  6. package/homepage/example.css +4 -0
  7. package/homepage/example.js +1 -0
  8. package/homepage/index.html +26 -0
  9. package/i18n/.eslintrc.js +12 -0
  10. package/i18n/fetch-languages-sheets.js +62 -0
  11. package/lib/RemoteCalibrator.min.js +1 -1
  12. package/lib/RemoteCalibrator.min.js.LICENSE.txt +1 -1
  13. package/lib/RemoteCalibrator.min.js.map +1 -1
  14. package/package.json +12 -8
  15. package/src/components/buttons.js +4 -3
  16. package/src/components/language.js +31 -0
  17. package/src/components/onCanvas.js +4 -8
  18. package/src/components/swalOptions.js +25 -23
  19. package/src/{helpers.js → components/utils.js} +8 -2
  20. package/src/{video.js → components/video.js} +23 -4
  21. package/src/const.js +23 -3
  22. package/src/core.js +106 -6
  23. package/src/css/distance.scss +12 -7
  24. package/src/css/main.css +65 -10
  25. package/src/css/panel.scss +1 -1
  26. package/src/css/screenSize.css +28 -14
  27. package/src/debug.js +2 -0
  28. package/src/displaySize.js +1 -1
  29. package/src/distance/distance.js +20 -13
  30. package/src/distance/distanceTrack.js +9 -8
  31. package/src/gaze/gaze.js +22 -20
  32. package/src/gaze/gazeAccuracy.js +3 -4
  33. package/src/gaze/gazeCalibration.js +30 -22
  34. package/src/gaze/gazeTracker.js +4 -2
  35. package/src/i18n.js +6 -0
  36. package/src/index.js +1 -1
  37. package/src/interpupillaryDistance.js +34 -18
  38. package/src/{panel/panel.js → panel.js} +57 -21
  39. package/src/screenSize.js +72 -35
  40. package/src/constants.js +0 -11
  41. package/src/text.json +0 -34
@@ -1,41 +1,42 @@
1
- .slider {
1
+ .rc-slider {
2
2
  position: absolute;
3
3
  display: block;
4
4
  -webkit-appearance: none;
5
5
  appearance: none;
6
6
  width: calc(100% - 4rem);
7
- height: 30px;
8
- background: #fff;
9
- opacity: 0.7;
7
+ height: 10px;
8
+ background: linear-gradient(90deg, #ffc772, #ffc772 60%, #fff 60%);
9
+ opacity: 0.8;
10
10
  /* top: max(45%, 200px); */
11
11
  left: 2rem;
12
- border-radius: 15px;
12
+ border-radius: 5px;
13
13
  z-index: 1;
14
14
  cursor: grab;
15
15
  -webkit-transition: opacity 0.3s;
16
16
  transition: opacity 0.3s;
17
17
  }
18
18
 
19
- .slider:hover {
19
+ .rc-slider:hover {
20
20
  opacity: 0.99;
21
21
  }
22
22
 
23
- .slider::-webkit-slider-thumb {
23
+ .rc-slider::-webkit-slider-thumb {
24
24
  -webkit-appearance: none;
25
25
  appearance: none;
26
26
  width: 30px;
27
27
  height: 30px;
28
28
  border-radius: 15px;
29
- background: #666;
29
+ background: #ff9a00;
30
+ box-shadow: 0 0 12px 0 #88520033;
30
31
  cursor: inherit;
31
32
  }
32
33
 
33
- .slider::-moz-range-thumb,
34
- .slider::-ms-thumb {
35
- width: 20px;
34
+ .rc-slider::-moz-range-thumb,
35
+ .rc-slider::-ms-thumb {
36
+ width: 30px;
36
37
  height: 30px;
37
38
  border-radius: 15px;
38
- background: #666;
39
+ background: #ff9a00;
39
40
  cursor: inherit;
40
41
  }
41
42
 
@@ -55,6 +56,7 @@
55
56
  #size-arrow {
56
57
  position: absolute;
57
58
  display: block;
59
+ /* display: none; */
58
60
  width: 70px;
59
61
  height: auto;
60
62
  z-index: 3;
@@ -68,8 +70,8 @@
68
70
  transition: opacity 0.1s;
69
71
  }
70
72
 
71
- .slider:hover ~ .size-obj .minor,
72
- .slider:active ~ .size-obj .minor {
73
+ .rc-slider:hover ~ .size-obj .minor,
74
+ .rc-slider:active ~ .size-obj .minor {
73
75
  opacity: 0;
74
76
  }
75
77
 
@@ -85,3 +87,15 @@
85
87
  font-size: 1.1rem;
86
88
  vertical-align: middle;
87
89
  }
90
+
91
+ @media (min-width: 481px) {
92
+ .rc-size-obj-selection {
93
+ display: inline-flex;
94
+ }
95
+ }
96
+
97
+ @media (max-width: 480px) {
98
+ .rc-size-obj-selection {
99
+ display: inline-block;
100
+ }
101
+ }
package/src/debug.js ADDED
@@ -0,0 +1,2 @@
1
+ // eslint-disable-next-line no-undef
2
+ export const debug = process.env.DEBUG
@@ -1,5 +1,5 @@
1
1
  import RemoteCalibrator from './core'
2
- import { blurAll } from './helpers'
2
+ import { blurAll } from './components/utils'
3
3
 
4
4
  /**
5
5
  *
@@ -5,7 +5,7 @@ import {
5
5
  toFixedNumber,
6
6
  median,
7
7
  blurAll,
8
- } from '../helpers'
8
+ } from '../components/utils'
9
9
  import {
10
10
  _getCrossX,
11
11
  _cross,
@@ -16,7 +16,7 @@ import {
16
16
  import { bindKeys, unbindKeys } from '../components/keyBinder'
17
17
  import { addButtons } from '../components/buttons'
18
18
  import { soundFeedback } from '../components/sound'
19
- import text from '../text.json'
19
+ import { phrases } from '../i18n'
20
20
 
21
21
  const blindSpotHTML = `<canvas id="blind-spot-canvas"></canvas>`
22
22
 
@@ -40,16 +40,17 @@ export function blindSpotTest(RC, options, toTrackDistance = false, callback) {
40
40
  RC.background.appendChild(blindSpotDiv)
41
41
  RC._constructFloatInstructionElement(
42
42
  'blind-spot-instruction',
43
- `Close <span id="eye-side"></span> eye.`
43
+ phrases.RC_headTrackingCloseL[RC.L]
44
44
  )
45
- RC._addCreditOnBackground(RC._CONST.CREDIT_TEXT.BLIND_SPOT_TEST)
45
+ RC._addCreditOnBackground(phrases.RC_viewingBlindSpotCredit[RC.L])
46
46
 
47
47
  // Get HTML elements
48
48
  const c = document.querySelector('#blind-spot-canvas')
49
49
  const ctx = c.getContext('2d')
50
50
 
51
- const eyeSideEle = document.getElementById('eye-side')
52
- let eyeSide = (eyeSideEle.innerText = 'LEFT').toLocaleLowerCase()
51
+ const eyeSideEle = document.getElementById('blind-spot-instruction')
52
+ // let eyeSide = (eyeSideEle.innerText = 'LEFT').toLocaleLowerCase()
53
+ let eyeSide = 'left'
53
54
  RC._setFloatInstructionElementPos(eyeSide, 16)
54
55
  let crossX = _getCrossX(eyeSide, c.width)
55
56
 
@@ -115,9 +116,14 @@ export function blindSpotTest(RC, options, toTrackDistance = false, callback) {
115
116
  }
116
117
  } else if (tested % options.repeatTesting === 0) {
117
118
  // Switch eye side
118
- if (eyeSide === 'left')
119
- eyeSide = (eyeSideEle.innerText = 'RIGHT').toLocaleLowerCase()
120
- else eyeSide = (eyeSideEle.innerText = 'LEFT').toLocaleLowerCase()
119
+ if (eyeSide === 'left') {
120
+ // Change to RIGHT
121
+ eyeSide = 'right'
122
+ eyeSideEle.innerHTML = phrases.RC_headTrackingCloseR[RC.L]
123
+ } else {
124
+ eyeSide = 'left'
125
+ eyeSideEle.innerHTML = phrases.RC_headTrackingCloseL[RC.L]
126
+ }
121
127
  RC._setFloatInstructionElementPos(eyeSide, 16)
122
128
 
123
129
  circleBounds = _getCircleBounds(eyeSide, crossX, c.width)
@@ -134,6 +140,7 @@ export function blindSpotTest(RC, options, toTrackDistance = false, callback) {
134
140
  ' ': finishFunction,
135
141
  })
136
142
  addButtons(
143
+ RC.L,
137
144
  RC.background,
138
145
  {
139
146
  go: finishFunction,
@@ -152,7 +159,7 @@ export function blindSpotTest(RC, options, toTrackDistance = false, callback) {
152
159
 
153
160
  _cross(ctx, crossX, c.height / 2)
154
161
 
155
- _circle(ctx, circleX, c.height / 2, frameCount, options.sparkle)
162
+ _circle(RC, ctx, circleX, c.height / 2, frameCount, options.sparkle)
156
163
  circleX += v * circleDeltaX
157
164
  tempX = constrain(circleX, ...circleBounds)
158
165
  if (circleX !== tempX) {
@@ -197,8 +204,8 @@ RemoteCalibrator.prototype.measureDistance = function (options = {}, callback) {
197
204
  repeatTesting: 2,
198
205
  sparkle: true,
199
206
  decimalPlace: 1,
200
- headline: text.measureDistance.headline,
201
- description: text.measureDistance.description,
207
+ headline: '📏 ' + phrases.RC_viewingDistanceTitle[this.L],
208
+ description: phrases.RC_viewingDistanceIntro[this.L],
202
209
  },
203
210
  options
204
211
  )
@@ -208,7 +215,7 @@ RemoteCalibrator.prototype.measureDistance = function (options = {}, callback) {
208
215
  this._addBackground()
209
216
 
210
217
  this._replaceBackground(
211
- constructInstructions(options.headline, options.description)
218
+ constructInstructions(options.headline, options.description, true)
212
219
  )
213
220
  blindSpotTest(this, options, false, callback)
214
221
  }
@@ -6,9 +6,9 @@ import {
6
6
  constructInstructions,
7
7
  blurAll,
8
8
  sleep,
9
- } from '../helpers'
9
+ } from '../components/utils'
10
10
  import { iRepeat } from '../components/iRepeat'
11
- import text from '../text.json'
11
+ import { phrases } from '../i18n'
12
12
 
13
13
  const originalStyles = {
14
14
  video: false,
@@ -42,15 +42,16 @@ RemoteCalibrator.prototype.trackDistance = function (
42
42
  fullscreen: false,
43
43
  repeatTesting: 2,
44
44
  sparkle: true,
45
- pipWidthPx: 208,
45
+ pipWidthPx:
46
+ this._CONST.N.VIDEO_W[this.isMobile.value ? 'MOBILE' : 'DESKTOP'],
46
47
  showVideo: true,
47
48
  showFaceOverlay: false,
48
49
  decimalPlace: 1,
49
50
  framerate: 3, // track rate
50
51
  nearPoint: true, // New 0.0.6
51
52
  showNearPoint: false, // New 0.0.6
52
- headline: text.trackDistance.headline,
53
- description: text.trackDistance.description,
53
+ headline: '🙂 ' + phrases.RC_headTrackingTitle[this.L],
54
+ description: phrases.RC_headTrackingIntro[this.L],
54
55
  },
55
56
  options
56
57
  )
@@ -73,7 +74,7 @@ RemoteCalibrator.prototype.trackDistance = function (
73
74
  this._addBackground()
74
75
  this._constructFloatInstructionElement(
75
76
  'gaze-system-instruction',
76
- 'Starting up... Please wait.'
77
+ phrases.RC_starting[this.L]
77
78
  )
78
79
 
79
80
  // STEP 2 - Live estimate
@@ -161,7 +162,7 @@ const cyclopean = (video, a, b) => {
161
162
 
162
163
  /* -------------------------------------------------------------------------- */
163
164
  const trackingOptions = {
164
- pipWidthPx: 208,
165
+ pipWidthPx: 0,
165
166
  decimalPlace: 2,
166
167
  framerate: 3,
167
168
  nearPoint: true,
@@ -372,7 +373,7 @@ RemoteCalibrator.prototype.endDistance = function (endAll = false, _r = true) {
372
373
  iRepeatOptions.break = true
373
374
  iRepeatOptions.framerate = 20
374
375
 
375
- trackingOptions.pipWidthPx = 208
376
+ trackingOptions.pipWidthPx = 0
376
377
  trackingOptions.decimalPlace = 2
377
378
  trackingOptions.framerate = 3
378
379
  trackingOptions.nearPoint = true
package/src/gaze/gaze.js CHANGED
@@ -1,12 +1,13 @@
1
1
  import RemoteCalibrator from '../core'
2
2
 
3
- import { blurAll } from '../helpers'
3
+ import { blurAll } from '../components/utils'
4
4
  import { gazeCalibrationPrepare } from './gazeCalibration'
5
- import text from '../text.json'
5
+ import { phrases } from '../i18n'
6
6
 
7
7
  RemoteCalibrator.prototype.trackGaze = function (
8
8
  options = {},
9
- callback = null
9
+ callbackOnCalibrationEnd = null,
10
+ callbackTrack = null
10
11
  ) {
11
12
  /**
12
13
  * options -
@@ -37,13 +38,14 @@ RemoteCalibrator.prototype.trackGaze = function (
37
38
  framerate: 30, // ! New 0.0.5
38
39
  showGazer: true,
39
40
  showVideo: true,
40
- pipWidthPx: 208,
41
+ pipWidthPx:
42
+ this._CONST.N.VIDEO_W[this.isMobile.value ? 'MOBILE' : 'DESKTOP'],
41
43
  showFaceOverlay: false,
42
44
  calibrationCount: 5,
43
45
  thresholdDeg: 10, // minAccuracy
44
46
  decimalPlace: 0, // As the system itself has a high prediction error, it's not necessary to be too precise here
45
- headline: text.calibrateGaze.headline,
46
- description: text.calibrateGaze.description,
47
+ headline: '👀 ' + phrases.RC_gazeTrackingTitle[this.L],
48
+ description: phrases.RC_gazeTrackingIntro[this.L],
47
49
  },
48
50
  options
49
51
  )
@@ -60,8 +62,8 @@ RemoteCalibrator.prototype.trackGaze = function (
60
62
  this.showVideo(options.showVideo)
61
63
  this.showFaceOverlay(options.showFaceOverlay)
62
64
 
63
- this.gazeTracker.attachNewCallback(callback)
64
- this.gazeTracker.defaultGazeCallback = callback
65
+ this.gazeTracker.attachNewCallback(callbackTrack)
66
+ this.gazeTracker.defaultGazeCallback = callbackTrack
65
67
  return
66
68
  }
67
69
 
@@ -101,6 +103,12 @@ RemoteCalibrator.prototype.trackGaze = function (
101
103
  // Calibration
102
104
 
103
105
  const onCalibrationEnded = () => {
106
+ if (
107
+ callbackOnCalibrationEnd &&
108
+ typeof callbackOnCalibrationEnd === 'function'
109
+ )
110
+ callbackOnCalibrationEnd()
111
+
104
112
  // ! greedyLearner
105
113
  if (!this.gazeTracker.webgazer.params.greedyLearner) {
106
114
  this.gazeTracker.stopLearning()
@@ -109,8 +117,8 @@ RemoteCalibrator.prototype.trackGaze = function (
109
117
  // TODO Test accuracy
110
118
  const testAccuracy = false
111
119
  if (options.thresholdDeg === 'none' || !testAccuracy) {
112
- this.gazeTracker.attachNewCallback(callback)
113
- this.gazeTracker.defaultGazeCallback = callback
120
+ this.gazeTracker.attachNewCallback(callbackTrack)
121
+ this.gazeTracker.defaultGazeCallback = callbackTrack
114
122
  return
115
123
  } else {
116
124
  if (
@@ -121,8 +129,8 @@ RemoteCalibrator.prototype.trackGaze = function (
121
129
  () => {
122
130
  // Success
123
131
  // Start running
124
- this.gazeTracker.attachNewCallback(callback)
125
- this.gazeTracker.defaultGazeCallback = callback
132
+ this.gazeTracker.attachNewCallback(callbackTrack)
133
+ this.gazeTracker.defaultGazeCallback = callbackTrack
126
134
  },
127
135
  () => {
128
136
  // Fail to meet the min accuracy
@@ -133,17 +141,11 @@ RemoteCalibrator.prototype.trackGaze = function (
133
141
  console.error(
134
142
  'Failed to finish gaze accuracy measurement due to error.'
135
143
  )
136
- this.gazeTracker.attachNewCallback(callback)
137
- this.gazeTracker.defaultGazeCallback = callback
144
+ this.gazeTracker.attachNewCallback(callbackTrack)
145
+ this.gazeTracker.defaultGazeCallback = callbackTrack
138
146
  }
139
147
  }
140
148
  }
141
- // Swal.fire({
142
- // ...swalInfoOptions,
143
- // html: options.description,
144
- // }).then(() => {
145
-
146
- // })
147
149
  }
148
150
 
149
151
  RemoteCalibrator.prototype.getGazeNow = async function (callback = null) {
@@ -3,8 +3,7 @@ import Swal from 'sweetalert2/dist/sweetalert2.js'
3
3
  import RemoteCalibrator from '../core'
4
4
 
5
5
  import { _cross } from '../components/onCanvas'
6
- import { blurAll, sleep, toFixedNumber } from '../helpers'
7
- import text from '../text.json'
6
+ import { blurAll, sleep, toFixedNumber } from '../components/utils'
8
7
  import { swalInfoOptions } from '../components/swalOptions'
9
8
 
10
9
  let inGetAccuracy = false
@@ -58,9 +57,9 @@ RemoteCalibrator.prototype.getGazeAccuracy = function (
58
57
  _resizeCanvas()
59
58
 
60
59
  Swal.fire({
61
- ...swalInfoOptions,
60
+ ...swalInfoOptions(this),
62
61
  // title: text.getGazeAccuracy.headline,
63
- html: text.getGazeAccuracy.description,
62
+ html: `We will measure your gaze accuracy. Please do not move the mouse and look at the fixation at the middle of the screen for the next 5 seconds.`,
64
63
  }).then(() => {
65
64
  // ! After confirming alert
66
65
  inGetAccuracy = true
@@ -1,9 +1,9 @@
1
1
  import RemoteCalibrator from '../core'
2
2
 
3
- import { constructInstructions, shuffle, blurAll } from '../helpers'
4
- import { gazeCalibrationDotDefault, debug } from '../constants'
3
+ import { constructInstructions, shuffle, blurAll } from '../components/utils'
4
+ import { debug } from '../debug'
5
5
  import { bindKeys, unbindKeys } from '../components/keyBinder'
6
- import text from '../text.json'
6
+ import { phrases } from '../i18n'
7
7
 
8
8
  // [Wait!], etc.
9
9
  // const instPOutsideWarning = 'Keep your face centered in the video feed.'
@@ -24,7 +24,7 @@ export function gazeCalibrationPrepare(RC, options) {
24
24
  )
25
25
  RC._constructFloatInstructionElement(
26
26
  'gaze-system-instruction',
27
- 'Starting up... Please wait.'
27
+ phrases.RC_starting[RC.L]
28
28
  )
29
29
  }
30
30
 
@@ -41,8 +41,8 @@ RemoteCalibrator.prototype.calibrateGaze = function (options = {}, callback) {
41
41
  {
42
42
  greedyLearner: false,
43
43
  calibrationCount: 5,
44
- headline: text.calibrateGaze.headline,
45
- description: text.calibrateGaze.description,
44
+ headline: '👀 ' + phrases.RC_gazeTrackingTitle[this.L],
45
+ description: phrases.RC_gazeTrackingIntro[this.L],
46
46
  },
47
47
  options
48
48
  )
@@ -97,7 +97,7 @@ class GazeCalibrationDot {
97
97
  this.clicks = 0
98
98
 
99
99
  this.position = this.order.shift()
100
- this.r = gazeCalibrationDotDefault.r
100
+ this.r = this.RC._CONST.N.GAZE_CALIBRATION.R
101
101
 
102
102
  // HTML div
103
103
  this.div = document.createElement('div')
@@ -116,12 +116,14 @@ class GazeCalibrationDot {
116
116
  height: this.r + 'px',
117
117
  borderRadius: this.r / 2 + 'px',
118
118
  })
119
+
120
+ const _b = this.RC._CONST.N.GAZE_CALIBRATION.BORDER
119
121
  Object.assign(this.clickDiv.style, {
120
- width: this.r - gazeCalibrationDotDefault.border + 'px',
121
- height: this.r - gazeCalibrationDotDefault.border + 'px',
122
- borderRadius: (this.r - gazeCalibrationDotDefault.border) / 2 + 'px',
123
- top: `${gazeCalibrationDotDefault.border / 2}px`,
124
- left: `${gazeCalibrationDotDefault.border / 2}px`,
122
+ width: this.r - _b + 'px',
123
+ height: this.r - _b + 'px',
124
+ borderRadius: (this.r - _b) / 2 + 'px',
125
+ top: `${_b / 2}px`,
126
+ left: `${_b / 2}px`,
125
127
  })
126
128
 
127
129
  this.parent = parent
@@ -137,33 +139,39 @@ class GazeCalibrationDot {
137
139
  Object.assign(
138
140
  this.div.style,
139
141
  [
140
- { left: gazeCalibrationDotDefault.margin + 'px', right: 'unset' }, // 0
141
142
  {
142
- left: `calc(50% - ${gazeCalibrationDotDefault.r / 2}px)`,
143
+ left: this.RC._CONST.N.GAZE_CALIBRATION.MARGIN + 'px',
144
+ right: 'unset',
145
+ }, // 0
146
+ {
147
+ left: `calc(50% - ${this.RC._CONST.N.GAZE_CALIBRATION.R / 2}px)`,
143
148
  right: 'unset',
144
149
  }, // 1
145
- // { right: gazeCalibrationDotDefault.margin + 'px', left: 'unset' }, // 2
150
+ // { right: this.RC._CONST.N.GAZE_CALIBRATION.MARGIN + 'px', left: 'unset' }, // 2
146
151
  {
147
152
  left:
148
153
  window.innerWidth -
149
- gazeCalibrationDotDefault.r -
150
- gazeCalibrationDotDefault.margin +
154
+ this.RC._CONST.N.GAZE_CALIBRATION.R -
155
+ this.RC._CONST.N.GAZE_CALIBRATION.MARGIN +
151
156
  'px',
152
157
  right: 'unset',
153
158
  }, // 2
154
159
  ][this.position[0]],
155
160
  [
156
- { top: gazeCalibrationDotDefault.margin + 'px', bottom: 'unset' }, // 0
157
161
  {
158
- top: `calc(50% - ${gazeCalibrationDotDefault.r / 2}px)`,
162
+ top: this.RC._CONST.N.GAZE_CALIBRATION.MARGIN + 'px',
163
+ bottom: 'unset',
164
+ }, // 0
165
+ {
166
+ top: `calc(50% - ${this.RC._CONST.N.GAZE_CALIBRATION.R / 2}px)`,
159
167
  bottom: 'unset',
160
168
  }, // 1
161
- // { bottom: gazeCalibrationDotDefault.margin + 'px', top: 'unset' }, // 2
169
+ // { bottom: this.RC._CONST.N.GAZE_CALIBRATION.MARGIN + 'px', top: 'unset' }, // 2
162
170
  {
163
171
  top:
164
172
  window.innerHeight -
165
- gazeCalibrationDotDefault.r -
166
- gazeCalibrationDotDefault.margin +
173
+ this.RC._CONST.N.GAZE_CALIBRATION.R -
174
+ this.RC._CONST.N.GAZE_CALIBRATION.MARGIN +
167
175
  'px',
168
176
  bottom: 'unset',
169
177
  }, // 2
@@ -1,7 +1,7 @@
1
1
  import webgazer from '../WebGazer4RC/src/index.mjs'
2
2
 
3
- import { toFixedNumber } from '../helpers'
4
- import { checkWebgazerReady } from '../video'
3
+ import { toFixedNumber } from '../components/utils'
4
+ import { checkWebgazerReady } from '../components/video'
5
5
 
6
6
  /**
7
7
  * The gaze tracker object to wrap all gaze-related functions
@@ -38,6 +38,7 @@ export default class GazeTracker {
38
38
  }
39
39
 
40
40
  checkWebgazerReady(
41
+ this.calibrator,
41
42
  pipWidthPx,
42
43
  this.calibrator.params.videoOpacity,
43
44
  this.webgazer,
@@ -55,6 +56,7 @@ export default class GazeTracker {
55
56
  }
56
57
 
57
58
  checkWebgazerReady(
59
+ this.calibrator,
58
60
  pipWidthPx,
59
61
  this.calibrator.params.videoOpacity,
60
62
  this.webgazer,