Merge branch 'headless-mode' into Fix-usage-vcpkg-for-windows-and-add-cmake-preset-for-vscode
This commit is contained in:
commit
9b0d1fdd52
@ -1,8 +1,8 @@
|
|||||||
test.set_setting("chunks.load-distance", 3)
|
app.set_setting("chunks.load-distance", 3)
|
||||||
test.set_setting("chunks.load-speed", 1)
|
app.set_setting("chunks.load-speed", 1)
|
||||||
|
|
||||||
test.reconfig_packs({"base"}, {})
|
app.reconfig_packs({"base"}, {})
|
||||||
test.new_world("demo", "2019", "core:default")
|
app.new_world("demo", "2019", "core:default")
|
||||||
|
|
||||||
local pid1 = player.create("Xerxes")
|
local pid1 = player.create("Xerxes")
|
||||||
assert(player.get_name(pid1) == "Xerxes")
|
assert(player.get_name(pid1) == "Xerxes")
|
||||||
@ -21,7 +21,7 @@ for i=1,25 do
|
|||||||
end
|
end
|
||||||
player.set_pos(pid1, math.random() * 100 - 50, 100, math.random() * 100 - 50)
|
player.set_pos(pid1, math.random() * 100 - 50, 100, math.random() * 100 - 50)
|
||||||
player.set_pos(pid2, math.random() * 200 - 100, 100, math.random() * 200 - 100)
|
player.set_pos(pid2, math.random() * 200 - 100, 100, math.random() * 200 - 100)
|
||||||
test.tick()
|
app.tick()
|
||||||
end
|
end
|
||||||
|
|
||||||
test.close_world(true)
|
app.close_world(true)
|
||||||
|
|||||||
@ -1,23 +1,23 @@
|
|||||||
-- Create/close/open/close world
|
-- Create/close/open/close world
|
||||||
|
|
||||||
-- Open
|
-- Open
|
||||||
test.new_world("demo", "2019", "core:default")
|
app.new_world("demo", "2019", "core:default")
|
||||||
assert(world.is_open())
|
assert(world.is_open())
|
||||||
assert(world.get_generator() == "core:default")
|
assert(world.get_generator() == "core:default")
|
||||||
test.sleep(1)
|
app.sleep(1)
|
||||||
assert(world.get_total_time() > 0.0)
|
assert(world.get_total_time() > 0.0)
|
||||||
print(world.get_total_time())
|
print(world.get_total_time())
|
||||||
|
|
||||||
-- Close
|
-- Close
|
||||||
test.close_world(true)
|
app.close_world(true)
|
||||||
assert(not world.is_open())
|
assert(not world.is_open())
|
||||||
|
|
||||||
-- Reopen
|
-- Reopen
|
||||||
test.open_world("demo")
|
app.open_world("demo")
|
||||||
assert(world.is_open())
|
assert(world.is_open())
|
||||||
assert(world.get_total_time() > 0.0)
|
assert(world.get_total_time() > 0.0)
|
||||||
assert(world.get_seed() == 2019)
|
assert(world.get_seed() == 2019)
|
||||||
test.tick()
|
app.tick()
|
||||||
|
|
||||||
-- Close
|
-- Close
|
||||||
test.close_world(true)
|
app.close_world(true)
|
||||||
|
|||||||
@ -35,6 +35,16 @@ Block model type from list:
|
|||||||
- "X" - grass model (two crossed sprites)
|
- "X" - grass model (two crossed sprites)
|
||||||
- "aabb" - model based of block hitbox (complex hitbox will be combined into one). Examples: pipes, bulbs, panels.
|
- "aabb" - model based of block hitbox (complex hitbox will be combined into one). Examples: pipes, bulbs, panels.
|
||||||
|
|
||||||
|
### *model-name*
|
||||||
|
|
||||||
|
In addition to built-in model types, you can use your own, loaded from file.
|
||||||
|
|
||||||
|
The property specifies the model name without `entry_point:models/` nor extension.
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> Textures (materials) used in the model must be in the `blocks` atlas and specified in the *atlas-texture* format:
|
||||||
|
> `blocks:texture_name`
|
||||||
|
|
||||||
### *draw-group*
|
### *draw-group*
|
||||||
|
|
||||||
Integer specifying number of block draw group (render order). Used for semi-transparent blocks.
|
Integer specifying number of block draw group (render order). Used for semi-transparent blocks.
|
||||||
|
|||||||
130
doc/en/scripting/builtins/libapp.md
Normal file
130
doc/en/scripting/builtins/libapp.md
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
# *app* library
|
||||||
|
|
||||||
|
A library for high-level engine control, available only in script or test mode.
|
||||||
|
|
||||||
|
The script/test name without the path and extension is available as `app.script`. The file path can be obtained as:
|
||||||
|
```lua
|
||||||
|
local filename = "script:"..app.script..".lua"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Functions
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.tick()
|
||||||
|
```
|
||||||
|
|
||||||
|
Performs one tick of the main engine loop.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.sleep(time: number)
|
||||||
|
```
|
||||||
|
|
||||||
|
Waits for the specified time in seconds, performing the main engine loop.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.sleep_until(
|
||||||
|
-- function that checks the condition for ending the wait
|
||||||
|
predicate: function() -> bool,
|
||||||
|
-- the maximum number of engine loop ticks after which
|
||||||
|
-- a "max ticks exceed" exception will be thrown
|
||||||
|
[optional] max_ticks = 1e9
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
Waits for the condition checked by the function to be true, performing the main engine loop.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.quit()
|
||||||
|
```
|
||||||
|
|
||||||
|
Terminates the engine, printing the call stack to trace the function call location.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.reconfig_packs(
|
||||||
|
-- packs to add
|
||||||
|
add_packs: table,
|
||||||
|
-- packs to remove
|
||||||
|
remove_packs: table
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
Updates the pack configuration, checking its correctness (dependencies and availability of packs).
|
||||||
|
|
||||||
|
To remove all packs from the configuration, you can use `pack.get_installed()`:
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.reconfig_packs({}, pack.get_installed())
|
||||||
|
```
|
||||||
|
|
||||||
|
In this case, `base` will also be removed from the configuration.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.new_world(
|
||||||
|
-- world name
|
||||||
|
name: str,
|
||||||
|
-- generation seed
|
||||||
|
seed: str,
|
||||||
|
-- generator name
|
||||||
|
generator: str
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
Creates a new world and opens it.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.open_world(name: str)
|
||||||
|
```
|
||||||
|
|
||||||
|
Opens a world by name.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.reopen_world()
|
||||||
|
```
|
||||||
|
|
||||||
|
Reopens the world.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.close_world(
|
||||||
|
-- save the world before closing
|
||||||
|
[optional] save_world: bool=false
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
Closes the world.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.delete_world(name: str)
|
||||||
|
```
|
||||||
|
|
||||||
|
Deletes a world by name.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.get_version() -> int, int
|
||||||
|
```
|
||||||
|
|
||||||
|
Returns the major and minor versions of the engine.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.get_setting(name: str) -> value
|
||||||
|
```
|
||||||
|
|
||||||
|
Returns the value of a setting. Throws an exception if the setting does not exist.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.set_setting(name: str, value: value)
|
||||||
|
```
|
||||||
|
|
||||||
|
Sets the value of a setting. Throws an exception if the setting does not exist.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.get_setting_info(name: str) -> {
|
||||||
|
-- default value
|
||||||
|
def: value,
|
||||||
|
-- minimum value
|
||||||
|
[only for numeric settings] min: number,
|
||||||
|
-- maximum value
|
||||||
|
[only for numeric settings] max: number
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Returns a table with information about a setting. Throws an exception if the setting does not exist.
|
||||||
@ -35,6 +35,16 @@
|
|||||||
- "X" - модель травы (крест из двух спрайтов)
|
- "X" - модель травы (крест из двух спрайтов)
|
||||||
- "aabb" - модель, соответствующая хитбоксу блока (составной хитбокс будет объединен в один). Примеры: трубы, лампочки, панели.
|
- "aabb" - модель, соответствующая хитбоксу блока (составной хитбокс будет объединен в один). Примеры: трубы, лампочки, панели.
|
||||||
|
|
||||||
|
### Имя модели - *model-name*
|
||||||
|
|
||||||
|
Кроме встроенных типов моделей, можно использовать собственные, загружаемые из файлов.
|
||||||
|
|
||||||
|
В свойстве указывается имя модели без `точка_входа:models/` и расширения.
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> Текстуры (материалы), использующиеся в модели, должны находиться в атласе `blocks` и указываться в соответствующем формате:
|
||||||
|
> `blocks:имя_текстуры`
|
||||||
|
|
||||||
### Группа отрисовки - *draw-group*
|
### Группа отрисовки - *draw-group*
|
||||||
|
|
||||||
Целое число определяющее номер группы отрисовки данного блока.
|
Целое число определяющее номер группы отрисовки данного блока.
|
||||||
|
|||||||
131
doc/ru/scripting/builtins/libapp.md
Normal file
131
doc/ru/scripting/builtins/libapp.md
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
# Библиотека *app*
|
||||||
|
|
||||||
|
Библиотека для высокоуровневого управления работой движка, доступная только в режиме сценария или теста.
|
||||||
|
|
||||||
|
Имя сценария/теста без пути и расширения доступен как `app.script`. Путь к файлу можно получить как:
|
||||||
|
```lua
|
||||||
|
local filename = "script:"..app.script..".lua"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Функции
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.tick()
|
||||||
|
```
|
||||||
|
|
||||||
|
Выполняет один такт основного цикла движка.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.sleep(time: number)
|
||||||
|
```
|
||||||
|
|
||||||
|
Ожидает указанное время в секундах, выполняя основной цикл движка.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.sleep_until(
|
||||||
|
-- функция, проверяющее условия завершения ожидания
|
||||||
|
predicate: function() -> bool,
|
||||||
|
-- максимальное количество тактов цикла движка, после истечения которых
|
||||||
|
-- будет брошено исключение "max ticks exceed"
|
||||||
|
[опционально] max_ticks = 1e9
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
Ожидает истинности утверждения (условия), проверяемого функцией, выполнячя основной цикл движка.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.quit()
|
||||||
|
```
|
||||||
|
|
||||||
|
Завершает выполнение движка, выводя стек вызовов для ослеживания места вызова функции.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.reconfig_packs(
|
||||||
|
-- добавляемые паки
|
||||||
|
add_packs: table,
|
||||||
|
-- удаляемые паки
|
||||||
|
remove_packs: table
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
Обновляет конфигурацию паков, проверяя её корректность (зависимости и доступность паков).
|
||||||
|
|
||||||
|
Для удаления всех паков из конфигурации можно использовать `pack.get_installed()`:
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.reconfig_packs({}, pack.get_installed())
|
||||||
|
```
|
||||||
|
|
||||||
|
В этом случае из конфигурации будет удалён и `base`.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.new_world(
|
||||||
|
-- название мира
|
||||||
|
name: str,
|
||||||
|
-- зерно генерации
|
||||||
|
seed: str,
|
||||||
|
-- название генератора
|
||||||
|
generator: str
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
Создаёт новый мир и открывает его.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.open_world(name: str)
|
||||||
|
```
|
||||||
|
|
||||||
|
Открывает мир по названию.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.reopen_world()
|
||||||
|
```
|
||||||
|
|
||||||
|
Переоткрывает мир.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.close_world(
|
||||||
|
-- сохранить мир перед закрытием
|
||||||
|
[опционально] save_world: bool=false
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
Закрывает мир.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.delete_world(name: str)
|
||||||
|
```
|
||||||
|
|
||||||
|
Удаляет мир по названию.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.get_version() -> int, int
|
||||||
|
```
|
||||||
|
|
||||||
|
Возвращает мажорную и минорную версии движка.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.get_setting(name: str) -> value
|
||||||
|
```
|
||||||
|
|
||||||
|
Возвращает значение настройки. Бросает исключение, если настройки не существует.
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.set_setting(name: str, value: value)
|
||||||
|
```
|
||||||
|
|
||||||
|
Устанавливает значение настройки. Бросает исключение, если настройки не существует.
|
||||||
|
|
||||||
|
|
||||||
|
```lua
|
||||||
|
app.get_setting_info(name: str) -> {
|
||||||
|
-- значение по-умолчанию
|
||||||
|
def: value
|
||||||
|
-- минимальное значение
|
||||||
|
[только числовые настройки] min: number,
|
||||||
|
-- максимальное значение
|
||||||
|
[только числовые настройки] max: number
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Возвращает таблицу с информацией о настройке. Бросает исключение, если настройки не существует.
|
||||||
@ -22,21 +22,24 @@ function tb_frame_tostring(frame)
|
|||||||
return s
|
return s
|
||||||
end
|
end
|
||||||
|
|
||||||
if test then
|
if app then
|
||||||
test.sleep = sleep
|
app.sleep = sleep
|
||||||
test.name = __VC_TEST_NAME
|
app.script = __VC_SCRIPT_NAME
|
||||||
test.new_world = core.new_world
|
app.new_world = core.new_world
|
||||||
test.open_world = core.open_world
|
app.open_world = core.open_world
|
||||||
test.close_world = core.close_world
|
app.close_world = core.close_world
|
||||||
test.reopen_world = core.reopen_world
|
app.reopen_world = core.reopen_world
|
||||||
test.delete_world = core.delete_world
|
app.delete_world = core.delete_world
|
||||||
test.reconfig_packs = core.reconfig_packs
|
app.reconfig_packs = core.reconfig_packs
|
||||||
test.set_setting = core.set_setting
|
app.get_setting = core.get_setting
|
||||||
test.tick = coroutine.yield
|
app.set_setting = core.set_setting
|
||||||
|
app.tick = coroutine.yield
|
||||||
|
app.get_version = core.get_version
|
||||||
|
app.get_setting_info = core.get_setting_info
|
||||||
|
|
||||||
function test.quit()
|
function app.quit()
|
||||||
local tb = debug.get_traceback(1)
|
local tb = debug.get_traceback(1)
|
||||||
local s = "test.quit() traceback:"
|
local s = "app.quit() traceback:"
|
||||||
for i, frame in ipairs(tb) do
|
for i, frame in ipairs(tb) do
|
||||||
s = s .. "\n\t"..tb_frame_tostring(frame)
|
s = s .. "\n\t"..tb_frame_tostring(frame)
|
||||||
end
|
end
|
||||||
@ -45,11 +48,12 @@ if test then
|
|||||||
coroutine.yield()
|
coroutine.yield()
|
||||||
end
|
end
|
||||||
|
|
||||||
function test.sleep_until(predicate, max_ticks)
|
function app.sleep_until(predicate, max_ticks)
|
||||||
max_ticks = max_ticks or 1e9
|
max_ticks = max_ticks or 1e9
|
||||||
local ticks = 0
|
local ticks = 0
|
||||||
while ticks < max_ticks and not predicate() do
|
while ticks < max_ticks and not predicate() do
|
||||||
test.tick()
|
app.tick()
|
||||||
|
ticks = ticks + 1
|
||||||
end
|
end
|
||||||
if ticks == max_ticks then
|
if ticks == max_ticks then
|
||||||
error("max ticks exceed")
|
error("max ticks exceed")
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
#include "engine.hpp"
|
#include "Engine.hpp"
|
||||||
|
|
||||||
#ifndef GLEW_STATIC
|
#ifndef GLEW_STATIC
|
||||||
#define GLEW_STATIC
|
#define GLEW_STATIC
|
||||||
@ -186,7 +186,7 @@ void Engine::run() {
|
|||||||
|
|
||||||
void Engine::postUpdate() {
|
void Engine::postUpdate() {
|
||||||
network->update();
|
network->update();
|
||||||
processPostRunnables();
|
postRunnables.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Engine::updateFrontend() {
|
void Engine::updateFrontend() {
|
||||||
@ -215,15 +215,6 @@ void Engine::renderFrame() {
|
|||||||
gui->draw(ctx, *assets);
|
gui->draw(ctx, *assets);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Engine::processPostRunnables() {
|
|
||||||
std::lock_guard<std::recursive_mutex> lock(postRunnablesMutex);
|
|
||||||
while (!postRunnables.empty()) {
|
|
||||||
postRunnables.front()();
|
|
||||||
postRunnables.pop();
|
|
||||||
}
|
|
||||||
scripting::process_post_runnables();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Engine::saveSettings() {
|
void Engine::saveSettings() {
|
||||||
logger.info() << "saving settings";
|
logger.info() << "saving settings";
|
||||||
files::write_string(paths.getSettingsFile(), toml::stringify(settingsHandler));
|
files::write_string(paths.getSettingsFile(), toml::stringify(settingsHandler));
|
||||||
@ -296,14 +287,9 @@ void Engine::loadAssets() {
|
|||||||
auto task = loader.startTask([=](){});
|
auto task = loader.startTask([=](){});
|
||||||
task->waitForEnd();
|
task->waitForEnd();
|
||||||
} else {
|
} else {
|
||||||
try {
|
|
||||||
while (loader.hasNext()) {
|
while (loader.hasNext()) {
|
||||||
loader.loadNext();
|
loader.loadNext();
|
||||||
}
|
}
|
||||||
} catch (const assetload::error& err) {
|
|
||||||
new_assets.reset();
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
assets = std::move(new_assets);
|
assets = std::move(new_assets);
|
||||||
|
|
||||||
@ -519,11 +505,6 @@ std::shared_ptr<Screen> Engine::getScreen() {
|
|||||||
return screen;
|
return screen;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Engine::postRunnable(const runnable& callback) {
|
|
||||||
std::lock_guard<std::recursive_mutex> lock(postRunnablesMutex);
|
|
||||||
postRunnables.push(callback);
|
|
||||||
}
|
|
||||||
|
|
||||||
SettingsHandler& Engine::getSettingsHandler() {
|
SettingsHandler& Engine::getSettingsHandler() {
|
||||||
return settingsHandler;
|
return settingsHandler;
|
||||||
}
|
}
|
||||||
@ -11,15 +11,14 @@
|
|||||||
#include "files/engine_paths.hpp"
|
#include "files/engine_paths.hpp"
|
||||||
#include "files/settings_io.hpp"
|
#include "files/settings_io.hpp"
|
||||||
#include "util/ObjectsKeeper.hpp"
|
#include "util/ObjectsKeeper.hpp"
|
||||||
|
#include "PostRunnables.hpp"
|
||||||
#include "Time.hpp"
|
#include "Time.hpp"
|
||||||
|
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <queue>
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <mutex>
|
|
||||||
|
|
||||||
class Level;
|
class Level;
|
||||||
class Screen;
|
class Screen;
|
||||||
@ -65,13 +64,12 @@ class Engine : public util::ObjectsKeeper {
|
|||||||
std::vector<ContentPack> contentPacks;
|
std::vector<ContentPack> contentPacks;
|
||||||
std::unique_ptr<Content> content;
|
std::unique_ptr<Content> content;
|
||||||
std::unique_ptr<ResPaths> resPaths;
|
std::unique_ptr<ResPaths> resPaths;
|
||||||
std::queue<runnable> postRunnables;
|
|
||||||
std::recursive_mutex postRunnablesMutex;
|
|
||||||
std::unique_ptr<EngineController> controller;
|
std::unique_ptr<EngineController> controller;
|
||||||
std::unique_ptr<cmd::CommandsInterpreter> interpreter;
|
std::unique_ptr<cmd::CommandsInterpreter> interpreter;
|
||||||
std::unique_ptr<network::Network> network;
|
std::unique_ptr<network::Network> network;
|
||||||
std::vector<std::string> basePacks;
|
std::vector<std::string> basePacks;
|
||||||
std::unique_ptr<gui::GUI> gui;
|
std::unique_ptr<gui::GUI> gui;
|
||||||
|
PostRunnables postRunnables;
|
||||||
Time time;
|
Time time;
|
||||||
consumer<std::unique_ptr<Level>> levelConsumer;
|
consumer<std::unique_ptr<Level>> levelConsumer;
|
||||||
bool quitSignal = false;
|
bool quitSignal = false;
|
||||||
@ -80,7 +78,6 @@ class Engine : public util::ObjectsKeeper {
|
|||||||
void loadSettings();
|
void loadSettings();
|
||||||
void saveSettings();
|
void saveSettings();
|
||||||
void updateHotkeys();
|
void updateHotkeys();
|
||||||
void processPostRunnables();
|
|
||||||
void loadAssets();
|
void loadAssets();
|
||||||
public:
|
public:
|
||||||
Engine(CoreParameters coreParameters);
|
Engine(CoreParameters coreParameters);
|
||||||
@ -157,7 +154,9 @@ public:
|
|||||||
std::shared_ptr<Screen> getScreen();
|
std::shared_ptr<Screen> getScreen();
|
||||||
|
|
||||||
/// @brief Enqueue function call to the end of current frame in draw thread
|
/// @brief Enqueue function call to the end of current frame in draw thread
|
||||||
void postRunnable(const runnable& callback);
|
void postRunnable(const runnable& callback) {
|
||||||
|
postRunnables.postRunnable(callback);
|
||||||
|
}
|
||||||
|
|
||||||
void saveScreenshot();
|
void saveScreenshot();
|
||||||
|
|
||||||
@ -1,7 +1,7 @@
|
|||||||
#include "Mainloop.hpp"
|
#include "Mainloop.hpp"
|
||||||
|
|
||||||
|
#include "Engine.hpp"
|
||||||
#include "debug/Logger.hpp"
|
#include "debug/Logger.hpp"
|
||||||
#include "engine.hpp"
|
|
||||||
#include "frontend/screens/MenuScreen.hpp"
|
#include "frontend/screens/MenuScreen.hpp"
|
||||||
#include "frontend/screens/LevelScreen.hpp"
|
#include "frontend/screens/LevelScreen.hpp"
|
||||||
#include "window/Window.hpp"
|
#include "window/Window.hpp"
|
||||||
29
src/engine/PostRunnables.hpp
Normal file
29
src/engine/PostRunnables.hpp
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <queue>
|
||||||
|
#include <mutex>
|
||||||
|
#include "delegates.hpp"
|
||||||
|
|
||||||
|
class PostRunnables {
|
||||||
|
std::queue<runnable> runnables;
|
||||||
|
std::recursive_mutex mutex;
|
||||||
|
public:
|
||||||
|
void postRunnable(runnable task) {
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(mutex);
|
||||||
|
runnables.push(std::move(task));
|
||||||
|
}
|
||||||
|
|
||||||
|
void run() {
|
||||||
|
std::queue<runnable> tasksToRun;
|
||||||
|
{
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(mutex);
|
||||||
|
std::swap(tasksToRun, runnables);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!tasksToRun.empty()) {
|
||||||
|
auto& task = tasksToRun.front();
|
||||||
|
task();
|
||||||
|
tasksToRun.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
@ -1,5 +1,6 @@
|
|||||||
#include "ServerMainloop.hpp"
|
#include "ServerMainloop.hpp"
|
||||||
|
|
||||||
|
#include "Engine.hpp"
|
||||||
#include "logic/scripting/scripting.hpp"
|
#include "logic/scripting/scripting.hpp"
|
||||||
#include "logic/LevelController.hpp"
|
#include "logic/LevelController.hpp"
|
||||||
#include "interfaces/Process.hpp"
|
#include "interfaces/Process.hpp"
|
||||||
@ -7,7 +8,6 @@
|
|||||||
#include "world/Level.hpp"
|
#include "world/Level.hpp"
|
||||||
#include "world/World.hpp"
|
#include "world/World.hpp"
|
||||||
#include "util/platform.hpp"
|
#include "util/platform.hpp"
|
||||||
#include "engine.hpp"
|
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
|
||||||
@ -1,6 +1,6 @@
|
|||||||
#include "audio/audio.hpp"
|
#include "audio/audio.hpp"
|
||||||
#include "delegates.hpp"
|
#include "delegates.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "settings.hpp"
|
#include "settings.hpp"
|
||||||
#include "hud.hpp"
|
#include "hud.hpp"
|
||||||
#include "content/Content.hpp"
|
#include "content/Content.hpp"
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
#include "content/Content.hpp"
|
#include "content/Content.hpp"
|
||||||
#include "core_defs.hpp"
|
#include "core_defs.hpp"
|
||||||
#include "delegates.hpp"
|
#include "delegates.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "graphics/core/Atlas.hpp"
|
#include "graphics/core/Atlas.hpp"
|
||||||
#include "graphics/core/Batch2D.hpp"
|
#include "graphics/core/Batch2D.hpp"
|
||||||
#include "graphics/core/Batch3D.hpp"
|
#include "graphics/core/Batch3D.hpp"
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
#include "screens/MenuScreen.hpp"
|
#include "screens/MenuScreen.hpp"
|
||||||
|
|
||||||
#include "delegates.hpp"
|
#include "delegates.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "data/dv.hpp"
|
#include "data/dv.hpp"
|
||||||
#include "interfaces/Task.hpp"
|
#include "interfaces/Task.hpp"
|
||||||
#include "files/engine_paths.hpp"
|
#include "files/engine_paths.hpp"
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
#include "content/Content.hpp"
|
#include "content/Content.hpp"
|
||||||
#include "core_defs.hpp"
|
#include "core_defs.hpp"
|
||||||
#include "debug/Logger.hpp"
|
#include "debug/Logger.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "files/files.hpp"
|
#include "files/files.hpp"
|
||||||
#include "frontend/LevelFrontend.hpp"
|
#include "frontend/LevelFrontend.hpp"
|
||||||
#include "frontend/hud.hpp"
|
#include "frontend/hud.hpp"
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
#include "maths/UVRegion.hpp"
|
#include "maths/UVRegion.hpp"
|
||||||
#include "window/Window.hpp"
|
#include "window/Window.hpp"
|
||||||
#include "window/Camera.hpp"
|
#include "window/Camera.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
|
|
||||||
MenuScreen::MenuScreen(Engine& engine) : Screen(engine) {
|
MenuScreen::MenuScreen(Engine& engine) : Screen(engine) {
|
||||||
engine.resetContent();
|
engine.resetContent();
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
#include "Screen.hpp"
|
#include "Screen.hpp"
|
||||||
|
|
||||||
#include "graphics/core/Batch2D.hpp"
|
#include "graphics/core/Batch2D.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
|
|
||||||
Screen::Screen(Engine& engine)
|
Screen::Screen(Engine& engine)
|
||||||
: engine(engine),
|
: engine(engine),
|
||||||
|
|||||||
@ -14,7 +14,7 @@
|
|||||||
#include "objects/Players.hpp"
|
#include "objects/Players.hpp"
|
||||||
#include "logic/LevelController.hpp"
|
#include "logic/LevelController.hpp"
|
||||||
#include "util/stringutil.hpp"
|
#include "util/stringutil.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "files/files.hpp"
|
#include "files/files.hpp"
|
||||||
|
|
||||||
namespace fs = std::filesystem;
|
namespace fs = std::filesystem;
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
#include "assets/Assets.hpp"
|
#include "assets/Assets.hpp"
|
||||||
#include "assets/assets_util.hpp"
|
#include "assets/assets_util.hpp"
|
||||||
#include "content/Content.hpp"
|
#include "content/Content.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "frontend/LevelFrontend.hpp"
|
#include "frontend/LevelFrontend.hpp"
|
||||||
#include "frontend/ContentGfxCache.hpp"
|
#include "frontend/ContentGfxCache.hpp"
|
||||||
#include "items/Inventory.hpp"
|
#include "items/Inventory.hpp"
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "coders/commons.hpp"
|
#include "coders/commons.hpp"
|
||||||
#include "debug/Logger.hpp"
|
#include "debug/Logger.hpp"
|
||||||
#include "content/ContentReport.hpp"
|
#include "content/ContentReport.hpp"
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
#include "debug/Logger.hpp"
|
#include "debug/Logger.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "files/WorldFiles.hpp"
|
#include "files/WorldFiles.hpp"
|
||||||
#include "maths/voxmaths.hpp"
|
#include "maths/voxmaths.hpp"
|
||||||
#include "objects/Entities.hpp"
|
#include "objects/Entities.hpp"
|
||||||
|
|||||||
@ -37,7 +37,7 @@ extern const luaL_Reg packlib[];
|
|||||||
extern const luaL_Reg particleslib[]; // gfx.particles
|
extern const luaL_Reg particleslib[]; // gfx.particles
|
||||||
extern const luaL_Reg playerlib[];
|
extern const luaL_Reg playerlib[];
|
||||||
extern const luaL_Reg quatlib[];
|
extern const luaL_Reg quatlib[];
|
||||||
extern const luaL_Reg testlib[];
|
extern const luaL_Reg applib[];
|
||||||
extern const luaL_Reg text3dlib[]; // gfx.text3d
|
extern const luaL_Reg text3dlib[]; // gfx.text3d
|
||||||
extern const luaL_Reg timelib[];
|
extern const luaL_Reg timelib[];
|
||||||
extern const luaL_Reg tomllib[];
|
extern const luaL_Reg tomllib[];
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#include "api_lua.hpp"
|
#include "api_lua.hpp"
|
||||||
|
|
||||||
const luaL_Reg testlib[] = {
|
const luaL_Reg applib[] = {
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
@ -1,5 +1,5 @@
|
|||||||
#include "audio/audio.hpp"
|
#include "audio/audio.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "api_lua.hpp"
|
#include "api_lua.hpp"
|
||||||
|
|
||||||
inline const char* DEFAULT_CHANNEL = "regular";
|
inline const char* DEFAULT_CHANNEL = "regular";
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#include "coders/commons.hpp"
|
#include "coders/commons.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "logic/CommandsInterpreter.hpp"
|
#include "logic/CommandsInterpreter.hpp"
|
||||||
#include "api_lua.hpp"
|
#include "api_lua.hpp"
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
#include "constants.hpp"
|
#include "constants.hpp"
|
||||||
#include "content/Content.hpp"
|
#include "content/Content.hpp"
|
||||||
#include "debug/Logger.hpp"
|
#include "debug/Logger.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "files/engine_paths.hpp"
|
#include "files/engine_paths.hpp"
|
||||||
#include "files/files.hpp"
|
#include "files/files.hpp"
|
||||||
#include "files/settings_io.hpp"
|
#include "files/settings_io.hpp"
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
#include "libentity.hpp"
|
#include "libentity.hpp"
|
||||||
|
|
||||||
#include "content/Content.hpp"
|
#include "content/Content.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "objects/Entities.hpp"
|
#include "objects/Entities.hpp"
|
||||||
#include "objects/EntityDef.hpp"
|
#include "objects/EntityDef.hpp"
|
||||||
#include "objects/Player.hpp"
|
#include "objects/Player.hpp"
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
#include "coders/gzip.hpp"
|
#include "coders/gzip.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "files/engine_paths.hpp"
|
#include "files/engine_paths.hpp"
|
||||||
#include "files/files.hpp"
|
#include "files/files.hpp"
|
||||||
#include "util/stringutil.hpp"
|
#include "util/stringutil.hpp"
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
#include "world/Level.hpp"
|
#include "world/Level.hpp"
|
||||||
#include "world/generator/VoxelFragment.hpp"
|
#include "world/generator/VoxelFragment.hpp"
|
||||||
#include "content/ContentLoader.hpp"
|
#include "content/ContentLoader.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "../lua_custom_types.hpp"
|
#include "../lua_custom_types.hpp"
|
||||||
|
|
||||||
using namespace scripting;
|
using namespace scripting;
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#include "assets/Assets.hpp"
|
#include "assets/Assets.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "frontend/UiDocument.hpp"
|
#include "frontend/UiDocument.hpp"
|
||||||
#include "frontend/locale.hpp"
|
#include "frontend/locale.hpp"
|
||||||
#include "graphics/ui/elements/Button.hpp"
|
#include "graphics/ui/elements/Button.hpp"
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#include "assets/Assets.hpp"
|
#include "assets/Assets.hpp"
|
||||||
#include "content/Content.hpp"
|
#include "content/Content.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "frontend/UiDocument.hpp"
|
#include "frontend/UiDocument.hpp"
|
||||||
#include "frontend/hud.hpp"
|
#include "frontend/hud.hpp"
|
||||||
#include "graphics/ui/elements/InventoryView.hpp"
|
#include "graphics/ui/elements/InventoryView.hpp"
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "files/files.hpp"
|
#include "files/files.hpp"
|
||||||
#include "frontend/hud.hpp"
|
#include "frontend/hud.hpp"
|
||||||
#include "frontend/screens/Screen.hpp"
|
#include "frontend/screens/Screen.hpp"
|
||||||
@ -30,7 +30,21 @@ static int l_mousecode(lua::State* L) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int l_add_callback(lua::State* L) {
|
static int l_add_callback(lua::State* L) {
|
||||||
auto bindname = lua::require_string(L, 1);
|
std::string bindname = lua::require_string(L, 1);
|
||||||
|
size_t pos = bindname.find(':');
|
||||||
|
if (pos != std::string::npos) {
|
||||||
|
std::string prefix = bindname.substr(0, pos);
|
||||||
|
if (prefix == "key") {
|
||||||
|
if (hud == nullptr) {
|
||||||
|
throw std::runtime_error("on_hud_open is not called yet");
|
||||||
|
}
|
||||||
|
auto key = input_util::keycode_from(bindname.substr(pos + 1));
|
||||||
|
auto callback = lua::create_runnable(L);
|
||||||
|
hud->keepAlive(Events::keyCallbacks[key].add(callback));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const auto& bind = Events::bindings.find(bindname);
|
const auto& bind = Events::bindings.find(bindname);
|
||||||
if (bind == Events::bindings.end()) {
|
if (bind == Events::bindings.end()) {
|
||||||
throw std::runtime_error("unknown binding " + util::quote(bindname));
|
throw std::runtime_error("unknown binding " + util::quote(bindname));
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
#include "api_lua.hpp"
|
#include "api_lua.hpp"
|
||||||
|
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "network/Network.hpp"
|
#include "network/Network.hpp"
|
||||||
|
|
||||||
using namespace scripting;
|
using namespace scripting;
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
#include "assets/AssetsLoader.hpp"
|
#include "assets/AssetsLoader.hpp"
|
||||||
#include "content/Content.hpp"
|
#include "content/Content.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "files/WorldFiles.hpp"
|
#include "files/WorldFiles.hpp"
|
||||||
#include "files/engine_paths.hpp"
|
#include "files/engine_paths.hpp"
|
||||||
#include "world/Level.hpp"
|
#include "world/Level.hpp"
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
#include "graphics/render/ParticlesRenderer.hpp"
|
#include "graphics/render/ParticlesRenderer.hpp"
|
||||||
#include "graphics/render/Emitter.hpp"
|
#include "graphics/render/Emitter.hpp"
|
||||||
#include "assets/assets_util.hpp"
|
#include "assets/assets_util.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
|
|
||||||
using namespace scripting;
|
using namespace scripting;
|
||||||
|
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
#include "graphics/render/WorldRenderer.hpp"
|
#include "graphics/render/WorldRenderer.hpp"
|
||||||
#include "graphics/render/TextsRenderer.hpp"
|
#include "graphics/render/TextsRenderer.hpp"
|
||||||
#include "graphics/render/TextNote.hpp"
|
#include "graphics/render/TextNote.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
|
|
||||||
using namespace scripting;
|
using namespace scripting;
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "api_lua.hpp"
|
#include "api_lua.hpp"
|
||||||
|
|
||||||
using namespace scripting;
|
using namespace scripting;
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
#include "coders/compression.hpp"
|
#include "coders/compression.hpp"
|
||||||
#include "coders/gzip.hpp"
|
#include "coders/gzip.hpp"
|
||||||
#include "coders/json.hpp"
|
#include "coders/json.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "files/engine_paths.hpp"
|
#include "files/engine_paths.hpp"
|
||||||
#include "files/files.hpp"
|
#include "files/files.hpp"
|
||||||
#include "lighting/Lighting.hpp"
|
#include "lighting/Lighting.hpp"
|
||||||
|
|||||||
@ -9,7 +9,7 @@
|
|||||||
#include "util/stringutil.hpp"
|
#include "util/stringutil.hpp"
|
||||||
#include "libs/api_lua.hpp"
|
#include "libs/api_lua.hpp"
|
||||||
#include "lua_custom_types.hpp"
|
#include "lua_custom_types.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
|
|
||||||
static debug::Logger logger("lua-state");
|
static debug::Logger logger("lua-state");
|
||||||
static lua::State* main_thread = nullptr;
|
static lua::State* main_thread = nullptr;
|
||||||
@ -58,10 +58,10 @@ static void create_libs(State* L, StateType stateType) {
|
|||||||
openlib(L, "vec3", vec3lib);
|
openlib(L, "vec3", vec3lib);
|
||||||
openlib(L, "vec4", vec4lib);
|
openlib(L, "vec4", vec4lib);
|
||||||
|
|
||||||
if (stateType == StateType::TEST) {
|
if (stateType == StateType::SCRIPT) {
|
||||||
openlib(L, "test", testlib);
|
openlib(L, "app", applib);
|
||||||
}
|
}
|
||||||
if (stateType == StateType::BASE || stateType == StateType::TEST) {
|
if (stateType == StateType::BASE || stateType == StateType::SCRIPT) {
|
||||||
openlib(L, "gui", guilib);
|
openlib(L, "gui", guilib);
|
||||||
openlib(L, "input", inputlib);
|
openlib(L, "input", inputlib);
|
||||||
openlib(L, "inventory", inventorylib);
|
openlib(L, "inventory", inventorylib);
|
||||||
@ -119,10 +119,10 @@ void lua::initialize(const EnginePaths& paths, const CoreParameters& params) {
|
|||||||
logger.info() << LUAJIT_VERSION;
|
logger.info() << LUAJIT_VERSION;
|
||||||
|
|
||||||
main_thread = create_state(
|
main_thread = create_state(
|
||||||
paths, params.headless ? StateType::TEST : StateType::BASE
|
paths, params.headless ? StateType::SCRIPT : StateType::BASE
|
||||||
);
|
);
|
||||||
lua::pushstring(main_thread, params.scriptFile.stem().u8string());
|
lua::pushstring(main_thread, params.scriptFile.stem().u8string());
|
||||||
lua::setglobal(main_thread, "__VC_TEST_NAME");
|
lua::setglobal(main_thread, "__VC_SCRIPT_NAME");
|
||||||
}
|
}
|
||||||
|
|
||||||
void lua::finalize() {
|
void lua::finalize() {
|
||||||
|
|||||||
@ -13,7 +13,7 @@ struct CoreParameters;
|
|||||||
namespace lua {
|
namespace lua {
|
||||||
enum class StateType {
|
enum class StateType {
|
||||||
BASE,
|
BASE,
|
||||||
TEST,
|
SCRIPT,
|
||||||
GENERATOR,
|
GENERATOR,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -12,7 +12,7 @@
|
|||||||
#include "files/util.hpp"
|
#include "files/util.hpp"
|
||||||
#include "graphics/core/ImageData.hpp"
|
#include "graphics/core/ImageData.hpp"
|
||||||
#include "maths/Heightmap.hpp"
|
#include "maths/Heightmap.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "../lua_util.hpp"
|
#include "../lua_util.hpp"
|
||||||
|
|
||||||
using namespace lua;
|
using namespace lua;
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
#include "content/Content.hpp"
|
#include "content/Content.hpp"
|
||||||
#include "content/ContentPack.hpp"
|
#include "content/ContentPack.hpp"
|
||||||
#include "debug/Logger.hpp"
|
#include "debug/Logger.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "files/engine_paths.hpp"
|
#include "files/engine_paths.hpp"
|
||||||
#include "files/files.hpp"
|
#include "files/files.hpp"
|
||||||
#include "frontend/UiDocument.hpp"
|
#include "frontend/UiDocument.hpp"
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
#include "scripting_hud.hpp"
|
#include "scripting_hud.hpp"
|
||||||
|
|
||||||
#include "debug/Logger.hpp"
|
#include "debug/Logger.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "files/files.hpp"
|
#include "files/files.hpp"
|
||||||
#include "frontend/hud.hpp"
|
#include "frontend/hud.hpp"
|
||||||
#include "graphics/render/WorldRenderer.hpp"
|
#include "graphics/render/WorldRenderer.hpp"
|
||||||
|
|||||||
@ -14,7 +14,7 @@
|
|||||||
#include "world/generator/GeneratorDef.hpp"
|
#include "world/generator/GeneratorDef.hpp"
|
||||||
#include "util/timeutil.hpp"
|
#include "util/timeutil.hpp"
|
||||||
#include "files/files.hpp"
|
#include "files/files.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "debug/Logger.hpp"
|
#include "debug/Logger.hpp"
|
||||||
|
|
||||||
using namespace lua;
|
using namespace lua;
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "util/platform.hpp"
|
#include "util/platform.hpp"
|
||||||
#include "util/command_line.hpp"
|
#include "util/command_line.hpp"
|
||||||
#include "debug/Logger.hpp"
|
#include "debug/Logger.hpp"
|
||||||
|
|||||||
@ -16,7 +16,7 @@ struct UVFace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<int n>
|
template<int n>
|
||||||
inline void rotate(int times) {
|
inline void rotate() {
|
||||||
int times = n % 4;
|
int times = n % 4;
|
||||||
if (times < 0) {
|
if (times < 0) {
|
||||||
times += 4;
|
times += 4;
|
||||||
|
|||||||
@ -9,6 +9,12 @@
|
|||||||
#include <glm/gtx/norm.hpp>
|
#include <glm/gtx/norm.hpp>
|
||||||
|
|
||||||
namespace util {
|
namespace util {
|
||||||
|
inline uint64_t shuffle_bits_step(uint64_t x, uint64_t m, unsigned shift) {
|
||||||
|
uint64_t t = ((x >> shift) ^ x) & m;
|
||||||
|
x = (x ^ t) ^ (t << shift);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
constexpr inline float EPSILON = 1e-6f;
|
constexpr inline float EPSILON = 1e-6f;
|
||||||
|
|
||||||
class PseudoRandom {
|
class PseudoRandom {
|
||||||
@ -57,17 +63,20 @@ namespace util {
|
|||||||
return randU64() / static_cast<double>(UINT64_MAX);
|
return randU64() / static_cast<double>(UINT64_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setSeed(int number) {
|
|
||||||
seed = (static_cast<unsigned short>(number * 23729) ^
|
|
||||||
static_cast<unsigned short>(number + 16786));
|
|
||||||
rand();
|
|
||||||
}
|
|
||||||
void setSeed(int number1, int number2) {
|
void setSeed(int number1, int number2) {
|
||||||
seed = ((static_cast<unsigned short>(number1 * 23729) |
|
seed = ((static_cast<unsigned short>(number1 * 23729) |
|
||||||
static_cast<unsigned short>(number2 % 16786)) ^
|
static_cast<unsigned short>(number2 % 16786)) ^
|
||||||
static_cast<unsigned short>(number2 * number1));
|
static_cast<unsigned short>(number2 * number1));
|
||||||
rand();
|
rand();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setSeed(long number) {
|
||||||
|
number = shuffle_bits_step(number, 0x2222222222222222ull, 1);
|
||||||
|
number = shuffle_bits_step(number, 0x0c0c0c0c0c0c0c0cull, 2);
|
||||||
|
number = shuffle_bits_step(number, 0x00f000f000f000f0ull, 4);
|
||||||
|
seed = number;
|
||||||
|
rand();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
#include "content/Content.hpp"
|
#include "content/Content.hpp"
|
||||||
#include "data/dv_util.hpp"
|
#include "data/dv_util.hpp"
|
||||||
#include "debug/Logger.hpp"
|
#include "debug/Logger.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "graphics/core/DrawContext.hpp"
|
#include "graphics/core/DrawContext.hpp"
|
||||||
#include "graphics/core/LineBatch.hpp"
|
#include "graphics/core/LineBatch.hpp"
|
||||||
#include "graphics/commons/Model.hpp"
|
#include "graphics/commons/Model.hpp"
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
@ -11,17 +12,33 @@ namespace util {
|
|||||||
class RunnablesList {
|
class RunnablesList {
|
||||||
int nextid = 1;
|
int nextid = 1;
|
||||||
std::unordered_map<int, runnable> runnables;
|
std::unordered_map<int, runnable> runnables;
|
||||||
|
std::mutex mutex;
|
||||||
public:
|
public:
|
||||||
|
RunnablesList() = default;
|
||||||
|
|
||||||
|
RunnablesList(RunnablesList&& o) {
|
||||||
|
runnables = std::move(o.runnables);
|
||||||
|
nextid = o.nextid;
|
||||||
|
}
|
||||||
|
|
||||||
|
void operator=(RunnablesList&& o) {
|
||||||
|
runnables = std::move(o.runnables);
|
||||||
|
nextid = o.nextid;
|
||||||
|
}
|
||||||
|
|
||||||
observer_handler add(runnable callback) {
|
observer_handler add(runnable callback) {
|
||||||
|
std::lock_guard lock(mutex);
|
||||||
int id = nextid++;
|
int id = nextid++;
|
||||||
runnables[id] = std::move(callback);
|
runnables[id] = std::move(callback);
|
||||||
return observer_handler(new int(id), [this](int* id) { //-V508
|
return observer_handler(new int(id), [this](int* id) { //-V508
|
||||||
|
std::lock_guard lock(mutex);
|
||||||
runnables.erase(*id);
|
runnables.erase(*id);
|
||||||
delete id;
|
delete id;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void notify() {
|
void notify() {
|
||||||
|
std::lock_guard lock(mutex);
|
||||||
for (auto& entry : runnables) {
|
for (auto& entry : runnables) {
|
||||||
entry.second();
|
entry.second();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
#include "files/engine_paths.hpp"
|
#include "files/engine_paths.hpp"
|
||||||
#include "util/ArgsReader.hpp"
|
#include "util/ArgsReader.hpp"
|
||||||
#include "engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
|
|
||||||
namespace fs = std::filesystem;
|
namespace fs = std::filesystem;
|
||||||
|
|
||||||
|
|||||||
@ -23,6 +23,7 @@ bool Events::_cursor_locked = false;
|
|||||||
std::vector<uint> Events::codepoints;
|
std::vector<uint> Events::codepoints;
|
||||||
std::vector<keycode> Events::pressedKeys;
|
std::vector<keycode> Events::pressedKeys;
|
||||||
std::unordered_map<std::string, Binding> Events::bindings;
|
std::unordered_map<std::string, Binding> Events::bindings;
|
||||||
|
std::unordered_map<keycode, util::RunnablesList> Events::keyCallbacks;
|
||||||
|
|
||||||
bool Events::pressed(keycode keycode) {
|
bool Events::pressed(keycode keycode) {
|
||||||
return pressed(static_cast<int>(keycode));
|
return pressed(static_cast<int>(keycode));
|
||||||
@ -156,6 +157,12 @@ bool Events::jactive(const std::string& name) {
|
|||||||
void Events::setKey(int key, bool b) {
|
void Events::setKey(int key, bool b) {
|
||||||
Events::keys[key] = b;
|
Events::keys[key] = b;
|
||||||
Events::frames[key] = currentFrame;
|
Events::frames[key] = currentFrame;
|
||||||
|
if (b) {
|
||||||
|
const auto& callbacks = keyCallbacks.find(static_cast<keycode>(key));
|
||||||
|
if (callbacks != keyCallbacks.end()) {
|
||||||
|
callbacks->second.notify();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Events::setButton(int button, bool b) {
|
void Events::setButton(int button, bool b) {
|
||||||
@ -173,6 +180,10 @@ void Events::setPosition(float xpos, float ypos) {
|
|||||||
Events::cursor.y = ypos;
|
Events::cursor.y = ypos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
observer_handler Events::addKeyCallback(keycode key, runnable callback) {
|
||||||
|
return keyCallbacks[key].add(std::move(callback));
|
||||||
|
}
|
||||||
|
|
||||||
#include "coders/json.hpp"
|
#include "coders/json.hpp"
|
||||||
#include "coders/toml.hpp"
|
#include "coders/toml.hpp"
|
||||||
|
|
||||||
@ -228,7 +239,6 @@ void Events::loadBindings(
|
|||||||
} else if (bindType == BindType::REBIND) {
|
} else if (bindType == BindType::REBIND) {
|
||||||
Events::rebind(key, type, code);
|
Events::rebind(key, type, code);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,6 +27,7 @@ public:
|
|||||||
static std::vector<uint> codepoints;
|
static std::vector<uint> codepoints;
|
||||||
static std::vector<keycode> pressedKeys;
|
static std::vector<keycode> pressedKeys;
|
||||||
static std::unordered_map<std::string, Binding> bindings;
|
static std::unordered_map<std::string, Binding> bindings;
|
||||||
|
static std::unordered_map<keycode, util::RunnablesList> keyCallbacks;
|
||||||
|
|
||||||
static void pollEvents();
|
static void pollEvents();
|
||||||
|
|
||||||
@ -50,6 +51,8 @@ public:
|
|||||||
static bool active(const std::string& name);
|
static bool active(const std::string& name);
|
||||||
static bool jactive(const std::string& name);
|
static bool jactive(const std::string& name);
|
||||||
|
|
||||||
|
static observer_handler addKeyCallback(keycode key, runnable callback);
|
||||||
|
|
||||||
static void setKey(int key, bool b);
|
static void setKey(int key, bool b);
|
||||||
static void setButton(int button, bool b);
|
static void setButton(int button, bool b);
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user