main.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #include <QGuiApplication>
  2. #include <QQmlApplicationEngine>
  3. #include <QOpenGLContext>
  4. #include <QSurfaceFormat>
  5. #include <QDebug>
  6. #include <QDir>
  7. #include "engine/core/world.h"
  8. #include "engine/core/component.h"
  9. #include "render/gl/renderer.h"
  10. #include "render/gl/camera.h"
  11. #include "game/systems/movement_system.h"
  12. #include "game/systems/combat_system.h"
  13. #include "game/systems/selection_system.h"
  14. class GameEngine : public QObject {
  15. Q_OBJECT
  16. public:
  17. GameEngine() {
  18. // Initialize core systems
  19. m_world = std::make_unique<Engine::Core::World>();
  20. m_renderer = std::make_unique<Render::GL::Renderer>();
  21. m_camera = std::make_unique<Render::GL::Camera>();
  22. // Add game systems
  23. m_world->addSystem(std::make_unique<Game::Systems::MovementSystem>());
  24. m_world->addSystem(std::make_unique<Game::Systems::CombatSystem>());
  25. m_world->addSystem(std::make_unique<Game::Systems::AISystem>());
  26. m_selectionSystem = std::make_unique<Game::Systems::SelectionSystem>();
  27. m_world->addSystem(std::make_unique<Game::Systems::SelectionSystem>());
  28. setupTestScene();
  29. }
  30. void initialize() {
  31. if (!m_renderer->initialize()) {
  32. qWarning() << "Failed to initialize renderer";
  33. return;
  34. }
  35. m_renderer->setCamera(m_camera.get());
  36. // Set up RTS camera view
  37. m_camera->setRTSView(QVector3D(0, 0, 0), 15.0f, 45.0f);
  38. m_camera->setPerspective(45.0f, 16.0f/9.0f, 0.1f, 1000.0f);
  39. qDebug() << "Game engine initialized successfully";
  40. }
  41. void update(float deltaTime) {
  42. if (m_world) {
  43. m_world->update(deltaTime);
  44. }
  45. }
  46. void render() {
  47. if (m_renderer && m_world) {
  48. m_renderer->beginFrame();
  49. m_renderer->renderWorld(m_world.get());
  50. m_renderer->endFrame();
  51. }
  52. }
  53. private:
  54. void setupTestScene() {
  55. // Create some test units
  56. for (int i = 0; i < 5; ++i) {
  57. auto entity = m_world->createEntity();
  58. // Add transform component
  59. auto transform = entity->addComponent<Engine::Core::TransformComponent>();
  60. transform->position.x = i * 2.0f;
  61. transform->position.y = 0.0f;
  62. transform->position.z = 0.0f;
  63. // Add renderable component
  64. auto renderable = entity->addComponent<Engine::Core::RenderableComponent>("", "");
  65. renderable->visible = true;
  66. // Add unit component
  67. auto unit = entity->addComponent<Engine::Core::UnitComponent>();
  68. unit->unitType = "warrior";
  69. unit->health = 100;
  70. unit->maxHealth = 100;
  71. unit->speed = 2.0f;
  72. // Add movement component
  73. entity->addComponent<Engine::Core::MovementComponent>();
  74. }
  75. qDebug() << "Test scene created with 5 units";
  76. }
  77. std::unique_ptr<Engine::Core::World> m_world;
  78. std::unique_ptr<Render::GL::Renderer> m_renderer;
  79. std::unique_ptr<Render::GL::Camera> m_camera;
  80. std::unique_ptr<Game::Systems::SelectionSystem> m_selectionSystem;
  81. };
  82. int main(int argc, char *argv[])
  83. {
  84. QGuiApplication app(argc, argv);
  85. // Set up OpenGL 3.3 Core Profile
  86. QSurfaceFormat format;
  87. format.setVersion(3, 3);
  88. format.setProfile(QSurfaceFormat::CoreProfile);
  89. format.setDepthBufferSize(24);
  90. format.setStencilBufferSize(8);
  91. format.setSamples(4); // 4x MSAA
  92. QSurfaceFormat::setDefaultFormat(format);
  93. // Set up QML engine
  94. QQmlApplicationEngine engine;
  95. // Register C++ types with QML if needed
  96. // qmlRegisterType<GameEngine>("StandardOfIron", 1, 0, "GameEngine");
  97. const QUrl url(QStringLiteral("qrc:/ui/qml/Main.qml"));
  98. QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
  99. &app, [url](QObject *obj, const QUrl &objUrl) {
  100. if (!obj && url == objUrl)
  101. QCoreApplication::exit(-1);
  102. }, Qt::QueuedConnection);
  103. // Load QML
  104. engine.load(url);
  105. if (engine.rootObjects().isEmpty()) {
  106. qWarning() << "Failed to load QML file";
  107. return -1;
  108. }
  109. qDebug() << "Application started successfully";
  110. qDebug() << "Assets directory:" << QDir::currentPath() + "/assets";
  111. // Get the QQuickWindow from the loaded QML
  112. QObject* rootObj = engine.rootObjects().first();
  113. QQuickWindow* window = qobject_cast<QQuickWindow*>(rootObj);
  114. if (!window) {
  115. // Try to find a QQuickWindow child
  116. window = rootObj->findChild<QQuickWindow*>();
  117. }
  118. static GameEngine gameEngine;
  119. if (window) {
  120. // Connect to sceneGraphInitialized to safely initialize OpenGL resources
  121. QObject::connect(window, &QQuickWindow::sceneGraphInitialized, &gameEngine, [&gameEngine]() {
  122. gameEngine.initialize();
  123. qDebug() << "Game engine initialized after scene graph.";
  124. }, Qt::DirectConnection);
  125. // Per-frame update/render loop
  126. QObject::connect(window, &QQuickWindow::beforeRendering, &gameEngine, [&gameEngine]() {
  127. gameEngine.update(1.0f / 60.0f); // Fixed timestep for now
  128. gameEngine.render();
  129. }, Qt::DirectConnection);
  130. window->setClearBeforeRendering(false); // Let our renderer handle clearing
  131. } else {
  132. qWarning() << "No QQuickWindow found for OpenGL initialization.";
  133. }
  134. return app.exec();
  135. }
  136. #include "main.moc"