[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

@@ -53,6 +53,7 @@ upb wpiutil/src/main/native/thirdparty/upb
mrcal tools/wpical/src/main/native/thirdparty/mrcal
libdogleg tools/wpical/src/main/native/thirdparty/libdogleg
Simd hal/src/main/native/systemcore/simd
AdvantageScope fields/src/main/native/resources/org/wpilib/fields/ftc
Additionally, glfw and nanopb were modified for use in WPILib.
@@ -1690,3 +1691,34 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
============
AdvantageScope License
============
Copyright (c) 2021-2026 Littleton Robotics. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
- Neither the name of Littleton Robotics, FRC 6328 ("Mechanical Advantage"),
AdvantageScope, nor the names of other AdvantageScope contributors may be
used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY LITTLETON ROBOTICS AND OTHER ADVANTAGESCOPE
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY NONINFRINGEMENT
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
LITTLETON ROBOTICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

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());

View File

@@ -348,7 +348,7 @@ static bool InputPose(wpi::math::Pose2d* pose) {
}
FieldInfo::FieldInfo(Storage& storage)
: m_builtin{storage.GetString("builtin", "2026 Rebuilt")},
: m_builtin{storage.GetString("builtin", "Custom")},
m_filename{storage.GetString("image")},
m_width{storage.GetFloat("width", kDefaultWidth.to<float>())},
m_height{storage.GetFloat("height", kDefaultHeight.to<float>())},
@@ -490,8 +490,8 @@ bool FieldInfo::LoadJson(std::span<const char> is, std::string_view filename) {
float width;
float height;
try {
width = j->at("field-size").at(0).get_float();
height = j->at("field-size").at(1).get_float();
width = j->at("field-size").at(0).get_number();
height = j->at("field-size").at(1).get_number();
} catch (const std::logic_error& e) {
wpi::util::print(stderr, "GUI: JSON: could not read field-size: {}\n",
e.what());