[fields] refactor: FTC/FRC separation, better naming scheme (#8034)

Closes #8018

- Adds the 2024-2025 and 2025-2026 FTC field image data
- Used a better naming scheme of `<year> F{R,T}C <gamename>`
  * Also removed generic `field` verbiage from PNG file names
- JSON and PNG files moved into respective `frc` and `ftc` directories
- Rotated fields for the new red-left scheme

Signed-off-by: crueter <swurl@swurl.xyz>
This commit is contained in:
crueter
2026-04-17 22:36:38 -04:00
committed by GitHub
parent 056d7bcbbe
commit fdb454a6b1
76 changed files with 369 additions and 239 deletions

View File

@@ -10,17 +10,27 @@ if(WITH_JAVA)
file(GLOB_RECURSE JAVA_SOURCES src/main/java/*.java)
file(
GLOB_RECURSE JAVA_RESOURCES
GLOB_RECURSE JAVA_FRC_RESOURCES
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
src/main/native/resources/*.json
src/main/native/resources/*.png
src/main/native/resources/*.jpg
src/main/native/resources/frc/*.json
src/main/native/resources/frc/*.png
src/main/native/resources/frc/*.jpg
)
file(
GLOB_RECURSE JAVA_FTC_RESOURCES
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
src/main/native/resources/ftc/*.json
src/main/native/resources/ftc/*.png
src/main/native/resources/ftc/*.jpg
)
add_jar(
field_images_jar
SOURCES ${JAVA_SOURCES}
RESOURCES
NAMESPACE "org/wpilib/fields" ${JAVA_RESOURCES}
NAMESPACE "org/wpilib/fields/frc" ${JAVA_FRC_RESOURCES}
NAMESPACE "org/wpilib/fields/ftc" ${JAVA_FTC_RESOURCES}
INCLUDE_JARS ${AVAJE_JARS}
OUTPUT_DIR ${WPILIB_BINARY_DIR}/${java_lib_dest}
OUTPUT_NAME fields
@@ -31,7 +41,7 @@ if(WITH_JAVA)
endif()
generate_resources(
src/main/native/resources/org/wpilib/fields
src/main/native/resources/org/wpilib/fields/*
${CMAKE_CURRENT_BINARY_DIR}/generated/main/cpp
FIELDS
wpi::fields

View File

@@ -38,14 +38,18 @@ public class FieldConfig {
@Json.Property("field-unit")
public String m_fieldUnit;
@Json.Property("program")
public String m_program;
public FieldConfig() {}
public URL getImageUrl() {
return getClass().getResource(Fields.kBaseResourceDir + m_fieldImage);
return getClass().getResource(Fields.BASE_RESOURCE_DIR + m_program + "/" + m_fieldImage);
}
public InputStream getImageAsStream() {
return getClass().getResourceAsStream(Fields.kBaseResourceDir + m_fieldImage);
return getClass()
.getResourceAsStream(Fields.BASE_RESOURCE_DIR + m_program + "/" + m_fieldImage);
}
/**
@@ -56,7 +60,7 @@ public class FieldConfig {
* @throws IOException Throws if the file could not be loaded
*/
public static FieldConfig loadField(Fields field) throws IOException {
return loadFromResource(field.m_resourceFile);
return loadFromResource(field.resourceFile);
}
/**

View File

@@ -5,29 +5,29 @@
package org.wpilib.fields;
public enum Fields {
k2018PowerUp("2018-powerup.json"),
k2019DeepSpace("2019-deepspace.json"),
k2020InfiniteRecharge("2020-infiniterecharge.json"),
k2021InfiniteRecharge("2021-infiniterecharge.json"),
k2021Barrel("2021-barrelracingpath.json"),
k2021Bounce("2021-bouncepath.json"),
k2021GalacticSearchA("2021-galacticsearcha.json"),
k2021GalacticSearchB("2021-galacticsearchb.json"),
k2021Slalom("2021-slalompath.json"),
k2022RapidReact("2022-rapidreact.json"),
k2023ChargedUp("2023-chargedup.json"),
k2024Crescendo("2024-crescendo.json"),
k2025Reefscape("2025-reefscape.json"),
k2026Rebuilt("2026-rebuilt.json");
FRC_2018_POWER_UP("frc/2018-powerup.json"),
FRC_2019_DEEP_SPACE("frc/2019-deepspace.json"),
FRC_2020_INFINITE_RECHARGE("frc/2020-infiniterecharge.json"),
FRC_2021_INFINITE_RECHARGE("frc/2021-infiniterecharge.json"),
FRC_2021_BARREL("frc/2021-barrelracingpath.json"),
FRC_2021_BOUNCE("frc/2021-bouncepath.json"),
FRC_2021_GALACTIC_SEARCH_A("frc/2021-galacticsearcha.json"),
FRC_2021_GALACTIC_SEARCH_B("frc/2021-galacticsearchb.json"),
FRC_2021_SLALOM("frc/2021-slalompath.json"),
FRC_2022_RAPID_REACT("frc/2022-rapidreact.json"),
FRC_2023_CHARGED_UP("frc/2023-chargedup.json"),
FRC_2024_CRESCENDO("frc/2024-crescendo.json"),
FTC_2024_2025_INTO_THE_DEEP("ftc/2024-2025-intothedeep.json"),
FRC_2025_REEFSCAPE("frc/2025-reefscape.json"),
FTC_2025_2026_DECODE("ftc/2025-2026-decode.json"),
FRC_2026_REBUILT("frc/2026-rebuilt.json");
public static final String kBaseResourceDir = "/org/wpilib/fields/";
public static final String BASE_RESOURCE_DIR = "/org/wpilib/fields/";
/** Alias to the current game. */
public static final Fields kDefaultField = k2026Rebuilt;
public final String m_resourceFile;
@SuppressWarnings("MemberName")
public final String resourceFile;
Fields(String resourceFile) {
m_resourceFile = kBaseResourceDir + resourceFile;
this.resourceFile = BASE_RESOURCE_DIR + resourceFile;
}
}

View File

@@ -4,51 +4,58 @@
#include "wpi/fields/fields.hpp"
#include "wpi/fields/2018-powerup.hpp"
#include "wpi/fields/2019-deepspace.hpp"
#include "wpi/fields/2020-infiniterecharge.hpp"
#include "wpi/fields/2021-barrel.hpp"
#include "wpi/fields/2021-bounce.hpp"
#include "wpi/fields/2021-galacticsearcha.hpp"
#include "wpi/fields/2021-galacticsearchb.hpp"
#include "wpi/fields/2021-infiniterecharge.hpp"
#include "wpi/fields/2021-slalom.hpp"
#include "wpi/fields/2022-rapidreact.hpp"
#include "wpi/fields/2023-chargedup.hpp"
#include "wpi/fields/2024-crescendo.hpp"
#include "wpi/fields/2025-reefscape.hpp"
#include "wpi/fields/2026-rebuilt.hpp"
#include "wpi/fields/frc/2018-powerup.hpp"
#include "wpi/fields/frc/2019-deepspace.hpp"
#include "wpi/fields/frc/2020-infiniterecharge.hpp"
#include "wpi/fields/frc/2021-barrelracingpath.hpp"
#include "wpi/fields/frc/2021-bouncepath.hpp"
#include "wpi/fields/frc/2021-galacticsearcha.hpp"
#include "wpi/fields/frc/2021-galacticsearchb.hpp"
#include "wpi/fields/frc/2021-infiniterecharge.hpp"
#include "wpi/fields/frc/2021-slalompath.hpp"
#include "wpi/fields/frc/2022-rapidreact.hpp"
#include "wpi/fields/frc/2023-chargedup.hpp"
#include "wpi/fields/frc/2024-crescendo.hpp"
#include "wpi/fields/frc/2025-reefscape.hpp"
#include "wpi/fields/frc/2026-rebuilt.hpp"
#include "wpi/fields/ftc/2024-2025-intothedeep.hpp"
#include "wpi/fields/ftc/2025-2026-decode.hpp"
using namespace wpi::fields;
static const Field kFields[] = {
{"2026 Rebuilt", GetResource_2026_rebuilt_json, GetResource_2026_field_png},
{"2025 Reefscape", GetResource_2025_reefscape_json,
GetResource_2025_field_png},
{"2024 Crescendo", GetResource_2024_crescendo_json,
GetResource_2024_field_png},
{"2023 Charged Up", GetResource_2023_chargedup_json,
GetResource_2023_field_png},
{"2022 Rapid React", GetResource_2022_rapidreact_json,
GetResource_2022_field_png},
{"2021 Barrel Racing Path", GetResource_2021_barrelracingpath_json,
GetResource_2021_barrel_png},
{"2021 Bounce Path", GetResource_2021_bouncepath_json,
GetResource_2021_bounce_png},
{"2021 Galactic Search A", GetResource_2021_galacticsearcha_json,
{"2026 FRC Rebuilt", GetResource_2026_rebuilt_json,
GetResource_2026_rebuilt_png},
{"2025-2026 FTC DECODE", GetResource_2025_2026_decode_json,
GetResource_2025_2026_decode_png},
{"2025 FRC Reefscape", GetResource_2025_reefscape_json,
GetResource_2025_reefscape_png},
{"2024-2025 FTC Into The Deep", GetResource_2024_2025_intothedeep_json,
GetResource_2024_2025_intothedeep_png},
{"2024 FRC Crescendo", GetResource_2024_crescendo_json,
GetResource_2024_crescendo_png},
{"2023 FRC Charged Up", GetResource_2023_chargedup_json,
GetResource_2023_chargedup_png},
{"2022 FRC Rapid React", GetResource_2022_rapidreact_json,
GetResource_2022_rapidreact_png},
{"2021 FRC Barrel Racing Path", GetResource_2021_barrelracingpath_json,
GetResource_2021_barrelracingpath_png},
{"2021 FRC Bounce Path", GetResource_2021_bouncepath_json,
GetResource_2021_bouncepath_png},
{"2021 FRC Galactic Search A", GetResource_2021_galacticsearcha_json,
GetResource_2021_galacticsearcha_png},
{"2021 Galactic Search B", GetResource_2021_galacticsearchb_json,
{"2021 FRC Galactic Search B", GetResource_2021_galacticsearchb_json,
GetResource_2021_galacticsearchb_png},
{"2021 Infinite Recharge", GetResource_2021_infiniterecharge_json,
GetResource_2021_field_png},
{"2021 Slalom Path", GetResource_2021_slalompath_json,
GetResource_2021_slalom_png},
{"2020 Infinite Recharge", GetResource_2020_infiniterecharge_json,
GetResource_2020_field_png},
{"2019 Destination: Deep Space", GetResource_2019_deepspace_json,
GetResource_2019_field_jpg},
{"2018 Power Up", GetResource_2018_powerup_json,
GetResource_2018_field_jpg},
{"2021 FRC Infinite Recharge", GetResource_2021_infiniterecharge_json,
GetResource_2021_infiniterecharge_png},
{"2021 FRC Slalom Path", GetResource_2021_slalompath_json,
GetResource_2021_slalompath_png},
{"2020 FRC Infinite Recharge", GetResource_2020_infiniterecharge_json,
GetResource_2020_infiniterecharge_png},
{"2019 FRC Destination: Deep Space", GetResource_2019_deepspace_json,
GetResource_2019_deepspace_jpg},
{"2018 FRC Power Up", GetResource_2018_powerup_json,
GetResource_2018_powerup_jpg},
};
std::span<const Field> wpi::fields::GetFields() {

View File

@@ -8,5 +8,5 @@
namespace wpi::fields {
std::string_view GetResource_2018_powerup_json();
std::string_view GetResource_2018_field_jpg();
std::string_view GetResource_2018_powerup_jpg();
} // namespace wpi::fields

View File

@@ -5,8 +5,7 @@
#pragma once
#include <string_view>
namespace wpi::fields {
std::string_view GetResource_2019_deepspace_json();
std::string_view GetResource_2019_field_jpg();
std::string_view GetResource_2019_deepspace_jpg();
} // namespace wpi::fields

View File

@@ -8,5 +8,5 @@
namespace wpi::fields {
std::string_view GetResource_2020_infiniterecharge_json();
std::string_view GetResource_2020_field_png();
std::string_view GetResource_2020_infiniterecharge_png();
} // namespace wpi::fields

View File

@@ -8,5 +8,5 @@
namespace wpi::fields {
std::string_view GetResource_2021_barrelracingpath_json();
std::string_view GetResource_2021_barrel_png();
std::string_view GetResource_2021_barrelracingpath_png();
} // namespace wpi::fields

View File

@@ -8,5 +8,5 @@
namespace wpi::fields {
std::string_view GetResource_2021_bouncepath_json();
std::string_view GetResource_2021_bounce_png();
std::string_view GetResource_2021_bouncepath_png();
} // namespace wpi::fields

View File

@@ -7,6 +7,6 @@
#include <string_view>
namespace wpi::fields {
std::string_view GetResource_2021_field_png();
std::string_view GetResource_2021_infiniterecharge_json();
std::string_view GetResource_2021_infiniterecharge_png();
} // namespace wpi::fields

View File

@@ -8,5 +8,5 @@
namespace wpi::fields {
std::string_view GetResource_2021_slalompath_json();
std::string_view GetResource_2021_slalom_png();
std::string_view GetResource_2021_slalompath_png();
} // namespace wpi::fields

View File

@@ -8,5 +8,5 @@
namespace wpi::fields {
std::string_view GetResource_2022_rapidreact_json();
std::string_view GetResource_2022_field_png();
std::string_view GetResource_2022_rapidreact_png();
} // namespace wpi::fields

View File

@@ -8,5 +8,5 @@
namespace wpi::fields {
std::string_view GetResource_2023_chargedup_json();
std::string_view GetResource_2023_field_png();
std::string_view GetResource_2023_chargedup_png();
} // namespace wpi::fields

View File

@@ -8,5 +8,5 @@
namespace wpi::fields {
std::string_view GetResource_2024_crescendo_json();
std::string_view GetResource_2024_field_png();
std::string_view GetResource_2024_crescendo_png();
} // namespace wpi::fields

View File

@@ -8,5 +8,5 @@
namespace wpi::fields {
std::string_view GetResource_2025_reefscape_json();
std::string_view GetResource_2025_field_png();
std::string_view GetResource_2025_reefscape_png();
} // namespace wpi::fields

View File

@@ -8,5 +8,5 @@
namespace wpi::fields {
std::string_view GetResource_2026_rebuilt_json();
std::string_view GetResource_2026_field_png();
std::string_view GetResource_2026_rebuilt_png();
} // namespace wpi::fields

View File

@@ -0,0 +1,12 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
#pragma once
#include <string_view>
namespace wpi::fields {
std::string_view GetResource_2024_2025_intothedeep_json();
std::string_view GetResource_2024_2025_intothedeep_png();
} // namespace wpi::fields

View File

@@ -0,0 +1,12 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
#pragma once
#include <string_view>
namespace wpi::fields {
std::string_view GetResource_2025_2026_decode_json();
std::string_view GetResource_2025_2026_decode_png();
} // namespace wpi::fields

Binary file not shown.

Before

Width:  |  Height:  |  Size: 191 KiB

View File

@@ -1,19 +0,0 @@
{
"game": "FIRST Power Up",
"field-image": "2018-field.jpg",
"field-corners": {
"top-left": [
125,
20
],
"bottom-right": [
827,
370
]
},
"field-size": [
54,
27
],
"field-unit": "feet"
}

View File

@@ -1,19 +0,0 @@
{
"game": "Destination: Deep Space",
"field-image": "2019-field.jpg",
"field-corners": {
"top-left": [
217,
40
],
"bottom-right": [
1372,
615
]
},
"field-size": [
54,
27
],
"field-unit": "foot"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 257 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 747 KiB

View File

@@ -1,19 +0,0 @@
{
"game": "Infinite Recharge",
"field-image": "2020-field.png",
"field-corners": {
"top-left": [
96,
25
],
"bottom-right": [
1040,
514
]
},
"field-size": [
52.4375,
26.9375
],
"field-unit": "foot"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -1,19 +0,0 @@
{
"game": "Infinite Recharge 2021",
"field-image": "2021-field.png",
"field-corners": {
"top-left": [
127,
34
],
"bottom-right": [
1323,
649
]
},
"field-size": [
52.4375,
26.9375
],
"field-unit": "foot"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

View File

@@ -1,19 +0,0 @@
{
"game": "Rapid React",
"field-image": "2022-field.png",
"field-corners": {
"top-left": [
74,
50
],
"bottom-right": [
1774,
900
]
},
"field-size": [
54,
27
],
"field-unit": "foot"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

View File

@@ -1,19 +0,0 @@
{
"game": "Crescendo",
"field-image": "2024-field.png",
"field-corners": {
"top-left": [
150,
79
],
"bottom-right": [
2961,
1476
]
},
"field-size": [
54.27083,
26.9375
],
"field-unit": "foot"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 921 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 742 KiB

View File

@@ -1,19 +0,0 @@
{
"game": "Rebuilt",
"field-image": "2026-field.png",
"field-corners": {
"top-left": [
245,
118
],
"bottom-right": [
3942,
1914
]
},
"field-size": [
54.269,
26.474
],
"field-unit": "foot"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

View File

@@ -0,0 +1,20 @@
{
"game": "2018 FRC Power Up",
"field-image": "2018-powerup.jpg",
"field-corners": {
"top-left": [
133,
23
],
"bottom-right": [
835,
373
]
},
"field-size": [
54,
27
],
"field-unit": "foot",
"program": "frc"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 KiB

View File

@@ -0,0 +1,20 @@
{
"game": "2019 FRC Destination: Deep Space",
"field-image": "2019-deepspace.jpg",
"field-corners": {
"top-left": [
220,
41
],
"bottom-right": [
1375,
616
]
},
"field-size": [
54,
27
],
"field-unit": "foot",
"program": "frc"
}

View File

@@ -0,0 +1,20 @@
{
"game": "2020 FRC Infinite Recharge",
"field-image": "2020-infiniterecharge.png",
"field-corners": {
"top-left": [
94,
26
],
"bottom-right": [
1038,
515
]
},
"field-size": [
52.4375,
26.9375
],
"field-unit": "foot",
"program": "frc"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 667 KiB

View File

@@ -1,6 +1,6 @@
{
"game": "Barrel Racing Path",
"field-image": "2021-barrel.png",
"game": "2021 FRC Barrel Racing Path",
"field-image": "2021-barrelracingpath.png",
"field-corners": {
"top-left": [
20,
@@ -15,5 +15,6 @@
30,
15
],
"field-unit": "feet"
"field-unit": "foot",
"program": "frc"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -1,6 +1,6 @@
{
"game": "Bounce Path",
"field-image": "2021-bounce.png",
"game": "2021 FRC Bounce Path",
"field-image": "2021-bouncepath.png",
"field-corners": {
"top-left": [
20,
@@ -15,5 +15,6 @@
30,
15
],
"field-unit": "feet"
"field-unit": "foot",
"program": "frc"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -1,5 +1,5 @@
{
"game": "Galactic Search A",
"game": "2021 FRC Galactic Search A",
"field-image": "2021-galacticsearcha.png",
"field-corners": {
"top-left": [
@@ -15,5 +15,6 @@
30,
15
],
"field-unit": "feet"
"field-unit": "foot",
"program": "frc"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -1,5 +1,5 @@
{
"game": "Galactic Search B",
"game": "2021 FRC Galactic Search B",
"field-image": "2021-galacticsearchb.png",
"field-corners": {
"top-left": [
@@ -15,5 +15,6 @@
30,
15
],
"field-unit": "feet"
"field-unit": "foot",
"program": "frc"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -0,0 +1,20 @@
{
"game": "2021 FRC Infinite Recharge",
"field-image": "2021-infiniterecharge.png",
"field-corners": {
"top-left": [
133,
35
],
"bottom-right": [
1329,
650
]
},
"field-size": [
52.4375,
26.9375
],
"field-unit": "foot",
"program": "frc"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 989 KiB

View File

@@ -1,6 +1,6 @@
{
"game": "Slalom Path",
"field-image": "2021-slalom.png",
"game": "2021 FRC Slalom Path",
"field-image": "2021-slalompath.png",
"field-corners": {
"top-left": [
20,
@@ -15,5 +15,6 @@
30,
15
],
"field-unit": "feet"
"field-unit": "foot",
"program": "frc"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -0,0 +1,20 @@
{
"game": "2022 FRC Rapid React",
"field-image": "2022-rapidreact.png",
"field-corners": {
"top-left": [
85,
49
],
"bottom-right": [
1785,
899
]
},
"field-size": [
54,
27
],
"field-unit": "foot",
"program": "frc"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

View File

@@ -1,6 +1,6 @@
{
"game": "Charged Up",
"field-image": "2023-field.png",
"game": "2023 FRC Charged Up",
"field-image": "2023-chargedup.png",
"field-corners": {
"top-left": [
46,
@@ -15,5 +15,6 @@
54.27083,
26.2916
],
"field-unit": "foot"
"field-unit": "foot",
"program": "frc"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 813 KiB

View File

@@ -0,0 +1,20 @@
{
"game": "2024 FRC Crescendo",
"field-image": "2024-crescendo.png",
"field-corners": {
"top-left": [
151,
80
],
"bottom-right": [
2962,
1477
]
},
"field-size": [
54.27083,
26.9375
],
"field-unit": "foot",
"program": "frc"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

View File

@@ -1,19 +1,20 @@
{
"game": "Reefscape",
"field-image": "2025-field.png",
"game": "2025 FRC Reefscape",
"field-image": "2025-reefscape.png",
"field-corners": {
"top-left": [
534,
291
289
],
"bottom-right": [
3466,
1638
1636
]
},
"field-size": [
57.573,
26.417
],
"field-unit": "foot"
"field-unit": "foot",
"program": "frc"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 847 KiB

View File

@@ -0,0 +1,20 @@
{
"game": "2026 FRC Rebuilt",
"field-image": "2026-rebuilt.png",
"field-corners": {
"top-left": [
254,
121
],
"bottom-right": [
3951,
1917
]
},
"field-size": [
54.269,
26.474
],
"field-unit": "foot",
"program": "frc"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 KiB

View File

@@ -0,0 +1,20 @@
{
"game": "2024-2025 FTC Into The Deep",
"field-image": "2024-2025-intothedeep.png",
"field-corners": {
"top-left": [
0,
0
],
"bottom-right": [
2214,
2214
]
},
"field-size": [
11.93183333,
11.93183333
],
"field-unit": "foot",
"program": "ftc"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 356 KiB

View File

@@ -0,0 +1,20 @@
{
"game": "2025-2026 FTC DECODE",
"field-image": "2025-2026-decode.png",
"field-corners": {
"top-left": [
0,
0
],
"bottom-right": [
2445,
2445
]
},
"field-size": [
11.93183333,
11.93183333
],
"field-unit": "foot",
"program": "ftc"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 KiB

View File

@@ -11,7 +11,7 @@ import org.junit.jupiter.params.provider.EnumSource;
class LoadConfigTest {
@ParameterizedTest
@EnumSource(Fields.class)
void testLoad(Fields field) {
void testLoadFields(Fields field) {
FieldConfig config = Assertions.assertDoesNotThrow(() -> FieldConfig.loadField(field));
Assertions.assertNotNull(config.getImageUrl());