@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.
- package/.babelrc +2 -1
- package/.eslintrc +11 -42
- package/dist/play-rendering.d.ts +21 -0
- package/dist/play-rendering.js +17 -8
- package/dist/play-rendering.js.map +1 -1
- package/dist/types/constants.d.ts +41 -0
- package/dist/types/helpers/common.d.ts +5 -0
- package/dist/types/layers/court/index.d.ts +18 -0
- package/dist/types/math/Bezier.d.ts +19 -0
- package/dist/types/math/LineDrawingMath.d.ts +8 -0
- package/dist/types/models/AnimationModel.d.ts +21 -0
- package/dist/types/models/FrameModel.d.ts +39 -0
- package/dist/types/models/LineModel.d.ts +22 -0
- package/dist/types/models/NoteModel.d.ts +17 -0
- package/dist/types/models/PlayModel.d.ts +40 -0
- package/dist/types/models/PlayerModel.d.ts +20 -0
- package/dist/types/models/ShapeModel.d.ts +54 -0
- package/dist/types/models/ShapeModels/CircleShape.d.ts +8 -0
- package/dist/types/models/ShapeModels/ConeShape.d.ts +8 -0
- package/dist/types/models/ShapeModels/FovShape.d.ts +12 -0
- package/dist/types/models/ShapeModels/LineShape.d.ts +11 -0
- package/dist/types/models/ShapeModels/SquareShape.d.ts +8 -0
- package/dist/types/models/ShapeModels/StraightShape.d.ts +12 -0
- package/dist/types/models/ShapeModels/TriangleShape.d.ts +12 -0
- package/dist/types/models/ShapeModels/XMarkShape.d.ts +8 -0
- package/dist/types/models/ShapeModels/index.d.ts +14 -0
- package/dist/types/models/ShapeModels/line/CutLineShape.d.ts +3 -0
- package/dist/types/models/ShapeModels/line/DribbleLineShape.d.ts +3 -0
- package/dist/types/models/ShapeModels/line/HandoffLineShape.d.ts +3 -0
- package/dist/types/models/ShapeModels/line/PassLineShape.d.ts +3 -0
- package/dist/types/models/ShapeModels/line/ScreenLineShape.d.ts +3 -0
- package/dist/types/types/index.d.ts +138 -0
- package/package.json +16 -13
- package/src/config.ts +1 -0
- package/src/constants.ts +49 -0
- package/src/global.d.ts +9 -0
- package/src/helpers/common.ts +40 -0
- package/src/index.ts +36 -0
- package/src/layers/{CourtLayer.js → CourtLayer.ts} +4 -6
- package/src/layers/{LineControlPointLayer.js → LineControlPointLayer.ts} +2 -4
- package/src/layers/{LineLayer.js → LineLayer.ts} +5 -7
- package/src/layers/{NoteLayer.js → NoteLayer.ts} +19 -19
- package/src/layers/{PlayerLayer.js → PlayerLayer.ts} +6 -7
- package/src/layers/{ShapeControlPointLayer.js → ShapeControlPointLayer.ts} +2 -4
- package/src/layers/{ShapeLayer.js → ShapeLayer.ts} +4 -6
- package/src/layers/base/BaseLayer.ts +15 -0
- package/src/layers/base/InternalBaseLayer.ts +29 -0
- package/src/layers/court/base/{InternalCourtLayer.js → InternalCourtLayer.ts} +3 -5
- package/src/layers/court/index.ts +213 -0
- package/src/layers/court/layers/BASEBALL/constants.ts +5 -0
- package/src/layers/court/layers/BASEBALL/courtTypes/BASEBALL_HIGH_SCHOOL/constants.ts +34 -0
- package/src/layers/court/layers/BASEBALL/courtTypes/BASEBALL_HIGH_SCHOOL/layers/{ADirtLayer.js → ADirtLayer.ts} +14 -14
- package/src/layers/court/layers/BASEBALL/courtTypes/BASEBALL_HIGH_SCHOOL/layers/{BaseLineLayer.js → BaseLineLayer.ts} +4 -10
- package/src/layers/court/layers/BASEBALL/courtTypes/BASEBALL_HIGH_SCHOOL/layers/{HomePlateLayer.js → HomePlateLayer.ts} +14 -15
- package/src/layers/court/layers/BASEBALL/courtTypes/BASEBALL_HIGH_SCHOOL/layers/{PitchingMoundLayer.js → PitchingMoundLayer.ts} +7 -8
- package/src/layers/court/layers/BASEBALL/courtTypes/BASEBALL_HIGH_SCHOOL/layers/index.ts +6 -0
- package/src/layers/court/layers/{BASKETBALL/layers/BorderRectLayer.js → BASEBALL/layers/BorderRectLayer.ts} +2 -4
- package/src/layers/court/layers/BASEBALL/layers/index.ts +3 -0
- package/src/layers/court/layers/BASKETBALL/common/{LaneMarkingNBATrait.js → LaneMarkingNBATrait.ts} +1 -1
- package/src/layers/court/layers/BASKETBALL/common/{LaneMarkingNCAATrait.js → LaneMarkingNCAATrait.ts} +1 -1
- package/src/layers/court/layers/BASKETBALL/constants.ts +5 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/constants.ts +11 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/layers/{Big3Layer.js → Big3Layer.ts} +2 -4
- package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/layers/LaneMarkingLayer.ts +10 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/layers/index.ts +4 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/FIBA/constants.ts +11 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/FIBA/layers/{LaneMarkingLayer.js → LaneMarkingLayer.ts} +2 -4
- package/src/layers/court/layers/BASKETBALL/courtTypes/FIBA/layers/index.ts +3 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/NBA/constants.ts +11 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/NBA/layers/LaneMarkingLayer.ts +10 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/NBA/layers/index.ts +3 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAM/constants.ts +11 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAM/layers/LaneMarkingLayer.ts +10 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAM/layers/index.ts +3 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAW/constants.ts +11 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAW/layers/LaneMarkingLayer.ts +10 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAW/layers/index.ts +3 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/US_HIGH_SCHOOL/constants.ts +11 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/US_HIGH_SCHOOL/layers/LaneMarkingLayer.ts +10 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/US_HIGH_SCHOOL/layers/index.ts +3 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/US_JUNIOR_HIGH/constants.ts +11 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/US_JUNIOR_HIGH/layers/LaneMarkingLayer.ts +10 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/US_JUNIOR_HIGH/layers/index.ts +3 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/WNBA/constants.ts +11 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/WNBA/layers/LaneMarkingLayer.ts +10 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/WNBA/layers/index.ts +3 -0
- package/src/layers/court/layers/BASKETBALL/layers/{BaseLineMarkingLayer.js → BaseLineMarkingLayer.ts} +3 -4
- package/src/layers/court/layers/BASKETBALL/layers/{BenchAreaLayer.js → BenchAreaLayer.ts} +2 -4
- package/src/layers/court/layers/{LACROSSE/layers/BorderRectLayer.js → BASKETBALL/layers/BorderRectLayer.ts} +2 -4
- package/src/layers/court/layers/BASKETBALL/layers/{CenterCircleLayer.js → CenterCircleLayer.ts} +2 -4
- package/src/layers/court/layers/{FOOTBALL/layers/CenterLineLayer.js → BASKETBALL/layers/CenterLineLayer.ts} +2 -4
- package/src/layers/court/layers/BASKETBALL/layers/{FreeThrowLayer.js → FreeThrowLayer.ts} +2 -4
- package/src/layers/court/layers/BASKETBALL/layers/{HoopLayer.js → HoopLayer.ts} +2 -4
- package/src/layers/court/layers/BASKETBALL/layers/{InnerOuterRectLayer.js → InnerOuterRectLayer.ts} +2 -4
- package/src/layers/court/layers/BASKETBALL/layers/{RestrictedAreaLayer.js → RestrictedAreaLayer.ts} +3 -4
- package/src/layers/court/layers/BASKETBALL/layers/{ThreePointLineLayer.js → ThreePointLineLayer.ts} +2 -4
- package/src/layers/court/layers/BASKETBALL/layers/index.ts +23 -0
- package/src/layers/court/layers/FOOTBALL/constants.ts +5 -0
- package/src/layers/court/layers/FOOTBALL/courtTypes/FOOTBALL_HIGH_SCHOOL/constants.ts +3 -0
- package/src/layers/court/layers/{BASEBALL/layers/BorderRectLayer.js → FOOTBALL/layers/BorderRectLayer.ts} +2 -4
- package/src/layers/court/layers/{SOCCER/layers/CenterLineLayer.js → FOOTBALL/layers/CenterLineLayer.ts} +2 -4
- package/src/layers/court/layers/FOOTBALL/layers/{EndZoneLayer.js → EndZoneLayer.ts} +2 -4
- package/src/layers/court/layers/FOOTBALL/layers/{FieldNumberLayer.js → FieldNumberLayer.ts} +2 -4
- package/src/layers/court/layers/FOOTBALL/layers/{HashMarkLayer.js → HashMarkLayer.ts} +2 -4
- package/src/layers/court/layers/FOOTBALL/layers/{YardLineLayer.js → YardLineLayer.ts} +2 -4
- package/src/layers/court/layers/FOOTBALL/layers/index.ts +8 -0
- package/src/layers/court/layers/HOCKEY/constants.ts +5 -0
- package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_INTERNATIONAL/constants.ts +12 -0
- package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_INTERNATIONAL/layers/{GoaCreaseLayer.js → GoaCreaseLayer.ts} +2 -4
- package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_INTERNATIONAL/layers/index.ts +3 -0
- package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_NHL/constants.ts +12 -0
- package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_NHL/layers/{GoaCreaseLayer.js → GoaCreaseLayer.ts} +2 -4
- package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_NHL/layers/index.ts +3 -0
- package/src/layers/court/layers/HOCKEY/layers/{BorderRinkLayer.js → BorderRinkLayer.ts} +2 -4
- package/src/layers/court/layers/HOCKEY/layers/{CenterCircleLayer.js → CenterCircleLayer.ts} +2 -4
- package/src/layers/court/layers/HOCKEY/layers/{CenterLineLayer.js → CenterLineLayer.ts} +2 -4
- package/src/layers/court/layers/HOCKEY/layers/{CenterSpotLayer.js → CenterSpotLayer.ts} +2 -4
- package/src/layers/court/layers/HOCKEY/layers/{EndZoneLayer.js → EndZoneLayer.ts} +2 -4
- package/src/layers/court/layers/HOCKEY/layers/{GoalLineLayer.js → GoalLineLayer.ts} +2 -4
- package/src/layers/court/layers/HOCKEY/layers/{NeutralZoneLayer.js → NeutralZoneLayer.ts} +2 -4
- package/src/layers/court/layers/HOCKEY/layers/{RefereeCreaseLayer.js → RefereeCreaseLayer.ts} +2 -4
- package/src/layers/court/layers/HOCKEY/layers/index.ts +19 -0
- package/src/layers/court/layers/LACROSSE/constants.ts +5 -0
- package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_M/constants.ts +4 -0
- package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_M/layers/{CenterLineLayer.js → CenterLineLayer.ts} +2 -4
- package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_M/layers/{GoalAreaLineLayer.js → GoalAreaLineLayer.ts} +2 -4
- package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_M/layers/{WingAreaLineLayer.js → WingAreaLineLayer.ts} +2 -4
- package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_M/layers/index.ts +5 -0
- package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_W/constants.ts +3 -0
- package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_W/layers/{CenterLineLayer.js → CenterLineLayer.ts} +2 -4
- package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_W/layers/{FanLineLayer.js → FanLineLayer.ts} +2 -4
- package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_W/layers/index.ts +4 -0
- package/src/layers/court/layers/{FOOTBALL/layers/BorderRectLayer.js → LACROSSE/layers/BorderRectLayer.ts} +2 -4
- package/src/layers/court/layers/LACROSSE/layers/{RestrainingLineLayer.js → RestrainingLineLayer.ts} +2 -4
- package/src/layers/court/layers/LACROSSE/layers/index.ts +4 -0
- package/src/layers/court/layers/SOCCER/constants.ts +5 -0
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_FIFA/constants.ts +7 -0
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NCAA/constants.ts +7 -0
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NCAA/layers/{CenterSpotLayer.js → CenterSpotLayer.ts} +2 -4
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NCAA/layers/{HashMarkLayer.js → HashMarkLayer.ts} +2 -4
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NCAA/layers/{PenaltySpotLayer.js → PenaltySpotLayer.ts} +2 -4
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NCAA/layers/index.ts +5 -0
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NFHS/constants.ts +7 -0
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NFHS/layers/{HashMarkLayer.js → HashMarkLayer.ts} +2 -4
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NFHS/layers/{PenaltySpotLayer.js → PenaltySpotLayer.ts} +2 -4
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NFHS/layers/index.ts +4 -0
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U10/constants.ts +7 -0
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U10/layers/{BuildOutLineLayer.js → BuildOutLineLayer.ts} +2 -4
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U10/layers/{PenaltyArcLayer.js → PenaltyArcLayer.ts} +2 -4
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U10/layers/index.ts +4 -0
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U12/constants.ts +7 -0
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U12/layers/{PenaltyArcLayer.js → PenaltyArcLayer.ts} +2 -4
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U12/layers/index.ts +3 -0
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U19/constants.ts +7 -0
- package/src/layers/court/layers/SOCCER/layers/BorderRectLayer.ts +10 -0
- package/src/layers/court/layers/SOCCER/layers/{CenterCircleLayer.js → CenterCircleLayer.ts} +2 -4
- package/src/layers/court/layers/{BASKETBALL/layers/CenterLineLayer.js → SOCCER/layers/CenterLineLayer.ts} +2 -4
- package/src/layers/court/layers/SOCCER/layers/{CenterSpotLayer.js → CenterSpotLayer.ts} +2 -4
- package/src/layers/court/layers/SOCCER/layers/{CornerLayer.js → CornerLayer.ts} +3 -4
- package/src/layers/court/layers/SOCCER/layers/{PenaltyArcLayer.js → PenaltyArcLayer.ts} +2 -4
- package/src/layers/court/layers/SOCCER/layers/{PenaltyAreaLayer.js → PenaltyAreaLayer.ts} +2 -4
- package/src/layers/court/layers/SOCCER/layers/{PenaltySpotLayer.js → PenaltySpotLayer.ts} +2 -4
- package/src/layers/court/layers/SOCCER/layers/index.ts +19 -0
- package/src/layers/court/layers/VOLLEYBALL/constants.ts +5 -0
- package/src/layers/court/layers/VOLLEYBALL/courtTypes/VOLLEYBALL_INDOOR/constants.ts +2 -0
- package/src/layers/court/layers/VOLLEYBALL/layers/{AttackLineLayer.js → AttackLineLayer.ts} +3 -4
- package/src/layers/court/layers/VOLLEYBALL/layers/BorderRectLayer.ts +10 -0
- package/src/layers/court/layers/VOLLEYBALL/layers/{CenterLineLayer.js → CenterLineLayer.ts} +2 -4
- package/src/layers/court/layers/VOLLEYBALL/layers/{HashMarkLayer.js → HashMarkLayer.ts} +3 -4
- package/src/layers/court/layers/VOLLEYBALL/layers/index.ts +6 -0
- package/src/layers/line/base/{ActionLineLayer.js → ActionLineLayer.ts} +2 -4
- package/src/layers/line/base/{InternalLineLayer.js → InternalLineLayer.ts} +30 -10
- package/src/layers/line/index.ts +8 -0
- package/src/layers/line/layers/CutLineLayer.ts +7 -0
- package/src/layers/line/layers/{DribbleLineLayer.js → DribbleLineLayer.ts} +14 -8
- package/src/layers/line/layers/{HandoffLineLayer.js → HandoffLineLayer.ts} +4 -5
- package/src/layers/line/layers/PassLineLayer.ts +11 -0
- package/src/layers/line/layers/ScreenLineLayer.ts +7 -0
- package/src/layers/line/layers/{ShotLineLayer.js → ShotLineLayer.ts} +2 -4
- package/src/layers/shape/base/{InternalShapeLayer.js → InternalShapeLayer.ts} +7 -5
- package/src/layers/shape/index.ts +28 -0
- package/src/layers/shape/layers/{CircleShapeLayer.js → CircleShapeLayer.ts} +2 -4
- package/src/layers/shape/layers/{ConeShapeLayer.js → ConeShapeLayer.ts} +2 -4
- package/src/layers/shape/layers/{FovShapeLayer.js → FovShapeLayer.ts} +2 -4
- package/src/layers/shape/layers/{SquareShapeLayer.js → SquareShapeLayer.ts} +2 -4
- package/src/layers/shape/layers/{StraightShapeLayer.js → StraightShapeLayer.ts} +2 -4
- package/src/layers/shape/layers/{TriangleShapeLayer.js → TriangleShapeLayer.ts} +2 -4
- package/src/layers/shape/layers/{XmarkShapeLayer.js → XmarkShapeLayer.ts} +2 -4
- package/src/layers/shape/layers/line/CutLineShapeLayer.ts +11 -0
- package/src/layers/shape/layers/line/DribbleLineShapeLayer.ts +26 -0
- package/src/layers/shape/layers/line/HandoffLineShapeLayer.ts +11 -0
- package/src/layers/shape/layers/line/PassLineShapeLayer.ts +15 -0
- package/src/layers/shape/layers/line/ScreenLineShapeLayer.ts +11 -0
- package/src/layers/shape/layers/line/base/InternalLineShapeLayer.ts +44 -0
- package/src/math/{Bezier.js → Bezier.ts} +48 -46
- package/src/math/LineDrawingMath.ts +573 -0
- package/src/models/{Animation.js → AnimationModel.ts} +29 -22
- package/src/models/Base/InternalFrameModel.ts +23 -0
- package/src/models/{Frame.js → FrameModel.ts} +136 -82
- package/src/models/{Line.js → LineModel.ts} +26 -14
- package/src/models/{Note.js → NoteModel.ts} +12 -11
- package/src/models/Play/Options.ts +31 -0
- package/src/models/PlayModel.ts +139 -0
- package/src/models/{Player.js → PlayerModel.ts} +5 -6
- package/src/models/{Shape.js → ShapeModel.ts} +9 -10
- package/src/models/ShapeModels/{CircleShape.js → CircleShape.ts} +2 -4
- package/src/models/ShapeModels/{ConeShape.js → ConeShape.ts} +2 -4
- package/src/models/ShapeModels/{FovShape.js → FovShape.ts} +2 -4
- package/src/models/ShapeModels/{LineShape.js → LineShape.ts} +4 -6
- package/src/models/ShapeModels/{XMarkShape.js → SquareShape.ts} +2 -4
- package/src/models/ShapeModels/{StraightShape.js → StraightShape.ts} +2 -4
- package/src/models/ShapeModels/{TriangleShape.js → TriangleShape.ts} +2 -4
- package/src/models/ShapeModels/{SquareShape.js → XMarkShape.ts} +2 -4
- package/src/models/ShapeModels/index.ts +30 -0
- package/src/models/ShapeModels/line/CutLineShape.ts +3 -0
- package/src/models/ShapeModels/line/DribbleLineShape.ts +3 -0
- package/src/models/ShapeModels/line/HandoffLineShape.ts +3 -0
- package/src/models/ShapeModels/line/PassLineShape.ts +3 -0
- package/src/models/ShapeModels/line/ScreenLineShape.ts +3 -0
- package/src/playerHatsConfig.ts +39 -0
- package/src/shapesConfig.ts +8 -0
- package/src/traits/{DribbleLineTrait.js → DribbleLineTrait.ts} +12 -10
- package/src/traits/{LineDrawOperationsTrait.js → LineDrawOperationsTrait.ts} +12 -9
- package/src/types/index.ts +205 -0
- package/tsconfig.json +21 -0
- package/webpack.config.js +5 -8
- package/index.js +0 -17
- package/src/config.js +0 -3
- package/src/constants.js +0 -51
- package/src/helpers/common.js +0 -12
- package/src/layers/base/BaseLayer.js +0 -20
- package/src/layers/base/InternalBaseLayer.js +0 -22
- package/src/layers/court/index.js +0 -64
- package/src/layers/court/layers/BASEBALL/constants.js +0 -7
- package/src/layers/court/layers/BASEBALL/courtTypes/BASEBALL_HIGH_SCHOOL/constants.js +0 -36
- package/src/layers/court/layers/BASKETBALL/constants.js +0 -7
- package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/constants.js +0 -13
- package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/layers/LaneMarkingLayer.js +0 -12
- package/src/layers/court/layers/BASKETBALL/courtTypes/FIBA/constants.js +0 -13
- package/src/layers/court/layers/BASKETBALL/courtTypes/NBA/constants.js +0 -13
- package/src/layers/court/layers/BASKETBALL/courtTypes/NBA/layers/LaneMarkingLayer.js +0 -12
- package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAM/constants.js +0 -13
- package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAM/layers/LaneMarkingLayer.js +0 -12
- package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAW/constants.js +0 -13
- package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAW/layers/LaneMarkingLayer.js +0 -12
- package/src/layers/court/layers/BASKETBALL/courtTypes/US_HIGH_SCHOOL/constants.js +0 -13
- package/src/layers/court/layers/BASKETBALL/courtTypes/US_HIGH_SCHOOL/layers/LaneMarkingLayer.js +0 -12
- package/src/layers/court/layers/BASKETBALL/courtTypes/US_JUNIOR_HIGH/constants.js +0 -13
- package/src/layers/court/layers/BASKETBALL/courtTypes/US_JUNIOR_HIGH/layers/LaneMarkingLayer.js +0 -12
- package/src/layers/court/layers/BASKETBALL/courtTypes/WNBA/constants.js +0 -13
- package/src/layers/court/layers/BASKETBALL/courtTypes/WNBA/layers/LaneMarkingLayer.js +0 -12
- package/src/layers/court/layers/FOOTBALL/constants.js +0 -7
- package/src/layers/court/layers/FOOTBALL/courtTypes/FOOTBALL_HIGH_SCHOOL/constants.js +0 -5
- package/src/layers/court/layers/HOCKEY/constants.js +0 -7
- package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_INTERNATIONAL/constants.js +0 -14
- package/src/layers/court/layers/HOCKEY/courtTypes/HOCKEY_NHL/constants.js +0 -14
- package/src/layers/court/layers/LACROSSE/constants.js +0 -7
- package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_M/constants.js +0 -6
- package/src/layers/court/layers/LACROSSE/courtTypes/LACROSSE_US_W/constants.js +0 -5
- package/src/layers/court/layers/SOCCER/constants.js +0 -7
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_FIFA/constants.js +0 -9
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NCAA/constants.js +0 -9
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_NFHS/constants.js +0 -9
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U10/constants.js +0 -9
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U12/constants.js +0 -9
- package/src/layers/court/layers/SOCCER/courtTypes/SOCCER_U19/constants.js +0 -9
- package/src/layers/court/layers/SOCCER/layers/BorderRectLayer.js +0 -12
- package/src/layers/court/layers/VOLLEYBALL/constants.js +0 -7
- package/src/layers/court/layers/VOLLEYBALL/courtTypes/VOLLEYBALL_INDOOR/constants.js +0 -4
- package/src/layers/court/layers/VOLLEYBALL/layers/BorderRectLayer.js +0 -12
- package/src/layers/line/index.js +0 -11
- package/src/layers/line/layers/CutLineLayer.js +0 -9
- package/src/layers/line/layers/PassLineLayer.js +0 -13
- package/src/layers/line/layers/ScreenLineLayer.js +0 -9
- package/src/layers/shape/index.js +0 -17
- package/src/layers/shape/layers/line/CutLineShapeLayer.js +0 -13
- package/src/layers/shape/layers/line/DribbleLineShapeLayer.js +0 -20
- package/src/layers/shape/layers/line/HandoffLineShapeLayer.js +0 -13
- package/src/layers/shape/layers/line/PassLineShapeLayer.js +0 -17
- package/src/layers/shape/layers/line/ScreenLineShapeLayer.js +0 -13
- package/src/layers/shape/layers/line/base/InternalLineShapeLayer.js +0 -34
- package/src/math/LineDrawingMath.js +0 -570
- package/src/models/Base/InternalFrameModel.js +0 -20
- package/src/models/Play/Options.js +0 -31
- package/src/models/Play.js +0 -91
- package/src/models/ShapeModels/index.js +0 -18
- package/src/models/ShapeModels/line/CutLineShape.js +0 -5
- package/src/models/ShapeModels/line/DribbleLineShape.js +0 -5
- package/src/models/ShapeModels/line/HandoffLineShape.js +0 -5
- package/src/models/ShapeModels/line/PassLineShape.js +0 -5
- package/src/models/ShapeModels/line/ScreenLineShape.js +0 -5
- package/src/playerHatsConfig.js +0 -29
- 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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
|
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 (
|
|
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
|
|
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 (
|
|
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
|
+
}
|