qmlfrontend/engine_instance.cpp
author Wuzzy <Wuzzy2@mail.ru>
Mon, 14 Jan 2019 00:34:56 +0100
changeset 14584 ab79cd4a7382
parent 14373 4409344db447
child 14713 cc6ab1e3f7d5
permissions -rw-r--r--
Reverse order of visual gears linked list Now vgears will render in the order they have been added. Older visual gears are rendered earlier, so they are "behind" newer visual gears. This has been primarily done to fix the render order of speech bubbles (bug #287).
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"));
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    44
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    45
  m_isValid = hedgewars_engine_protocol_version && start_engine &&
14373
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
    46
              generate_preview && dispose_preview && cleanup && send_ipc &&
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
    47
              read_ipc && setup_current_gl_context && render_frame &&
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
    48
              advance_simulation;
14372
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    49
  emit isValidChanged(m_isValid);
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    50
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    51
  if (isValid()) {
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    52
    qDebug() << "Loaded engine library with protocol version"
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    53
             << hedgewars_engine_protocol_version();
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    54
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    55
    m_instance = start_engine();
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
}
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    58
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    59
EngineInstance::~EngineInstance() {
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    60
  if (m_isValid) cleanup(m_instance);
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    61
}
14154
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    62
14290
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14271
diff changeset
    63
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
    64
  for (auto b : config.config()) {
14372
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    65
    send_ipc(m_instance, reinterpret_cast<uint8_t*>(b.data()),
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    66
             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
    67
  }
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14154
diff changeset
    68
}
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14154
diff changeset
    69
14298
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14294
diff changeset
    70
void EngineInstance::advance(quint32 ticks) {
14372
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    71
  advance_simulation(m_instance, ticks);
14298
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14294
diff changeset
    72
}
14290
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14271
diff changeset
    73
14372
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    74
void EngineInstance::renderFrame() { render_frame(m_instance); }
14290
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14271
diff changeset
    75
14294
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14290
diff changeset
    76
void EngineInstance::setOpenGLContext(QOpenGLContext* context) {
14298
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14294
diff changeset
    77
  currentOpenglContext = context;
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14294
diff changeset
    78
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14294
diff changeset
    79
  auto size = context->surface()->size();
14372
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    80
  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
    81
                           static_cast<quint16>(size.height()),
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    82
                           &getProcAddress);
14294
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14290
diff changeset
    83
}
14290
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14271
diff changeset
    84
14373
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
    85
QImage EngineInstance::generatePreview() {
14154
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    86
  Engine::PreviewInfo pinfo;
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    87
14372
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
    88
  generate_preview(m_instance, &pinfo);
14154
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    89
14373
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
    90
  QVector<QRgb> colorTable;
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
    91
  colorTable.resize(256);
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
    92
  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
    93
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
    94
  QImage previewImage(pinfo.land, static_cast<int>(pinfo.width),
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
    95
                      static_cast<int>(pinfo.height), QImage::Format_Indexed8);
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
    96
  previewImage.setColorTable(colorTable);
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
    97
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
    98
  // 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
    99
  // dispose_preview(m_instance);
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
   100
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14372
diff changeset
   101
  return previewImage;
14154
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
   102
}
14372
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
   103
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14298
diff changeset
   104
bool EngineInstance::isValid() const { return m_isValid; }