remote-calibrator 0.5.0-beta.2 → 0.5.0-beta.3

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remote-calibrator",
3
- "version": "0.5.0-beta.2",
3
+ "version": "0.5.0-beta.3",
4
4
  "description": "Useful calibration tools for remote psychophysics experiments.",
5
5
  "main": "lib/RemoteCalibrator.min.js",
6
6
  "directories": {
@@ -33,25 +33,25 @@
33
33
  "autoprefixer": "^10.3.7",
34
34
  "babel-loader": "^8.2.3",
35
35
  "clean-webpack-plugin": "^4.0.0",
36
- "css-loader": "^6.4.0",
36
+ "css-loader": "^6.5.0",
37
37
  "css-minimizer-webpack-plugin": "^3.1.1",
38
38
  "cssnano": "^5.0.8",
39
- "eslint": "^7.32.0",
40
- "eslint-webpack-plugin": "^3.0.1",
39
+ "eslint": "^8.1.0",
40
+ "eslint-webpack-plugin": "^3.1.0",
41
41
  "express": "^4.17.1",
42
42
  "googleapis": "^89.0.0",
43
43
  "husky": "^7.0.4",
44
- "lint-staged": "^11.2.4",
44
+ "lint-staged": "^11.2.6",
45
45
  "nodemon": "^2.0.14",
46
46
  "postcss-loader": "^6.2.0",
47
47
  "prettier": "^2.4.1",
48
- "sass": "^1.43.3",
48
+ "sass": "^1.43.4",
49
49
  "sass-loader": "^12.2.0",
50
50
  "style-loader": "^3.3.1",
51
51
  "svg-inline-loader": "^0.8.2",
52
52
  "terser-webpack-plugin": "^5.2.4",
53
53
  "url-loader": "^4.1.1",
54
- "webpack": "^5.59.1",
54
+ "webpack": "^5.60.0",
55
55
  "webpack-cli": "^4.9.1",
56
56
  "webpack-modules": "^1.0.0",
57
57
  "xlsx": "^0.17.3"
package/src/const.js CHANGED
@@ -12,6 +12,8 @@ RemoteCalibrator.prototype._CONST = Object.freeze({
12
12
  MARGIN: 10,
13
13
  BORDER: 8,
14
14
  },
15
+ PPI_DONT_USE: 127.7,
16
+ PD_DONT_USE: 6.4,
15
17
  },
16
18
  S: {
17
19
  AUTO: 'AUTO',
@@ -31,4 +33,5 @@ RemoteCalibrator.prototype._CONST = Object.freeze({
31
33
  B: 'BlindSpot',
32
34
  F: 'FaceMesh',
33
35
  },
36
+ IN_TO_CM: 2.54,
34
37
  })
@@ -29,6 +29,7 @@
29
29
  user-select: none;
30
30
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
31
31
  Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
32
+ scrollbar-width: none;
32
33
  }
33
34
 
34
35
  .rc-panel-title {
@@ -211,4 +212,9 @@
211
212
  cursor: pointer;
212
213
  }
213
214
  }
215
+
216
+ ::-webkit-scrollbar {
217
+ width: 0;
218
+ display: none;
219
+ }
214
220
  }
@@ -24,7 +24,7 @@ const blindSpotHTML = `<canvas id="blind-spot-canvas"></canvas>`
24
24
  /* -------------------------------------------------------------------------- */
25
25
 
26
26
  export function blindSpotTest(RC, options, toTrackDistance = false, callback) {
27
- let ppi = 108 // Dangerous! Arbitrary value
27
+ let ppi = RC._CONST.N.PPI_DONT_USE // Dangerous! Arbitrary value
28
28
  if (RC.screenPpi) ppi = RC.screenPpi.value
29
29
  else
30
30
  console.error(
@@ -155,17 +155,14 @@ const startTrackingPupils = async (RC, beforeCallbackTrack, callbackTrack) => {
155
155
  }
156
156
 
157
157
  const eyeDist = (a, b) => {
158
- return Math.sqrt(
159
- Math.pow(a[0] - b[0], 2) +
160
- Math.pow(a[1] - b[1], 2) +
161
- Math.pow(a[2] - b[2], 2)
162
- )
158
+ return Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2])
163
159
  }
164
160
 
165
161
  const cyclopean = (video, a, b) => {
166
- let [aX, aY] = [video.videoWidth - a[0], a[1]]
167
- let [bX, bY] = [video.videoWidth - b[0], b[1]]
168
- return [(aX + bX) / 2, (aY + bY) / 2]
162
+ return [
163
+ (-a[0] - b[0] + video.videoWidth) / 2,
164
+ (-a[1] - b[1] + video.videoHeight) / 2,
165
+ ]
169
166
  }
