#pragma once #include #include "CoreMath.h" #include "engine/tracks/Track.h" #include "engine/cameras/GameCamera.h" #include "objects/Object.h" #include "Cup.h" #include "PlayerBombKart.h" #include "TrainCrossing.h" #include #include #include #include "RaceManager.h" #include "Actor.h" #include "StaticMeshActor.h" #include "particles/ParticleEmitter.h" #include "engine/sky/SkyCloud.h" #include "editor/Editor.h" #include "editor/GameObject.h" #include "port/Game.h" extern "C" { #include "camera.h" #include "objects.h" }; class Cup; // <-- Forward declaration class OObject; class GameCamera; class Track; class StaticMeshActor; class OBombKart; class TrainCrossing; class OLakitu; class GameObject; // <-- Editor class World { typedef struct Matrix { Mtx Screen2D; // Orthogonal projection for UI, skybox, and such Mtx Ortho; std::array Persp; std::array LookAt; std::array Karts; // Eight players * four screens std::array Shadows; // Eight players * four screens std::deque Hud; std::deque Objects; Matrix() : Hud(200), Objects(1000) {} } Matrix; private: std::unique_ptr mTrack; Cup* CurrentCup; public: static World* Instance; explicit World(); ~World(); RaceManager& GetRaceManager() { return *RaceManagerInstance; } void SetRaceManager(std::unique_ptr manager) { RaceManagerInstance = std::move(manager); } void TickCameras(); AActor* AddActor(std::unique_ptr actor); struct Actor* AddBaseActor(); void ActorBeginPlay(Actor* actor); AActor* GetActor(size_t index); void TickActors(); AActor* ConvertActorToAActor(Actor* actor); Actor* ConvertAActorToActor(AActor* actor); void DrawStaticMeshActors(); StaticMeshActor* AddStaticMeshActor(const std::string& name, FVector pos, IRotator rot, FVector scale, const std::string& model, int32_t* collision); OObject* AddObject(std::unique_ptr object); void TickObjects(); void TickObjects60fps(); void DrawObjects(s32 cameraId); Object *GetObjectByIndex(size_t); void TickParticles(); void DrawParticles(s32 cameraId); ParticleEmitter* AddEmitter(std::unique_ptr emitter); void Reset(void); // Sets OObjects or AActors static member variables back to default values void AddCup(Cup* cup); void SetCurrentCup(Cup* cup); Cup* GetCurrentCup() { return CurrentCup; } void SetCupIndex(size_t index); const char* GetCupName(); u32 GetCupIndex(); u32 NextCup(); u32 PreviousCup(); World* GetWorld(void); void CleanWorld(void); void CleanActors(void); // getter/setter for current track Track* GetTrack() { return mTrack.get(); } void SetCurrentTrack(std::unique_ptr track); Matrix world_mtx; std::vector Cups; size_t CupIndex = 1; std::vector> Cameras; std::vector> StaticMeshActors; std::vector> Actors; std::deque> Objects; std::vector> Emitters; std::unordered_map Lakitus; /** Objects **/ PlayerBombKart mPlayerBombKart[4]; // Used in battle mode TrainCrossing* AddCrossing(Vec3f position, u32 waypointMin, u32 waypointMax, f32 approachRadius, f32 exitRadius); std::vector> Crossings; private: std::unique_ptr RaceManagerInstance; };