feat: add track classes
This commit is contained in:
		
							
								
								
									
										61
									
								
								src/track.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								src/track.py
									
									
									
									
									
										Normal file
									
								
							| @@ -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"]]) | ||||
							
								
								
									
										13
									
								
								src/track_object.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/track_object.py
									
									
									
									
									
										Normal file
									
								
							| @@ -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 | ||||
							
								
								
									
										5
									
								
								src/utils.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/utils.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| import os | ||||
| from pathlib import Path | ||||
|  | ||||
|  | ||||
| ROOT = Path(os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir))) | ||||
		Reference in New Issue
	
	Block a user