2021-06-15 22:12:41 +03:00
|
|
|
//#
|
|
|
|
//# Copyright (C) 2021-2021 QuasarApp.
|
|
|
|
//# Distributed under the GPLv3 software license, see the accompanying
|
|
|
|
//# Everyone is permitted to copy and distribute verbatim copies
|
|
|
|
//# of this license document, but changing it is not allowed.
|
|
|
|
//#
|
|
|
|
|
2021-06-06 15:53:49 +03:00
|
|
|
#include "engine.h"
|
|
|
|
|
|
|
|
#include <QQmlComponent>
|
2021-06-16 16:10:14 +03:00
|
|
|
#include <Crawl/guiobject.h>
|
|
|
|
#include "Crawl/iworld.h"
|
2021-06-21 10:57:31 +03:00
|
|
|
#include <QThread>
|
2021-06-11 18:09:03 +03:00
|
|
|
#include <quasarapp.h>
|
2021-06-16 16:10:14 +03:00
|
|
|
#include "Crawl/icontrol.h"
|
2021-06-21 10:57:31 +03:00
|
|
|
#include "QDateTime"
|
|
|
|
#include "QtConcurrent"
|
2021-06-06 15:53:49 +03:00
|
|
|
|
2021-07-05 17:39:26 +03:00
|
|
|
namespace CRAWL {
|
|
|
|
|
2021-06-10 18:07:04 +03:00
|
|
|
Engine::Engine(QObject *parent): QObject(parent) {
|
2021-06-06 15:53:49 +03:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2021-06-21 10:57:31 +03:00
|
|
|
Engine::~Engine() {
|
|
|
|
stopRenderLoop();
|
|
|
|
}
|
|
|
|
|
2021-06-06 15:53:49 +03:00
|
|
|
QObject *Engine::scane() {
|
|
|
|
return _scane;
|
|
|
|
}
|
|
|
|
|
2021-06-07 17:37:03 +03:00
|
|
|
void Engine::setQmlEngine(QQmlEngine *newEngine) {
|
2021-06-06 15:53:49 +03:00
|
|
|
if (_engine == newEngine)
|
|
|
|
return;
|
|
|
|
|
|
|
|
_engine = newEngine;
|
|
|
|
}
|
2021-06-07 17:37:03 +03:00
|
|
|
|
2021-06-08 18:00:42 +03:00
|
|
|
void Engine::setWorld(IWorld *world) {
|
|
|
|
if (_currentWorld == world)
|
|
|
|
return ;
|
|
|
|
|
2021-06-08 21:56:36 +03:00
|
|
|
if (_currentWorld) {
|
2021-06-28 18:16:27 +03:00
|
|
|
_currentWorld->reset();
|
2021-06-08 21:56:36 +03:00
|
|
|
}
|
|
|
|
|
2021-06-08 18:00:42 +03:00
|
|
|
_currentWorld = world;
|
2021-06-14 18:15:59 +03:00
|
|
|
emit worldChanged();
|
2021-06-08 21:56:36 +03:00
|
|
|
|
2021-06-30 12:15:57 +03:00
|
|
|
if (!prepareNewWorld()) {
|
2021-08-07 17:46:37 +03:00
|
|
|
QuasarAppUtils::Params::log("Failed to init world. World name: " + _currentWorld->itemName(),
|
2021-06-30 12:15:57 +03:00
|
|
|
QuasarAppUtils::Error);
|
|
|
|
|
|
|
|
_currentWorld = nullptr;
|
|
|
|
return;
|
|
|
|
}
|
2021-06-07 17:37:03 +03:00
|
|
|
|
2021-06-29 20:24:57 +03:00
|
|
|
startRenderLoop();
|
2021-06-30 12:15:57 +03:00
|
|
|
_currentWorld->runAsBackGround();
|
2021-06-08 18:00:42 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void Engine::setScane(QObject *newScane) {
|
|
|
|
if (_scane == newScane)
|
|
|
|
return;
|
|
|
|
_scane = newScane;
|
|
|
|
emit scaneChanged();
|
2021-06-07 17:37:03 +03:00
|
|
|
}
|
2021-06-09 16:38:55 +03:00
|
|
|
|
|
|
|
QObject *Engine::player() const {
|
|
|
|
if (_currentWorld)
|
|
|
|
return _currentWorld->_player;
|
|
|
|
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
QObject *Engine::world() const {
|
|
|
|
return _currentWorld;
|
|
|
|
}
|
|
|
|
|
2021-06-12 18:20:29 +03:00
|
|
|
|
|
|
|
QObject *Engine::menu() const {
|
|
|
|
return _menu;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Engine::setMenu(QObject *newMenu) {
|
2021-06-15 09:29:57 +03:00
|
|
|
if (_menu == newMenu) {
|
2021-06-12 18:20:29 +03:00
|
|
|
return;
|
2021-06-15 09:29:57 +03:00
|
|
|
}
|
2021-06-12 18:20:29 +03:00
|
|
|
|
|
|
|
_menu = newMenu;
|
|
|
|
emit menuChanged();
|
|
|
|
}
|
2021-06-13 20:16:36 +03:00
|
|
|
|
|
|
|
int Engine::prepareLvlProgress() const {
|
|
|
|
return _prepareLvlProgress;
|
|
|
|
}
|
2021-06-14 18:15:59 +03:00
|
|
|
|
2021-06-15 16:04:18 +03:00
|
|
|
bool Engine::start() const {
|
|
|
|
if (!_currentWorld)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (!_currentWorld->isInit())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
return _currentWorld->start();
|
|
|
|
}
|
|
|
|
|
2021-06-16 18:57:50 +03:00
|
|
|
QObject *Engine::getGameObject(int id) const {
|
|
|
|
if (!_currentWorld)
|
|
|
|
return nullptr;
|
|
|
|
|
|
|
|
return _currentWorld->getItem(id);
|
|
|
|
}
|
|
|
|
|
2021-06-21 10:57:31 +03:00
|
|
|
void Engine::startRenderLoop() {
|
|
|
|
if (isRendering())
|
|
|
|
return;
|
|
|
|
|
|
|
|
_renderLoop = true;
|
2021-07-19 12:27:58 +03:00
|
|
|
_renderLoopFuture = QtConcurrent::run([this](){renderLoop();});
|
2021-06-21 10:57:31 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void Engine::stopRenderLoop() {
|
|
|
|
_renderLoop = false;
|
|
|
|
_renderLoopFuture.waitForFinished();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Engine::isRendering() const {
|
|
|
|
return _renderLoopFuture.isRunning();
|
|
|
|
}
|
|
|
|
|
2021-06-14 18:15:59 +03:00
|
|
|
void Engine::setPrepareLvlProgress(int newPrepareLvlProgress) {
|
2021-06-15 09:29:57 +03:00
|
|
|
if (_prepareLvlProgress == newPrepareLvlProgress) {
|
2021-06-14 18:15:59 +03:00
|
|
|
return;
|
2021-06-15 09:29:57 +03:00
|
|
|
}
|
2021-06-14 18:15:59 +03:00
|
|
|
_prepareLvlProgress = newPrepareLvlProgress;
|
|
|
|
emit prepareLvlProgressChanged();
|
|
|
|
}
|
2021-06-21 10:57:31 +03:00
|
|
|
|
2021-06-30 12:15:57 +03:00
|
|
|
bool Engine::prepareNewWorld() {
|
2021-06-29 20:24:57 +03:00
|
|
|
if (!_currentWorld->prepare()) {
|
2021-06-30 12:15:57 +03:00
|
|
|
return false;
|
2021-06-29 20:24:57 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!_currentWorld->userInterface()->init()) {
|
2021-06-30 12:15:57 +03:00
|
|
|
return false;
|
2021-06-29 20:24:57 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
setMenu(_currentWorld->userInterface());
|
2021-06-30 12:15:57 +03:00
|
|
|
|
|
|
|
return true;
|
2021-06-29 20:24:57 +03:00
|
|
|
}
|
|
|
|
|
2021-06-21 10:57:31 +03:00
|
|
|
void Engine::renderLoop() {
|
|
|
|
|
|
|
|
if (!_currentWorld)
|
|
|
|
return;
|
|
|
|
|
|
|
|
while (_renderLoop) {
|
|
|
|
|
|
|
|
quint64 currentTime = QDateTime::currentMSecsSinceEpoch();
|
|
|
|
|
|
|
|
if (!_oldTimeRender) {
|
|
|
|
_oldTimeRender = currentTime;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
_currentWorld->render(currentTime - _oldTimeRender);
|
|
|
|
_oldTimeRender = currentTime;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2021-07-05 17:39:26 +03:00
|
|
|
|
|
|
|
}
|