170
167
 
171
168
  /* -------------------------------------------------------------------------- */
@@ -207,7 +204,7 @@ const _tracking = async (RC, trackingOptions, callbackTrack) => {
207
204
  model = await RC.gazeTracker.webgazer.getTracker().model
208
205
 
209
206
  // Near point
210
- let ppi = RC.screenPpi ? RC.screenPpi.value : 108
207
+ let ppi = RC.screenPpi ? RC.screenPpi.value : RC._CONST.N.PPI_DONT_USE
211
208
  if (!RC.screenPpi && trackingOptions.nearPoint)
212
209
  console.error(
213
210
  'Screen size measurement is required to get accurate near point tracking.'
@@ -352,25 +349,19 @@ const _getNearPoint = (
352
349
  ppi,
353
350
  latency
354
351
  ) => {
355
- let m = cyclopean(video, mesh[133], mesh[362])
356
- let offsetToVideoMid = [
357
- m[0] - video.videoWidth / 2,
358
- video.videoHeight / 2 - m[1],
359
- ]
360
-
361
- const videoFactor = video.videoHeight / video.clientHeight
362
- offsetToVideoMid.forEach((e, i) => {
363
- // Average interpupillary distance - 6.4cm
364
- offsetToVideoMid[i] =
365
- ((RC.PDCm ? RC.PDCm.value : 6.4) * e) /
366
- (averageDist * (videoFactor / 2)) /* Should this be videoFactor? */
352
+ let offsetToVideoCenter = cyclopean(video, mesh[133], mesh[362])
353
+ offsetToVideoCenter.forEach((offset, i) => {
354
+ // Average inter-pupillary distance - 6.4cm
355
+ offsetToVideoCenter[i] =
356
+ ((RC.PDCm ? RC.PDCm.value : RC._CONST.N.PD_DONT_USE) * offset) /
357
+ averageDist
367
358
  })
368
359
 
369
360
  let nPData = (RC.newNearPointData = {
370
361
  value: {
371
- x: toFixedNumber(offsetToVideoMid[0], trackingOptions.decimalPlace),
362
+ x: toFixedNumber(offsetToVideoCenter[0], trackingOptions.decimalPlace),
372
363
  y: toFixedNumber(
373
- offsetToVideoMid[1] + 0.5, // Commonly the webcam is 0.5cm above the screen
364
+ offsetToVideoCenter[1] + ((screen.height / 2) * 2.54) / ppi, // Commonly the webcam is 0.5cm above the screen
374
365
  trackingOptions.decimalPlace
375
366
  ),
376
367
  latencyMs: latency,
@@ -379,17 +370,18 @@ const _getNearPoint = (
379
370
  })
380
371
 
381
372
  // SHOW
373
+ const dotR = 5
382
374
  if (trackingOptions.showNearPoint) {
383
375
  let offsetX = (nPData.value.x * ppi) / 2.54
384
376
  let offsetY = (nPData.value.y * ppi) / 2.54
385
377
  Object.assign(nearPointDot.style, {
386
- left: `${screen.width / 2 - window.screenLeft - 5 + offsetX}px`,
378
+ left: `${screen.width / 2 - window.screenLeft + offsetX - dotR}px`,
387
379
  top: `${
388
380
  screen.height / 2 -
389
381
  window.screenTop -
390
- 5 -
391
- (RC.isFullscreen.value ? 0 : 50) -
392
- offsetY
382
+ (window.outerHeight - window.innerHeight) -
383
+ offsetY -
384
+ dotR
393
385
  }px`,
394
386
  })
395
387
  }
@@ -498,7 +490,7 @@ RemoteCalibrator.prototype.getDistanceNow = async function (callback = null) {
498
490
  mesh,
499
491
  dist,
500
492
  timestamp,
501
- this.screenPpi ? this.screenPpi.value : 108,
493
+ this.screenPpi ? this.screenPpi.value : this._CONST.N.PPI_DONT_USE,
502
494
  latency
503
495
  )
504
496
  }
@@ -53,7 +53,9 @@ RemoteCalibrator.prototype._measurePD = function (options = {}, callback) {
53
53
  this._replaceBackground(
54
54
  constructInstructions(options.headline, options.shortDescription, true)
55
55
  )
56
- const screenPpi = this.screenPpi ? this.screenPpi.value : 108
56
+ const screenPpi = this.screenPpi
57
+ ? this.screenPpi.value
58
+ : this._CONST.N.PPI_DONT_USE
57
59
 
58
60
  let [videoWidth, videoHeight] = setupVideo(this)
59
61
  let [ruler, rulerListener] = setupRuler(