163 lines
4.1 KiB
C++
163 lines
4.1 KiB
C++
#include "Components/Camera.hpp"
|
|
#include "Components/Gravity.hpp"
|
|
#include "Components/Player.hpp"
|
|
#include "Components/Renderable.hpp"
|
|
#include "Components/RigidBody.hpp"
|
|
#include "Components/Thrust.hpp"
|
|
#include "Components/Transform.hpp"
|
|
#include "Core/Coordinator.hpp"
|
|
#include "Systems/CameraControlSystem.hpp"
|
|
#include "Systems/PhysicsSystem.hpp"
|
|
#include "Systems/PlayerControlSystem.hpp"
|
|
#include "Systems/RenderSystem.hpp"
|
|
#include "WindowManager.hpp"
|
|
#include <chrono>
|
|
#include <random>
|
|
|
|
|
|
Coordinator gCoordinator;
|
|
|
|
static bool quit = false;
|
|
|
|
|
|
void QuitHandler(Event& event)
|
|
{
|
|
quit = true;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
gCoordinator.Init();
|
|
|
|
|
|
WindowManager windowManager;
|
|
windowManager.Init("Nexus", 1920, 1080, 0, 0);
|
|
|
|
|
|
gCoordinator.AddEventListener(FUNCTION_LISTENER(Events::Window::QUIT, QuitHandler));
|
|
|
|
|
|
gCoordinator.RegisterComponent<Camera>();
|
|
gCoordinator.RegisterComponent<Gravity>();
|
|
gCoordinator.RegisterComponent<Player>();
|
|
gCoordinator.RegisterComponent<Renderable>();
|
|
gCoordinator.RegisterComponent<RigidBody>();
|
|
gCoordinator.RegisterComponent<Thrust>();
|
|
gCoordinator.RegisterComponent<Transform>();
|
|
|
|
|
|
auto physicsSystem = gCoordinator.RegisterSystem<PhysicsSystem>();
|
|
{
|
|
Signature signature;
|
|
signature.set(gCoordinator.GetComponentType<Gravity>());
|
|
signature.set(gCoordinator.GetComponentType<RigidBody>());
|
|
signature.set(gCoordinator.GetComponentType<Transform>());
|
|
gCoordinator.SetSystemSignature<PhysicsSystem>(signature);
|
|
}
|
|
|
|
physicsSystem->Init();
|
|
|
|
|
|
auto cameraControlSystem = gCoordinator.RegisterSystem<CameraControlSystem>();
|
|
{
|
|
Signature signature;
|
|
signature.set(gCoordinator.GetComponentType<Camera>());
|
|
signature.set(gCoordinator.GetComponentType<Transform>());
|
|
gCoordinator.SetSystemSignature<CameraControlSystem>(signature);
|
|
}
|
|
|
|
cameraControlSystem->Init();
|
|
|
|
|
|
auto playerControlSystem = gCoordinator.RegisterSystem<PlayerControlSystem>();
|
|
{
|
|
Signature signature;
|
|
signature.set(gCoordinator.GetComponentType<Player>());
|
|
signature.set(gCoordinator.GetComponentType<Transform>());
|
|
gCoordinator.SetSystemSignature<PlayerControlSystem>(signature);
|
|
}
|
|
|
|
playerControlSystem->Init();
|
|
|
|
|
|
auto renderSystem = gCoordinator.RegisterSystem<RenderSystem>();
|
|
{
|
|
Signature signature;
|
|
signature.set(gCoordinator.GetComponentType<Renderable>());
|
|
signature.set(gCoordinator.GetComponentType<Transform>());
|
|
gCoordinator.SetSystemSignature<RenderSystem>(signature);
|
|
}
|
|
|
|
renderSystem->Init();
|
|
|
|
std::vector<Entity> entities(MAX_ENTITIES - 1);
|
|
|
|
std::default_random_engine generator;
|
|
std::uniform_real_distribution<float> randPosition(-100.0f, 100.0f);
|
|
std::uniform_real_distribution<float> randRotation(0.0f, 3.0f);
|
|
std::uniform_real_distribution<float> randScale(3.0f, 5.0f);
|
|
std::uniform_real_distribution<float> randColor(0.0f, 1.0f);
|
|
std::uniform_real_distribution<float> randGravity(-10.0f, -1.0f);
|
|
|
|
float scale = randScale(generator);
|
|
|
|
for (auto& entity : entities)
|
|
{
|
|
entity = gCoordinator.CreateEntity();
|
|
gCoordinator.AddComponent(entity, Player{});
|
|
|
|
gCoordinator.AddComponent<Gravity>(
|
|
entity,
|
|
{Vec3(0.0f, randGravity(generator), 0.0f)});
|
|
|
|
gCoordinator.AddComponent(
|
|
entity,
|
|
RigidBody{
|
|
.velocity = Vec3(0.0f, 0.0f, 0.0f),
|
|
.acceleration = Vec3(0.0f, 0.0f, 0.0f)
|
|
});
|
|
|
|
gCoordinator.AddComponent(
|
|
entity,
|
|
Transform{
|
|
.position = Vec3(randPosition(generator), randPosition(generator), randPosition(generator)),
|
|
.rotation = Vec3(randRotation(generator), randRotation(generator), randRotation(generator)),
|
|
.scale = Vec3(scale, scale, scale)
|
|
});
|
|
|
|
gCoordinator.AddComponent(
|
|
entity,
|
|
Renderable{
|
|
.color = Vec3(randColor(generator), randColor(generator), randColor(generator))
|
|
});
|
|
}
|
|
|
|
float dt = 0.0f;
|
|
|
|
while (!quit)
|
|
{
|
|
auto startTime = std::chrono::high_resolution_clock::now();
|
|
|
|
windowManager.ProcessEvents();
|
|
|
|
playerControlSystem->Update(dt);
|
|
|
|
cameraControlSystem->Update(dt);
|
|
|
|
physicsSystem->Update(dt);
|
|
|
|
renderSystem->Update(dt);
|
|
|
|
windowManager.Update();
|
|
|
|
auto stopTime = std::chrono::high_resolution_clock::now();
|
|
|
|
dt = std::chrono::duration<float, std::chrono::seconds::period>(stopTime - startTime).count();
|
|
}
|
|
|
|
|
|
windowManager.Shutdown();
|
|
|
|
return 0;
|
|
}
|