@gcorevideo/player 2.18.3 → 2.19.0

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 (349) hide show
  1. package/assets/audio-selector/style.scss +156 -0
  2. package/assets/audio-selector/track-selector.ejs +12 -0
  3. package/assets/big-mute-button/big-mute-button.ejs +3 -0
  4. package/assets/big-mute-button/big-mute-button.scss +57 -0
  5. package/assets/bottom-gear/bottomgear.ejs +12 -0
  6. package/assets/bottom-gear/gear-sub-menu.scss +95 -0
  7. package/assets/bottom-gear/gear.scss +79 -0
  8. package/assets/clappr-nerd-stats/button.ejs +4 -0
  9. package/assets/clappr-nerd-stats/clappr-nerd-stats.ejs +212 -0
  10. package/assets/clappr-nerd-stats/clappr-nerd-stats.scss +488 -0
  11. package/assets/clappr-nerd-stats/options-list.ejs +9 -0
  12. package/assets/clappr-nerd-stats/settings.ejs +12 -0
  13. package/assets/clappr-nerd-stats/speedtest/speedtest.worker.js +775 -0
  14. package/assets/clips/clips.scss +3 -0
  15. package/assets/context-menu/context_menu.ejs +8 -0
  16. package/assets/context-menu/context_menu.scss +31 -0
  17. package/assets/dvr-controls/dvr_controls.scss +136 -0
  18. package/assets/dvr-controls/index.ejs +2 -0
  19. package/assets/error-screen/error_screen.ejs +13 -0
  20. package/assets/error-screen/error_screen.scss +40 -0
  21. package/assets/icons/new/arrow-left.svg +5 -0
  22. package/assets/icons/new/arrow-right.svg +5 -0
  23. package/assets/icons/new/check.svg +5 -0
  24. package/assets/icons/new/close.svg +12 -0
  25. package/assets/icons/new/full.svg +8 -0
  26. package/assets/icons/new/fullscreen-off.svg +14 -0
  27. package/assets/icons/new/fullscreen-on.svg +14 -0
  28. package/assets/icons/new/gear-hd.svg +16 -0
  29. package/assets/icons/new/gear.svg +12 -0
  30. package/assets/icons/new/hd.svg +8 -0
  31. package/assets/icons/new/pause.svg +5 -0
  32. package/assets/icons/new/pip.svg +5 -0
  33. package/assets/icons/new/play.svg +10 -0
  34. package/assets/icons/new/replayleft.svg +5 -0
  35. package/assets/icons/new/replayright.svg +5 -0
  36. package/assets/icons/new/speed.svg +5 -0
  37. package/assets/icons/new/stats.svg +3 -0
  38. package/assets/icons/new/stop.svg +3 -0
  39. package/assets/icons/new/subtitles-off.svg +5 -0
  40. package/assets/icons/new/subtitles-on.svg +6 -0
  41. package/assets/icons/new/volume-max.svg +5 -0
  42. package/assets/icons/new/volume-min.svg +5 -0
  43. package/assets/icons/new/volume-off.svg +5 -0
  44. package/assets/icons/old/cardboard.svg +4 -0
  45. package/assets/icons/old/close-share.svg +13 -0
  46. package/assets/icons/old/close.svg +13 -0
  47. package/assets/icons/old/fb.svg +13 -0
  48. package/assets/icons/old/fullscreen.svg +12 -0
  49. package/assets/icons/old/language.svg +1 -0
  50. package/assets/icons/old/pause.svg +12 -0
  51. package/assets/icons/old/play.svg +12 -0
  52. package/assets/icons/old/quality-arrow.svg +13 -0
  53. package/assets/icons/old/reload.svg +4 -0
  54. package/assets/icons/old/share.svg +13 -0
  55. package/assets/icons/old/sound-off.svg +15 -0
  56. package/assets/icons/old/sound-on.svg +15 -0
  57. package/assets/icons/old/streams.svg +3 -0
  58. package/assets/icons/old/twitter.svg +13 -0
  59. package/assets/icons/old/wn.svg +15 -0
  60. package/assets/icons/standard/01-play.svg +3 -0
  61. package/assets/icons/standard/02-pause.svg +3 -0
  62. package/assets/icons/standard/03-stop.svg +3 -0
  63. package/assets/icons/standard/04-volume.svg +3 -0
  64. package/assets/icons/standard/05-mute.svg +3 -0
  65. package/assets/icons/standard/06-expand.svg +3 -0
  66. package/assets/icons/standard/07-shrink.svg +3 -0
  67. package/assets/icons/standard/08-hd.svg +3 -0
  68. package/assets/icons/standard/09-cc.svg +8 -0
  69. package/assets/icons/standard/10-reload.svg +4 -0
  70. package/assets/level-selector/button.ejs +8 -0
  71. package/assets/level-selector/list.ejs +22 -0
  72. package/assets/level-selector/style.scss +4 -0
  73. package/assets/logo/styles/logo.scss +10 -0
  74. package/assets/logo/templates/logo.ejs +3 -0
  75. package/assets/media-control/closed-hand.cur +0 -0
  76. package/assets/media-control/container.scss +57 -0
  77. package/assets/media-control/media-control.ejs +133 -0
  78. package/assets/media-control/media-control.scss +390 -0
  79. package/assets/media-control/plugins.scss +94 -0
  80. package/assets/media-control/width270.scss +50 -0
  81. package/assets/media-control/width370.scss +263 -0
  82. package/assets/multi-camera/multicamera.ejs +29 -0
  83. package/assets/multi-camera/style.scss +176 -0
  84. package/assets/picture-in-picture/button.ejs +3 -0
  85. package/assets/picture-in-picture/button.scss +11 -0
  86. package/assets/playback-rate/button.ejs +6 -0
  87. package/assets/playback-rate/list.ejs +14 -0
  88. package/assets/playback-rate/playback-rate-selector.ejs +9 -0
  89. package/assets/poster/poster.ejs +1 -0
  90. package/assets/poster/poster.scss +32 -0
  91. package/assets/seek-time/seek-time.html +2 -0
  92. package/assets/seek-time/seek-time.scss +38 -0
  93. package/assets/share/share.ejs +37 -0
  94. package/assets/share/style.scss +104 -0
  95. package/assets/skip-time/skip-time.ejs +8 -0
  96. package/assets/skip-time/style.scss +24 -0
  97. package/assets/spinner-three-bounce/spinner.ejs +3 -0
  98. package/assets/spinner-three-bounce/spinner.scss +44 -0
  99. package/assets/style/main.scss +50 -0
  100. package/assets/style/theme.scss +42 -0
  101. package/assets/style/variables.scss +7 -0
  102. package/assets/subtitles/combobox copy.ejs +16 -0
  103. package/assets/subtitles/combobox.ejs +16 -0
  104. package/assets/subtitles/string.ejs +3 -0
  105. package/assets/subtitles/style.scss +99 -0
  106. package/assets/thumbnails/scrub-thumbnails.ejs +10 -0
  107. package/assets/thumbnails/style.scss +75 -0
  108. package/assets/vast-ads/style.scss +112 -0
  109. package/assets/video360/button.ejs +1 -0
  110. package/assets/video360/style.scss +8 -0
  111. package/build/vite-raw-plugin.js +18 -0
  112. package/dist/index.js +1 -1
  113. package/dist/plugins/index.css +2164 -0
  114. package/dist/plugins/index.js/index.plugins.js +40837 -0
  115. package/dist/plugins/index.plugins.js +40837 -0
  116. package/lib/index.core.d.ts +15 -0
  117. package/lib/index.core.d.ts.map +1 -0
  118. package/lib/index.core.js +14 -0
  119. package/lib/index.d.ts +2 -14
  120. package/lib/index.d.ts.map +1 -1
  121. package/lib/index.js +2 -14
  122. package/lib/index.plugins.d.ts +38 -0
  123. package/lib/index.plugins.d.ts.map +1 -0
  124. package/lib/index.plugins.js +40 -0
  125. package/lib/plugins/audio-selector/AudioSelector.d.ts +3 -3
  126. package/lib/plugins/audio-selector/AudioSelector.d.ts.map +1 -1
  127. package/lib/plugins/audio-selector/AudioSelector.js +6 -12
  128. package/lib/plugins/big-mute-button/BigMuteButton.d.ts +2 -2
  129. package/lib/plugins/big-mute-button/BigMuteButton.d.ts.map +1 -1
  130. package/lib/plugins/big-mute-button/BigMuteButton.js +7 -12
  131. package/lib/plugins/bottom-gear/BottomGear.d.ts +4 -3
  132. package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
  133. package/lib/plugins/bottom-gear/BottomGear.js +11 -16
  134. package/lib/plugins/build.d.ts +2 -0
  135. package/lib/plugins/build.d.ts.map +1 -0
  136. package/lib/plugins/build.js +1 -0
  137. package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.d.ts +44 -0
  138. package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.d.ts.map +1 -0
  139. package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.js +294 -0
  140. package/lib/plugins/clappr-nerd-stats/formatter.d.ts +8 -0
  141. package/lib/plugins/clappr-nerd-stats/formatter.d.ts.map +1 -0
  142. package/lib/plugins/clappr-nerd-stats/formatter.js +91 -0
  143. package/lib/plugins/clappr-nerd-stats/speedtest/Speedtest.d.ts +54 -0
  144. package/lib/plugins/clappr-nerd-stats/speedtest/Speedtest.d.ts.map +1 -0
  145. package/lib/plugins/clappr-nerd-stats/speedtest/Speedtest.js +335 -0
  146. package/lib/plugins/clappr-nerd-stats/speedtest/index.d.ts +9 -0
  147. package/lib/plugins/clappr-nerd-stats/speedtest/index.d.ts.map +1 -0
  148. package/lib/plugins/clappr-nerd-stats/speedtest/index.js +154 -0
  149. package/lib/plugins/clappr-nerd-stats/speedtest/types.d.ts +6 -0
  150. package/lib/plugins/clappr-nerd-stats/speedtest/types.d.ts.map +1 -0
  151. package/lib/plugins/clappr-nerd-stats/speedtest/types.js +1 -0
  152. package/lib/plugins/clappr-nerd-stats/types.d.ts +4 -0
  153. package/lib/plugins/clappr-nerd-stats/types.d.ts.map +1 -0
  154. package/lib/plugins/clappr-nerd-stats/types.js +1 -0
  155. package/lib/plugins/clappr-stats/ClapprStats.d.ts +56 -0
  156. package/lib/plugins/clappr-stats/ClapprStats.d.ts.map +1 -0
  157. package/lib/plugins/clappr-stats/ClapprStats.js +332 -0
  158. package/lib/plugins/clappr-stats/types.d.ts +50 -0
  159. package/lib/plugins/clappr-stats/types.d.ts.map +1 -0
  160. package/lib/plugins/clappr-stats/types.js +5 -0
  161. package/lib/plugins/clappr-stats/utils.d.ts +3 -0
  162. package/lib/plugins/clappr-stats/utils.d.ts.map +1 -0
  163. package/lib/plugins/clappr-stats/utils.js +40 -0
  164. package/lib/plugins/click-to-pause/ClickToPause.d.ts +2 -2
  165. package/lib/plugins/click-to-pause/ClickToPause.d.ts.map +1 -1
  166. package/lib/plugins/click-to-pause/ClickToPause.js +4 -6
  167. package/lib/plugins/clips/Clips.d.ts +23 -0
  168. package/lib/plugins/clips/Clips.d.ts.map +1 -0
  169. package/lib/plugins/clips/Clips.js +109 -0
  170. package/lib/plugins/context-menu/ContextMenu.d.ts +36 -0
  171. package/lib/plugins/context-menu/ContextMenu.d.ts.map +1 -0
  172. package/lib/plugins/context-menu/ContextMenu.js +102 -0
  173. package/lib/plugins/disable-controls/DisableControls.d.ts +1 -1
  174. package/lib/plugins/disable-controls/DisableControls.d.ts.map +1 -1
  175. package/lib/plugins/disable-controls/DisableControls.js +3 -5
  176. package/lib/plugins/dvr-controls/DVRControls.d.ts +4 -4
  177. package/lib/plugins/dvr-controls/DVRControls.d.ts.map +1 -1
  178. package/lib/plugins/dvr-controls/DVRControls.js +5 -4
  179. package/lib/plugins/error-screen/ErrorScreen.d.ts +44 -0
  180. package/lib/plugins/error-screen/ErrorScreen.d.ts.map +1 -0
  181. package/lib/plugins/error-screen/ErrorScreen.js +179 -0
  182. package/lib/plugins/favicon/Favicon.d.ts +24 -0
  183. package/lib/plugins/favicon/Favicon.d.ts.map +1 -0
  184. package/lib/plugins/favicon/Favicon.js +106 -0
  185. package/lib/plugins/google-analytics/GoogleAnalytics.d.ts +30 -0
  186. package/lib/plugins/google-analytics/GoogleAnalytics.d.ts.map +1 -0
  187. package/lib/plugins/google-analytics/GoogleAnalytics.js +114 -0
  188. package/lib/plugins/index.d.ts +38 -0
  189. package/lib/plugins/index.d.ts.map +1 -0
  190. package/lib/plugins/index.js +40 -0
  191. package/lib/plugins/kibo/index.d.ts +23 -0
  192. package/lib/plugins/kibo/index.d.ts.map +1 -0
  193. package/lib/plugins/kibo/index.js +199 -0
  194. package/lib/plugins/level-selector/LevelSelector.d.ts +48 -17
  195. package/lib/plugins/level-selector/LevelSelector.d.ts.map +1 -1
  196. package/lib/plugins/level-selector/LevelSelector.js +169 -155
  197. package/lib/plugins/logo/Logo.d.ts +29 -0
  198. package/lib/plugins/logo/Logo.d.ts.map +1 -0
  199. package/lib/plugins/logo/Logo.js +181 -0
  200. package/lib/plugins/logo/utils/index.d.ts +22 -0
  201. package/lib/plugins/logo/utils/index.d.ts.map +1 -0
  202. package/lib/plugins/logo/utils/index.js +32 -0
  203. package/lib/plugins/media-control/MediaControl.d.ts +20 -25
  204. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  205. package/lib/plugins/media-control/MediaControl.js +136 -106
  206. package/lib/plugins/multi-camera/MultiCamera.d.ts +59 -0
  207. package/lib/plugins/multi-camera/MultiCamera.d.ts.map +1 -0
  208. package/lib/plugins/multi-camera/MultiCamera.js +353 -0
  209. package/lib/plugins/picture-in-picture/PictureInPicture.d.ts +20 -0
  210. package/lib/plugins/picture-in-picture/PictureInPicture.d.ts.map +1 -0
  211. package/lib/plugins/picture-in-picture/PictureInPicture.js +68 -0
  212. package/lib/plugins/playback-rate/PlaybackRate.d.ts +42 -0
  213. package/lib/plugins/playback-rate/PlaybackRate.d.ts.map +1 -0
  214. package/lib/plugins/playback-rate/PlaybackRate.js +205 -0
  215. package/lib/plugins/poster/Poster.d.ts +18 -17
  216. package/lib/plugins/poster/Poster.d.ts.map +1 -1
  217. package/lib/plugins/poster/Poster.js +83 -37
  218. package/lib/plugins/seek-time/SeekTime.d.ts +38 -0
  219. package/lib/plugins/seek-time/SeekTime.d.ts.map +1 -0
  220. package/lib/plugins/seek-time/SeekTime.js +153 -0
  221. package/lib/plugins/share/Share.d.ts +38 -0
  222. package/lib/plugins/share/Share.d.ts.map +1 -0
  223. package/lib/plugins/share/Share.js +122 -0
  224. package/lib/plugins/skip-time/SkipTime.d.ts +28 -0
  225. package/lib/plugins/skip-time/SkipTime.d.ts.map +1 -0
  226. package/lib/plugins/skip-time/SkipTime.js +86 -0
  227. package/lib/plugins/source-controller/SourceController.d.ts +41 -0
  228. package/lib/plugins/source-controller/SourceController.d.ts.map +1 -0
  229. package/lib/plugins/source-controller/SourceController.js +199 -0
  230. package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.d.ts +26 -0
  231. package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.d.ts.map +1 -0
  232. package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.js +117 -0
  233. package/lib/plugins/statistics/Statistics.d.ts +52 -0
  234. package/lib/plugins/statistics/Statistics.d.ts.map +1 -0
  235. package/lib/plugins/statistics/Statistics.js +130 -0
  236. package/lib/plugins/subtitles/Subtitles.d.ts +61 -0
  237. package/lib/plugins/subtitles/Subtitles.d.ts.map +1 -0
  238. package/lib/plugins/subtitles/Subtitles.js +354 -0
  239. package/lib/plugins/thumbnails/Thumbnails.d.ts +47 -0
  240. package/lib/plugins/thumbnails/Thumbnails.d.ts.map +1 -0
  241. package/lib/plugins/thumbnails/Thumbnails.js +414 -0
  242. package/lib/plugins/types.d.ts +8 -0
  243. package/lib/plugins/types.d.ts.map +1 -0
  244. package/lib/plugins/types.js +1 -0
  245. package/lib/plugins/utils.d.ts +5 -0
  246. package/lib/plugins/utils.d.ts.map +1 -0
  247. package/lib/plugins/utils.js +68 -0
  248. package/lib/plugins/vast-ads/VastAds.d.ts +72 -0
  249. package/lib/plugins/vast-ads/VastAds.d.ts.map +1 -0
  250. package/lib/plugins/vast-ads/VastAds.js +686 -0
  251. package/lib/plugins/vast-ads/loaderxml.d.ts +32 -0
  252. package/lib/plugins/vast-ads/loaderxml.d.ts.map +1 -0
  253. package/lib/plugins/vast-ads/loaderxml.js +226 -0
  254. package/lib/plugins/vast-ads/roll.d.ts +60 -0
  255. package/lib/plugins/vast-ads/roll.d.ts.map +1 -0
  256. package/lib/plugins/vast-ads/roll.js +415 -0
  257. package/lib/plugins/vast-ads/rollmanager.d.ts +62 -0
  258. package/lib/plugins/vast-ads/rollmanager.d.ts.map +1 -0
  259. package/lib/plugins/vast-ads/rollmanager.js +347 -0
  260. package/lib/plugins/vast-ads/sctemanager.d.ts +18 -0
  261. package/lib/plugins/vast-ads/sctemanager.d.ts.map +1 -0
  262. package/lib/plugins/vast-ads/sctemanager.js +116 -0
  263. package/lib/plugins/vast-ads/types.d.ts +12 -0
  264. package/lib/plugins/vast-ads/types.d.ts.map +1 -0
  265. package/lib/plugins/vast-ads/types.js +1 -0
  266. package/lib/plugins/vast-ads/urlhandler.d.ts +4 -0
  267. package/lib/plugins/vast-ads/urlhandler.d.ts.map +1 -0
  268. package/lib/plugins/vast-ads/urlhandler.js +30 -0
  269. package/lib/plugins/vast-ads/xmlhttprequest.d.ts +6 -0
  270. package/lib/plugins/vast-ads/xmlhttprequest.d.ts.map +1 -0
  271. package/lib/plugins/vast-ads/xmlhttprequest.js +39 -0
  272. package/lib/plugins/vast-ads/xmlmerge.d.ts +12 -0
  273. package/lib/plugins/vast-ads/xmlmerge.d.ts.map +1 -0
  274. package/lib/plugins/vast-ads/xmlmerge.js +82 -0
  275. package/lib/plugins/volume-fade/VolumeFade.d.ts +21 -0
  276. package/lib/plugins/volume-fade/VolumeFade.d.ts.map +1 -0
  277. package/lib/plugins/volume-fade/VolumeFade.js +90 -0
  278. package/package.json +10 -2
  279. package/rollup.config.js +32 -2
  280. package/src/index.core.ts +15 -0
  281. package/src/index.plugins.ts +42 -0
  282. package/src/index.ts +2 -15
  283. package/src/plugins/audio-selector/AudioSelector.ts +370 -0
  284. package/src/plugins/big-mute-button/BigMuteButton.ts +187 -0
  285. package/src/plugins/bottom-gear/BottomGear.ts +122 -0
  286. package/src/plugins/build.ts +1 -0
  287. package/src/plugins/clappr-nerd-stats/ClapprNerdStats.ts +369 -0
  288. package/src/plugins/clappr-nerd-stats/formatter.ts +109 -0
  289. package/src/plugins/clappr-nerd-stats/speedtest/Speedtest.ts +414 -0
  290. package/src/plugins/clappr-nerd-stats/speedtest/index.ts +183 -0
  291. package/src/plugins/clappr-nerd-stats/speedtest/types.ts +5 -0
  292. package/src/plugins/clappr-nerd-stats/types.ts +3 -0
  293. package/src/plugins/clappr-stats/ClapprStats.ts +441 -0
  294. package/src/plugins/clappr-stats/types.ts +52 -0
  295. package/src/plugins/clappr-stats/utils.ts +42 -0
  296. package/src/plugins/click-to-pause/ClickToPause.ts +93 -0
  297. package/src/plugins/clips/Clips.ts +152 -0
  298. package/src/plugins/context-menu/ContextMenu.ts +134 -0
  299. package/src/plugins/disable-controls/DisableControls.ts +81 -0
  300. package/src/plugins/dvr-controls/DvrControls.ts +131 -0
  301. package/src/plugins/error-screen/ErrorScreen.ts +241 -0
  302. package/src/plugins/favicon/Favicon.ts +137 -0
  303. package/src/plugins/ga-events/GaEvents.js +395 -0
  304. package/src/plugins/ga-events/ga-tracking.js +46 -0
  305. package/src/plugins/google-analytics/GoogleAnalytics.ts +147 -0
  306. package/src/plugins/index.ts +42 -0
  307. package/src/plugins/kibo/index.ts +244 -0
  308. package/src/plugins/level-selector/LevelSelector.ts +400 -0
  309. package/src/plugins/level-selector/__tests__/LevelSelector.test.ts +72 -0
  310. package/src/plugins/level-selector/__tests__/__snapshots__/LevelSelector.test.ts.snap +11 -0
  311. package/src/plugins/logo/Logo.ts +233 -0
  312. package/src/plugins/logo/utils/index.ts +46 -0
  313. package/src/plugins/media-control/MediaControl.ts +1383 -0
  314. package/src/plugins/multi-camera/MultiCamera copy.xts +414 -0
  315. package/src/plugins/multi-camera/MultiCamera.ts +426 -0
  316. package/src/plugins/picture-in-picture/PictureInPicture.ts +87 -0
  317. package/src/plugins/playback-rate/PlaybackRate.ts +269 -0
  318. package/src/plugins/poster/Poster.ts +298 -0
  319. package/src/plugins/seek-time/SeekTime.ts +191 -0
  320. package/src/plugins/share/Share.ts +148 -0
  321. package/src/plugins/skip-time/SkipTime.ts +109 -0
  322. package/src/plugins/source-controller/SourceController.ts +239 -0
  323. package/src/plugins/source-controller/__tests__/SourceController.test.ts +230 -0
  324. package/src/plugins/spinner-three-bounce/SpinnerThreeBounce.ts +135 -0
  325. package/src/plugins/statistics/Statistics copy.xts +296 -0
  326. package/src/plugins/statistics/Statistics.ts +207 -0
  327. package/src/plugins/subtitles/Subtitles.ts +505 -0
  328. package/src/plugins/thumbnails/Thumbnails.ts +530 -0
  329. package/src/plugins/types.ts +7 -0
  330. package/src/plugins/typings/globals.d.ts +10 -0
  331. package/src/plugins/typings/parse-srt.d.ts +14 -0
  332. package/src/plugins/typings/workers.d.ts +3 -0
  333. package/src/plugins/utils.ts +77 -0
  334. package/src/plugins/vast-ads/VastAds.ts +915 -0
  335. package/src/plugins/vast-ads/loaderxml.ts +260 -0
  336. package/src/plugins/vast-ads/roll.ts +492 -0
  337. package/src/plugins/vast-ads/rollmanager.ts +403 -0
  338. package/src/plugins/vast-ads/sctemanager.ts +134 -0
  339. package/src/plugins/vast-ads/types.ts +14 -0
  340. package/src/plugins/vast-ads/urlhandler.ts +37 -0
  341. package/src/plugins/vast-ads/xmlhttprequest.ts +44 -0
  342. package/src/plugins/vast-ads/xmlmerge.ts +96 -0
  343. package/src/plugins/video360/VRControls.js +104 -0
  344. package/src/plugins/video360/VREffect.js +422 -0
  345. package/src/plugins/video360/Video360.js +979 -0
  346. package/src/plugins/video360/orbit-oriention-controls.js +1002 -0
  347. package/src/plugins/video360/utils.js +49 -0
  348. package/src/plugins/volume-fade/VolumeFade.ts +109 -0
  349. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,96 @@
