@luceosports/play-rendering 1.12.4 → 1.13.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/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 +4 -4
- package/src/layers/PlayerLayer.js +4 -2
- package/src/layers/base/BaseLayer.js +2 -2
- package/src/layers/court/index.js +33 -6
- package/src/layers/court/layers/BASKETBALL/NBA/constants/constants.js +1 -0
- package/src/layers/court/layers/BASKETBALL/NBA/constants/index.js +4 -0
- package/src/layers/court/layers/{NBA → BASKETBALL/NBA/layers}/BaseLineMarkingLayer.js +1 -1
- package/src/layers/court/layers/{NBA → BASKETBALL/NBA/layers}/BenchAreaLayer.js +1 -1
- package/src/layers/court/layers/{NBA → BASKETBALL/NBA/layers}/Big3Layer.js +2 -4
- package/src/layers/court/layers/{NBA → BASKETBALL/NBA/layers}/BorderRectLayer.js +2 -4
- package/src/layers/court/layers/{NBA → BASKETBALL/NBA/layers}/CenterCircleLayer.js +2 -4
- package/src/layers/court/layers/{NBA → BASKETBALL/NBA/layers}/CenterLineLayer.js +2 -4
- package/src/layers/court/layers/{NBA → BASKETBALL/NBA/layers}/FreeThrowLayer.js +1 -1
- package/src/layers/court/layers/{NBA → BASKETBALL/NBA/layers}/HoopLayer.js +1 -1
- package/src/layers/court/layers/{NBA → BASKETBALL/NBA/layers}/InnerOuterRectLayer.js +1 -1
- package/src/layers/court/layers/{NBA → BASKETBALL/NBA/layers}/LaneMarkingLayer.js +1 -1
- package/src/layers/court/layers/{NBA → BASKETBALL/NBA/layers}/RestrictedAreaLayer.js +1 -1
- package/src/layers/court/layers/{NBA → BASKETBALL/NBA/layers}/ThreePointLineLayer.js +1 -1
- package/src/layers/court/layers/BASKETBALL/constants.js +9 -0
- package/src/layers/court/layers/FOOTBALL/HIGH_SCHOOL_FOOTBALL/constants/constants.js +3 -0
- package/src/layers/court/layers/FOOTBALL/HIGH_SCHOOL_FOOTBALL/constants/index.js +4 -0
- package/src/layers/court/layers/FOOTBALL/{BorderRectLayer.js → HIGH_SCHOOL_FOOTBALL/layers/BorderRectLayer.js} +2 -4
- package/src/layers/court/layers/FOOTBALL/{CenterLineLayer.js → HIGH_SCHOOL_FOOTBALL/layers/CenterLineLayer.js} +2 -4
- package/src/layers/court/layers/FOOTBALL/{EndZoneLayer.js → HIGH_SCHOOL_FOOTBALL/layers/EndZoneLayer.js} +2 -4
- package/src/layers/court/layers/FOOTBALL/{FieldNumberLayer.js → HIGH_SCHOOL_FOOTBALL/layers/FieldNumberLayer.js} +2 -4
- package/src/layers/court/layers/FOOTBALL/{HashMarkLayer.js → HIGH_SCHOOL_FOOTBALL/layers/HashMarkLayer.js} +2 -4
- package/src/layers/court/layers/FOOTBALL/{YardLineLayer.js → HIGH_SCHOOL_FOOTBALL/layers/YardLineLayer.js} +2 -4
- package/src/layers/court/layers/FOOTBALL/constants.js +9 -0
- package/src/models/Frame.js +21 -2
- package/src/models/Play.js +3 -3
package/index.js
CHANGED
|
@@ -8,4 +8,5 @@ module.exports.Shape = require('./src/models/Shape');
|
|
|
8
8
|
module.exports.ShapeModels = require('./src/models/ShapeModels');
|
|
9
9
|
module.exports.LineDrawingMath = require('./src/math/LineDrawingMath');
|
|
10
10
|
module.exports.Bezier = require('./src/math/Bezier').Bezier;
|
|
11
|
-
module.exports.CourtTypeConstants = require('./src/
|
|
11
|
+
module.exports.CourtTypeConstants = require('./src/layers/court').courtTypeConstants;
|
|
12
|
+
module.exports.Constants = require('./src/constants');
|
package/package.json
CHANGED
package/src/constants.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
module.exports = Object.freeze({
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
2
|
+
SPORT_TYPE_BASKETBALL: 'BASKETBALL',
|
|
3
|
+
SPORT_TYPE_FOOTBALL: 'FOOTBALL',
|
|
4
|
+
|
|
5
|
+
COURT_TYPE_NBA: 'NBA',
|
|
6
|
+
COURT_TYPE_HIGH_SCHOOL_FOOTBALL: 'HIGH_SCHOOL_FOOTBALL',
|
|
7
|
+
COURT_TYPE_HIGH_SCHOOL_FOOTBALL_LEGACY: 'FOOTBALL',
|
|
8
|
+
|
|
9
|
+
SHAPE_TYPE_CIRCLE: 'CIRCLE',
|
|
10
|
+
SHAPE_TYPE_SQUARE: 'SQUARE',
|
|
11
|
+
SHAPE_TYPE_TRIANGLE: 'TRIANGLE',
|
|
12
|
+
SHAPE_TYPE_FOV: 'FOV',
|
|
13
|
+
SHAPE_TYPE_XMARK: 'XMARK',
|
|
14
|
+
SHAPE_TYPE_STRAIGHT: 'STRAIGHT',
|
|
15
|
+
SHAPE_TYPE_CONE: 'CONE',
|
|
16
|
+
SHAPE_TYPE_LINE_CUT: 'LINE.CUT',
|
|
17
|
+
SHAPE_TYPE_LINE_SCREEN: 'LINE.SCREEN',
|
|
18
|
+
SHAPE_TYPE_LINE_DRIBBLE: 'LINE.DRIBBLE',
|
|
19
|
+
SHAPE_TYPE_LINE_PASS: 'LINE.PASS',
|
|
20
|
+
SHAPE_TYPE_LINE_HANDOFF: 'LINE.HANDOFF'
|
|
21
21
|
});
|
package/src/layers/CourtLayer.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const BaseLayer = require('./base/BaseLayer');
|
|
2
|
-
const courtLayers = require('./court');
|
|
2
|
+
const { layers: courtLayers } = require('./court');
|
|
3
3
|
|
|
4
4
|
class CourtLayer extends BaseLayer {
|
|
5
5
|
get frameWidth() {
|
|
@@ -15,12 +15,12 @@ class CourtLayer extends BaseLayer {
|
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
get courtTypeLayers() {
|
|
18
|
-
if (!courtLayers[this.playData.court.type]) throw new Error('unknown court type');
|
|
19
|
-
return courtLayers[this.playData.court.type];
|
|
18
|
+
if (!(courtLayers[this.playData.sport] || {})[this.playData.court.type]) throw new Error('unknown court type');
|
|
19
|
+
return courtLayers[this.playData.sport][this.playData.court.type];
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
get background() {
|
|
23
|
-
return this.options.background || this.playData.
|
|
23
|
+
return this.options.background || this.playData.sport;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
apply() {
|
|
@@ -101,11 +101,13 @@ class PlayerLayer extends BaseLayer {
|
|
|
101
101
|
const { x, y } = player.location;
|
|
102
102
|
const { alpha } = player.color;
|
|
103
103
|
|
|
104
|
+
const fontSizeLength = 3 - player.textLabel.length * 0.5;
|
|
104
105
|
const fontSizeMultiplier = this.options.legacyPrintStyle ? 1.3 : 1;
|
|
105
|
-
const fontSize =
|
|
106
|
+
const fontSize = fontSizeLength * fontSizeMultiplier * this.playerScale;
|
|
106
107
|
|
|
108
|
+
const textVOffsetLength = 1 - player.textLabel.length * 0.15;
|
|
107
109
|
const textVOffsetMultiplier = this.options.legacyPrintStyle ? 1.4 : 1;
|
|
108
|
-
const textVerticalOffset =
|
|
110
|
+
const textVerticalOffset = textVOffsetLength * textVOffsetMultiplier * this.playerScale;
|
|
109
111
|
|
|
110
112
|
if (!alpha) return;
|
|
111
113
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const
|
|
1
|
+
const { courtTypeConstants } = require('../court');
|
|
2
2
|
|
|
3
3
|
class BaseLayer {
|
|
4
4
|
constructor(ctx, playData) {
|
|
@@ -8,7 +8,7 @@ class BaseLayer {
|
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
get courtTypeConstants() {
|
|
11
|
-
return
|
|
11
|
+
return courtTypeConstants[this.playData.court.type];
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
|
|
@@ -1,13 +1,40 @@
|
|
|
1
1
|
// require all modules on the path and with the pattern defined
|
|
2
2
|
const req = require.context('./layers/', true, /.js$/);
|
|
3
3
|
|
|
4
|
-
const
|
|
4
|
+
const layers = {};
|
|
5
|
+
const sportConstants = {};
|
|
6
|
+
const courtTypeConstants = {};
|
|
5
7
|
|
|
6
8
|
req.keys().forEach(key => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
if (key.match(/\/layers\//)) {
|
|
10
|
+
return processLayers(key);
|
|
11
|
+
}
|
|
12
|
+
processConstants(key);
|
|
11
13
|
});
|
|
12
14
|
|
|
13
|
-
|
|
15
|
+
function processLayers(key) {
|
|
16
|
+
const mPath = key
|
|
17
|
+
.replace('./', '')
|
|
18
|
+
.replace('/layers', '')
|
|
19
|
+
.replace('.js', '');
|
|
20
|
+
const [sportName, courtType, mName] = mPath.split('/');
|
|
21
|
+
if (!layers[sportName]) layers[sportName] = {};
|
|
22
|
+
if (!layers[sportName][courtType]) layers[sportName][courtType] = {};
|
|
23
|
+
layers[sportName][courtType][mName] = req(key);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function processConstants(key) {
|
|
27
|
+
if (key.match(/\/constants\/index.js$/)) {
|
|
28
|
+
const mPath = key.replace('./', '').replace('/constants/index.js', '');
|
|
29
|
+
const [, courtType] = mPath.split('/');
|
|
30
|
+
courtTypeConstants[courtType] = req(key);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const mPath = key.replace('./', '').replace('/constants.js', '');
|
|
34
|
+
const [sportName, courtType] = mPath.split('/');
|
|
35
|
+
if (!courtType) {
|
|
36
|
+
sportConstants[sportName] = req(key);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
module.exports = { layers, sportConstants, courtTypeConstants };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = Object.freeze({});
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
const InternalCourtLayer = require('
|
|
2
|
-
const {
|
|
3
|
-
NBA: { COURT_RECT_WIDTH, COURT_LINE_WIDTH }
|
|
4
|
-
} = require('../../../../constants');
|
|
1
|
+
const InternalCourtLayer = require('../../../../base/InternalCourtLayer');
|
|
2
|
+
const { COURT_RECT_WIDTH, COURT_LINE_WIDTH } = require('../constants');
|
|
5
3
|
|
|
6
4
|
class Big3Layer extends InternalCourtLayer {
|
|
7
5
|
drawLogic() {
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
const InternalCourtLayer = require('
|
|
2
|
-
const {
|
|
3
|
-
NBA: { COURT_RECT_WIDTH, COURT_RECT_HEIGHT, COURT_LINE_WIDTH }
|
|
4
|
-
} = require('../../../../constants');
|
|
1
|
+
const InternalCourtLayer = require('../../../../base/InternalCourtLayer');
|
|
2
|
+
const { COURT_RECT_WIDTH, COURT_RECT_HEIGHT, COURT_LINE_WIDTH } = require('../constants');
|
|
5
3
|
|
|
6
4
|
class BorderRectLayer extends InternalCourtLayer {
|
|
7
5
|
drawLogic() {
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
const InternalCourtLayer = require('
|
|
2
|
-
const {
|
|
3
|
-
NBA: { COURT_RECT_WIDTH, COURT_RECT_HEIGHT }
|
|
4
|
-
} = require('../../../../constants');
|
|
1
|
+
const InternalCourtLayer = require('../../../../base/InternalCourtLayer');
|
|
2
|
+
const { COURT_RECT_WIDTH, COURT_RECT_HEIGHT } = require('../constants');
|
|
5
3
|
|
|
6
4
|
class CenterCircleLayer extends InternalCourtLayer {
|
|
7
5
|
drawLogic() {
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
const InternalCourtLayer = require('
|
|
2
|
-
const {
|
|
3
|
-
NBA: { COURT_RECT_WIDTH, COURT_RECT_HEIGHT, COURT_LINE_WIDTH }
|
|
4
|
-
} = require('../../../../constants');
|
|
1
|
+
const InternalCourtLayer = require('../../../../base/InternalCourtLayer');
|
|
2
|
+
const { COURT_RECT_WIDTH, COURT_RECT_HEIGHT, COURT_LINE_WIDTH } = require('../constants');
|
|
5
3
|
|
|
6
4
|
class CenterLineLayer extends InternalCourtLayer {
|
|
7
5
|
drawLogic() {
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
const InternalCourtLayer = require('
|
|
2
|
-
const {
|
|
3
|
-
FOOTBALL: { COURT_RECT_WIDTH, COURT_RECT_HEIGHT, COURT_LINE_WIDTH }
|
|
4
|
-
} = require('../../../../constants');
|
|
1
|
+
const InternalCourtLayer = require('../../../../base/InternalCourtLayer');
|
|
2
|
+
const { COURT_RECT_WIDTH, COURT_RECT_HEIGHT, COURT_LINE_WIDTH } = require('../constants');
|
|
5
3
|
|
|
6
4
|
class BorderRectLayer extends InternalCourtLayer {
|
|
7
5
|
drawLogic() {
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
const InternalCourtLayer = require('
|
|
2
|
-
const {
|
|
3
|
-
FOOTBALL: { COURT_RECT_WIDTH, COURT_RECT_HEIGHT, COURT_LINE_WIDTH }
|
|
4
|
-
} = require('../../../../constants');
|
|
1
|
+
const InternalCourtLayer = require('../../../../base/InternalCourtLayer');
|
|
2
|
+
const { COURT_RECT_WIDTH, COURT_RECT_HEIGHT, COURT_LINE_WIDTH } = require('../constants');
|
|
5
3
|
|
|
6
4
|
class CenterLineLayer extends InternalCourtLayer {
|
|
7
5
|
drawLogic() {
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
const InternalCourtLayer = require('
|
|
2
|
-
const {
|
|
3
|
-
FOOTBALL: { COURT_RECT_WIDTH, COURT_LINE_WIDTH }
|
|
4
|
-
} = require('../../../../constants');
|
|
1
|
+
const InternalCourtLayer = require('../../../../base/InternalCourtLayer');
|
|
2
|
+
const { COURT_RECT_WIDTH, COURT_LINE_WIDTH } = require('../constants');
|
|
5
3
|
|
|
6
4
|
class EndZoneLayer extends InternalCourtLayer {
|
|
7
5
|
reflection() {
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
const InternalCourtLayer = require('
|
|
2
|
-
const {
|
|
3
|
-
FOOTBALL: { COURT_RECT_WIDTH, END_ZONE_HEIGHT }
|
|
4
|
-
} = require('../../../../constants');
|
|
1
|
+
const InternalCourtLayer = require('../../../../base/InternalCourtLayer');
|
|
2
|
+
const { COURT_RECT_WIDTH, END_ZONE_HEIGHT } = require('../constants');
|
|
5
3
|
|
|
6
4
|
const NUMBER_VERTICAL_OFFSET = -6;
|
|
7
5
|
|
|
@@ -1,7 +1,5 @@
|
|
|
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');
|
|
2
|
+
const { COURT_RECT_WIDTH, COURT_RECT_HEIGHT, COURT_LINE_WIDTH, END_ZONE_HEIGHT } = require('../constants');
|
|
5
3
|
|
|
6
4
|
const HASH_MARK_OFFSET_X = 3;
|
|
7
5
|
const HASH_MARK_LENGTH = 3;
|
|
@@ -1,7 +1,5 @@
|
|
|
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');
|
|
2
|
+
const { COURT_RECT_WIDTH, COURT_RECT_HEIGHT, COURT_LINE_WIDTH, END_ZONE_HEIGHT } = require('../constants');
|
|
5
3
|
|
|
6
4
|
class YardLineLayer extends InternalCourtLayer {
|
|
7
5
|
reflection() {
|
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}`);
|