@luceosports/play-rendering 1.19.0 → 2.0.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 (293) hide show
  1. package/.babelrc +2 -1
  2. package/.eslintrc +11 -42
  3. package/dist/play-rendering.d.ts +21 -0
  4. package/dist/play-rendering.js +17 -8
  5. package/dist/play-rendering.js.map +1 -1
  6. package/dist/types/constants.d.ts +41 -0
  7. package/dist/types/helpers/common.d.ts +5 -0
  8. package/dist/types/layers/court/index.d.ts +18 -0
  9. package/dist/types/math/Bezier.d.ts +19 -0
  10. package/dist/types/math/LineDrawingMath.d.ts +8 -0
  11. package/dist/types/models/AnimationModel.d.ts +21 -0
  12. package/dist/types/models/FrameModel.d.ts +39 -0
  13. package/dist/types/models/LineModel.d.ts +22 -0
  14. package/dist/types/models/NoteModel.d.ts +17 -0
  15. package/dist/types/models/PlayModel.d.ts +40 -0
  16. package/dist/types/models/PlayerModel.d.ts +20 -0
  17. package/dist/types/models/ShapeModel.d.ts +54 -0
  18. package/dist/types/models/ShapeModels/CircleShape.d.ts +8 -0
  19. package/dist/types/models/ShapeModels/ConeShape.d.ts +8 -0
  20. package/dist/types/models/ShapeModels/FovShape.d.ts +12 -0
  21. package/dist/types/models/ShapeModels/LineShape.d.ts +11 -0
  22. package/dist/types/models/ShapeModels/SquareShape.d.ts +8 -0
  23. package/dist/types/models/ShapeModels/StraightShape.d.ts +12 -0
  24. package/dist/types/models/ShapeModels/TriangleShape.d.ts +12 -0
  25. package/dist/types/models/ShapeModels/XMarkShape.d.ts +8 -0
  26. package/dist/types/models/ShapeModels/index.d.ts +14 -0
  27. package/dist/types/models/ShapeModels/line/CutLineShape.d.ts +3 -0
  28. package/dist/types/models/ShapeModels/line/DribbleLineShape.d.ts +3 -0
  29. package/dist/types/models/ShapeModels/line/HandoffLineShape.d.ts +3 -0
  30. package/dist/types/models/ShapeModels/line/PassLineShape.d.ts +3 -0
  31. package/dist/types/models/ShapeModels/line/ScreenLineShape.d.ts +3 -0
  32. package/dist/types/types/index.d.ts +138 -0
  33. package/package.json +16 -13
  34. package/src/config.ts +1 -0
  35. package/src/constants.ts +49 -0
  36. package/src/global.d.ts +9 -0
  37. package/src/helpers/common.ts +40 -0
  38. package/src/index.ts +36 -0
  39. package/src/layers/{CourtLayer.js → CourtLayer.ts} +4 -6
  40. package/src/layers/{LineControlPointLayer.js → LineControlPointLayer.ts} +2 -4
  41. package/src/layers/{LineLayer.js → LineLayer.ts} +5 -7
  42. package/src/layers/{NoteLayer.js → NoteLayer.ts} +19 -19
  43. package/src/layers/{PlayerLayer.js → PlayerLayer.ts} +6 -7
  44. package/src/layers/{ShapeControlPointLayer.js → ShapeControlPointLayer.ts} +2 -4
  45. package/src/layers/{ShapeLayer.js → ShapeLayer.ts} +4 -6
  46. package/src/layers/base/BaseLayer.ts +15 -0
  47. package/src/layers/base/InternalBaseLayer.ts +29 -0
  48. package/src/layers/court/base/{InternalCourtLayer.js → InternalCourtLayer.ts} +3 -5
  49. package/src/layers/court/index.ts +213 -0
  50. package/src/layers/court/layers/BASEBALL/constants.ts +5 -0
  51. package/src/layers/court/layers/BASEBALL/courtTypes/BASEBALL_HIGH_SCHOOL/constants.ts +34 -0
  52. package/src/layers/court/layers/BASEBALL/courtTypes/BASEBALL_HIGH_SCHOOL/layers/{ADirtLayer.js → ADirtLayer.ts} +14 -14
  53. package/src/layers/court/layers/BASEBALL/courtTypes/BASEBALL_HIGH_SCHOOL/layers/{BaseLineLayer.js → BaseLineLayer.ts} +4 -10
  54. package/src/layers/court/layers/BASEBALL/courtTypes/BASEBALL_HIGH_SCHOOL/layers/{HomePlateLayer.js → HomePlateLayer.ts} +14 -15
  55. package/src/layers/court/layers/BASEBALL/courtTypes/BASEBALL_HIGH_SCHOOL/layers/{PitchingMoundLayer.js → PitchingMoundLayer.ts} +7 -8
  56. package/src/layers/court/layers/BASEBALL/courtTypes/BASEBALL_HIGH_SCHOOL/layers/index.ts +6 -0
  57. package/src/layers/court/layers/{BASKETBALL/layers/BorderRectLayer.js → BASEBALL/layers/BorderRectLayer.ts} +2 -4
  58. package/src/layers/court/layers/BASEBALL/layers/index.ts +3 -0
  59. package/src/layers/court/layers/BASKETBALL/common/{LaneMarkingNBATrait.js → LaneMarkingNBATrait.ts} +1 -1
  60. package/src/layers/court/layers/BASKETBALL/common/{LaneMarkingNCAATrait.js → LaneMarkingNCAATrait.ts} +1 -1
  61. package/src/layers/court/layers/BASKETBALL/constants.ts +5 -0
  62. package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/constants.ts +11 -0
  63. package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/layers/{Big3Layer.js → Big3Layer.ts} +2 -4
  64. package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/layers/LaneMarkingLayer.ts +10 -0
  65. package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/layers/index.ts +4 -0
  66. package/src/layers/court/layers/BASKETBALL/courtTypes/FIBA/constants.ts +11 -0
  67. package/src/layers/court/layers/BASKETBALL/courtTypes/FIBA/layers/{LaneMarkingLayer.js → LaneMarkingLayer.ts} +2 -4
  68. package/src/layers/court/layers/BASKETBALL/courtTypes/FIBA/layers/index.ts +3 -0
  69. package/src/layers/court/layers/BASKETBALL/courtTypes/NBA/constants.ts +11 -0
  70. package/src/layers/court/layers/BASKETBALL/courtTypes/NBA/layers/LaneMarkingLayer.ts +10 -0
  71. package/src/layers/court/layers/BASKETBALL/courtTypes/NBA/layers/index.ts +3 -0
  72. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAM/constants.ts +11 -0
  73. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAM/layers/LaneMarkingLayer.ts +10 -0
  74. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAM/layers/index.ts +3 -0
  75. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAW/constants.ts +11 -0
  76. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAW/layers/LaneMarkingLayer.ts +10 -0
  77. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAW/layers/index.ts +3 -0
  78. package/src/layers/court/layers/BASKETBALL/courtTypes/US_HIGH_SCHOOL/constants.ts +11 -0
  79. package/src/layers/court/layers/BASKETBALL/courtTypes/US_HIGH_SCHOOL/layers/LaneMarkingLayer.ts +10 -0
  80. package/src/layers/court/layers/BASKETBALL/courtTypes/US_HIGH_SCHOOL/layers/index.ts +3 -0
  81. package/src/layers/court/layers/BASKETBALL/courtTypes/US_JUNIOR_HIGH/constants.ts +11 -0
  82. package/src/layers/court/layers/BASKETBALL/courtTypes/US_JUNIOR_HIGH/layers/LaneMarkingLayer.ts +10 -0
  83. package/src/layers/court/layers/BASKETBALL/courtTypes/US_JUNIOR_HIGH/layers/index.ts +3 -0
  84. package/src/layers/court/layers/BASKETBALL/courtTypes/WNBA/constants.ts +11 -0
  85. package/src/layers/court/layers/BASKETBALL/courtTypes/WNBA/layers/LaneMarkingLayer.ts +10 -0
  86. package/src/layers/court/layers/BASKETBALL/courtTypes/WNBA/layers/index.ts +3 -0
  87. package/src/layers/court/layers/BASKETBALL/layers/{BaseLineMarkingLayer.js → BaseLineMarkingLayer.ts} +3 -4
  88. package/src/layers/court/layers/BASKETBALL/layers/{BenchAreaLayer.js → BenchAreaLayer.ts} +2 -4
  89. package/src/layers/court/layers/{LACROSSE/layers/BorderRectLayer.js → BASKETBALL/layers/BorderRectLayer.ts} +2 -4
  90. package/src/layers/court/layers/BASKETBALL/layers/{CenterCircleLayer.js → CenterCircleLayer.ts} +2 -4
  91. package/src/layers/court/layers/{FOOTBALL/layers/CenterLineLayer.js → BASKETBALL/layers/CenterLineLayer.ts} +2 -4
  92. package/src/layers/court/layers/BASKETBALL/layers/{FreeThrowLayer.js → FreeThrowLayer.ts} +2 -4
  93. package/src/layers/court/layers/BASKETBALL/layers/{HoopLayer.js → HoopLayer.ts} +2 -4
  94. package/src/layers/court/layers/BASKETBALL/layers/{InnerOuterRectLayer.js → InnerOuterRectLayer.ts} +2 -4
  95. package/src/layers/court/layers/BASKETBALL/layers/{RestrictedAreaLayer.js → RestrictedAreaLayer.ts} +3 -4
  96. package/src/layers/court/layers/BASKETBALL/layers/{ThreePointLineLayer.js → ThreePointLineLayer.ts} +2 -4
  97. package/src/layers/court/layers/BASKETBALL/layers/index.ts +23 -0
  98. package/src/layers/court/layers/FOOTBALL/constants.ts +5 -0
  99. package/src/layers/court/layers/FOOTBALL/courtTypes/FOOTBALL_HIGH_SCHOOL/constants.ts +3 -0
  100. package/src/layers/court/layers/{BASEBALL/layers/BorderRectLayer.js → FOOTBALL/layers/BorderRectLayer.ts} +2 -4
  101. package/src/layers/court/layers/{SOCCER/layers/CenterLineLayer.js → FOOTBALL/layers/CenterLineLayer.ts} +2 -4
  102. package/src/layers/court/layers/FOOTBALL/layers/{EndZoneLayer.js → EndZoneLayer.ts} +2 -4
  103. package/src/layers/court/layers/FOOTBALL/layers/{FieldNumberLayer.js → FieldNumberLayer.ts} +2 -4
  104. package/src/layers/court/layers/FOOTBALL/layers/{HashMarkLayer.js → HashMarkLayer.ts} +2 -4
  105. package/src/layers/court/layers/FOOTBALL/layers/{YardLineLayer.js → YardLineLayer.ts} +2 -4
  106. package/src/layers/court/layers/FOOTBALL/layers/index.ts +8 -0
  107. package/src/layers/court/layers/HOCKEY/constants.ts +5 -0
  108. package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_INTERNATIONAL/constants.ts +12 -0
  109. package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_INTERNATIONAL/layers/{GoaCreaseLayer.js → GoaCreaseLayer.ts} +2 -4
  110. package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_INTERNATIONAL/layers/index.ts +3 -0
  111. package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_NHL/constants.ts +12 -0
  112. package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_NHL/layers/{GoaCreaseLayer.js → GoaCreaseLayer.ts} +2 -4
  113. package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_NHL/layers/index.ts +3 -0
  114. package/src/layers/court/layers/HOCKEY/layers/{BorderRinkLayer.js → BorderRinkLayer.ts} +2 -4
  115. package/src/layers/court/layers/HOCKEY/layers/{CenterCircleLayer.js → CenterCircleLayer.ts} +2 -4
  116. package/src/layers/court/layers/HOCKEY/layers/{CenterLineLayer.js → CenterLineLayer.ts} +2 -4
  117. package/src/layers/court/layers/HOCKEY/layers/{CenterSpotLayer.js → CenterSpotLayer.ts} +2 -4
  118. package/src/layers/court/layers/HOCKEY/layers/{EndZoneLayer.js → EndZoneLayer.ts} +2 -4
  119. package/src/layers/court/layers/HOCKEY/layers/{GoalLineLayer.js → GoalLineLayer.ts} +2 -4
  120. package/src/layers/court/layers/HOCKEY/layers/{NeutralZoneLayer.js → NeutralZoneLayer.ts} +2 -4
  121. package/src/layers/court/layers/HOCKEY/layers/{RefereeCreaseLayer.js → RefereeCreaseLayer.ts} +2 -4
  122. package/src/layers/court/layers/HOCKEY/layers/index.ts +19 -0
  123. package/src/layers/court/layers/LACROSSE/constants.ts +5 -0
  124. package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_M/constants.ts +4 -0
  125. package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_M/layers/{CenterLineLayer.js → CenterLineLayer.ts} +2 -4
  126. package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_M/layers/{GoalAreaLineLayer.js → GoalAreaLineLayer.ts} +2 -4
  127. package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_M/layers/{WingAreaLineLayer.js → WingAreaLineLayer.ts} +2 -4
  128. package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_M/layers/index.ts +5 -0
  129. package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_W/constants.ts +3 -0
  130. package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_W/layers/{CenterLineLayer.js → CenterLineLayer.ts} +2 -4
  131. package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_W/layers/{FanLineLayer.js → FanLineLayer.ts} +2 -4
  132. package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_W/layers/index.ts +4 -0
  133. package/src/layers/court/layers/{FOOTBALL/layers/BorderRectLayer.js → LACROSSE/layers/BorderRectLayer.ts} +2 -4
  134. package/src/layers/court/layers/LACROSSE/layers/{RestrainingLineLayer.js → RestrainingLineLayer.ts} +2 -4
  135. package/src/layers/court/layers/LACROSSE/layers/index.ts +4 -0
  136. package/src/layers/court/layers/SOCCER/constants.ts +5 -0
  137. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_FIFA/constants.ts +7 -0
  138. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NCAA/constants.ts +7 -0
  139. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NCAA/layers/{CenterSpotLayer.js → CenterSpotLayer.ts} +2 -4
  140. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NCAA/layers/{HashMarkLayer.js → HashMarkLayer.ts} +2 -4
  141. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NCAA/layers/{PenaltySpotLayer.js → PenaltySpotLayer.ts} +2 -4
  142. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NCAA/layers/index.ts +5 -0
  143. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NFHS/constants.ts +7 -0
  144. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NFHS/layers/{HashMarkLayer.js → HashMarkLayer.ts} +2 -4
  145. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NFHS/layers/{PenaltySpotLayer.js → PenaltySpotLayer.ts} +2 -4
  146. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NFHS/layers/index.ts +4 -0
  147. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U10/constants.ts +7 -0
  148. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U10/layers/{BuildOutLineLayer.js → BuildOutLineLayer.ts} +2 -4
  149. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U10/layers/{PenaltyArcLayer.js → PenaltyArcLayer.ts} +2 -4
  150. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U10/layers/index.ts +4 -0
  151. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U12/constants.ts +7 -0
  152. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U12/layers/{PenaltyArcLayer.js → PenaltyArcLayer.ts} +2 -4
  153. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U12/layers/index.ts +3 -0
  154. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U19/constants.ts +7 -0
  155. package/src/layers/court/layers/SOCCER/layers/BorderRectLayer.ts +10 -0
  156. package/src/layers/court/layers/SOCCER/layers/{CenterCircleLayer.js → CenterCircleLayer.ts} +2 -4
  157. package/src/layers/court/layers/{BASKETBALL/layers/CenterLineLayer.js → SOCCER/layers/CenterLineLayer.ts} +2 -4
  158. package/src/layers/court/layers/SOCCER/layers/{CenterSpotLayer.js → CenterSpotLayer.ts} +2 -4
  159. package/src/layers/court/layers/SOCCER/layers/{CornerLayer.js → CornerLayer.ts} +3 -4
  160. package/src/layers/court/layers/SOCCER/layers/{PenaltyArcLayer.js → PenaltyArcLayer.ts} +2 -4
  161. package/src/layers/court/layers/SOCCER/layers/{PenaltyAreaLayer.js → PenaltyAreaLayer.ts} +2 -4
  162. package/src/layers/court/layers/SOCCER/layers/{PenaltySpotLayer.js → PenaltySpotLayer.ts} +2 -4
  163. package/src/layers/court/layers/SOCCER/layers/index.ts +19 -0
  164. package/src/layers/court/layers/VOLLEYBALL/constants.ts +5 -0
  165. package/src/layers/court/layers/VOLLEYBALL/courtTypes/VOLLEYBALL_INDOOR/constants.ts +2 -0
  166. package/src/layers/court/layers/VOLLEYBALL/layers/{AttackLineLayer.js → AttackLineLayer.ts} +3 -4
  167. package/src/layers/court/layers/VOLLEYBALL/layers/BorderRectLayer.ts +10 -0
  168. package/src/layers/court/layers/VOLLEYBALL/layers/{CenterLineLayer.js → CenterLineLayer.ts} +2 -4
  169. package/src/layers/court/layers/VOLLEYBALL/layers/{HashMarkLayer.js → HashMarkLayer.ts} +3 -4
  170. package/src/layers/court/layers/VOLLEYBALL/layers/index.ts +6 -0
  171. package/src/layers/line/base/{ActionLineLayer.js → ActionLineLayer.ts} +2 -4
  172. package/src/layers/line/base/{InternalLineLayer.js → InternalLineLayer.ts} +30 -10
  173. package/src/layers/line/index.ts +8 -0
  174. package/src/layers/line/layers/CutLineLayer.ts +7 -0
  175. package/src/layers/line/layers/{DribbleLineLayer.js → DribbleLineLayer.ts} +14 -8
  176. package/src/layers/line/layers/{HandoffLineLayer.js → HandoffLineLayer.ts} +4 -5
  177. package/src/layers/line/layers/PassLineLayer.ts +11 -0
  178. package/src/layers/line/layers/ScreenLineLayer.ts +7 -0
  179. package/src/layers/line/layers/{ShotLineLayer.js → ShotLineLayer.ts} +2 -4
  180. package/src/layers/shape/base/{InternalShapeLayer.js → InternalShapeLayer.ts} +7 -5
  181. package/src/layers/shape/index.ts +28 -0
  182. package/src/layers/shape/layers/{CircleShapeLayer.js → CircleShapeLayer.ts} +2 -4
  183. package/src/layers/shape/layers/{ConeShapeLayer.js → ConeShapeLayer.ts} +2 -4
  184. package/src/layers/shape/layers/{FovShapeLayer.js → FovShapeLayer.ts} +2 -4
  185. package/src/layers/shape/layers/{SquareShapeLayer.js → SquareShapeLayer.ts} +2 -4
  186. package/src/layers/shape/layers/{StraightShapeLayer.js → StraightShapeLayer.ts} +2 -4
  187. package/src/layers/shape/layers/{TriangleShapeLayer.js → TriangleShapeLayer.ts} +2 -4
  188. package/src/layers/shape/layers/{XmarkShapeLayer.js → XmarkShapeLayer.ts} +2 -4
  189. package/src/layers/shape/layers/line/CutLineShapeLayer.ts +11 -0
  190. package/src/layers/shape/layers/line/DribbleLineShapeLayer.ts +26 -0
  191. package/src/layers/shape/layers/line/HandoffLineShapeLayer.ts +11 -0
  192. package/src/layers/shape/layers/line/PassLineShapeLayer.ts +15 -0
  193. package/src/layers/shape/layers/line/ScreenLineShapeLayer.ts +11 -0
  194. package/src/layers/shape/layers/line/base/InternalLineShapeLayer.ts +44 -0
  195. package/src/math/{Bezier.js → Bezier.ts} +48 -46
  196. package/src/math/LineDrawingMath.ts +573 -0
  197. package/src/models/{Animation.js → AnimationModel.ts} +29 -22
  198. package/src/models/Base/InternalFrameModel.ts +23 -0
  199. package/src/models/{Frame.js → FrameModel.ts} +136 -82
  200. package/src/models/{Line.js → LineModel.ts} +26 -14
  201. package/src/models/{Note.js → NoteModel.ts} +12 -11
  202. package/src/models/Play/Options.ts +31 -0
  203. package/src/models/PlayModel.ts +139 -0
  204. package/src/models/{Player.js → PlayerModel.ts} +5 -6
  205. package/src/models/{Shape.js → ShapeModel.ts} +9 -10
  206. package/src/models/ShapeModels/{CircleShape.js → CircleShape.ts} +2 -4
  207. package/src/models/ShapeModels/{ConeShape.js → ConeShape.ts} +2 -4
  208. package/src/models/ShapeModels/{FovShape.js → FovShape.ts} +2 -4
  209. package/src/models/ShapeModels/{LineShape.js → LineShape.ts} +4 -6
  210. package/src/models/ShapeModels/{XMarkShape.js → SquareShape.ts} +2 -4
  211. package/src/models/ShapeModels/{StraightShape.js → StraightShape.ts} +2 -4
  212. package/src/models/ShapeModels/{TriangleShape.js → TriangleShape.ts} +2 -4
  213. package/src/models/ShapeModels/{SquareShape.js → XMarkShape.ts} +2 -4
  214. package/src/models/ShapeModels/index.ts +30 -0
  215. package/src/models/ShapeModels/line/CutLineShape.ts +3 -0
  216. package/src/models/ShapeModels/line/DribbleLineShape.ts +3 -0
  217. package/src/models/ShapeModels/line/HandoffLineShape.ts +3 -0
  218. package/src/models/ShapeModels/line/PassLineShape.ts +3 -0
  219. package/src/models/ShapeModels/line/ScreenLineShape.ts +3 -0
  220. package/src/playerHatsConfig.ts +39 -0
  221. package/src/shapesConfig.ts +8 -0
  222. package/src/traits/{DribbleLineTrait.js → DribbleLineTrait.ts} +12 -10
  223. package/src/traits/{LineDrawOperationsTrait.js → LineDrawOperationsTrait.ts} +12 -9
  224. package/src/types/index.ts +205 -0
  225. package/tsconfig.json +21 -0
  226. package/webpack.config.js +5 -8
  227. package/index.js +0 -17
  228. package/src/config.js +0 -3
  229. package/src/constants.js +0 -51
  230. package/src/helpers/common.js +0 -12
  231. package/src/layers/base/BaseLayer.js +0 -20
  232. package/src/layers/base/InternalBaseLayer.js +0 -22
  233. package/src/layers/court/index.js +0 -64
  234. package/src/layers/court/layers/BASEBALL/constants.js +0 -7
  235. package/src/layers/court/layers/BASEBALL/courtTypes/BASEBALL_HIGH_SCHOOL/constants.js +0 -36
  236. package/src/layers/court/layers/BASKETBALL/constants.js +0 -7
  237. package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/constants.js +0 -13
  238. package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/layers/LaneMarkingLayer.js +0 -12
  239. package/src/layers/court/layers/BASKETBALL/courtTypes/FIBA/constants.js +0 -13
  240. package/src/layers/court/layers/BASKETBALL/courtTypes/NBA/constants.js +0 -13
  241. package/src/layers/court/layers/BASKETBALL/courtTypes/NBA/layers/LaneMarkingLayer.js +0 -12
  242. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAM/constants.js +0 -13
  243. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAM/layers/LaneMarkingLayer.js +0 -12
  244. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAW/constants.js +0 -13
  245. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAW/layers/LaneMarkingLayer.js +0 -12
  246. package/src/layers/court/layers/BASKETBALL/courtTypes/US_HIGH_SCHOOL/constants.js +0 -13
  247. package/src/layers/court/layers/BASKETBALL/courtTypes/US_HIGH_SCHOOL/layers/LaneMarkingLayer.js +0 -12
  248. package/src/layers/court/layers/BASKETBALL/courtTypes/US_JUNIOR_HIGH/constants.js +0 -13
  249. package/src/layers/court/layers/BASKETBALL/courtTypes/US_JUNIOR_HIGH/layers/LaneMarkingLayer.js +0 -12
  250. package/src/layers/court/layers/BASKETBALL/courtTypes/WNBA/constants.js +0 -13
  251. package/src/layers/court/layers/BASKETBALL/courtTypes/WNBA/layers/LaneMarkingLayer.js +0 -12
  252. package/src/layers/court/layers/FOOTBALL/constants.js +0 -7
  253. package/src/layers/court/layers/FOOTBALL/courtTypes/FOOTBALL_HIGH_SCHOOL/constants.js +0 -5
  254. package/src/layers/court/layers/HOCKEY/constants.js +0 -7
  255. package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_INTERNATIONAL/constants.js +0 -14
  256. package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_NHL/constants.js +0 -14
  257. package/src/layers/court/layers/LACROSSE/constants.js +0 -7
  258. package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_M/constants.js +0 -6
  259. package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_W/constants.js +0 -5
  260. package/src/layers/court/layers/SOCCER/constants.js +0 -7
  261. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_FIFA/constants.js +0 -9
  262. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NCAA/constants.js +0 -9
  263. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NFHS/constants.js +0 -9
  264. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U10/constants.js +0 -9
  265. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U12/constants.js +0 -9
  266. package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U19/constants.js +0 -9
  267. package/src/layers/court/layers/SOCCER/layers/BorderRectLayer.js +0 -12
  268. package/src/layers/court/layers/VOLLEYBALL/constants.js +0 -7
  269. package/src/layers/court/layers/VOLLEYBALL/courtTypes/VOLLEYBALL_INDOOR/constants.js +0 -4
  270. package/src/layers/court/layers/VOLLEYBALL/layers/BorderRectLayer.js +0 -12
  271. package/src/layers/line/index.js +0 -11
  272. package/src/layers/line/layers/CutLineLayer.js +0 -9
  273. package/src/layers/line/layers/PassLineLayer.js +0 -13
  274. package/src/layers/line/layers/ScreenLineLayer.js +0 -9
  275. package/src/layers/shape/index.js +0 -17
  276. package/src/layers/shape/layers/line/CutLineShapeLayer.js +0 -13
  277. package/src/layers/shape/layers/line/DribbleLineShapeLayer.js +0 -20
  278. package/src/layers/shape/layers/line/HandoffLineShapeLayer.js +0 -13
  279. package/src/layers/shape/layers/line/PassLineShapeLayer.js +0 -17
  280. package/src/layers/shape/layers/line/ScreenLineShapeLayer.js +0 -13
  281. package/src/layers/shape/layers/line/base/InternalLineShapeLayer.js +0 -34
  282. package/src/math/LineDrawingMath.js +0 -570
  283. package/src/models/Base/InternalFrameModel.js +0 -20
  284. package/src/models/Play/Options.js +0 -31
  285. package/src/models/Play.js +0 -91
  286. package/src/models/ShapeModels/index.js +0 -18
  287. package/src/models/ShapeModels/line/CutLineShape.js +0 -5
  288. package/src/models/ShapeModels/line/DribbleLineShape.js +0 -5
  289. package/src/models/ShapeModels/line/HandoffLineShape.js +0 -5
  290. package/src/models/ShapeModels/line/PassLineShape.js +0 -5
  291. package/src/models/ShapeModels/line/ScreenLineShape.js +0 -5
  292. package/src/playerHatsConfig.js +0 -29
  293. package/src/shapesConfig.js +0 -6