1
+ import { reportError } from '@gcorevideo/utils';
2
+ import assert from "assert";
3
+
4
+ export default class MergeVast {
5
+ private firstXML: Document;
6
+ private secondXML: Document;
7
+
8
+ private firstVAST: HTMLCollectionOf<Element>;
9
+ private secondVAST: HTMLCollectionOf<Element>;
10
+
11
+ constructor(xml1: string, xml2: string) {
12
+ this.firstXML = this._stringToXML(xml1);
13
+ this.secondXML = this._stringToXML(xml2);
14
+ this.firstVAST = this.firstXML.getElementsByTagName('VAST');
15
+ this.secondVAST = this.secondXML.getElementsByTagName('VAST');
16
+ }
17
+
18
+ merge() {
19
+ const res = this._mergeXML(this.firstVAST, this.secondVAST);
20
+
21
+ try {
22
+ return res[0].outerHTML;
23
+ } catch (error) {
24
+ // LogManager.exception(error);
25
+ reportError(error);
26
+ }
27
+
28
+ return '';
29
+ }
30
+
31
+ _mergeXML(first: HTMLCollectionOf<Element>, second: HTMLCollectionOf<Element>, parent?: Element): HTMLCollectionOf<Element> {
32
+ // const sources = [].slice.call( arguments, 0 );
33
+ // const first = sources[0];
34
+ // const second = sources[1];
35
+ // const parent = sources[2];
36
+
37
+ for (let i = 0; i < first.length; i++) {
38
+ let secondItems = this._getPieceTree(first[i].nodeName,second);
39
+
40
+ if (
41
+ first[i].nodeName === 'Tracking' ||
42
+ first[i].nodeName === 'Impression' ||
43
+ first[i].nodeName === 'Error' ||
44
+ first[i].nodeName === 'Viewable' ||
45
+ first[i].nodeName === 'ClickTracking' ||
46
+ first[i].nodeName === 'ClickThrough'
47
+ ) {
48
+ secondItems = null;
49
+ }
50
+
51
+ if (!secondItems) {
52
+ try {
53
+ assert(parent, 'parent is null');
54
+ parent.appendChild(first[i].cloneNode(true));
55
+ } catch (error) {
56
+ // LogManager.exception(error);
57
+ reportError(error);
58
+ }
59
+ } else {
60
+ if (first[i].children.length > 0 && secondItems) {
61
+ this._mergeXML(first[i].children, secondItems.children, secondItems );
62
+ }
63
+ }
64
+ }
65
+
66
+ return second;
67
+ }
68
+
69
+ _getPieceTree(nodeName: string, xml: HTMLCollectionOf<Element>): Element | null {
70
+ if (xml) {
71
+ if (xml instanceof HTMLCollection) {
72
+ for (const item of xml) {
73
+ if (item.nodeName === nodeName) {
74
+ return item;
75
+ }
76
+ }
77
+ }
78
+ }
79
+
80
+ return null;
81
+ }
82
+
83
+ _stringToXML(val: string): Document {
84
+ let xmlDoc = null;
85
+
86
+ if (document.implementation && (document.implementation as any).createDocument) {
87
+ return (new DOMParser()).parseFromString(val, 'application/xml');
88
+ } else if ('ActiveXObject' in window) {
89
+ xmlDoc = new (window.ActiveXObject as any)('Microsoft.XMLDOM');
90
+ xmlDoc.loadXML(val);
91
+ return xmlDoc;
92
+ }
93
+
94
+ throw new Error('XML Parser not found');
95
+ }
96
+ }
@@ -0,0 +1,104 @@
1
+ import { Matrix4 } from 'three';
2
+ import LogManager from '../../utils/LogManager';
3
+ import { SentryLogLevel } from '../../constants';
4
+
5
+ export class VRControls {
6
+ constructor(object, onError) {
7
+ const scope = this;
8
+ let vrDisplay, vrDisplays;
9
+ const standingMatrix = new Matrix4();
10
+ let frameData = null;
11
+
12
+ if ('VRFrameData' in window) {
13
+ frameData = new VRFrameData();
14
+ }
15
+
16
+ function gotVRDisplays(displays) {
17
+ vrDisplays = displays;
18
+ if (displays.length > 0) {
19
+ vrDisplay = displays[0];
20
+ } else {
21
+ if (onError) {
22
+ onError('VR input not available.');
23
+ }
24
+ }
25
+ }
26
+
27
+ if (navigator.getVRDisplays) {
28
+ navigator.getVRDisplays().then(gotVRDisplays).catch(function () {
29
+ LogManager.message('THREE.VRControls: Unable to get VR Displays', SentryLogLevel.WARNING);
30
+ console.warn('THREE.VRControls: Unable to get VR Displays');
31
+ });
32
+ }
33
+
34
+ // the Rift SDK returns the position in meters
35
+ // this scale factor allows the user to define how meters
36
+ // are converted to scene units.
37
+
38
+ this.scale = 1;
39
+
40
+ // If true will use "standing space" coordinate system where y=0 is the
41
+ // floor and x=0, z=0 is the center of the room.
42
+ this.standing = false;
43
+
44
+ // Distance from the users eyes to the floor in meters. Used when
45
+ // standing=true but the VRDisplay doesn't provide stageParameters.
46
+ this.userHeight = 1.6;
47
+
48
+ this.getVRDisplay = function () {
49
+ return vrDisplay;
50
+ };
51
+
52
+ this.setVRDisplay = function (value) {
53
+ vrDisplay = value;
54
+ };
55
+
56
+ this.getVRDisplays = function () {
57
+ console.warn('THREE.VRControls: getVRDisplays() is being deprecated.');
58
+
59
+ return vrDisplays;
60
+ };
61
+
62
+ this.getStandingMatrix = function () {
63
+ return standingMatrix;
64
+ };
65
+
66
+ this.update = function () {
67
+ if (vrDisplay) {
68
+ let pose;
69
+
70
+ if (vrDisplay.getFrameData) {
71
+ vrDisplay.getFrameData(frameData);
72
+ pose = frameData.pose;
73
+ } else if (vrDisplay.getPose) {
74
+ pose = vrDisplay.getPose();
75
+ }
76
+
77
+ if (pose.orientation) {
78
+ object.quaternion.fromArray(pose.orientation);
79
+ }
80
+
81
+ if (pose.position) {
82
+ object.position.fromArray(pose.position);
83
+ } else {
84
+ object.position.set(0, 0, 0);
85
+ }
86
+
87
+ if (this.standing) {
88
+ if (vrDisplay.stageParameters) {
89
+ object.updateMatrix();
90
+ standingMatrix.fromArray(vrDisplay.stageParameters.sittingToStandingTransform);
91
+ object.applyMatrix(standingMatrix);
92
+ } else {
93
+ object.position.setY(object.position.y + this.userHeight);
94
+ }
95
+ }
96
+ object.position.multiplyScalar(scope.scale);
97
+ }
98
+ };
99
+
100
+ this.dispose = function () {
101
+ vrDisplay = null;
102
+ };
103
+ }
104
+ }
@@ -0,0 +1,422 @@
1
+ import { Matrix4, PerspectiveCamera, Quaternion, Vector3 } from 'three';
2
+ import LogManager from '../../utils/LogManager';
3
+ // import { SentryLogLevel } from '../../constants';
4
+
5
+ export class VREffect {
6
+ constructor(renderer, onError) {
7
+ let vrDisplay, vrDisplays;
8
+ const eyeTranslationL = new Vector3();
9
+ const eyeTranslationR = new Vector3();
10
+ let renderRectL, renderRectR;
11
+ const headMatrix = new Matrix4();
12
+ const eyeMatrixL = new Matrix4();
13
+ const eyeMatrixR = new Matrix4();
14
+
15
+ let frameData = null;
16
+
17
+ if ('VRFrameData' in window) {
18
+ frameData = new window.VRFrameData();
19
+ }
20
+
21
+ function gotVRDisplays(displays) {
22
+ vrDisplays = displays;
23
+
24
+ if (displays.length > 0) {
25
+ vrDisplay = displays[0];
26
+ } else {
27
+ if (onError) {
28
+ onError('HMD not available');
29
+ }
30
+ }
31
+ }
32
+
33
+ if (navigator.getVRDisplays) {
34
+ navigator.getVRDisplays().then(gotVRDisplays).catch(function () {
35
+ console.warn('THREE.VREffect: Unable to get VR Displays');
36
+ LogManager.message('THREE.VREffect: Unable to get VR Displays', SentryLogLevel.WARNING);
37
+ });
38
+ }
39
+
40
+ this.isPresenting = false;
41
+
42
+ const scope = this;
43
+
44
+ let rendererSize = renderer.getSize();
45
+ let rendererUpdateStyle = false;
46
+ let rendererPixelRatio = renderer.getPixelRatio();
47
+
48
+ this.getVRDisplay = function () {
49
+ return vrDisplay;
50
+ };
51
+
52
+ this.setVRDisplay = function (value) {
53
+ vrDisplay = value;
54
+ };
55
+
56
+ this.getVRDisplays = function () {
57
+ console.warn('THREE.VREffect: getVRDisplays() is being deprecated.');
58
+
59
+ return vrDisplays;
60
+ };
61
+
62
+ this.setSize = function (width, height, updateStyle) {
63
+ rendererSize = { width: width, height: height };
64
+ rendererUpdateStyle = updateStyle;
65
+
66
+ if (scope.isPresenting) {
67
+ const eyeParamsL = vrDisplay.getEyeParameters('left');
68
+
69
+ renderer.setPixelRatio(1);
70
+ renderer.setSize(eyeParamsL.renderWidth * 2, eyeParamsL.renderHeight, false);
71
+ } else {
72
+ renderer.setPixelRatio(rendererPixelRatio);
73
+ renderer.setSize(width, height, updateStyle);
74
+ }
75
+ };
76
+
77
+ // VR presentation
78
+ const canvas = renderer.domElement;
79
+ const defaultLeftBounds = [0.0, 0.0, 0.5, 1.0];
80
+ const defaultRightBounds = [0.5, 0.0, 0.5, 1.0];
81
+
82
+ function onVRDisplayPresentChange() {
83
+ const wasPresenting = scope.isPresenting;
84
+
85
+ scope.isPresenting = vrDisplay !== undefined && vrDisplay.isPresenting;
86
+
87
+ if (scope.isPresenting) {
88
+ const eyeParamsL = vrDisplay.getEyeParameters('left');
89
+ const eyeWidth = eyeParamsL.renderWidth;
90
+ const eyeHeight = eyeParamsL.renderHeight;
91
+
92
+ if (!wasPresenting) {
93
+ rendererPixelRatio = renderer.getPixelRatio();
94
+ rendererSize = renderer.getSize();
95
+
96
+ renderer.setPixelRatio(1);
97
+ renderer.setSize(eyeWidth * 2, eyeHeight, false);
98
+ }
99
+ } else if (wasPresenting) {
100
+ renderer.setPixelRatio(rendererPixelRatio);
101
+ renderer.setSize(rendererSize.width, rendererSize.height, rendererUpdateStyle);
102
+ }
103
+ }
104
+
105
+ window.addEventListener('vrdisplaypresentchange', onVRDisplayPresentChange, false);
106
+
107
+ this.setFullScreen = function (boolean) {
108
+ return new Promise(function (resolve, reject) {
109
+ if (vrDisplay === undefined) {
110
+ reject(new Error('No VR hardware found.'));
111
+
112
+ return;
113
+ }
114
+
115
+ if (scope.isPresenting === boolean) {
116
+ resolve();
117
+
118
+ return;
119
+ }
120
+
121
+ if (boolean) {
122
+ resolve(vrDisplay.requestPresent([{ source: canvas }]));
123
+ } else {
124
+ resolve(vrDisplay.exitPresent());
125
+ }
126
+ });
127
+ };
128
+
129
+ this.requestPresent = function () {
130
+ return this.setFullScreen(true);
131
+ };
132
+
133
+ this.exitPresent = function () {
134
+ return this.setFullScreen(false);
135
+ };
136
+
137
+ this.requestAnimationFrame = function (f) {
138
+ if (vrDisplay !== undefined) {
139
+ return vrDisplay.requestAnimationFrame(f);
140
+ } else {
141
+ return window.requestAnimationFrame(f);
142
+ }
143
+ };
144
+
145
+ this.cancelAnimationFrame = function (h) {
146
+ if (vrDisplay !== undefined) {
147
+ vrDisplay.cancelAnimationFrame(h);
148
+ } else {
149
+ window.cancelAnimationFrame(h);
150
+ }
151
+ };
152
+
153
+ this.submitFrame = function () {
154
+ if (vrDisplay !== undefined && scope.isPresenting) {
155
+ vrDisplay.submitFrame();
156
+ }
157
+ };
158
+
159
+ this.autoSubmitFrame = true;
160
+
161
+ // render
162
+ const cameraL = new PerspectiveCamera();
163
+
164
+ cameraL.layers.enable(1);
165
+
166
+ const cameraR = new PerspectiveCamera();
167
+
168
+ cameraR.layers.enable(2);
169
+
170
+ this.render = function (scene, camera, renderTarget, forceClear) {
171
+ if (vrDisplay && scope.isPresenting) {
172
+ const autoUpdate = scene.autoUpdate;
173
+
174
+ if (autoUpdate) {
175
+ scene.updateMatrixWorld();
176
+ scene.autoUpdate = false;
177
+ }
178
+
179
+ if (Array.isArray(scene)) {
180
+ console.warn('THREE.VREffect.render() no longer supports arrays. Use object.layers instead.');
181
+ scene = scene[0];
182
+ }
183
+
184
+ // When rendering we don't care what the recommended size is, only what the actual size
185
+ // of the backbuffer is.
186
+ const size = renderer.getSize();
187
+ const layers = vrDisplay.getLayers();
188
+ let leftBounds;
189
+ let rightBounds;
190
+
191
+ if (layers.length) {
192
+ const layer = layers[0];
193
+
194
+ leftBounds = layer.leftBounds && layer.leftBounds.length === 4 ? layer.leftBounds : defaultLeftBounds;
195
+ rightBounds = layer.rightBounds && layer.rightBounds.length === 4 ? layer.rightBounds : defaultRightBounds;
196
+ } else {
197
+ leftBounds = defaultLeftBounds;
198
+ rightBounds = defaultRightBounds;
199
+ }
200
+
201
+ renderRectL = {
202
+ x: Math.round(size.width * leftBounds[0]),
203
+ y: Math.round(size.height * leftBounds[1]),
204
+ width: Math.round(size.width * leftBounds[2]),
205
+ height: Math.round(size.height * leftBounds[3])
206
+ };
207
+ renderRectR = {
208
+ x: Math.round(size.width * rightBounds[0]),
209
+ y: Math.round(size.height * rightBounds[1]),
210
+ width: Math.round(size.width * rightBounds[2]),
211
+ height: Math.round(size.height * rightBounds[3])
212
+ };
213
+
214
+ if (renderTarget) {
215
+ renderer.setRenderTarget(renderTarget);
216
+ renderTarget.scissorTest = true;
217
+ } else {
218
+ renderer.setRenderTarget(null);
219
+ renderer.setScissorTest(true);
220
+ }
221
+
222
+ if (renderer.autoClear || forceClear) {
223
+ renderer.clear();
224
+ }
225
+
226
+ if (camera.parent === null) {
227
+ camera.updateMatrixWorld();
228
+ }
229
+
230
+ camera.matrixWorld.decompose(cameraL.position, cameraL.quaternion, cameraL.scale);
231
+
232
+ cameraR.position.copy(cameraL.position);
233
+ cameraR.quaternion.copy(cameraL.quaternion);
234
+ cameraR.scale.copy(cameraL.scale);
235
+
236
+ if (vrDisplay.getFrameData) {
237
+ vrDisplay.depthNear = camera.near;
238
+ vrDisplay.depthFar = camera.far;
239
+
240
+ vrDisplay.getFrameData(frameData);
241
+
242
+ cameraL.projectionMatrix.elements = frameData.leftProjectionMatrix;
243
+ cameraR.projectionMatrix.elements = frameData.rightProjectionMatrix;
244
+
245
+ getEyeMatrices(frameData);
246
+
247
+ cameraL.updateMatrix();
248
+ cameraL.matrix.multiply(eyeMatrixL);
249
+ cameraL.matrix.decompose(cameraL.position, cameraL.quaternion, cameraL.scale);
250
+
251
+ cameraR.updateMatrix();
252
+ cameraR.matrix.multiply(eyeMatrixR);
253
+ cameraR.matrix.decompose(cameraR.position, cameraR.quaternion, cameraR.scale);
254
+ } else {
255
+ const eyeParamsL = vrDisplay.getEyeParameters('left');
256
+ const eyeParamsR = vrDisplay.getEyeParameters('right');
257
+
258
+ cameraL.projectionMatrix = fovToProjection(eyeParamsL.fieldOfView, true, camera.near, camera.far);
259
+ cameraR.projectionMatrix = fovToProjection(eyeParamsR.fieldOfView, true, camera.near, camera.far);
260
+
261
+ eyeTranslationL.fromArray(eyeParamsL.offset);
262
+ eyeTranslationR.fromArray(eyeParamsR.offset);
263
+
264
+ cameraL.translateOnAxis(eyeTranslationL, cameraL.scale.x);
265
+ cameraR.translateOnAxis(eyeTranslationR, cameraR.scale.x);
266
+ }
267
+
268
+ // render left eye
269
+ if (renderTarget) {
270
+ renderTarget.viewport.set(renderRectL.x, renderRectL.y, renderRectL.width, renderRectL.height);
271
+ renderTarget.scissor.set(renderRectL.x, renderRectL.y, renderRectL.width, renderRectL.height);
272
+ } else {
273
+ renderer.setViewport(renderRectL.x, renderRectL.y, renderRectL.width, renderRectL.height);
274
+ renderer.setScissor(renderRectL.x, renderRectL.y, renderRectL.width, renderRectL.height);
275
+ }
276
+ renderer.render(scene, cameraL, renderTarget, forceClear);
277
+
278
+ // render right eye
279
+ if (renderTarget) {
280
+ renderTarget.viewport.set(renderRectR.x, renderRectR.y, renderRectR.width, renderRectR.height);
281
+ renderTarget.scissor.set(renderRectR.x, renderRectR.y, renderRectR.width, renderRectR.height);
282
+ } else {
283
+ renderer.setViewport(renderRectR.x, renderRectR.y, renderRectR.width, renderRectR.height);
284
+ renderer.setScissor(renderRectR.x, renderRectR.y, renderRectR.width, renderRectR.height);
285
+ }
286
+ renderer.render(scene, cameraR, renderTarget, forceClear);
287
+
288
+ if (renderTarget) {
289
+ renderTarget.viewport.set(0, 0, size.width, size.height);
290
+ renderTarget.scissor.set(0, 0, size.width, size.height);
291
+ renderTarget.scissorTest = false;
292
+ renderer.setRenderTarget(null);
293
+ } else {
294
+ renderer.setViewport(0, 0, size.width, size.height);
295
+ renderer.setScissorTest(false);
296
+ }
297
+
298
+ if (autoUpdate) {
299
+ scene.autoUpdate = true;
300
+ }
301
+
302
+ if (scope.autoSubmitFrame) {
303
+ scope.submitFrame();
304
+ }
305
+
306
+ return;
307
+ }
308
+
309
+ // Regular render mode if not HMD
310
+ renderer.render(scene, camera, renderTarget, forceClear);
311
+ };
312
+
313
+ this.dispose = function () {
314
+ window.removeEventListener('vrdisplaypresentchange', onVRDisplayPresentChange, false);
315
+ };
316
+
317
+ const poseOrientation = new Quaternion();
318
+ const posePosition = new Vector3();
319
+
320
+ // Compute model matrices of the eyes with respect to the head.
321
+ function getEyeMatrices(frameData) {
322
+ // Compute the matrix for the position of the head based on the pose
323
+ if (frameData.pose.orientation) {
324
+ poseOrientation.fromArray(frameData.pose.orientation);
325
+ headMatrix.makeRotationFromQuaternion(poseOrientation);
326
+ } else {
327
+ headMatrix.identity();
328
+ }
329
+
330
+ if (frameData.pose.position) {
331
+ posePosition.fromArray(frameData.pose.position);
332
+ headMatrix.setPosition(posePosition);
333
+ }
334
+
335
+ // The view matrix transforms vertices from sitting space to eye space.
336
+ // As such, the view matrix can be thought of as a product of two matrices:
337
+ // headToEyeMatrix * sittingToHeadMatrix
338
+
339
+ // The headMatrix that we've calculated above is the model matrix of the head in sitting space,
340
+ // which is the inverse of sittingToHeadMatrix.
341
+ // So when we multiply the view matrix with headMatrix, we're left with headToEyeMatrix:
342
+ // viewMatrix * headMatrix = headToEyeMatrix * sittingToHeadMatrix * headMatrix = headToEyeMatrix
343
+
344
+ eyeMatrixL.fromArray(frameData.leftViewMatrix);
345
+ eyeMatrixL.multiply(headMatrix);
346
+ eyeMatrixR.fromArray(frameData.rightViewMatrix);
347
+ eyeMatrixR.multiply(headMatrix);
348
+
349
+ // The eye's model matrix in head space is the inverse of headToEyeMatrix we calculated above.
350
+
351
+ eyeMatrixL.getInverse(eyeMatrixL);
352
+ eyeMatrixR.getInverse(eyeMatrixR);
353
+ }
354
+
355
+ function fovToNDCScaleOffset(fov) {
356
+ const pxscale = 2.0 / (fov.leftTan + fov.rightTan);
357
+ const pxoffset = (fov.leftTan - fov.rightTan) * pxscale * 0.5;
358
+ const pyscale = 2.0 / (fov.upTan + fov.downTan);
359
+ const pyoffset = (fov.upTan - fov.downTan) * pyscale * 0.5;
360
+
361
+ return { scale: [pxscale, pyscale], offset: [pxoffset, pyoffset] };
362
+ }
363
+
364
+ function fovPortToProjection(fov, rightHanded, zNear, zFar) {
365
+ rightHanded = rightHanded === undefined ? true : rightHanded;
366
+ zNear = zNear === undefined ? 0.01 : zNear;
367
+ zFar = zFar === undefined ? 10000.0 : zFar;
368
+
369
+ const handednessScale = rightHanded ? -1.0 : 1.0;
370
+
371
+ // start with an identity matrix
372
+ const mobj = new Matrix4();
373
+ const m = mobj.elements;
374
+
375
+ // and with scale/offset info for normalized device coords
376
+ const scaleAndOffset = fovToNDCScaleOffset(fov);
377
+
378
+ // X result, map clip edges to [-w,+w]
379
+ m[0 * 4 + 0] = scaleAndOffset.scale[0];
380
+ m[0 * 4 + 1] = 0.0;
381
+ m[0 * 4 + 2] = scaleAndOffset.offset[0] * handednessScale;
382
+ m[0 * 4 + 3] = 0.0;
383
+
384
+ // Y result, map clip edges to [-w,+w]
385
+ // Y offset is negated because this proj matrix transforms from world coords with Y=up,
386
+ // but the NDC scaling has Y=down (thanks D3D?)
387
+ m[1 * 4 + 0] = 0.0;
388
+ m[1 * 4 + 1] = scaleAndOffset.scale[1];
389
+ m[1 * 4 + 2] = -scaleAndOffset.offset[1] * handednessScale;
390
+ m[1 * 4 + 3] = 0.0;
391
+
392
+ // Z result (up to the app)
393
+ m[2 * 4 + 0] = 0.0;
394
+ m[2 * 4 + 1] = 0.0;
395
+ m[2 * 4 + 2] = zFar / (zNear - zFar) * -handednessScale;
396
+ m[2 * 4 + 3] = (zFar * zNear) / (zNear - zFar);
397
+
398
+ // W result (= Z in)
399
+ m[3 * 4 + 0] = 0.0;
400
+ m[3 * 4 + 1] = 0.0;
401
+ m[3 * 4 + 2] = handednessScale;
402
+ m[3 * 4 + 3] = 0.0;
403
+
404
+ mobj.transpose();
405
+
406
+ return mobj;
407
+ }
408
+
409
+ function fovToProjection(fov, rightHanded, zNear, zFar) {
410
+ const DEG2RAD = Math.PI / 180.0;
411
+
412
+ const fovPort = {
413
+ upTan: Math.tan(fov.upDegrees * DEG2RAD),
414
+ downTan: Math.tan(fov.downDegrees * DEG2RAD),
415
+ leftTan: Math.tan(fov.leftDegrees * DEG2RAD),
416
+ rightTan: Math.tan(fov.rightDegrees * DEG2RAD)
417
+ };
418
+
419
+ return fovPortToProjection(fovPort, rightHanded, zNear, zFar);
420
+ }
421
+ }
422
+ }