From da8c64624f93e5f340338d34843f4248023cc9cf Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Sat, 18 Oct 2025 01:32:04 +0200 Subject: [PATCH] feat: add track classes --- src/track.py | 61 +++++++++++++++++++++++++++++++++++++++++++++ src/track_object.py | 13 ++++++++++ src/utils.py | 5 ++++ 3 files changed, 79 insertions(+) create mode 100644 src/track.py create mode 100644 src/track_object.py create mode 100644 src/utils.py diff --git a/src/track.py b/src/track.py new file mode 100644 index 0000000..675d49c --- /dev/null +++ b/src/track.py @@ -0,0 +1,61 @@ +from __future__ import annotations + +import json + +from src.track_object import TrackObject, TrackObjectType +from src.utils import ROOT +from src.vec import Vec + + +class Track: + TRACKS_DIRECTORY = ROOT / "assets" / "tracks" + + def __init__(self, id: str, name: str, start_pos: Vec, start_dir: Vec) -> None: + self.id: str = id + self.name: str = name + self.start_pos: Vec = start_pos + self.start_dir: Vec = start_dir + self.objects: list[TrackObject] = [] + self.load_objects() + + @staticmethod + def load(name: str) -> Track: + with open(Track.TRACKS_DIRECTORY / name / "meta.json", "r") as f: + meta: dict = json.load(f) + + return Track( + name, + meta["name"], + Vec(*meta["start"]["pos"]), + Vec(*meta["start"]["direction"]), + ) + + def load_objects(self): + with open(Track.TRACKS_DIRECTORY / self.id / "track.json", "r") as f: + data: list = json.load(f) + + self.objects = [] + for obj_data in data: + if obj_data["type"] == "road": + self.objects.append(Road.load(obj_data)) + + +class RoadPoint: + def __init__(self, pos: Vec, direction: Vec, width: float) -> None: + self.pos: Vec = pos + self.direction: Vec = direction + self.width: float = width + + @staticmethod + def load(data: list[float]) -> RoadPoint: + return RoadPoint(Vec(data[0], data[1]), Vec(data[2], data[3]), data[4]) + + +class Road(TrackObject): + def __init__(self, pts: list[RoadPoint]) -> None: + super().__init__(TrackObjectType.Road) + self.pts: list[RoadPoint] = pts + + @staticmethod + def load(data: dict) -> Road: + return Road([RoadPoint.load(pt) for pt in data["pts"]]) diff --git a/src/track_object.py b/src/track_object.py new file mode 100644 index 0000000..3e9a162 --- /dev/null +++ b/src/track_object.py @@ -0,0 +1,13 @@ +from enum import StrEnum + + +class TrackObjectType(StrEnum): + Road = "road" + + +class TrackObject: + def __init__( + self, + type: TrackObjectType, + ) -> None: + self.type: TrackObjectType = type diff --git a/src/utils.py b/src/utils.py new file mode 100644 index 0000000..4b58a5c --- /dev/null +++ b/src/utils.py @@ -0,0 +1,5 @@ +import os +from pathlib import Path + + +ROOT = Path(os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)))