@luceosports/play-rendering 1.12.5 → 1.13.1
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/dist/play-rendering.js +3 -3
- package/dist/play-rendering.js.map +1 -1
- package/index.js +2 -1
- package/package.json +1 -1
- package/src/constants.js +19 -19
- package/src/layers/CourtLayer.js +8 -4
- package/src/layers/base/BaseLayer.js +7 -2
- package/src/layers/court/base/InternalCourtLayer.js +7 -0
- package/src/layers/court/index.js +48 -6
- package/src/layers/court/layers/BASKETBALL/common/LaneMarkingNBATrait.js +34 -0
- package/src/layers/court/layers/BASKETBALL/common/LaneMarkingNCAATrait.js +30 -0
- package/src/layers/court/layers/BASKETBALL/constants.js +7 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/constants.js +13 -0
- package/src/layers/court/layers/{NBA → BASKETBALL/courtTypes/BIG3/layers}/Big3Layer.js +4 -9
- package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/layers/LaneMarkingLayer.js +12 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/FIBA/constants.js +13 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/FIBA/layers/LaneMarkingLayer.js +38 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/NBA/constants.js +13 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/NBA/layers/LaneMarkingLayer.js +12 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAM/constants.js +13 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAM/layers/LaneMarkingLayer.js +12 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAW/constants.js +13 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAW/layers/LaneMarkingLayer.js +12 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/US_HIGH_SCHOOL/constants.js +13 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/US_HIGH_SCHOOL/layers/LaneMarkingLayer.js +12 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/US_JUNIOR_HIGH/constants.js +13 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/US_JUNIOR_HIGH/layers/LaneMarkingLayer.js +12 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/WNBA/constants.js +13 -0
- package/src/layers/court/layers/BASKETBALL/courtTypes/WNBA/layers/LaneMarkingLayer.js +12 -0
- package/src/layers/court/layers/{NBA → BASKETBALL/layers}/BaseLineMarkingLayer.js +8 -5
- package/src/layers/court/layers/{NBA → BASKETBALL/layers}/BenchAreaLayer.js +6 -4
- package/src/layers/court/layers/BASKETBALL/layers/BorderRectLayer.js +12 -0
- package/src/layers/court/layers/BASKETBALL/layers/CenterCircleLayer.js +21 -0
- package/src/layers/court/layers/BASKETBALL/layers/CenterLineLayer.js +16 -0
- package/src/layers/court/layers/{NBA → BASKETBALL/layers}/FreeThrowLayer.js +5 -3
- package/src/layers/court/layers/BASKETBALL/layers/HoopLayer.js +26 -0
- package/src/layers/court/layers/BASKETBALL/layers/InnerOuterRectLayer.js +24 -0
- package/src/layers/court/layers/{NBA → BASKETBALL/layers}/RestrictedAreaLayer.js +6 -5
- package/src/layers/court/layers/BASKETBALL/layers/ThreePointLineLayer.js +42 -0
- package/src/layers/court/layers/FOOTBALL/constants.js +9 -0
- package/src/layers/court/layers/FOOTBALL/courtTypes/HIGH_SCHOOL_FOOTBALL/constants.js +3 -0
- package/src/layers/court/layers/FOOTBALL/layers/BorderRectLayer.js +12 -0
- package/src/layers/court/layers/FOOTBALL/layers/CenterLineLayer.js +16 -0
- package/src/layers/court/layers/FOOTBALL/{EndZoneLayer.js → layers/EndZoneLayer.js} +3 -6
- package/src/layers/court/layers/FOOTBALL/{FieldNumberLayer.js → layers/FieldNumberLayer.js} +4 -7
- package/src/layers/court/layers/FOOTBALL/{HashMarkLayer.js → layers/HashMarkLayer.js} +11 -13
- package/src/layers/court/layers/FOOTBALL/layers/YardLineLayer.js +23 -0
- package/src/models/Frame.js +21 -2
- package/src/models/Play/Options.js +0 -1
- package/src/models/Play.js +3 -3
- package/src/layers/court/layers/FOOTBALL/BorderRectLayer.js +0 -15
- package/src/layers/court/layers/FOOTBALL/CenterLineLayer.js +0 -19
- package/src/layers/court/layers/FOOTBALL/YardLineLayer.js +0 -25
- package/src/layers/court/layers/NBA/BorderRectLayer.js +0 -15
- package/src/layers/court/layers/NBA/CenterCircleLayer.js +0 -21
- package/src/layers/court/layers/NBA/CenterLineLayer.js +0 -19
- package/src/layers/court/layers/NBA/HoopLayer.js +0 -24
- package/src/layers/court/layers/NBA/InnerOuterRectLayer.js +0 -26
- package/src/layers/court/layers/NBA/LaneMarkingLayer.js +0 -65
- package/src/layers/court/layers/NBA/ThreePointLineLayer.js +0 -35
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const InternalCourtLayer = require('
|
|
1
|
+
const InternalCourtLayer = require('../../../base/InternalCourtLayer');
|
|
2
2
|
|
|
3
3
|
class FreeThrowLayer extends InternalCourtLayer {
|
|
4
4
|
reflection() {
|
|
@@ -6,8 +6,8 @@ class FreeThrowLayer extends InternalCourtLayer {
|
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
drawLogic() {
|
|
9
|
-
const freeThrowSemiCircleCenterPoint = { x:
|
|
10
|
-
const freeThrowSemiCircleRadius =
|
|
9
|
+
const freeThrowSemiCircleCenterPoint = { x: this.courtCenter.x, y: 19.0 };
|
|
10
|
+
const freeThrowSemiCircleRadius = this.courtTypeConstants.FREE_THROW_INNER_WIDTH / 2;
|
|
11
11
|
|
|
12
12
|
this.ctx.beginPath();
|
|
13
13
|
this.ctx.arc(
|
|
@@ -20,6 +20,8 @@ class FreeThrowLayer extends InternalCourtLayer {
|
|
|
20
20
|
);
|
|
21
21
|
this.ctx.stroke();
|
|
22
22
|
|
|
23
|
+
if (!this.courtTypeConstants.FREE_THROW_INNER_DASHED_CIRCLE) return;
|
|
24
|
+
|
|
23
25
|
this.ctx.setLineDash([1, 0.5]);
|
|
24
26
|
this.ctx.beginPath();
|
|
25
27
|
this.ctx.arc(
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const InternalCourtLayer = require('../../../base/InternalCourtLayer');
|
|
2
|
+
|
|
3
|
+
const COURT_HOOP_LINE_OFFSET = 3;
|
|
4
|
+
|
|
5
|
+
class HoopLayer extends InternalCourtLayer {
|
|
6
|
+
reflection() {
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
drawLogic() {
|
|
11
|
+
const courtHoopRadius = 0.75;
|
|
12
|
+
const courtHoopCenter = { x: this.courtCenter.x, y: 5.25 };
|
|
13
|
+
const courtHoopLineOrigin = { x: courtHoopCenter.x - COURT_HOOP_LINE_OFFSET, y: 4.0 };
|
|
14
|
+
const courtHoopLineTerminus = { x: courtHoopCenter.x + COURT_HOOP_LINE_OFFSET, y: 4.0 };
|
|
15
|
+
|
|
16
|
+
this.ctx.beginPath();
|
|
17
|
+
this.ctx.moveTo(courtHoopLineOrigin.x, courtHoopLineOrigin.y);
|
|
18
|
+
this.ctx.lineTo(courtHoopLineTerminus.x, courtHoopLineTerminus.y);
|
|
19
|
+
this.ctx.stroke();
|
|
20
|
+
this.ctx.beginPath();
|
|
21
|
+
this.ctx.arc(courtHoopCenter.x, courtHoopCenter.y, courtHoopRadius, 0, 2 * Math.PI, true);
|
|
22
|
+
this.ctx.stroke();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
module.exports = HoopLayer;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const InternalCourtLayer = require('../../../base/InternalCourtLayer');
|
|
2
|
+
|
|
3
|
+
class InnerOuterRectLayer extends InternalCourtLayer {
|
|
4
|
+
reflection() {
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
drawLogic() {
|
|
9
|
+
const courtRectHeight = 19;
|
|
10
|
+
const courtInnerRectWidth = this.courtTypeConstants.FREE_THROW_INNER_WIDTH;
|
|
11
|
+
const courtOuterRectWidth = this.courtTypeConstants.FREE_THROW_OUTER_WIDTH;
|
|
12
|
+
const courtInnerRectOrigin = { x: this.courtCenter.x - courtInnerRectWidth / 2, y: 0 };
|
|
13
|
+
const courtOuterRectOrigin = { x: this.courtCenter.x - courtOuterRectWidth / 2, y: 0 };
|
|
14
|
+
|
|
15
|
+
this.ctx.beginPath();
|
|
16
|
+
this.ctx.rect(courtInnerRectOrigin.x, courtInnerRectOrigin.y, courtInnerRectWidth, courtRectHeight);
|
|
17
|
+
this.ctx.stroke();
|
|
18
|
+
this.ctx.beginPath();
|
|
19
|
+
this.ctx.rect(courtOuterRectOrigin.x, courtOuterRectOrigin.y, courtOuterRectWidth, courtRectHeight);
|
|
20
|
+
this.ctx.stroke();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
module.exports = InnerOuterRectLayer;
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
const InternalCourtLayer = require('
|
|
1
|
+
const InternalCourtLayer = require('../../../base/InternalCourtLayer');
|
|
2
2
|
|
|
3
|
+
const RESTRICTED_AREA_MARK_OFFSET = 4;
|
|
3
4
|
class RestrictedAreaLayer extends InternalCourtLayer {
|
|
4
5
|
reflection() {
|
|
5
6
|
return true;
|
|
6
7
|
}
|
|
7
8
|
|
|
8
9
|
drawLogic() {
|
|
9
|
-
const restrictedAreaCourtHoopCenter = { x: 25.0, y: 5.25 };
|
|
10
10
|
const restrictedAreaCourtRadius = 4.0;
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const
|
|
11
|
+
const restrictedAreaCourtHoopCenter = { x: this.courtCenter.x, y: 5.25 };
|
|
12
|
+
const restrictedAreaCourtStartPoint = { x: this.courtCenter.x + RESTRICTED_AREA_MARK_OFFSET, y: 4.0 };
|
|
13
|
+
const restrictedAreaCourtFirstLineTerminus = { x: this.courtCenter.x + RESTRICTED_AREA_MARK_OFFSET, y: 5.25 };
|
|
14
|
+
const restrictedAreaCourtEndPoint = { x: this.courtCenter.x - RESTRICTED_AREA_MARK_OFFSET, y: 4.0 };
|
|
14
15
|
|
|
15
16
|
this.ctx.beginPath();
|
|
16
17
|
this.ctx.moveTo(restrictedAreaCourtStartPoint.x, restrictedAreaCourtStartPoint.y);
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
const InternalCourtLayer = require('../../../base/InternalCourtLayer');
|
|
2
|
+
|
|
3
|
+
class ThreePointLineLayer extends InternalCourtLayer {
|
|
4
|
+
reflection() {
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
drawLogic() {
|
|
9
|
+
const courtRimDistanceToBackboard = 0.5;
|
|
10
|
+
const courtThreePointOffsetOrigin = this.courtCenter.x - this.courtTypeConstants.HOOP_CORNER_DISTANCE;
|
|
11
|
+
const courtThreePointOffsetTerminus = this.courtTypeConstants.COURT_RECT_WIDTH - courtThreePointOffsetOrigin;
|
|
12
|
+
const courtThreePointOrigin = { x: courtThreePointOffsetOrigin, y: 0.0 };
|
|
13
|
+
const courtThreePointFirstLineTerminus = {
|
|
14
|
+
x: courtThreePointOffsetOrigin,
|
|
15
|
+
y: this.courtTypeConstants.THREE_POINT_OFFSET_ORIGIN_Y_APPROX
|
|
16
|
+
};
|
|
17
|
+
const courtThreePointSecondLineTerminus = { x: courtThreePointOffsetTerminus, y: 0.0 };
|
|
18
|
+
const courtThreePointHoopCenter = { x: this.courtCenter.x, y: 4.75 + courtRimDistanceToBackboard };
|
|
19
|
+
|
|
20
|
+
const endAngle = Math.asin(
|
|
21
|
+
(this.courtTypeConstants.THREE_POINT_ASIN_APPROX - 0.75 - courtRimDistanceToBackboard) /
|
|
22
|
+
this.courtTypeConstants.THREE_POINT_ARC_RADIUS
|
|
23
|
+
);
|
|
24
|
+
const startAngle = Math.PI - endAngle;
|
|
25
|
+
|
|
26
|
+
this.ctx.beginPath();
|
|
27
|
+
this.ctx.moveTo(courtThreePointOrigin.x, courtThreePointOrigin.y);
|
|
28
|
+
this.ctx.lineTo(courtThreePointFirstLineTerminus.x, courtThreePointFirstLineTerminus.y);
|
|
29
|
+
this.ctx.arc(
|
|
30
|
+
courtThreePointHoopCenter.x,
|
|
31
|
+
courtThreePointHoopCenter.y,
|
|
32
|
+
this.courtTypeConstants.THREE_POINT_ARC_RADIUS,
|
|
33
|
+
startAngle,
|
|
34
|
+
endAngle,
|
|
35
|
+
true
|
|
36
|
+
);
|
|
37
|
+
this.ctx.lineTo(courtThreePointSecondLineTerminus.x, courtThreePointSecondLineTerminus.y);
|
|
38
|
+
this.ctx.stroke();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
module.exports = ThreePointLineLayer;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const InternalCourtLayer = require('../../../base/InternalCourtLayer');
|
|
2
|
+
|
|
3
|
+
class BorderRectLayer extends InternalCourtLayer {
|
|
4
|
+
drawLogic() {
|
|
5
|
+
this.ctx.beginPath();
|
|
6
|
+
this.ctx.lineWidth = this.courtTypeConstants.COURT_LINE_WIDTH * 2;
|
|
7
|
+
this.ctx.rect(0, 0, this.courtTypeConstants.COURT_RECT_WIDTH, this.courtTypeConstants.COURT_RECT_HEIGHT);
|
|
8
|
+
this.ctx.stroke();
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
module.exports = BorderRectLayer;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const InternalCourtLayer = require('../../../base/InternalCourtLayer');
|
|
2
|
+
|
|
3
|
+
class CenterLineLayer extends InternalCourtLayer {
|
|
4
|
+
drawLogic() {
|
|
5
|
+
const courtOrigin = { x: 0.0, y: this.courtCenter.y };
|
|
6
|
+
const courtTerminus = { x: this.courtTypeConstants.COURT_RECT_WIDTH, y: this.courtCenter.y };
|
|
7
|
+
|
|
8
|
+
this.ctx.beginPath();
|
|
9
|
+
this.ctx.lineWidth = this.courtTypeConstants.COURT_LINE_WIDTH * 2;
|
|
10
|
+
this.ctx.moveTo(courtOrigin.x, courtOrigin.y);
|
|
11
|
+
this.ctx.lineTo(courtTerminus.x, courtTerminus.y);
|
|
12
|
+
this.ctx.stroke();
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
module.exports = CenterLineLayer;
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
const InternalCourtLayer = require('
|
|
2
|
-
const {
|
|
3
|
-
FOOTBALL: { COURT_RECT_WIDTH, COURT_LINE_WIDTH }
|
|
4
|
-
} = require('../../../../constants');
|
|
1
|
+
const InternalCourtLayer = require('../../../base/InternalCourtLayer');
|
|
5
2
|
|
|
6
3
|
class EndZoneLayer extends InternalCourtLayer {
|
|
7
4
|
reflection() {
|
|
@@ -10,10 +7,10 @@ class EndZoneLayer extends InternalCourtLayer {
|
|
|
10
7
|
|
|
11
8
|
drawLogic() {
|
|
12
9
|
const courtOrigin = { x: 0.0, y: 30 };
|
|
13
|
-
const courtTerminus = { x: COURT_RECT_WIDTH, y: 30 };
|
|
10
|
+
const courtTerminus = { x: this.courtTypeConstants.COURT_RECT_WIDTH, y: 30 };
|
|
14
11
|
|
|
15
12
|
this.ctx.beginPath();
|
|
16
|
-
this.ctx.lineWidth = COURT_LINE_WIDTH * 2;
|
|
13
|
+
this.ctx.lineWidth = this.courtTypeConstants.COURT_LINE_WIDTH * 2;
|
|
17
14
|
this.ctx.moveTo(courtOrigin.x, courtOrigin.y);
|
|
18
15
|
this.ctx.lineTo(courtTerminus.x, courtTerminus.y);
|
|
19
16
|
this.ctx.stroke();
|
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
const InternalCourtLayer = require('
|
|
2
|
-
const {
|
|
3
|
-
FOOTBALL: { COURT_RECT_WIDTH, END_ZONE_HEIGHT }
|
|
4
|
-
} = require('../../../../constants');
|
|
1
|
+
const InternalCourtLayer = require('../../../base/InternalCourtLayer');
|
|
5
2
|
|
|
6
3
|
const NUMBER_VERTICAL_OFFSET = -6;
|
|
7
4
|
|
|
8
5
|
class FieldNumberLayer extends InternalCourtLayer {
|
|
9
6
|
drawLogic() {
|
|
10
7
|
const x = 20;
|
|
11
|
-
const y = END_ZONE_HEIGHT;
|
|
8
|
+
const y = this.courtTypeConstants.END_ZONE_HEIGHT;
|
|
12
9
|
|
|
13
10
|
const thinSpaceChar = String.fromCharCode(8202);
|
|
14
11
|
|
|
@@ -19,14 +16,14 @@ class FieldNumberLayer extends InternalCourtLayer {
|
|
|
19
16
|
const number = i <= 5 ? i : 10 - i;
|
|
20
17
|
const yardMarkLabel = `${number}${thinSpaceChar}0`;
|
|
21
18
|
|
|
22
|
-
this.ctx.translate(0, END_ZONE_HEIGHT);
|
|
19
|
+
this.ctx.translate(0, this.courtTypeConstants.END_ZONE_HEIGHT);
|
|
23
20
|
|
|
24
21
|
this.ctx.save();
|
|
25
22
|
|
|
26
23
|
this.ctx.rotate(Math.PI / 2); // 90
|
|
27
24
|
this.ctx.fillText(yardMarkLabel, NUMBER_VERTICAL_OFFSET, 0);
|
|
28
25
|
|
|
29
|
-
this.ctx.translate(0, 20 * 2 - COURT_RECT_WIDTH);
|
|
26
|
+
this.ctx.translate(0, 20 * 2 - this.courtTypeConstants.COURT_RECT_WIDTH);
|
|
30
27
|
this.ctx.rotate(Math.PI); // 180
|
|
31
28
|
this.ctx.fillText(yardMarkLabel, NUMBER_VERTICAL_OFFSET, 0);
|
|
32
29
|
|
|
@@ -1,16 +1,7 @@
|
|
|
1
|
-
const InternalCourtLayer = require('
|
|
2
|
-
const {
|
|
3
|
-
FOOTBALL: { COURT_RECT_WIDTH, COURT_RECT_HEIGHT, COURT_LINE_WIDTH, END_ZONE_HEIGHT }
|
|
4
|
-
} = require('../../../../constants');
|
|
1
|
+
const InternalCourtLayer = require('../../../base/InternalCourtLayer');
|
|
5
2
|
|
|
6
3
|
const HASH_MARK_OFFSET_X = 3;
|
|
7
4
|
const HASH_MARK_LENGTH = 3;
|
|
8
|
-
const HASH_MARK_X_POSITIONS = [
|
|
9
|
-
HASH_MARK_OFFSET_X,
|
|
10
|
-
53,
|
|
11
|
-
COURT_RECT_WIDTH - 53 - HASH_MARK_LENGTH,
|
|
12
|
-
COURT_RECT_WIDTH - HASH_MARK_OFFSET_X - HASH_MARK_LENGTH
|
|
13
|
-
];
|
|
14
5
|
|
|
15
6
|
class HashMarkLayer extends InternalCourtLayer {
|
|
16
7
|
reflection() {
|
|
@@ -18,12 +9,19 @@ class HashMarkLayer extends InternalCourtLayer {
|
|
|
18
9
|
}
|
|
19
10
|
|
|
20
11
|
drawLogic() {
|
|
12
|
+
const hashMarkPositionsX = [
|
|
13
|
+
HASH_MARK_OFFSET_X,
|
|
14
|
+
53,
|
|
15
|
+
this.courtTypeConstants.COURT_RECT_WIDTH - 53 - HASH_MARK_LENGTH,
|
|
16
|
+
this.courtTypeConstants.COURT_RECT_WIDTH - HASH_MARK_OFFSET_X - HASH_MARK_LENGTH
|
|
17
|
+
];
|
|
18
|
+
|
|
21
19
|
this.ctx.save();
|
|
22
20
|
|
|
23
|
-
this.ctx.lineWidth = COURT_LINE_WIDTH;
|
|
21
|
+
this.ctx.lineWidth = this.courtTypeConstants.COURT_LINE_WIDTH;
|
|
24
22
|
|
|
25
|
-
for (let y = END_ZONE_HEIGHT + 15; y <=
|
|
26
|
-
|
|
23
|
+
for (let y = this.courtTypeConstants.END_ZONE_HEIGHT + 15; y <= this.courtCenter.y; y += 15) {
|
|
24
|
+
hashMarkPositionsX.forEach(px => {
|
|
27
25
|
for (let i = 0; i < 4; i++) {
|
|
28
26
|
const hashMarkVerticalStep = 3 + i * 3;
|
|
29
27
|
const courtOrigin = { x: px, y: y - hashMarkVerticalStep };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const InternalCourtLayer = require('../../../base/InternalCourtLayer');
|
|
2
|
+
|
|
3
|
+
class YardLineLayer extends InternalCourtLayer {
|
|
4
|
+
reflection() {
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
drawLogic() {
|
|
9
|
+
for (let y = this.courtTypeConstants.END_ZONE_HEIGHT; y <= this.courtCenter.y; y += 15) {
|
|
10
|
+
const courtOrigin = { x: 0.0, y };
|
|
11
|
+
const courtTerminus = { x: this.courtTypeConstants.COURT_RECT_WIDTH, y };
|
|
12
|
+
|
|
13
|
+
this.ctx.beginPath();
|
|
14
|
+
this.ctx.lineWidth =
|
|
15
|
+
y % 30 === 0 ? this.courtTypeConstants.COURT_LINE_WIDTH * 2 : this.courtTypeConstants.COURT_LINE_WIDTH;
|
|
16
|
+
this.ctx.moveTo(courtOrigin.x, courtOrigin.y);
|
|
17
|
+
this.ctx.lineTo(courtTerminus.x, courtTerminus.y);
|
|
18
|
+
this.ctx.stroke();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
module.exports = YardLineLayer;
|
package/src/models/Frame.js
CHANGED
|
@@ -13,6 +13,12 @@ const Line = require('./Line');
|
|
|
13
13
|
const Player = require('./Player');
|
|
14
14
|
const Note = require('./Note');
|
|
15
15
|
const ShapeModels = require('./ShapeModels');
|
|
16
|
+
const {
|
|
17
|
+
COURT_TYPE_HIGH_SCHOOL_FOOTBALL,
|
|
18
|
+
COURT_TYPE_HIGH_SCHOOL_FOOTBALL_LEGACY,
|
|
19
|
+
SPORT_TYPE_FOOTBALL,
|
|
20
|
+
SPORT_TYPE_BASKETBALL
|
|
21
|
+
} = require('../constants');
|
|
16
22
|
|
|
17
23
|
class Frame {
|
|
18
24
|
constructor(play, phase = 1, animationGlobalProgress = false) {
|
|
@@ -22,8 +28,20 @@ class Frame {
|
|
|
22
28
|
this.animationGlobalProgressPrev = animationGlobalProgress;
|
|
23
29
|
}
|
|
24
30
|
|
|
31
|
+
get sport() {
|
|
32
|
+
const { court, sport } = this.play.playData;
|
|
33
|
+
if (sport) return sport;
|
|
34
|
+
return [COURT_TYPE_HIGH_SCHOOL_FOOTBALL_LEGACY, COURT_TYPE_HIGH_SCHOOL_FOOTBALL].includes(court.type)
|
|
35
|
+
? SPORT_TYPE_FOOTBALL
|
|
36
|
+
: SPORT_TYPE_BASKETBALL;
|
|
37
|
+
}
|
|
38
|
+
|
|
25
39
|
get court() {
|
|
26
|
-
|
|
40
|
+
const { court } = this.play.playData;
|
|
41
|
+
return {
|
|
42
|
+
...court,
|
|
43
|
+
type: court.type === COURT_TYPE_HIGH_SCHOOL_FOOTBALL_LEGACY ? COURT_TYPE_HIGH_SCHOOL_FOOTBALL : court.type
|
|
44
|
+
};
|
|
27
45
|
}
|
|
28
46
|
|
|
29
47
|
get frameWidth() {
|
|
@@ -36,7 +54,8 @@ class Frame {
|
|
|
36
54
|
|
|
37
55
|
get frameData() {
|
|
38
56
|
return {
|
|
39
|
-
|
|
57
|
+
sport: this.sport,
|
|
58
|
+
court: this.court,
|
|
40
59
|
lines: this.lines,
|
|
41
60
|
players: this.players,
|
|
42
61
|
shapes: this.shapes,
|
package/src/models/Play.js
CHANGED
|
@@ -3,6 +3,7 @@ const { loadImage } = require('canvas');
|
|
|
3
3
|
const playerHatsConfig = require('../playerHatsConfig');
|
|
4
4
|
const shapesConfig = require('../shapesConfig');
|
|
5
5
|
const { useDefaults } = require('./Play/Options');
|
|
6
|
+
const { SPORT_TYPE_BASKETBALL, SPORT_TYPE_FOOTBALL } = require('../constants');
|
|
6
7
|
|
|
7
8
|
const STORAGE_URL = 'https://playbooksstore.blob.core.windows.net/public';
|
|
8
9
|
const LUCEOSPORTS_WATERMARK_PATH = 'partners/LuceoSports/luceo-sports-logo-powered-by-sm.png';
|
|
@@ -25,9 +26,8 @@ class Play {
|
|
|
25
26
|
|
|
26
27
|
Play.backgroundOptions = {
|
|
27
28
|
Hardwood: hardwoodImage,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
FOOTBALL: grassImage
|
|
29
|
+
[SPORT_TYPE_BASKETBALL]: hardwoodImage,
|
|
30
|
+
[SPORT_TYPE_FOOTBALL]: grassImage
|
|
31
31
|
};
|
|
32
32
|
|
|
33
33
|
const luceoSportsWatermark = await loadImage(`${STORAGE_URL}/${LUCEOSPORTS_WATERMARK_PATH}`);
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
const InternalCourtLayer = require('../../base/InternalCourtLayer');
|
|
2
|
-
const {
|
|
3
|
-
FOOTBALL: { COURT_RECT_WIDTH, COURT_RECT_HEIGHT, COURT_LINE_WIDTH }
|
|
4
|
-
} = require('../../../../constants');
|
|
5
|
-
|
|
6
|
-
class BorderRectLayer extends InternalCourtLayer {
|
|
7
|
-
drawLogic() {
|
|
8
|
-
this.ctx.beginPath();
|
|
9
|
-
this.ctx.lineWidth = COURT_LINE_WIDTH * 2;
|
|
10
|
-
this.ctx.rect(0, 0, COURT_RECT_WIDTH, COURT_RECT_HEIGHT);
|
|
11
|
-
this.ctx.stroke();
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
module.exports = BorderRectLayer;
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
const InternalCourtLayer = require('../../base/InternalCourtLayer');
|
|
2
|
-
const {
|
|
3
|
-
FOOTBALL: { COURT_RECT_WIDTH, COURT_RECT_HEIGHT, COURT_LINE_WIDTH }
|
|
4
|
-
} = require('../../../../constants');
|
|
5
|
-
|
|
6
|
-
class CenterLineLayer extends InternalCourtLayer {
|
|
7
|
-
drawLogic() {
|
|
8
|
-
const courtOrigin = { x: 0.0, y: COURT_RECT_HEIGHT / 2 };
|
|
9
|
-
const courtTerminus = { x: COURT_RECT_WIDTH, y: COURT_RECT_HEIGHT / 2 };
|
|
10
|
-
|
|
11
|
-
this.ctx.beginPath();
|
|
12
|
-
this.ctx.lineWidth = COURT_LINE_WIDTH * 2;
|
|
13
|
-
this.ctx.moveTo(courtOrigin.x, courtOrigin.y);
|
|
14
|
-
this.ctx.lineTo(courtTerminus.x, courtTerminus.y);
|
|
15
|
-
this.ctx.stroke();
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
module.exports = CenterLineLayer;
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
const InternalCourtLayer = require('../../base/InternalCourtLayer');
|
|
2
|
-
const {
|
|
3
|
-
FOOTBALL: { COURT_RECT_WIDTH, COURT_RECT_HEIGHT, COURT_LINE_WIDTH, END_ZONE_HEIGHT }
|
|
4
|
-
} = require('../../../../constants');
|
|
5
|
-
|
|
6
|
-
class YardLineLayer extends InternalCourtLayer {
|
|
7
|
-
reflection() {
|
|
8
|
-
return true;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
drawLogic() {
|
|
12
|
-
for (let y = END_ZONE_HEIGHT; y <= COURT_RECT_HEIGHT / 2; y += 15) {
|
|
13
|
-
const courtOrigin = { x: 0.0, y };
|
|
14
|
-
const courtTerminus = { x: COURT_RECT_WIDTH, y };
|
|
15
|
-
|
|
16
|
-
this.ctx.beginPath();
|
|
17
|
-
this.ctx.lineWidth = y % 30 === 0 ? COURT_LINE_WIDTH * 2 : COURT_LINE_WIDTH;
|
|
18
|
-
this.ctx.moveTo(courtOrigin.x, courtOrigin.y);
|
|
19
|
-
this.ctx.lineTo(courtTerminus.x, courtTerminus.y);
|
|
20
|
-
this.ctx.stroke();
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
module.exports = YardLineLayer;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
const InternalCourtLayer = require('../../base/InternalCourtLayer');
|
|
2
|
-
const {
|
|
3
|
-
NBA: { COURT_RECT_WIDTH, COURT_RECT_HEIGHT, COURT_LINE_WIDTH }
|
|
4
|
-
} = require('../../../../constants');
|
|
5
|
-
|
|
6
|
-
class BorderRectLayer extends InternalCourtLayer {
|
|
7
|
-
drawLogic() {
|
|
8
|
-
this.ctx.beginPath();
|
|
9
|
-
this.ctx.lineWidth = COURT_LINE_WIDTH * 2;
|
|
10
|
-
this.ctx.rect(0, 0, COURT_RECT_WIDTH, COURT_RECT_HEIGHT);
|
|
11
|
-
this.ctx.stroke();
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
module.exports = BorderRectLayer;
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
const InternalCourtLayer = require('../../base/InternalCourtLayer');
|
|
2
|
-
const {
|
|
3
|
-
NBA: { COURT_RECT_WIDTH, COURT_RECT_HEIGHT }
|
|
4
|
-
} = require('../../../../constants');
|
|
5
|
-
|
|
6
|
-
class CenterCircleLayer extends InternalCourtLayer {
|
|
7
|
-
drawLogic() {
|
|
8
|
-
if (!this.options.showHalfCourtCircle) return;
|
|
9
|
-
|
|
10
|
-
const outerCenterRadius = 6.0;
|
|
11
|
-
const innerCenterRadius = 2.0;
|
|
12
|
-
const centerCourtPoint = { x: COURT_RECT_WIDTH / 2, y: COURT_RECT_HEIGHT / 2 };
|
|
13
|
-
|
|
14
|
-
this.ctx.beginPath();
|
|
15
|
-
this.ctx.arc(centerCourtPoint.x, centerCourtPoint.y, outerCenterRadius, 0, Math.PI * 2, true);
|
|
16
|
-
this.ctx.arc(centerCourtPoint.x, centerCourtPoint.y, innerCenterRadius, 0, Math.PI * 2, true);
|
|
17
|
-
this.ctx.stroke();
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
module.exports = CenterCircleLayer;
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
const InternalCourtLayer = require('../../base/InternalCourtLayer');
|
|
2
|
-
const {
|
|
3
|
-
NBA: { COURT_RECT_WIDTH, COURT_RECT_HEIGHT, COURT_LINE_WIDTH }
|
|
4
|
-
} = require('../../../../constants');
|
|
5
|
-
|
|
6
|
-
class CenterLineLayer extends InternalCourtLayer {
|
|
7
|
-
drawLogic() {
|
|
8
|
-
const courtOrigin = { x: 0.0, y: COURT_RECT_HEIGHT / 2 };
|
|
9
|
-
const courtTerminus = { x: COURT_RECT_WIDTH, y: COURT_RECT_HEIGHT / 2 };
|
|
10
|
-
|
|
11
|
-
this.ctx.beginPath();
|
|
12
|
-
this.ctx.lineWidth = COURT_LINE_WIDTH * 2;
|
|
13
|
-
this.ctx.moveTo(courtOrigin.x, courtOrigin.y);
|
|
14
|
-
this.ctx.lineTo(courtTerminus.x, courtTerminus.y);
|
|
15
|
-
this.ctx.stroke();
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
module.exports = CenterLineLayer;
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
const InternalCourtLayer = require('../../base/InternalCourtLayer');
|
|
2
|
-
|
|
3
|
-
class HoopLayer extends InternalCourtLayer {
|
|
4
|
-
reflection() {
|
|
5
|
-
return true;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
drawLogic() {
|
|
9
|
-
const hoopCourtOrigin = { x: 22.0, y: 4.0 };
|
|
10
|
-
const hoopCourtTerminus = { x: 28.0, y: 4.0 };
|
|
11
|
-
const courtHoopCenter = { x: 25.0, y: 5.25 };
|
|
12
|
-
const courtHoopRadius = 0.75;
|
|
13
|
-
|
|
14
|
-
this.ctx.beginPath();
|
|
15
|
-
this.ctx.moveTo(hoopCourtOrigin.x, hoopCourtOrigin.y);
|
|
16
|
-
this.ctx.lineTo(hoopCourtTerminus.x, hoopCourtTerminus.y);
|
|
17
|
-
this.ctx.stroke();
|
|
18
|
-
this.ctx.beginPath();
|
|
19
|
-
this.ctx.arc(courtHoopCenter.x, courtHoopCenter.y, courtHoopRadius, 0, 2 * Math.PI, true);
|
|
20
|
-
this.ctx.stroke();
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
module.exports = HoopLayer;
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
const InternalCourtLayer = require('../../base/InternalCourtLayer');
|
|
2
|
-
|
|
3
|
-
class InnerOuterRectLayer extends InternalCourtLayer {
|
|
4
|
-
reflection() {
|
|
5
|
-
return true;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
drawLogic() {
|
|
9
|
-
const courtInnerRectOrigin = { x: 19, y: 0 };
|
|
10
|
-
const courtInnerRectWidth = 12;
|
|
11
|
-
const courtInnerRectHeight = 19;
|
|
12
|
-
|
|
13
|
-
const courtOuterRectOrigin = { x: 17, y: 0 };
|
|
14
|
-
const courtOuterRectWidth = 16;
|
|
15
|
-
const courtOuterRectHeight = 19;
|
|
16
|
-
|
|
17
|
-
this.ctx.beginPath();
|
|
18
|
-
this.ctx.rect(courtInnerRectOrigin.x, courtInnerRectOrigin.y, courtInnerRectWidth, courtInnerRectHeight);
|
|
19
|
-
this.ctx.stroke();
|
|
20
|
-
this.ctx.beginPath();
|
|
21
|
-
this.ctx.rect(courtOuterRectOrigin.x, courtOuterRectOrigin.y, courtOuterRectWidth, courtOuterRectHeight);
|
|
22
|
-
this.ctx.stroke();
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
module.exports = InnerOuterRectLayer;
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
const InternalCourtLayer = require('../../base/InternalCourtLayer');
|
|
2
|
-
|
|
3
|
-
class LaneMarkingLayer extends InternalCourtLayer {
|
|
4
|
-
reflection() {
|
|
5
|
-
return true;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
drawLogic() {
|
|
9
|
-
const courtMarkingWidth = 0.667;
|
|
10
|
-
const courtPath1Origin = { x: 17.0, y: 7.0 };
|
|
11
|
-
const courtPath1Terminus = { x: 17.0 - courtMarkingWidth, y: 7.0 };
|
|
12
|
-
|
|
13
|
-
this.ctx.beginPath();
|
|
14
|
-
this.ctx.moveTo(courtPath1Origin.x, courtPath1Origin.y);
|
|
15
|
-
this.ctx.lineTo(courtPath1Terminus.x, courtPath1Terminus.y);
|
|
16
|
-
this.ctx.stroke();
|
|
17
|
-
|
|
18
|
-
this.ctx.beginPath();
|
|
19
|
-
this.ctx.moveTo(17.0, 8.0);
|
|
20
|
-
this.ctx.lineTo(17.0 - courtMarkingWidth, 8.0);
|
|
21
|
-
this.ctx.stroke();
|
|
22
|
-
|
|
23
|
-
this.ctx.beginPath();
|
|
24
|
-
this.ctx.moveTo(17.0, 11.0);
|
|
25
|
-
this.ctx.lineTo(17.0 - courtMarkingWidth, 11.0);
|
|
26
|
-
this.ctx.stroke();
|
|
27
|
-
|
|
28
|
-
this.ctx.beginPath();
|
|
29
|
-
this.ctx.moveTo(17.0, 14.0);
|
|
30
|
-
this.ctx.lineTo(17.0 - courtMarkingWidth, 14.0);
|
|
31
|
-
this.ctx.stroke();
|
|
32
|
-
|
|
33
|
-
this.ctx.beginPath();
|
|
34
|
-
this.ctx.moveTo(33.0, 7.0);
|
|
35
|
-
this.ctx.lineTo(33.0 + courtMarkingWidth, 7.0);
|
|
36
|
-
this.ctx.stroke();
|
|
37
|
-
|
|
38
|
-
this.ctx.beginPath();
|
|
39
|
-
this.ctx.moveTo(33.0, 8.0);
|
|
40
|
-
this.ctx.lineTo(33.0 + courtMarkingWidth, 8.0);
|
|
41
|
-
this.ctx.stroke();
|
|
42
|
-
|
|
43
|
-
this.ctx.beginPath();
|
|
44
|
-
this.ctx.moveTo(33.0, 11.0);
|
|
45
|
-
this.ctx.lineTo(33.0 + courtMarkingWidth, 11.0);
|
|
46
|
-
this.ctx.stroke();
|
|
47
|
-
|
|
48
|
-
this.ctx.beginPath();
|
|
49
|
-
this.ctx.moveTo(33.0, 14.0);
|
|
50
|
-
this.ctx.lineTo(33.0 + courtMarkingWidth, 14.0);
|
|
51
|
-
this.ctx.stroke();
|
|
52
|
-
|
|
53
|
-
this.ctx.beginPath();
|
|
54
|
-
this.ctx.moveTo(20.0, 13.0);
|
|
55
|
-
this.ctx.lineTo(20.0 + 0.5, 13.0);
|
|
56
|
-
this.ctx.stroke();
|
|
57
|
-
|
|
58
|
-
this.ctx.beginPath();
|
|
59
|
-
this.ctx.moveTo(30.0, 13.0);
|
|
60
|
-
this.ctx.lineTo(30.0 - 0.5, 13.0);
|
|
61
|
-
this.ctx.stroke();
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
module.exports = LaneMarkingLayer;
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
const InternalCourtLayer = require('../../base/InternalCourtLayer');
|
|
2
|
-
|
|
3
|
-
class ThreePointLineLayer extends InternalCourtLayer {
|
|
4
|
-
reflection() {
|
|
5
|
-
return true;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
drawLogic() {
|
|
9
|
-
const courtRimDistanceToBackboard = 0.5;
|
|
10
|
-
const courtThreePointOrigin = { x: 3.0, y: 0.0 };
|
|
11
|
-
const courtThreePointFirstLineTerminus = { x: 3.0, y: 14.0 };
|
|
12
|
-
const courtThreePointSecondLineTerminus = { x: 47.0, y: 0.0 };
|
|
13
|
-
const courtThreePointHoopCenter = { x: 25.0, y: 4.75 + courtRimDistanceToBackboard };
|
|
14
|
-
const courtThreePointArcRadius = 23.6762;
|
|
15
|
-
|
|
16
|
-
const endAngle = Math.asin((10.0 - 0.75 - courtRimDistanceToBackboard) / courtThreePointArcRadius);
|
|
17
|
-
const startAngle = Math.PI - endAngle;
|
|
18
|
-
|
|
19
|
-
this.ctx.beginPath();
|
|
20
|
-
this.ctx.moveTo(courtThreePointOrigin.x, courtThreePointOrigin.y);
|
|
21
|
-
this.ctx.lineTo(courtThreePointFirstLineTerminus.x, courtThreePointFirstLineTerminus.y);
|
|
22
|
-
this.ctx.arc(
|
|
23
|
-
courtThreePointHoopCenter.x,
|
|
24
|
-
courtThreePointHoopCenter.y,
|
|
25
|
-
courtThreePointArcRadius,
|
|
26
|
-
startAngle,
|
|
27
|
-
endAngle,
|
|
28
|
-
true
|
|
29
|
-
);
|
|
30
|
-
this.ctx.lineTo(courtThreePointSecondLineTerminus.x, courtThreePointSecondLineTerminus.y);
|
|
31
|
-
this.ctx.stroke();
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
module.exports = ThreePointLineLayer;
|