qmlfrontend/engine_instance.cpp
author Wuzzy <Wuzzy2@mail.ru>
Thu, 03 Jan 2019 19:46:48 +0100
changeset 14535 5ac181cb2396
parent 14394 4409344db447
child 14734 cc6ab1e3f7d5
permissions -rw-r--r--
Fix bee targeting fail across wrap world edge Previously, the bee always aimed for the light area, no matter where you actually put the target. It also got confused whenever it flew across the wrap world edge. How the bee works now: 1) The placed bee target is *not* recalculated when it was placed in the "gray" part of the wrap world edge. This allows for more fine-tuning. 1a) Place target in light area: bee aims for target light area 1b) Place target in gray area: bee aims for target, but flies to gray area first 2) Bee target is recalculated whenever bee passes the wrap world edge.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14175
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
14319
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14315
diff changeset
     3
#include <QDebug>
14393
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
     4
#include <QLibrary>
14319
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14315
diff changeset
     5
#include <QOpenGLFunctions>
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14315
diff changeset
     6
#include <QSurface>
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14315
diff changeset
     7
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14315
diff changeset
     8
static QOpenGLContext* currentOpenglContext = nullptr;
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14315
diff changeset
     9
extern "C" void (*getProcAddress(const char* fn))() {
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14315
diff changeset
    10
  if (!currentOpenglContext)
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14315
diff changeset
    11
    return nullptr;
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14315
diff changeset
    12
  else
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14315
diff changeset
    13
    return currentOpenglContext->getProcAddress(fn);
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14315
diff changeset
    14
}
14315
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14311
diff changeset
    15
14393
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    16
EngineInstance::EngineInstance(const QString& libraryPath, QObject* parent)
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    17
    : QObject(parent) {
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    18
  QLibrary hwlib(libraryPath);
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    19
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    20
  if (!hwlib.load())
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    21
    qWarning() << "Engine library not found" << hwlib.errorString();
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    22
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    23
  hedgewars_engine_protocol_version =
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    24
      reinterpret_cast<Engine::hedgewars_engine_protocol_version_t*>(
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    25
          hwlib.resolve("hedgewars_engine_protocol_version"));
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    26
  start_engine =
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    27
      reinterpret_cast<Engine::start_engine_t*>(hwlib.resolve("start_engine"));
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    28
  generate_preview = reinterpret_cast<Engine::generate_preview_t*>(
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    29
      hwlib.resolve("generate_preview"));
14394
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14393
diff changeset
    30
  dispose_preview = reinterpret_cast<Engine::dispose_preview_t*>(
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14393
diff changeset
    31
      hwlib.resolve("dispose_preview"));
14393
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    32
  cleanup = reinterpret_cast<Engine::cleanup_t*>(hwlib.resolve("cleanup"));
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    33
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
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: 14319
diff changeset
    35
  read_ipc = reinterpret_cast<Engine::read_ipc_t*>(hwlib.resolve("read_ipc"));
14175
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    36
14393
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    37
  setup_current_gl_context =
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    38
      reinterpret_cast<Engine::setup_current_gl_context_t*>(
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    39
          hwlib.resolve("setup_current_gl_context"));
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    40
  render_frame =
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    41
      reinterpret_cast<Engine::render_frame_t*>(hwlib.resolve("render_frame"));
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    42
  advance_simulation = reinterpret_cast<Engine::advance_simulation_t*>(
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    43
      hwlib.resolve("advance_simulation"));
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    44
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    45
  m_isValid = hedgewars_engine_protocol_version && start_engine &&
14394
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14393
diff changeset
    46
              generate_preview && dispose_preview && cleanup && send_ipc &&
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14393
diff changeset
    47
              read_ipc && setup_current_gl_context && render_frame &&
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14393
diff changeset
    48
              advance_simulation;
14393
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    49
  emit isValidChanged(m_isValid);
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    50
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    51
  if (isValid()) {
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    52
    qDebug() << "Loaded engine library with protocol version"
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    53
             << hedgewars_engine_protocol_version();
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    54
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    55
    m_instance = start_engine();
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    56
  }
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    57
}
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    58
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    59
EngineInstance::~EngineInstance() {
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    60
  if (m_isValid) cleanup(m_instance);
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    61
}
14175
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    62
14311
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14292
diff changeset
    63
void EngineInstance::sendConfig(const GameConfig& config) {
14292
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14175
diff changeset
    64
  for (auto b : config.config()) {
14393
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    65
    send_ipc(m_instance, reinterpret_cast<uint8_t*>(b.data()),
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    66
             static_cast<size_t>(b.size()));
14292
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14175
diff changeset
    67
  }
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14175
diff changeset
    68
}
1aac8a62be6f Implement send_ipc and read_ipc in engine lib, send_ipc in frontend
unC0Rr
parents: 14175
diff changeset
    69
14319
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14315
diff changeset
    70
void EngineInstance::advance(quint32 ticks) {
14393
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    71
  advance_simulation(m_instance, ticks);
14319
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14315
diff changeset
    72
}
14311
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14292
diff changeset
    73
14393
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    74
void EngineInstance::renderFrame() { render_frame(m_instance); }
14311
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14292
diff changeset
    75
14315
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14311
diff changeset
    76
void EngineInstance::setOpenGLContext(QOpenGLContext* context) {
14319
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14315
diff changeset
    77
  currentOpenglContext = context;
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14315
diff changeset
    78
00b56ec8b7df Pass opengl context to engine
unC0Rr
parents: 14315
diff changeset
    79
  auto size = context->surface()->size();
14393
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
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: 14319
diff changeset
    81
                           static_cast<quint16>(size.height()),
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    82
                           &getProcAddress);
14315
21be7838a127 Add advance_simulation() function to engine lib, some WIP on frontend
unc0rr
parents: 14311
diff changeset
    83
}
14311
92e5682810d4 Prepare to have possibility to pass opengl context to engine
unc0rr
parents: 14292
diff changeset
    84
14394
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14393
diff changeset
    85
QImage EngineInstance::generatePreview() {
14175
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
14393
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
    88
  generate_preview(m_instance, &pinfo);
14175
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
    89
14394
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14393
diff changeset
    90
  QVector<QRgb> colorTable;
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14393
diff changeset
    91
  colorTable.resize(256);
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14393
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: 14393
diff changeset
    93
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14393
diff changeset
    94
  QImage previewImage(pinfo.land, static_cast<int>(pinfo.width),
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14393
diff changeset
    95
                      static_cast<int>(pinfo.height), QImage::Format_Indexed8);
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14393
diff changeset
    96
  previewImage.setColorTable(colorTable);
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14393
diff changeset
    97
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14393
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: 14393
diff changeset
    99
  // dispose_preview(m_instance);
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14393
diff changeset
   100
4409344db447 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents: 14393
diff changeset
   101
  return previewImage;
14175
8354b390f1a2 Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff changeset
   102
}
14393
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
   103
b6824a53d4b1 Allow to instantiate HWEngine with different library binaries
unC0Rr
parents: 14319
diff changeset
   104
bool EngineInstance::isValid() const { return m_isValid; }