qmlfrontend/engine_instance.cpp
author Wuzzy <Wuzzy2@mail.ru>
Thu, 11 Jul 2019 16:24:09 +0200
changeset 15236 c10e9261ab9c
parent 15222 b32c52c76977
permissions -rw-r--r--
Make lowest line of Splash image frames transparent to work around scaling issues The Splash image is scaled. Sometimes, the lowest line is repeated on the top, which caused some weird lines to appear above big splashes (e.g. piano). This has been done fully automated with a script. Only the alpha channel was changed. The color information is preserved.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14159
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
14303
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14299
diff changeset
     3
#include <QDebug>
14377
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
     4
#include <QLibrary>
14303
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14299
diff changeset
     5
#include <QOpenGLFunctions>
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14299
diff changeset
     6
#include <QSurface>
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14299
diff changeset
     7
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14299
diff changeset
     8
static QOpenGLContext* currentOpenglContext = nullptr;
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14299
diff changeset
     9
extern "C" void (*getProcAddress(const char* fn))() {
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14299
diff changeset
    10
  if (!currentOpenglContext)
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14299
diff changeset
    11
    return nullptr;
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14299
diff changeset
    12
  else
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14299
diff changeset
    13
    return currentOpenglContext->getProcAddress(fn);
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14299
diff changeset
    14
}
14299
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14295
diff changeset
    15
14377
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    16
EngineInstance::EngineInstance(const QString& libraryPath, QObject* parent)
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    17
    : QObject(parent) {
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    18
  QLibrary hwlib(libraryPath);
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    19
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    20
  if (!hwlib.load())
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    21
    qWarning() << "Engine library not found" << hwlib.errorString();
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    22
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    23
  hedgewars_engine_protocol_version =
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    24
      reinterpret_cast<Engine::hedgewars_engine_protocol_version_t*>(
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    25
          hwlib.resolve("hedgewars_engine_protocol_version"));
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    26
  start_engine =
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    27
      reinterpret_cast<Engine::start_engine_t*>(hwlib.resolve("start_engine"));
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    28
  generate_preview = reinterpret_cast<Engine::generate_preview_t*>(
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    29
      hwlib.resolve("generate_preview"));
14378
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14377
diff changeset
    30
  dispose_preview = reinterpret_cast<Engine::dispose_preview_t*>(
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14377
diff changeset
    31
      hwlib.resolve("dispose_preview"));
14377
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    32
  cleanup = reinterpret_cast<Engine::cleanup_t*>(hwlib.resolve("cleanup"));
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    33
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
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: 14303
diff changeset
    35
  read_ipc = reinterpret_cast<Engine::read_ipc_t*>(hwlib.resolve("read_ipc"));
14159
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    36
14377
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    37
  setup_current_gl_context =
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    38
      reinterpret_cast<Engine::setup_current_gl_context_t*>(
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    39
          hwlib.resolve("setup_current_gl_context"));
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    40
  render_frame =
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    41
      reinterpret_cast<Engine::render_frame_t*>(hwlib.resolve("render_frame"));
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    42
  advance_simulation = reinterpret_cast<Engine::advance_simulation_t*>(
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    43
      hwlib.resolve("advance_simulation"));
14718
cc6ab1e3f7d5 Allow to move camera around
unc0rr
parents: 14378
diff changeset
    44
  move_camera =
cc6ab1e3f7d5 Allow to move camera around
unc0rr
parents: 14378
diff changeset
    45
      reinterpret_cast<Engine::move_camera_t*>(hwlib.resolve("move_camera"));
14859
aed75d439027 Implement external events approach to input user actions into engine.
unc0rr
parents: 14718
diff changeset
    46
  simple_event =
aed75d439027 Implement external events approach to input user actions into engine.
unc0rr
parents: 14718
diff changeset
    47
      reinterpret_cast<Engine::simple_event_t*>(hwlib.resolve("simple_event"));
aed75d439027 Implement external events approach to input user actions into engine.
unc0rr
parents: 14718
diff changeset
    48
  long_event =
aed75d439027 Implement external events approach to input user actions into engine.
unc0rr
parents: 14718
diff changeset
    49
      reinterpret_cast<Engine::long_event_t*>(hwlib.resolve("long_event"));
aed75d439027 Implement external events approach to input user actions into engine.
unc0rr
parents: 14718
diff changeset
    50
  positioned_event = reinterpret_cast<Engine::positioned_event_t*>(
aed75d439027 Implement external events approach to input user actions into engine.
unc0rr
parents: 14718
diff changeset
    51
      hwlib.resolve("positioned_event"));
14377
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    52
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    53
  m_isValid = hedgewars_engine_protocol_version && start_engine &&
14378
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14377
diff changeset
    54
              generate_preview && dispose_preview && cleanup && send_ipc &&
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14377
diff changeset
    55
              read_ipc && setup_current_gl_context && render_frame &&
14859
aed75d439027 Implement external events approach to input user actions into engine.
unc0rr
parents: 14718
diff changeset
    56
              advance_simulation && move_camera && simple_event && long_event &&
aed75d439027 Implement external events approach to input user actions into engine.
unc0rr
parents: 14718
diff changeset
    57
              positioned_event;
aed75d439027 Implement external events approach to input user actions into engine.
unc0rr
parents: 14718
diff changeset
    58
14377
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    59
  emit isValidChanged(m_isValid);
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    60
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    61
  if (isValid()) {
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    62
    qDebug() << "Loaded engine library with protocol version"
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    63
             << hedgewars_engine_protocol_version();
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    64
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    65
    m_instance = start_engine();
14718
cc6ab1e3f7d5 Allow to move camera around
unc0rr
parents: 14378
diff changeset
    66
  } else {
cc6ab1e3f7d5 Allow to move camera around
unc0rr
parents: 14378
diff changeset
    67
    qDebug("Engine library load failed");
14377
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    68
  }
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    69
}
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    70
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    71
EngineInstance::~EngineInstance() {
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    72
  if (m_isValid) cleanup(m_instance);
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    73
}
14159
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    74
14295
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14276
diff changeset
    75
