From de39f059a130a843f220dc549c7d3714093e9ee6 Mon Sep 17 00:00:00 2001 From: KyroVibe Date: Sat, 20 Jul 2024 15:42:25 -0600 Subject: [PATCH 1/7] UI touchups and debug panel --- fission/src/Synthesis.tsx | 2 + fission/src/ui/components/MainHUD.tsx | 104 +----------- fission/src/ui/panels/DebugPanel.tsx | 153 ++++++++++++++++++ .../ui/panels/mirabuf/ImportMirabufPanel.tsx | 2 +- 4 files changed, 161 insertions(+), 100 deletions(-) create mode 100644 fission/src/ui/panels/DebugPanel.tsx diff --git a/fission/src/Synthesis.tsx b/fission/src/Synthesis.tsx index c6c7048b12..9394c23aa7 100644 --- a/fission/src/Synthesis.tsx +++ b/fission/src/Synthesis.tsx @@ -66,6 +66,7 @@ import SceneOverlay from "./ui/components/SceneOverlay.tsx" import WPILibWSWorker from "@/systems/simulation/wpilib_brain/WPILibWSWorker.ts?worker" import WSViewPanel from "./ui/panels/WSViewPanel.tsx" import Lazy from "./util/Lazy.ts" +import DebugPanel from "./ui/panels/DebugPanel.tsx" const DEFAULT_MIRA_PATH = "/api/mira/Robots/Team 2471 (2018)_v7.mira" @@ -267,6 +268,7 @@ const initialPanels: ReactElement[] = [ , , , + , ] export default Synthesis diff --git a/fission/src/ui/components/MainHUD.tsx b/fission/src/ui/components/MainHUD.tsx index 5b88f3efbb..0a15b1db5d 100644 --- a/fission/src/ui/components/MainHUD.tsx +++ b/fission/src/ui/components/MainHUD.tsx @@ -21,7 +21,7 @@ import MirabufSceneObject from "@/mirabuf/MirabufSceneObject" import { Button } from "@mui/base/Button" import MirabufCachingService, { MiraType } from "@/mirabuf/MirabufLoader" import Jolt from "@barclah/jolt-physics" -import { AiOutlineDoubleRight } from "react-icons/ai" +import { AiOutlineDoubleRight, AiOutlineTool } from "react-icons/ai" import PreferencesSystem from "@/systems/preferences/PreferencesSystem" type ButtonProps = { @@ -118,62 +118,8 @@ const MainHUD: React.FC = () => { icon={} onClick={() => openModal("import-local-mirabuf")} /> - } - onClick={() => openPanel("poker")} - /> - } onClick={TestGodMode} /> - } - onClick={() => PreferencesSystem.clearPreferences()} - /> - } - onClick={async () => - APS.isSignedIn() && APS.refreshAuthToken((await APS.getAuth())!.refresh_token, true) - } - /> - } - onClick={() => { - if (APS.isSignedIn()) { - APS.setExpiresAt(Date.now()) - APS.getAuthOrLogin() - } - }} - /> - } onClick={() => openPanel("ws-view")} />
- } - onClick={() => openModal("download-assets")} - /> - } onClick={() => openModal("roborio")} /> - } - onClick={() => openPanel("driver-station")} - /> - {/* MiraMap and OPFS Temp Buttons */} - } - onClick={() => { - console.log(MirabufCachingService.GetCacheMap(MiraType.ROBOT)) - console.log(MirabufCachingService.GetCacheMap(MiraType.FIELD)) - }} - /> - } - onClick={() => MirabufCachingService.RemoveAll()} - /> } @@ -182,31 +128,14 @@ const MainHUD: React.FC = () => { }} /> } onClick={() => openModal("drivetrain")} /> + } onClick={() => openModal("config-robot")} /> } - onClick={() => { - // worker?.postMessage({ command: 'connect' }); - const miraObjs = [...World.SceneRenderer.sceneObjects.entries()].filter( - x => x[1] instanceof MirabufSceneObject - ) - console.log(`Number of mirabuf scene objects: ${miraObjs.length}`) - if (miraObjs.length > 0) { - const mechanism = (miraObjs[0][1] as MirabufSceneObject).mechanism - const simLayer = World.SimulationSystem.GetSimulationLayer(mechanism) - simLayer?.SetBrain(new WPILibBrain(mechanism)) - } - }} - /> - } + value={"Debug Tools"} + icon={} onClick={() => { - const type: ToastType = ["info", "warning", "error"][Math.floor(Random() * 3)] as ToastType - addToast(type, type, "This is a test toast to test the toast system") + openPanel("debug") }} /> - } onClick={() => openModal("config-robot")} />
{userInfo ? ( { ) } -async function TestGodMode() { - const robot: MirabufSceneObject = [...World.SceneRenderer.sceneObjects.entries()] - .filter(x => { - const y = x[1] instanceof MirabufSceneObject - return y - }) - .map(x => x[1])[0] as MirabufSceneObject - const rootNodeId = robot.GetRootNodeId() - if (rootNodeId == undefined) { - console.error("Robot root node not found for god mode") - return - } - const robotPosition = World.PhysicsSystem.GetBody(rootNodeId).GetPosition() - const [ghostBody, _ghostConstraint] = World.PhysicsSystem.CreateGodModeBody(rootNodeId, robotPosition as Jolt.Vec3) - // Move ghostBody to demonstrate godMode movement - await new Promise(f => setTimeout(f, 1000)) - World.PhysicsSystem.SetBodyPosition( - ghostBody.GetID(), - new JOLT.Vec3(robotPosition.GetX(), robotPosition.GetY() + 2, robotPosition.GetZ()) - ) - await new Promise(f => setTimeout(f, 1000)) - World.PhysicsSystem.SetBodyPosition(ghostBody.GetID(), new JOLT.Vec3(2, 2, 2)) -} export default MainHUD diff --git a/fission/src/ui/panels/DebugPanel.tsx b/fission/src/ui/panels/DebugPanel.tsx new file mode 100644 index 0000000000..e4a4d2927c --- /dev/null +++ b/fission/src/ui/panels/DebugPanel.tsx @@ -0,0 +1,153 @@ +import { AiOutlineTool } from "react-icons/ai" +import Panel, { PanelPropsImpl } from "../components/Panel" +import Button from "../components/Button" +import World from "@/systems/World" +import MirabufSceneObject from "@/mirabuf/MirabufSceneObject" +import WPILibBrain from "@/systems/simulation/wpilib_brain/WPILibBrain" +import { MainHUD_AddToast } from "../components/MainHUD" +import { ToastType } from "../ToastContext" +import { Random } from "@/util/Random" +import MirabufCachingService, { MiraType } from "@/mirabuf/MirabufLoader" +import { Box, styled } from "@mui/material" +import { usePanelControlContext } from "../PanelContext" +import APS from "@/aps/APS" +import PreferencesSystem from "@/systems/preferences/PreferencesSystem" +import JOLT from "@/util/loading/JoltSyncLoader" +import Jolt from "@barclah/jolt-physics" +import Label from "../components/Label" +import { colorNameToVar } from "../ThemeContext" + +const LabelStyled = styled(Label)({ + fontWeight: 700, + margin: "0pt", + marginTop: "0.5rem" +}) + +async function TestGodMode() { + const robot: MirabufSceneObject = [...World.SceneRenderer.sceneObjects.entries()] + .filter(x => { + const y = x[1] instanceof MirabufSceneObject + return y + }) + .map(x => x[1])[0] as MirabufSceneObject + const rootNodeId = robot.GetRootNodeId() + if (rootNodeId == undefined) { + console.error("Robot root node not found for god mode") + return + } + const robotPosition = World.PhysicsSystem.GetBody(rootNodeId).GetPosition() + const [ghostBody, _ghostConstraint] = World.PhysicsSystem.CreateGodModeBody(rootNodeId, robotPosition as Jolt.Vec3) + + // Move ghostBody to demonstrate godMode movement + await new Promise(f => setTimeout(f, 1000)) + World.PhysicsSystem.SetBodyPosition( + ghostBody.GetID(), + new JOLT.Vec3(robotPosition.GetX(), robotPosition.GetY() + 2, robotPosition.GetZ()) + ) + await new Promise(f => setTimeout(f, 1000)) + World.PhysicsSystem.SetBodyPosition(ghostBody.GetID(), new JOLT.Vec3(2, 2, 2)) +} + +const DebugPanel: React.FC = ({ panelId }) => { + const { openPanel } = usePanelControlContext() + + return ( + } + panelId={panelId} + acceptEnabled={false} + cancelName="Close" + > + + Generic + {
} + icon={} onClick={() => openModal("manage-assemblies")} /> } onClick={() => openModal("settings")} /> } onClick={() => openModal("view")} /> - } - onClick={() => openModal("change-inputs")} - /> + } onClick={() => openModal("change-inputs")} /> } onClick={() => openPanel("multibot")} /> } + icon={} onClick={() => openModal("import-local-mirabuf")} />
} + icon={} onClick={() => { openPanel("scoring-zones") }} @@ -120,7 +125,7 @@ const MainHUD: React.FC = () => { } onClick={() => openModal("config-robot")} /> } + icon={} onClick={() => { openPanel("debug") }} diff --git a/fission/src/ui/components/Toast.tsx b/fission/src/ui/components/Toast.tsx index 3918463197..04d81dda0b 100644 --- a/fission/src/ui/components/Toast.tsx +++ b/fission/src/ui/components/Toast.tsx @@ -1,6 +1,6 @@ import React, { ReactElement, useEffect } from "react" import { ToastData, useToastContext } from "@/ui/ToastContext" -import { GrFormClose } from "react-icons/gr" +import { FaXmark } from "react-icons/fa6" import { BsFillWrenchAdjustableCircleFill } from "react-icons/bs" import { AiFillWarning } from "react-icons/ai" import { BiSolidErrorCircle } from "react-icons/bi" @@ -51,7 +51,7 @@ const Toast: React.FC = ({ id, type, title, description }) => { onClick={handleClose} className="toast-close bg-[rgba(0,0,0,0)] h-min aspect-square p-0" > - +

{title}

diff --git a/fission/src/ui/components/Tooltip.tsx b/fission/src/ui/components/Tooltip.tsx index 4c8ecdbeb3..deec78f58f 100644 --- a/fission/src/ui/components/Tooltip.tsx +++ b/fission/src/ui/components/Tooltip.tsx @@ -1,5 +1,5 @@ import { TooltipControl, TooltipType } from "@/ui/TooltipContext" -import { FaInfoCircle } from "react-icons/fa" +import { FaCircleInfo } from "react-icons/fa6" import Label, { LabelSize } from "./Label" import Stack, { StackDirection } from "./Stack" @@ -12,7 +12,7 @@ const Tooltip: React.FC = ({ type, controls }) => { if (type === "controls") { return (
- + {controls?.map(c => ( = ({ modalId }) => { const isOnMainMenu = false return ( - } modalId={modalId} acceptName="Exit"> + } modalId={modalId} acceptName="Exit"> diff --git a/fission/src/ui/modals/MatchResultsModal.tsx b/fission/src/ui/modals/MatchResultsModal.tsx index 3fc1c9cf1b..cf24625bac 100644 --- a/fission/src/ui/modals/MatchResultsModal.tsx +++ b/fission/src/ui/modals/MatchResultsModal.tsx @@ -1,6 +1,6 @@ import React from "react" import Modal, { ModalPropsImpl } from "@/components/Modal" -import { GrFormClose } from "react-icons/gr" +import { FaXmark } from "react-icons/fa6" import Stack, { StackDirection } from "@/components/Stack" import Label from "@/components/Label" @@ -18,7 +18,7 @@ const MatchResultsModal: React.FC = ({ modalId }) => { return ( } + icon={} modalId={modalId} cancelName="Exit" middleName="Configure" diff --git a/fission/src/ui/modals/UpdateAvailableModal.tsx b/fission/src/ui/modals/UpdateAvailableModal.tsx index 6cbeb3cd27..2c567308c5 100644 --- a/fission/src/ui/modals/UpdateAvailableModal.tsx +++ b/fission/src/ui/modals/UpdateAvailableModal.tsx @@ -1,11 +1,11 @@ import React from "react" import Modal, { ModalPropsImpl } from "@/components/Modal" -import { GrFormClose } from "react-icons/gr" +import { FaXmark } from "react-icons/fa6" import Label from "@/components/Label" const UpdateAvailableModal: React.FC = ({ modalId }) => { return ( - } modalId={modalId} acceptName="Update"> + } modalId={modalId} acceptName="Update">