@@ -0,0 +1,573 @@
1
+ import { CourtPoint, LinePart } from '../types';
2
+ import { matrix, Matrix, multiply, ones } from 'mathjs';
3
+
4
+ const sinusoidNumberOfPoints = 1000;
5
+
6
+ export function adjustedBezierCurveWithExclusionZones(
7
+ controlPoints: CourtPoint[],
8
+ startZoneRadius = null,
9
+ startAnchor = null,
10
+ endZoneRadius = null,
11
+ endAnchor = null
12
+ ) {
13
+ let curve = [...controlPoints];
14
+ if (startZoneRadius && startAnchor) {
15
+ const controlPointsMat = controlPointsMatFromPoints(controlPoints);
16
+ const tVal = firstTValForPointOnCurveOutsideCircle(controlPointsMat, startAnchor, startZoneRadius);
17
+ const splitCurves = splitBezierCurveAtTVal(controlPoints, tVal);
18
+ curve = [...splitCurves].pop();
19
+ }
20
+
21
+ if (endZoneRadius && endAnchor) {
22
+ const reverseControlPoints = [].concat(curve).reverse(); // reverse array without changing the original
23
+ const reverseControlPointsMat = controlPointsMatFromPoints(reverseControlPoints);
24
+ const reverseTVal = firstTValForPointOnCurveOutsideCircle(reverseControlPointsMat, endAnchor, endZoneRadius);
25
+ const tVal = 1.0 - reverseTVal;
26
+ const splitCurves = splitBezierCurveAtTVal(curve, tVal);
27
+ curve = splitCurves[0];
28
+ }
29
+ return curve as LinePart['controlPoints'];
30
+ }
31
+
32
+ // export function sinusodialBezierPathsForBezierPaths(
33
+ // controlPointPaths: LinePart[],
34
+ // waveLength: number,
35
+ // amplitude: number
36
+ // ) {
37
+ // const [pointsOnCurve, tangentAnglesToPointsOnCurve] = evenlySpacedPointsOnCurveWithTangentAngles(
38
+ // controlPointPaths,
39
+ // waveLength / 2.0
40
+ // );
41
+ //
42
+ // const returnPaths = [];
43
+ // let normal_PI_inc = Math.PI / 2;
44
+ // let index = 0;
45
+ //
46
+ // while (index < pointsOnCurve.length - 4) {
47
+ // const beginPoint = pointsOnCurve[index];
48
+ // const midPoint = pointsOnCurve[index + 1];
49
+ // const endPoint = pointsOnCurve[index + 2];
50
+ // const midPointNormalAngle = tangentAnglesToPointsOnCurve[index + 1] + normal_PI_inc;
51
+ //
52
+ // const controlPoint = {
53
+ // x: midPoint.x + amplitude * Math.cos(midPointNormalAngle),
54
+ // y: midPoint.y + amplitude * Math.sin(midPointNormalAngle)
55
+ // };
56
+ //
57
+ // returnPaths.push([beginPoint, controlPoint, endPoint]);
58
+ // normal_PI_inc *= -1.0;
59
+ // index += 2;
60
+ // }
61
+ //
62
+ // const lastPoint = [...[...returnPaths].pop()].pop();
63
+ // if (lastPoint) {
64
+ // const lastCp = [...[...controlPointPaths].pop().controlPoints].pop();
65
+ // returnPaths.push([lastPoint, lastCp]);
66
+ // }
67
+ // return returnPaths;
68
+ // }
69
+
70
+ export function distanceBetweenPoints(point1: CourtPoint, point2: CourtPoint) {
71
+ const xDist = point1.x - point2.x;
72
+ const yDist = point1.y - point2.y;
73
+ return Math.sqrt(xDist * xDist + yDist * yDist);
74
+ }
75
+
76
+ // function evenlySpacedPointsOnCurveWithTangentAngles(controlPointPaths: LinePart[], distanceBetweenPoints: number) {
77
+ // const returnPoints = [];
78
+ // const returnTangentAngles = [];
79
+ //
80
+ // controlPointPaths.forEach((linePath, pathIndex) => {
81
+ // const { controlPoints } = linePath;
82
+ // const helperMat = helperMatrixForDegree(controlPoints.length - 1);
83
+ // const tMat = preCalculatedTMatrixForDegree(controlPoints.length - 1);
84
+ // const controlPointsMat = controlPointsMatFromPoints(controlPoints);
85
+ // const testPoints = multiply(helperMat, controlPointsMat);
86
+ // const testPointsTangentRatiosMat = slopesOnCurveAtTVals(controlPointsMat, tMat);
87
+ // const distancesBetweenPoints = distanceBetweenPointsOnCurve(testPoints);
88
+ // if (pathIndex === 0) {
89
+ // const tpFirstRowVector0 = subset(testPointsTangentRatiosMat, index(0, [0]));
90
+ // const tpFirstRowVector1 = subset(testPointsTangentRatiosMat, index(0, [1]));
91
+ // returnTangentAngles.push(Math.atan2(tpFirstRowVector1, tpFirstRowVector0));
92
+ // returnPoints.push({ x: tpFirstRowVector0, y: tpFirstRowVector1 });
93
+ // }
94
+ //
95
+ // let currentDistance = 0.0;
96
+ // distancesBetweenPoints.forEach((dist, i) => {
97
+ // currentDistance += dist;
98
+ // if (currentDistance >= distanceBetweenPoints) {
99
+ // const tpAdjustedStartVectorX = subset(testPointsTangentRatiosMat, index(i, [0]));
100
+ // const tpAdjustedStartVectorY = subset(testPointsTangentRatiosMat, index(i, [1]));
101
+ // returnTangentAngles.push(Math.atan2(tpAdjustedStartVectorY, tpAdjustedStartVectorX));
102
+ // returnPoints.push({ x: tpAdjustedStartVectorX, y: tpAdjustedStartVectorY });
103
+ // currentDistance = 0.0;
104
+ // }
105
+ // });
106
+ // });
107
+ //
108
+ // return [returnPoints, returnTangentAngles];
109
+ // }
110
+
111
+ // function distanceBetweenPointsOnCurve(points: Matrix) {
112
+ // // Creates a copy of the vector with points offset by 1 in order to calculate the relative distances between points
113
+ // const [pointsNumberOfRows] = points.size();
114
+ //
115
+ // const xPointsVector = [];
116
+ // points.forEach(value => xPointsVector.push(value));
117
+ //
118
+ // const oneOffSetXPoints = [...xPointsVector];
119
+ // oneOffSetXPoints.splice(0, 2);
120
+ // oneOffSetXPoints.push(xPointsVector[xPointsVector.length - 2]);
121
+ // oneOffSetXPoints.push(xPointsVector[xPointsVector.length - 1]);
122
+ //
123
+ // const yPointsVector = [...xPointsVector];
124
+ // yPointsVector.splice(0, 1);
125
+ //
126
+ // const oneOffSetYPoints = [...oneOffSetXPoints];
127
+ // oneOffSetYPoints.splice(0, 1);
128
+ //
129
+ // const xPointsVectorStrideAdjusted = [];
130
+ // const oneOffSetXPointsStrideAdjusted = [];
131
+ // const yPointsVectorStrideAdjusted = [];
132
+ // const oneOffSetYPointsStrideAdjusted = [];
133
+ // xPointsVector.forEach((p, index) => {
134
+ // if (!(index % 2)) xPointsVectorStrideAdjusted.push(p);
135
+ // });
136
+ // oneOffSetXPoints.forEach((p, index) => {
137
+ // if (!(index % 2)) oneOffSetXPointsStrideAdjusted.push(p);
138
+ // });
139
+ // yPointsVector.forEach((p, index) => {
140
+ // if (!(index % 2)) yPointsVectorStrideAdjusted.push(p);
141
+ // });
142
+ // oneOffSetYPoints.forEach((p, index) => {
143
+ // if (!(index % 2)) oneOffSetYPointsStrideAdjusted.push(p);
144
+ // });
145
+ //
146
+ // const distance = [];
147
+ // for (let n = 0; n < pointsNumberOfRows; ++n) {
148
+ // distance.push(
149
+ // Math.sqrt(
150
+ // (xPointsVectorStrideAdjusted[n] - oneOffSetXPointsStrideAdjusted[n]) ** 2 +
151
+ // (yPointsVectorStrideAdjusted[n] - oneOffSetYPointsStrideAdjusted[n]) ** 2
152
+ // )
153
+ // );
154
+ // }
155
+ // return distance;
156
+ // }
157
+
158
+ // function slopesOnCurveAtTVals(controlPointsMat: Matrix, tVals: Matrix) {
159
+ // const [cpMatNumberOfRows] = controlPointsMat.size();
160
+ //
161
+ // if (cpMatNumberOfRows === 2) {
162
+ // const xPoints = [];
163
+ // const yPoints = [];
164
+ //
165
+ // controlPointsMat.forEach((value, [, col]) => {
166
+ // switch (col) {
167
+ // case 0: {
168
+ // xPoints.push(value);
169
+ // break;
170
+ // }
171
+ // case 1: {
172
+ // yPoints.push(value);
173
+ // break;
174
+ // }
175
+ // default: {
176
+ // break;
177
+ // }
178
+ // }
179
+ // });
180
+ //
181
+ // const xDiff = xPoints[1] - xPoints[0];
182
+ // const yDiff = yPoints[1] - yPoints[0];
183
+ //
184
+ // const matrixRows = [];
185
+ // const [tValsNumberOfRows] = tVals.size();
186
+ // for (let i = 0; i < tValsNumberOfRows; i++) {
187
+ // matrixRows.push([xDiff, yDiff]);
188
+ // }
189
+ //
190
+ // return matrix(matrixRows);
191
+ // }
192
+ //
193
+ // let fixedMat: Matrix;
194
+ // if (cpMatNumberOfRows === 3) {
195
+ // fixedMat = quadraticDerivativeMatrix();
196
+ // } else {
197
+ // fixedMat = cubicDerivativeMatrix();
198
+ // }
199
+ //
200
+ // console.log({ tVals, fixedMat, controlPointsMat });
201
+ //
202
+ // const slopeRatios = calculatedPointsOnCurve(tVals, controlPointsMat, fixedMat);
203
+ //
204
+ // console.log({ slopeRatios });
205
+ //
206
+ // return slopeRatios;
207
+ // }
208
+
209
+ // function calculatedPointsOnCurve(tValMatrix: Matrix, controlPointsMatrix: Matrix, fixedMatrix: Matrix) {
210
+ // return multiply(tValMatrix, fixedMatrix, controlPointsMatrix);
211
+ // }
212
+
213
+ export function splitBezierCurveAtTVal(controlPoints: CourtPoint[], tVal: number) {
214
+ switch (controlPoints.length) {
215
+ case 2:
216
+ return splitLinearBezierCurveAtTVal(controlPoints, tVal);
217
+ case 3:
218
+ return splitQuadraticCurveAtTVal(controlPoints, tVal);
219
+ case 4:
220
+ return splitCubicCurveAtTVal(controlPoints, tVal);
221
+ default:
222
+ return null;
223
+ }
224
+ }
225
+
226
+ function linearPointAtTVal(controlPoints: CourtPoint[], tVal: number) {
227
+ const [firstControlPoint] = controlPoints;
228
+ const lastControlPoint = [...controlPoints].pop();
229
+ const xt = firstControlPoint.x + (lastControlPoint.x - firstControlPoint.x) * tVal;
230
+ const yt = firstControlPoint.y + (lastControlPoint.y - firstControlPoint.y) * tVal;
231
+ return { y: yt, x: xt };
232
+ }
233
+
234
+ function splitLinearBezierCurveAtTVal(controlPoints: CourtPoint[], tVal: number) {
235
+ // Comment from prev dev:
236
+ // this could be faster by doing calculations directly.. but who cares
237
+ const midPoint = linearPointAtTVal(controlPoints, tVal);
238
+ return [
239
+ [controlPoints[0], midPoint],
240
+ [midPoint, [...controlPoints].pop()]
241
+ ];
242
+ }
243
+
244
+ function splitQuadraticCurveAtTVal(controlPoints: CourtPoint[], tVal: number) {
245
+ const firstTwoPoints = [controlPoints[0], controlPoints[1]];
246
+ const lastTwoPoints = [controlPoints[1], controlPoints[2]];
247
+ const control1 = linearPointAtTVal(firstTwoPoints, tVal);
248
+ const control2 = linearPointAtTVal(lastTwoPoints, tVal);
249
+ const breakPoint = linearPointAtTVal([control1, control2], tVal);
250
+ return [
251
+ [controlPoints[0], control1, breakPoint],
252
+ [breakPoint, control2, controlPoints[2]]
253
+ ];
254
+ }
255
+
256
+ function splitCubicCurveAtTVal(controlPoints: CourtPoint[], tVal: number) {
257
+ const firstTwoPoints = [controlPoints[0], controlPoints[1]];
258
+ const middleTwoPoints = [controlPoints[1], controlPoints[2]];
259
+ const lastTwoPoints = [controlPoints[2], controlPoints[3]];
260
+
261
+ const firstTwoMidPoint = linearPointAtTVal(firstTwoPoints, tVal);
262
+ const middleTwoMidPoint = linearPointAtTVal(middleTwoPoints, tVal);
263
+ const lastTwoMidPoint = linearPointAtTVal(lastTwoPoints, tVal);
264
+
265
+ const midPoint123 = linearPointAtTVal([firstTwoMidPoint, middleTwoMidPoint], tVal);
266
+ const midPoint234 = linearPointAtTVal([middleTwoMidPoint, lastTwoMidPoint], tVal);
267
+ const breakPoint = linearPointAtTVal([midPoint123, midPoint234], tVal);
268
+
269
+ return [
270
+ [controlPoints[0], firstTwoMidPoint, midPoint123, breakPoint],
271
+ [breakPoint, midPoint234, lastTwoMidPoint, controlPoints[3]]
272
+ ];
273
+ }
274
+
275
+ function firstTValForPointOnCurveOutsideCircle(controlPointsMat: Matrix, anchorPoint: CourtPoint, radius: number) {
276
+ const [numberOfRows] = controlPointsMat.size();
277
+ const helperMat = helperMatrixForDegree(numberOfRows - 1);
278
+ const pointsOnCurveMat = multiply(helperMat, controlPointsMat);
279
+ const distances = distancesFromPointToPoints(anchorPoint, pointsOnCurveMat);
280
+
281
+ // Comment from prev dev:
282
+ // We're assuming that point 0 is the closest to the anchor point... So we could use a binary search here to save a bit of time
283
+ // Chances are is that the tVal will actually be near the beginning however due to the way the function i used at this time
284
+
285
+ let indexOfPoint = distances.length - 1;
286
+ for (let i = 0; i < distances.length; i++) {
287
+ if (distances[i] >= radius) {
288
+ indexOfPoint = i;
289
+ break;
290
+ }
291
+ }
292
+
293
+ const tInc = 1.0 / sinusoidNumberOfPoints;
294
+ return indexOfPoint * tInc;
295
+ }
296
+
297
+ function distancesFromPointToPoints(anchorPoint: CourtPoint, pointsOnCurveMat: Matrix) {
298
+ const xPointAdjustFromOrigin = -anchorPoint.x;
299
+ const yPointAdjustFromOrigin = -anchorPoint.y;
300
+
301
+ const adjustedXPoints = [];
302
+ const adjustedYPoints = [];
303
+
304
+ pointsOnCurveMat.forEach((value, [, col]) => {
305
+ switch (col) {
306
+ case 0: {
307
+ adjustedXPoints.push(value + xPointAdjustFromOrigin);
308
+ break;
309
+ }
310
+ case 1: {
311
+ adjustedYPoints.push(value + yPointAdjustFromOrigin);
312
+ break;
313
+ }
314
+ default: {
315
+ break;
316
+ }
317
+ }
318
+ });
319
+
320
+ const distances = [];
321
+ for (let i = 0; i < adjustedXPoints.length; i++) {
322
+ distances.push(Math.sqrt(adjustedXPoints[i] * adjustedXPoints[i] + adjustedYPoints[i] * adjustedYPoints[i]));
323
+ }
324
+ return distances;
325
+ }
326
+
327
+ function helperMatrixForDegree(degree: number) {
328
+ switch (degree) {
329
+ case 1: {
330
+ return linearHelperMatrix();
331
+ }
332
+ case 2: {
333
+ return quadraticHelperMatrix();
334
+ }
335
+ case 3: {
336
+ return cubicHelperMatrix();
337
+ }
338
+ default: {
339
+ return null;
340
+ }
341
+ }
342
+ }
343
+
344
+ // function preCalculatedTMatrixForDegree(degree: number) {
345
+ // switch (degree) {
346
+ // case 1: {
347
+ // return linearTMatSinusoid();
348
+ // }
349
+ // case 2: {
350
+ // return quadraticTMatSinusoid();
351
+ // }
352
+ // case 3: {
353
+ // return cubicTMatSinusoid();
354
+ // }
355
+ // default: {
356
+ // return null;
357
+ // }
358
+ // }
359
+ // }
360
+
361
+ function linearBezierMatrix() {
362
+ return matrix([
363
+ [1, 0],
364
+ [-1, 1]
365
+ ]);
366
+ }
367
+
368
+ function quadraticBezierMatrix() {
369
+ return matrix([
370
+ [1, 0, 0],
371
+ [-2, 2, 0],
372
+ [1, -2, 1]
373
+ ]);
374
+ }
375
+
376
+ function cubicBezierMatrix() {
377
+ return matrix([
378
+ [1, 0, 0, 0],
379
+ [-3, 3, 0, 0],
380
+ [3, -6, 3, 0],
381
+ [-1, 3, -3, 1]
382
+ ]);
383
+ }
384
+
385
+ // function cubicDerivativeMatrix() {
386
+ // return matrix([
387
+ // [-3, 3, 0, 0],
388
+ // [6, -12, 6, 0],
389
+ // [-3, 9, -9, 3],
390
+ // [0, 0, 0, 0]
391
+ // ]);
392
+ // }
393
+ //
394
+ // function quadraticDerivativeMatrix() {
395
+ // return matrix([
396
+ // [-2, 2, 0],
397
+ // [2, -4, 2],
398
+ // [0, 0, 0]
399
+ // ]);
400
+ // }
401
+
402
+ function linearHelperMatrix() {
403
+ return multiply(linearTMatSinusoid(), linearBezierMatrix());
404
+ }
405
+
406
+ function quadraticHelperMatrix() {
407
+ return multiply(quadraticTMatSinusoid(), quadraticBezierMatrix());
408
+ }
409
+ function cubicHelperMatrix() {
410
+ return multiply(cubicTMatSinusoid(), cubicBezierMatrix());
411
+ }
412
+
413
+ function linearTMatSinusoid() {
414
+ return tMatrixForEvenlyDistributedTValues(sinusoidNumberOfPoints, 1);
415
+ }
416
+
417
+ function quadraticTMatSinusoid() {
418
+ return tMatrixForEvenlyDistributedTValues(sinusoidNumberOfPoints, 2);
419
+ }
420
+
421
+ function cubicTMatSinusoid() {
422
+ return tMatrixForEvenlyDistributedTValues(sinusoidNumberOfPoints, 3);
423
+ }
424
+
425
+ function tMatrixForEvenlyDistributedTValues(numberOfPoints: number, degreeOfCurve: number) {
426
+ const increment = 1.0 / numberOfPoints;
427
+ let tVal = 0;
428
+ const returnArray = (ones(numberOfPoints + 1, degreeOfCurve + 1) as Matrix).map((value, [, col]) => {
429
+ let resVal = null;
430
+ switch (col) {
431
+ case 0: {
432
+ resVal = 1.0;
433
+ break;
434
+ }
435
+ case 1: {
436
+ resVal = tVal;
437
+ break;
438
+ }
439
+ case 2: {
440
+ resVal = tVal * tVal;
441
+ break;
442
+ }
443
+ case 3: {
444
+ resVal = tVal * tVal * tVal;
445
+ break;
446
+ }
447
+ default: {
448
+ break;
449
+ }
450
+ }
451
+ tVal += increment;
452
+ return resVal;
453
+ });
454
+
455
+ return matrix(returnArray);
456
+ }
457
+
458
+ function controlPointsMatFromPoints(controlPoints: CourtPoint[]) {
459
+ const controlPointsVec = controlPoints.map(cp => {
460
+ return [cp.x, cp.y];
461
+ });
462
+ return matrix(controlPointsVec);
463
+ }
464
+
465
+ export function bezierBoundingBox(controlPoints: LinePart['controlPoints']) {
466
+ if (controlPoints.length === 3) {
467
+ throw new Error('bezierBoundingBox function supports only linear and cubic bezier curves for now');
468
+ }
469
+
470
+ const bMinMax = controlPoints.length === 2 ? linearBezierMinMax(controlPoints) : cubicBezierMinMax(controlPoints);
471
+
472
+ // Extend bounding box for straight lines
473
+ const yAxisOffset = controlPoints.length === 2 ? 1 : 0;
474
+
475
+ return [
476
+ {
477
+ x: bMinMax.min.x,
478
+ y: bMinMax.min.y - yAxisOffset
479
+ },
480
+ {
481
+ x: bMinMax.max.x,
482
+ y: bMinMax.min.y - yAxisOffset
483
+ },
484
+ {
485
+ x: bMinMax.max.x,
486
+ y: bMinMax.max.y + yAxisOffset
487
+ },
488
+ {
489
+ x: bMinMax.min.x,
490
+ y: bMinMax.max.y + yAxisOffset
491
+ }
492
+ ];
493
+ }
494
+
495
+ function linearBezierMinMax([p0, p1]: [CourtPoint, CourtPoint]) {
496
+ const xValues = [p0.x, p1.x];
497
+ const yValues = [p0.y, p1.y];
498
+ return {
499
+ min: { x: Math.min.apply(0, xValues), y: Math.min.apply(0, yValues) },
500
+ max: { x: Math.max.apply(0, xValues), y: Math.max.apply(0, yValues) }
501
+ };
502
+ }
503
+
504
+ function cubicBezierMinMax([p0, p1, p2, p3]: [CourtPoint, CourtPoint, CourtPoint, CourtPoint]) {
505
+ const tValues: number[] = [];
506
+ const xValues: number[] = [];
507
+ const yValues: number[] = [];
508
+ let a: number;
509
+ let b: number;
510
+ let c: number;
511
+ let t: number;
512
+ let t1: number;
513
+ let t2: number;
514
+ let b2ac: number;
515
+ let sqrtb2ac: number;
516
+ for (let i = 0; i < 2; ++i) {
517
+ if (i === 0) {
518
+ b = 6 * p0.x - 12 * p1.x + 6 * p2.x;
519
+ a = -3 * p0.x + 9 * p1.x - 9 * p2.x + 3 * p3.x;
520
+ c = 3 * p1.x - 3 * p0.x;
521
+ } else {
522
+ b = 6 * p0.y - 12 * p1.y + 6 * p2.y;
523
+ a = -3 * p0.y + 9 * p1.y - 9 * p2.y + 3 * p3.y;
524
+ c = 3 * p1.y - 3 * p0.y;
525
+ }
526
+ if (Math.abs(a) < 1e-12) {
527
+ if (Math.abs(b) < 1e-12) {
528
+ continue;
529
+ }
530
+ t = -c / b;
531
+ if (t > 0 && t < 1) {
532
+ tValues.push(t);
533
+ }
534
+ continue;
535
+ }
536
+ b2ac = b * b - 4 * c * a;
537
+ if (b2ac < 0) {
538
+ if (Math.abs(b2ac) < 1e-12) {
539
+ t = -b / (2 * a);
540
+ if (t > 0 && t < 1) {
541
+ tValues.push(t);
542
+ }
543
+ }
544
+ continue;
545
+ }
546
+ sqrtb2ac = Math.sqrt(b2ac);
547
+ t1 = (-b + sqrtb2ac) / (2 * a);
548
+ if (t1 > 0 && t1 < 1) {
549
+ tValues.push(t1);
550
+ }
551
+ t2 = (-b - sqrtb2ac) / (2 * a);
552
+ if (t2 > 0 && t2 < 1) {
553
+ tValues.push(t2);
554
+ }
555
+ }
556
+
557
+ let j = tValues.length;
558
+ let mt: number;
559
+ while (j--) {
560
+ t = tValues[j];
561
+ mt = 1 - t;
562
+ xValues[j] = mt * mt * mt * p0.x + 3 * mt * mt * t * p1.x + 3 * mt * t * t * p2.x + t * t * t * p3.x;
563
+ yValues[j] = mt * mt * mt * p0.y + 3 * mt * mt * t * p1.y + 3 * mt * t * t * p2.y + t * t * t * p3.y;
564
+ }
565
+
566
+ xValues.push(p0.x, p3.x);
567
+ yValues.push(p0.y, p3.y);
568
+
569
+ return {
570
+ min: { x: Math.min.apply(0, xValues), y: Math.min.apply(0, yValues) },
571
+ max: { x: Math.max.apply(0, xValues), y: Math.max.apply(0, yValues) }
572
+ };
573
+ }
@@ -1,15 +1,24 @@
1
- const _ = require('lodash');
2
- const config = require('../config');
3
- const Frame = require('./Frame');
4
- const Line = require('./Line');
5
-
6
- class Animation {
7
- constructor(ctx, play) {
8
- this.ctx = ctx;
1
+ import _ from 'lodash';
2
+ import { debug } from '../config';
3
+ import FrameModel from './FrameModel';
4
+ import LineModel from './LineModel';
5
+ import PlayModel from './PlayModel';
6
+
7
+ export default class AnimationModel {
8
+ private play: PlayModel;
9
+ private readonly playBase: PlayModel;
10
+ private animationFrame: FrameModel;
11
+ private loopId: number | null;
12
+ private running: boolean;
13
+ private framesLoadTime: number[];
14
+ private timeStart: number | null;
15
+ private timeElapsed: number;
16
+ private timeElapsedSaved: number;
17
+
18
+ constructor(private ctx: CanvasRenderingContext2D, play: PlayModel) {
9
19
  this.play = _.cloneDeep(play);
10
20
  this.playBase = _.cloneDeep(play);
11
-
12
- this.animationFrame = new Frame(this.play, this.currentPlayPhase, this.globalProgress).setContext(this.ctx);
21
+ this.animationFrame = new FrameModel(this.play, this.currentPlayPhase, this.globalProgress).setContext(this.ctx);
13
22
 
14
23
  this.loopId = null;
15
24
  this.running = false;
@@ -37,8 +46,8 @@ class Animation {
37
46
  return parseInt(phaseInterval ? phaseInterval[0] : Object.keys(this.linesPhaseIntervals).pop());
38
47
  }
39
48
 
40
- get linesPhaseIntervals() {
41
- const result = {};
49
+ get linesPhaseIntervals(): Record<number, { min: number; max: number }> {
50
+ const result: Record<number, { min: number; max: number }> = {};
42
51
  this.play.playData.lines.forEach(line => {
43
52
  if (!result[line.phase]) result[line.phase] = { min: 0, max: 0 };
44
53
  line.animations.forEach(({ keyTimes }) => {
@@ -53,13 +62,13 @@ class Animation {
53
62
 
54
63
  get lastLineAnimationMax() {
55
64
  return this.play.playData.lines.reduce((result, line) => {
56
- const lineModel = new Line(line);
65
+ const lineModel = new LineModel(line);
57
66
  return result > lineModel.lastAnimEndTime ? result : lineModel.lastAnimEndTime;
58
67
  }, 0);
59
68
  }
60
69
 
61
- start(finishCallback, progressCallback) {
62
- if (config.debug) {
70
+ start(finishCallback: () => void, progressCallback: (progress: number) => void) {
71
+ if (debug) {
63
72
  console.log('Animate stared with duration', this.play.playData.animationDuration);
64
73
  console.log('this.play.playData.players', this.play.playData.players);
65
74
  console.log('this.play.playData.lines', this.play.playData.lines);
@@ -75,7 +84,7 @@ class Animation {
75
84
  this.timeElapsedSaved = this.timeElapsed;
76
85
  }
77
86
 
78
- setProgress(progress) {
87
+ setProgress(progress: number) {
79
88
  const elapsed = this.countTimeElapsedFromProgress(progress);
80
89
  this.timeElapsed = elapsed;
81
90
  this.timeElapsedSaved = elapsed;
@@ -88,7 +97,7 @@ class Animation {
88
97
  }
89
98
 
90
99
  drawPreviewFrame() {
91
- new Frame(this.play, this.currentPlayPhase, this.globalProgress).setContext(this.ctx).draw();
100
+ new FrameModel(this.play, this.currentPlayPhase, this.globalProgress).setContext(this.ctx).draw();
92
101
  }
93
102
 
94
103
  reset() {
@@ -98,11 +107,11 @@ class Animation {
98
107
  this.play = _.cloneDeep(this.playBase);
99
108
  }
100
109
 
101
- countTimeElapsedFromProgress(progress) {
110
+ countTimeElapsedFromProgress(progress: number) {
102
111
  return this.animationDuration * 1000 * progress;
103
112
  }
104
113
 
105
- drawFrame(finishCallback, progressCallback, timestamp) {
114
+ drawFrame(finishCallback: () => void, progressCallback: (progress: number) => void, timestamp: number) {
106
115
  if (!this.running) return;
107
116
 
108
117
  if (this.globalProgress >= this.lastLineAnimationMax) {
@@ -124,7 +133,7 @@ class Animation {
124
133
 
125
134
  this.timeElapsed = timestamp - this.timeStart + this.timeElapsedSaved;
126
135
 
127
- if (config.debug) {
136
+ if (debug) {
128
137
  console.log(
129
138
  `Frames: ${this.framesLoadTime.length}, Avg frame time: ${this.framesLoadTime.reduce((a, b) => a + b) /
130
139
  this.framesLoadTime.length}`
@@ -141,5 +150,3 @@ class Animation {
141
150
  requestAnimationFrame(this.drawFrame.bind(this, finishCallback, progressCallback));
142
151
  }
143
152
  }
144
-
145
- module.exports = Animation;
@@ -0,0 +1,23 @@
1
+ import { Line, Player, Note, Shape } from '../../types';
2
+ import { LineAdjusted } from '../LineModel';
3
+
4
+ export default class Model<M extends Line | Player | Note | Shape, A extends LineAdjusted | Player | Note | Shape> {
5
+ public readonly originalData: M;
6
+ private readonly adjustedData: A;
7
+ constructor(data: M) {
8
+ this.originalData = JSON.parse(JSON.stringify(data));
9
+ this.adjustedData = JSON.parse(JSON.stringify(data));
10
+ }
11
+
12
+ _getAttrOriginal<K extends keyof M>(attr: K) {
13
+ return typeof this.originalData[attr] !== 'undefined' ? this.originalData[attr] : null;
14
+ }
15
+
16
+ _getAttr<K extends keyof A>(attr: K) {
17
+ return typeof this.adjustedData[attr] !== 'undefined' ? this.adjustedData[attr] : null;
18
+ }
19
+
20
+ _setAttr<K extends keyof A>(attr: K, value: A[K]) {
21
+ this.adjustedData[attr] = value;
22
+ }
23
+ }