qmlfrontend/engine_instance.cpp
author Wuzzy <Wuzzy2@mail.ru>
Thu, 25 Apr 2019 23:01:05 +0200
changeset 14839 e239378a9400
parent 14713 cc6ab1e3f7d5
child 14854 aed75d439027
permissions -rw-r--r--
Prevent entering “/”, “\” and “:” in team and scheme names. The name of teams and schems is saved in the file name itself, so these characters would cause trouble as they are used in path names in Linux and Windows.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14154
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
     1
#include "engine_instance.h"
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
     2
14298
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14294
diff changeset
     3
#include <QDebug>
14372
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
     4
#include <QLibrary>
14298
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14294
diff changeset
     5
#include <QOpenGLFunctions>
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14294
diff changeset
     6
#include <QSurface>
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14294
diff changeset
     7
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14294
diff changeset
     8
static QOpenGLContext* currentOpenglContext = nullptr;
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14294
diff changeset
     9
extern "C" void (*getProcAddress(const char* fn))() {
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14294
diff changeset
    10
  if (!currentOpenglContext)
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14294
diff changeset
    11
    return nullptr;
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14294
diff changeset
    12
  else
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14294
diff changeset
    13
    return currentOpenglContext->getProcAddress(fn);
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14294
diff changeset
    14
}
14294
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14290
diff changeset
    15
14372
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    16
EngineInstance::EngineInstance(const QString& libraryPath, QObject* parent)
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    17
    : QObject(parent) {
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    18
  QLibrary hwlib(libraryPath);
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    19
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    20
  if (!hwlib.load())
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    21
    qWarning() << "Engine library not found" << hwlib.errorString();
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    22
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    23
  hedgewars_engine_protocol_version =
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    24
      reinterpret_cast<Engine::hedgewars_engine_protocol_version_t*>(
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    25
          hwlib.resolve("hedgewars_engine_protocol_version"));
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    26
  start_engine =
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    27
      reinterpret_cast<Engine::start_engine_t*>(hwlib.resolve("start_engine"));
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    28
  generate_preview = reinterpret_cast<Engine::generate_preview_t*>(
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    29
      hwlib.resolve("generate_preview"));
14373
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
    30
  dispose_preview = reinterpret_cast<Engine::dispose_preview_t*>(
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
    31
      hwlib.resolve("dispose_preview"));
14372
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    32
  cleanup = reinterpret_cast<Engine::cleanup_t*>(hwlib.resolve("cleanup"));
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    33
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    34
  send_ipc = reinterpret_cast<Engine::send_ipc_t*>(hwlib.resolve("send_ipc"));
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    35
  read_ipc = reinterpret_cast<Engine::read_ipc_t*>(hwlib.resolve("read_ipc"));
14154
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    36
14372
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    37
  setup_current_gl_context =
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    38
      reinterpret_cast<Engine::setup_current_gl_context_t*>(
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    39
          hwlib.resolve("setup_current_gl_context"));
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    40
  render_frame =
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    41
      reinterpret_cast<Engine::render_frame_t*>(hwlib.resolve("render_frame"));
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    42
  advance_simulation = reinterpret_cast<Engine::advance_simulation_t*>(
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    43
      hwlib.resolve("advance_simulation"));
14713
cc6ab1e3f7d5 Allow to move camera around
unc0rr
parents: 14373
diff changeset
    44
  move_camera =
cc6ab1e3f7d5 Allow to move camera around
unc0rr
parents: 14373
diff changeset
    45
      reinterpret_cast<Engine::move_camera_t*>(hwlib.resolve("move_camera"));
14372
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    46
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    47
  m_isValid = hedgewars_engine_protocol_version && start_engine &&
14373
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
    48
              generate_preview && dispose_preview && cleanup && send_ipc &&
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
    49
              read_ipc && setup_current_gl_context && render_frame &&
14713
cc6ab1e3f7d5 Allow to move camera around
unc0rr
parents: 14373
diff changeset
    50
              advance_simulation && move_camera;
14372
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    51
  emit isValidChanged(m_isValid);
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    52
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    53
  if (isValid()) {
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    54
    qDebug() << "Loaded engine library with protocol version"
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    55
             << hedgewars_engine_protocol_version();
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    56
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    57
    m_instance = start_engine();
14713
cc6ab1e3f7d5 Allow to move camera around
unc0rr
parents: 14373
diff changeset
    58
  } else {
cc6ab1e3f7d5 Allow to move camera around
unc0rr
parents: 14373
diff changeset
    59
    qDebug("Engine library load failed");
14372
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    60
  }
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    61
}
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    62
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    63
EngineInstance::~EngineInstance() {
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    64
  if (m_isValid) cleanup(m_instance);
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    65
}
14154
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    66
14290
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14271
diff changeset
    67
void EngineInstance::sendConfig(const GameConfig& config) {
14271
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14154
diff changeset
    68
  for (auto b : config.config()) {
14372
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    69
    send_ipc(m_instance, reinterpret_cast<uint8_t*>(b.data()),
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    70
             static_cast<size_t>(b.size()));
14271
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14154
diff changeset
    71
  }
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14154
diff changeset
    72
}
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14154
diff changeset
    73
14298
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14294
diff changeset
    74
void EngineInstance::advance(quint32 ticks) {
14372
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    75
  advance_simulation(m_instance, ticks);
14298
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14294
diff changeset
    76
}
14290
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14271
diff changeset
    77
14713
cc6ab1e3f7d5 Allow to move camera around
unc0rr
parents: 14373
diff changeset
    78
void EngineInstance::moveCamera(const QPoint& delta) {
cc6ab1e3f7d5 Allow to move camera around
unc0rr
parents: 14373
diff changeset
    79
  move_camera(m_instance, delta.x(), delta.y());
cc6ab1e3f7d5 Allow to move camera around
unc0rr
parents: 14373
diff changeset
    80
}
cc6ab1e3f7d5 Allow to move camera around
unc0rr
parents: 14373
diff changeset
    81
14372
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    82
void EngineInstance::renderFrame() { render_frame(m_instance); }
14290
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14271
diff changeset
    83
14294
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14290
diff changeset
    84
void EngineInstance::setOpenGLContext(QOpenGLContext* context) {
14298
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14294
diff changeset
    85
  currentOpenglContext = context;
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14294
diff changeset
    86
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14294
diff changeset
    87
  auto size = context->surface()->size();
14372
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    88
  setup_current_gl_context(m_instance, static_cast<quint16>(size.width()),
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    89
                           static_cast<quint16>(size.height()),
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    90
                           &getProcAddress);
14294
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14290
diff changeset
    91
}
14290
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14271
diff changeset
    92
14373
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
    93
QImage EngineInstance::generatePreview() {
14154
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    94
  Engine::PreviewInfo pinfo;
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    95
14372
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    96
  generate_preview(m_instance, &pinfo);
14154
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    97
14373
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
    98
  QVector<QRgb> colorTable;
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
    99
  colorTable.resize(256);
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
   100
  for (int i = 0; i < 256; ++i) colorTable[i] = qRgba(255, 255, 0, i);
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
   101
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
   102
  QImage previewImage(pinfo.land, static_cast<int>(pinfo.width),
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
   103
                      static_cast<int>(pinfo.height), QImage::Format_Indexed8);
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
   104
  previewImage.setColorTable(colorTable);
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
   105
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
   106
  // Cannot use it here, since QImage refers to original bytes
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
   107
  // dispose_preview(m_instance);
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
   108
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
   109
  return previewImage;
14154
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
   110
}
14372
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
   111
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
   112
bool EngineInstance::isValid() const { return m_isValid; }