summaryrefslogtreecommitdiff
path: root/src/engine/World.h
blob: 6bc60ca2bd1b8e284716b90126c82eb94e8645c0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#pragma once

#include <libultraship.h>

#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 <memory>
#include <unordered_map>
#include <utility>
#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<Mtx,5> Persp;
    std::array<Mtx,5> LookAt;
    std::array<Mtx, 8 * 4> Karts; // Eight players * four screens
    std::array<Mtx, 8 * 4> Shadows; // Eight players * four screens
    std::deque<Mtx> Hud;
    std::deque<Mtx> Objects;

    Matrix()
        : Hud(200), Objects(1000)
    {}
};
private:
    std::unique_ptr<Track> mTrack;
    Cup* CurrentCup;

public:
    static World* Instance;
    explicit World();
    ~World();

    RaceManager& GetRaceManager() { return *RaceManagerInstance; }
    void SetRaceManager(std::unique_ptr<RaceManager> manager) { RaceManagerInstance = std::move(manager); }

    void TickCameras();

    AActor* AddActor(std::unique_ptr<AActor> 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<OObject> object);

    void TickObjects();
    void TickObjects60fps();
    void DrawObjects(s32 cameraId);
    Object *GetObjectByIndex(size_t);

    void TickParticles();
    void DrawParticles(s32 cameraId);
    ParticleEmitter* AddEmitter(std::unique_ptr<ParticleEmitter> 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> track);

    Matrix Mtx;

    std::vector<Cup*> Cups;
    size_t CupIndex = 1;

    std::vector<std::unique_ptr<GameCamera>> Cameras;

    std::vector<std::unique_ptr<StaticMeshActor>> StaticMeshActors;
    std::vector<std::unique_ptr<AActor>> Actors;
    std::deque<std::unique_ptr<OObject>> Objects;
    std::vector<std::unique_ptr<ParticleEmitter>> Emitters;

    std::unordered_map<s32, OLakitu*> Lakitus;

    /** Objects **/
    PlayerBombKart mPlayerBombKart[4]; // Used in battle mode

    TrainCrossing* AddCrossing(Vec3f position, u32 waypointMin, u32 waypointMax, f32 approachRadius, f32 exitRadius);
    std::vector<std::shared_ptr<TrainCrossing>> Crossings;
private:
    std::unique_ptr<RaceManager> RaceManagerInstance;
};