From 257ba86183fc6a020ecd6abaffa01e008d050c85 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 10 Jul 2024 00:39:41 +0300 Subject: [PATCH] add vec3.random_normal and fix entities cleanup moment --- doc/ru/scripting/builtins/libvecn.md | 28 +++++++++++++------ .../base/scripts/components/falling_block.lua | 3 +- src/logic/LevelController.cpp | 2 +- src/logic/scripting/lua/libvecn.cpp | 17 ++++++++++- 4 files changed, 39 insertions(+), 11 deletions(-) diff --git a/doc/ru/scripting/builtins/libvecn.md b/doc/ru/scripting/builtins/libvecn.md index bc847bf9..104c389a 100644 --- a/doc/ru/scripting/builtins/libvecn.md +++ b/doc/ru/scripting/builtins/libvecn.md @@ -33,7 +33,7 @@ vecn.add(a: vector, b: vector) vecn.add(a: vector, b: number) -- записывает результат сложения двух векторов в dst -vec.add(a: vector, b: vector, dst: vector) +vecn.add(a: vector, b: vector, dst: vector) ``` #### Вычитание - *vecn.sub(...)* @@ -46,7 +46,7 @@ vecn.sub(a: vector, b: vector) vecn.sub(a: vector, b: number) -- записывает результат вычитания двух векторов в dst -vec.sub(a: vector, b: vector, dst: vector) +vecn.sub(a: vector, b: vector, dst: vector) ``` #### Умножение - *vecn.mul(...)* @@ -66,7 +66,7 @@ vecn.mul(a: vector, b: number) vecn.inverse(a: vector) -- записывает инвертированный вектор в dst -vec.inverse(v: vector, dst: vector) +vecn.inverse(v: vector, dst: vector) ``` #### Деление - *vecn.div(...)* @@ -79,7 +79,7 @@ vecn.div(a: vector, b: vector) vecn.div(a: vector, b: number) -- записывает результат деления двух векторов в dst -vec.div(a: vector, b: vector, dst: vector) +vecn.div(a: vector, b: vector, dst: vector) ``` #### Нормализация - *vecn.norm(...)* @@ -89,7 +89,7 @@ vec.div(a: vector, b: vector, dst: vector) vecn.normalize(a: vector) -- записывает нормализованный вектор в dst -vec.normalize(v: vector, dst: vector) +vecn.normalize(v: vector, dst: vector) ``` #### Длина вектора - *vecn.len(...)* @@ -107,7 +107,7 @@ vecn.length(a: vector) vecn.abs(a: vector) -- записывает абсолютное значение вектора в dst -vec.abs(v: vector, dst: vector) +vecn.abs(v: vector, dst: vector) ``` #### Округление - *vecn.round(...)* @@ -117,7 +117,7 @@ vec.abs(v: vector, dst: vector) vecn.round(a: vector) -- записывает округленный вектор в dst -vec.round(v: vector, dst: vector) +vecn.round(v: vector, dst: vector) ``` #### Степень - *vecn.pow(...)* @@ -127,7 +127,7 @@ vec.round(v: vector, dst: vector) vecn.pow(a: vector, b: number) -- записывает вектор, возведенный в степень, в dst -vec.pow(v: vector, exponent: number, dst: vector) +vecn.pow(v: vector, exponent: number, dst: vector) ``` #### Скалярное произведение - *vecn.dot(...)* @@ -144,6 +144,18 @@ vecn.dot(a: vector, b: vector) vecn.tostring(a: vector) ``` +## Специфические функции + +Функции относящиеся к конкретным размерностям векторов. + +```lua +-- возвращает случайный вектор, координаты которого равномерно распределены на сфере заданного радиуса +vec3.spherical_rand(radius: number) + +-- записывает случайный вектор, координаты которого равномерно распределены на сфере заданного радиуса в dst +vec3.spherical_rand(radius: number, dst: vec3) +``` + ## Пример ```lua diff --git a/res/content/base/scripts/components/falling_block.lua b/res/content/base/scripts/components/falling_block.lua index 44345ec6..44a0774c 100644 --- a/res/content/base/scripts/components/falling_block.lua +++ b/res/content/base/scripts/components/falling_block.lua @@ -26,7 +26,8 @@ function on_grounded() block.set(ix, iy, iz, block.index(blockid)) else local picking_item = block.get_picking_item(block.index(blockid)) - entities.spawn("base:drop", pos, {item={id=picking_item, count=1}}) + local drop = entities.spawn("base:drop", pos, {item={id=picking_item, count=1}}) + drop.rigidbody:set_vel(vec3.spherical_rand(5.0)) end entity:despawn() end diff --git a/src/logic/LevelController.cpp b/src/logic/LevelController.cpp index 501abd0c..1f3f12e8 100644 --- a/src/logic/LevelController.cpp +++ b/src/logic/LevelController.cpp @@ -31,7 +31,6 @@ void LevelController::update(float delta, bool input, bool pause) { settings.chunks.padding.get() * 2); chunks->update(settings.chunks.loadSpeed.get()); - level->entities->clean(); if (!pause) { // update all objects that needed for (const auto& obj : level->objects) { @@ -44,6 +43,7 @@ void LevelController::update(float delta, bool input, bool pause) { level->entities->updatePhysics(delta); level->entities->update(); } + level->entities->clean(); player->postUpdate(delta, input, pause); // erease null pointers diff --git a/src/logic/scripting/lua/libvecn.cpp b/src/logic/scripting/lua/libvecn.cpp index 875a0562..1aa4d43f 100644 --- a/src/logic/scripting/lua/libvecn.cpp +++ b/src/logic/scripting/lua/libvecn.cpp @@ -2,6 +2,7 @@ #include #include +#include template class Op> static int l_binop(lua::State* L) { @@ -135,6 +136,19 @@ static int l_inverse(lua::State* L) { } } +static int l_spherical_rand(lua::State* L) { + int argc = lua::gettop(L); + switch (argc) { + case 1: + return lua::pushvec3_arr(L, glm::sphericalRand(lua::tonumber(L, 1))); + case 2: + return lua::setvec(L, 2, + glm::sphericalRand(static_cast(lua::tonumber(L, 1)))); + default: + throw std::runtime_error("invalid arguments number (1 or 2 expected)"); + } +} + template static int l_tostring(lua::State* L) { auto vec = lua::tovec(L, 1); @@ -182,6 +196,7 @@ const luaL_Reg vec3lib [] = { {"inverse", lua::wrap>}, {"pow", lua::wrap>}, {"dot", lua::wrap>}, + {"spherical_rand", lua::wrap}, {NULL, NULL} }; @@ -199,4 +214,4 @@ const luaL_Reg vec4lib [] = { {"pow", lua::wrap>}, {"dot", lua::wrap>}, {NULL, NULL} -}; \ No newline at end of file +};