main.cpp 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include <QDateTime>
  2. #include <QDebug>
  3. #include <QDir>
  4. #include <QFile>
  5. #include <QGuiApplication>
  6. #include <QOpenGLContext>
  7. #include <QQmlApplicationEngine>
  8. #include <QQmlContext>
  9. #include <QQuickWindow>
  10. #include <QSGRendererInterface>
  11. #include <QSurfaceFormat>
  12. #include <QTextStream>
  13. #include "app/game_engine.h"
  14. #include "ui/gl_view.h"
  15. int main(int argc, char *argv[]) {
  16. if (qEnvironmentVariableIsSet("WAYLAND_DISPLAY") &&
  17. qEnvironmentVariableIsSet("DISPLAY")) {
  18. qputenv("QT_QPA_PLATFORM", "xcb");
  19. }
  20. qputenv("QT_OPENGL", "desktop");
  21. qputenv("QSG_RHI_BACKEND", "opengl");
  22. #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
  23. QQuickWindow::setGraphicsApi(QSGRendererInterface::OpenGLRhi);
  24. #endif
  25. QSurfaceFormat fmt;
  26. fmt.setVersion(3, 3);
  27. fmt.setProfile(QSurfaceFormat::CoreProfile);
  28. fmt.setDepthBufferSize(24);
  29. fmt.setStencilBufferSize(8);
  30. fmt.setSamples(0);
  31. QSurfaceFormat::setDefaultFormat(fmt);
  32. QGuiApplication app(argc, argv);
  33. auto gameEngine = new GameEngine();
  34. QQmlApplicationEngine engine;
  35. engine.rootContext()->setContextProperty("game", gameEngine);
  36. qmlRegisterType<GLView>("StandardOfIron", 1, 0, "GLView");
  37. engine.load(QUrl(QStringLiteral("qrc:/StandardOfIron/ui/qml/Main.qml")));
  38. if (engine.rootObjects().isEmpty()) {
  39. qWarning() << "Failed to load QML file";
  40. return -1;
  41. }
  42. QObject *rootObj = engine.rootObjects().first();
  43. QQuickWindow *window = qobject_cast<QQuickWindow *>(rootObj);
  44. if (!window)
  45. window = rootObj->findChild<QQuickWindow *>();
  46. if (!window) {
  47. qWarning() << "No QQuickWindow found for OpenGL initialization.";
  48. return -2;
  49. }
  50. gameEngine->setWindow(window);
  51. QObject::connect(
  52. window, &QQuickWindow::sceneGraphInitialized, window, [window]() {
  53. if (auto *ri = window->rendererInterface()) {
  54. auto api = ri->graphicsApi();
  55. const char *name =
  56. api == QSGRendererInterface::OpenGLRhi ? "OpenGLRhi"
  57. : api == QSGRendererInterface::VulkanRhi ? "VulkanRhi"
  58. : api == QSGRendererInterface::Direct3D11Rhi ? "D3D11Rhi"
  59. : api == QSGRendererInterface::MetalRhi ? "MetalRhi"
  60. : api == QSGRendererInterface::Software ? "Software"
  61. : "Unknown";
  62. qInfo() << "QSG graphicsApi:" << name;
  63. }
  64. });
  65. QObject::connect(window, &QQuickWindow::sceneGraphError, &app,
  66. [&](QQuickWindow::SceneGraphError, const QString &msg) {
  67. qCritical()
  68. << "Failed to initialize OpenGL scene graph:" << msg;
  69. app.exit(3);
  70. });
  71. qDebug() << "Application started successfully";
  72. qDebug() << "Assets directory:" << QDir::currentPath() + "/assets";
  73. return app.exec();
  74. }