void EngineInstance::sendConfig(const GameConfig& config) {
14276
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14159
diff changeset
    76
  for (auto b : config.config()) {
14377
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    77
    send_ipc(m_instance, reinterpret_cast<uint8_t*>(b.data()),
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    78
             static_cast<size_t>(b.size()));
14276
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14159
diff changeset
    79
  }
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14159
diff changeset
    80
}
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14159
diff changeset
    81
14303
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14299
diff changeset
    82
void EngineInstance::advance(quint32 ticks) {
14377
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
    83
  advance_simulation(m_instance, ticks);
14303
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14299
diff changeset
    84
}
14295
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14276
diff changeset
    85
14718
cc6ab1e3f7d5 Allow to move camera around
unc0rr
parents: 14378
diff changeset
    86
void EngineInstance::moveCamera(const QPoint& delta) {
cc6ab1e3f7d5 Allow to move camera around
unc0rr
parents: 14378
diff changeset
    87
  move_camera(m_instance, delta.x(), delta.y());
cc6ab1e3f7d5 Allow to move camera around
unc0rr
parents: 14378
diff changeset
    88
}
cc6ab1e3f7d5 Allow to move camera around
unc0rr
parents: 14378
diff changeset
    89
15222
b32c52c76977 Marry C enums, Qt's metaobject system and QML
unc0rr
parents: 14859
diff changeset
    90
void EngineInstance::simpleEvent(Engine::SimpleEventType event_type) {
14859
aed75d439027 Implement external events approach to input user actions into engine.
unc0rr
parents: 14718
diff changeset
    91
  simple_event(m_instance, event_type);
aed75d439027 Implement external events approach to input user actions into engine.
unc0rr
parents: 14718
diff changeset
    92
}
aed75d439027 Implement external events approach to input user actions into engine.
unc0rr
parents: 14718
diff changeset
    93
15222
b32c52c76977 Marry C enums, Qt's metaobject system and QML
unc0rr
parents: 14859
diff changeset
    94
void EngineInstance::longEvent(Engine::LongEventType event_type,
b32c52c76977 Marry C enums, Qt's metaobject system and QML
unc0rr
parents: 14859
diff changeset
    95
                               Engine::LongEventState state) {
14859
aed75d439027 Implement external events approach to input user actions into engine.
unc0rr
parents: 14718
diff changeset
    96
  long_event(m_instance, event_type, state);
aed75d439027 Implement external events approach to input user actions into engine.
unc0rr
parents: 14718
diff changeset
    97
}
aed75d439027 Implement external events approach to input user actions into engine.
unc0rr
parents: 14718
diff changeset
    98
15222
b32c52c76977 Marry C enums, Qt's metaobject system and QML
unc0rr
parents: 14859
diff changeset
    99
void EngineInstance::positionedEvent(Engine::PositionedEventType event_type,
b32c52c76977 Marry C enums, Qt's metaobject system and QML
unc0rr
parents: 14859
diff changeset
   100
                                     qint32 x, qint32 y) {
14859
aed75d439027 Implement external events approach to input user actions into engine.
unc0rr
parents: 14718
diff changeset
   101
  positioned_event(m_instance, event_type, x, y);
aed75d439027 Implement external events approach to input user actions into engine.
unc0rr
parents: 14718
diff changeset
   102
}
aed75d439027 Implement external events approach to input user actions into engine.
unc0rr
parents: 14718
diff changeset
   103
14377
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
   104
void EngineInstance::renderFrame() { render_frame(m_instance); }
14295
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14276
diff changeset
   105
14299
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14295
diff changeset
   106
void EngineInstance::setOpenGLContext(QOpenGLContext* context) {
14303
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14299
diff changeset
   107
  currentOpenglContext = context;
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14299
diff changeset
   108
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14299
diff changeset
   109
  auto size = context->surface()->size();
14377
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
   110
  setup_current_gl_context(m_instance, static_cast<quint16>(size.width()),
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
   111
                           static_cast<quint16>(size.height()),
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
   112
                           &getProcAddress);
14299
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14295
diff changeset
   113
}
14295
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14276
diff changeset
   114
14378
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14377
diff changeset
   115
QImage EngineInstance::generatePreview() {
14159
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
   116
  Engine::PreviewInfo pinfo;
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
   117
14377
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
   118
  generate_preview(m_instance, &pinfo);
14159
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
   119
14378
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14377
diff changeset
   120
  QVector<QRgb> colorTable;
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14377
diff changeset
   121
  colorTable.resize(256);
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14377
diff changeset
   122
  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: 14377
diff changeset
   123
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14377
diff changeset
   124
  QImage previewImage(pinfo.land, static_cast<int>(pinfo.width),
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14377
diff changeset
   125
                      static_cast<int>(pinfo.height), QImage::Format_Indexed8);
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14377
diff changeset
   126
  previewImage.setColorTable(colorTable);
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14377
diff changeset
   127
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14377
diff changeset
   128
  // Cannot use it here, since QImage refers to original bytes
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14377
diff changeset
   129
  // dispose_preview(m_instance);
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14377
diff changeset
   130
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14377
diff changeset
   131
  return previewImage;
14159
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
   132
}
14377
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
   133
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14303
diff changeset
   134
bool EngineInstance::isValid() const { return m_isValid; }