fix func in libvecn

This commit is contained in:
Cogi Asd 2024-07-08 22:48:05 +03:00
parent 783050c488
commit e55d6a36e3
2 changed files with 111 additions and 42 deletions

View File

@ -31,6 +31,9 @@ vecn.add(a: vector, b: vector)
-- возвращает результат сложения вектора и скаляра
vecn.add(a: vector, b: number)
-- записывает результат сложения двух векторов в dst
vec.add(a: vector, b: vector, dst: vector)
```
#### Вычитание - *vecn.sub(...)*
@ -41,6 +44,9 @@ vecn.sub(a: vector, b: vector)
-- возвращает результат вычитания скаляра из вектора
vecn.sub(a: vector, b: number)
-- записывает результат вычитания двух векторов в dst
vec.sub(a: vector, b: vector, dst: vector)
```
#### Умножение - *vecn.mul(...)*
@ -58,6 +64,9 @@ vecn.mul(a: vector, b: number)
```lua
-- возвращает результат инверсии (противоположный) вектора
vecn.inverse(a: vector)
-- записывает инвертированный вектор в dst
vec.inverse(v: vector, dst: vector)
```
#### Деление - *vecn.div(...)*
@ -68,6 +77,9 @@ vecn.div(a: vector, b: vector)
-- возвращает результат деления вектора на скаляр
vecn.div(a: vector, b: number)
-- записывает результат деления двух векторов в dst
vec.div(a: vector, b: vector, dst: vector)
```
#### Нормализация - *vecn.norm(...)*
@ -75,12 +87,17 @@ vecn.div(a: vector, b: number)
```lua
-- возвращает нормализованный вектор
vecn.normalize(a: vector)
-- записывает нормализованный вектор в dst
vec.normalize(v: vector, dst: vector)
```
#### Длина вектора - *vecn.len(...)*
```lua
-- возвращает длину вектора
vecn.length(a: vector)
```
#### Абсолютное значение - *vecn.abs(...)*
@ -88,6 +105,9 @@ vecn.length(a: vector)
```lua
-- возвращает вектор с абсолютными значениями
vecn.abs(a: vector)
-- записывает абсолютное значение вектора в dst
vec.abs(v: vector, dst: vector)
```
#### Округление - *vecn.round(...)*
@ -95,6 +115,9 @@ vecn.abs(a: vector)
```lua
-- возвращает вектор с округленными значениями
vecn.round(a: vector)
-- записывает округленный вектор в dst
vec.round(v: vector, dst: vector)
```
#### Степень - *vecn.pow(...)*
@ -102,6 +125,9 @@ vecn.round(a: vector)
```lua
-- возвращает вектор с элементами, возведенными в степень
vecn.pow(a: vector, b: number)
-- записывает вектор, возведенный в степень, в dst
vec.pow(v: vector, exponent: number, dst: vector)
```
#### Скалярное произведение - *vecn.dot(...)*

View File

@ -72,44 +72,92 @@ static int l_scalar_op(lua::State* L) {
template<int n>
static int l_pow(lua::State* L) {
uint argc = lua::gettop(L);
if (argc == 2 || argc == 3) {
const auto& a = lua::tovec<n>(L, 1); // vector
bool is_b_scalar = lua::isnumber(L, 2);
if (is_b_scalar || (argc == 3 && lua::isnumber(L, 2))) {
const auto& b = is_b_scalar
? lua::tonumber(L, 2) // scalar (pow)
: lua::tovec<n>(L, 2)[0]; // vector (pow)
if (argc != 2 && argc != 3) {
throw std::runtime_error("invalid arguments number (2 or 3 expected)");
}
const auto& a = lua::tovec<n>(L, 1); //vector
if (lua::isnumber(L, 2)) { // scalar second operand overload
const auto& b = lua::tonumber(L, 2); //scalar (pow)
if (argc == 2) {
glm::vec<n, float> result_vector;
for (int i = 0; i < n; i++) {
result_vector[i] = pow(a[i], b);
}
if (argc == 2) {
lua::createtable(L, n, 0);
for (uint i = 0; i < n; i++) {
lua::pushnumber(L, result_vector[i]);
lua::rawseti(L, i+1);
}
return 1;
} else {
glm::vec<n, float> result_vector;
for (int i = 0; i < n; i++) {
result_vector[i] = pow(a[i], b);
}
lua::pushvalue(L, 3);
lua::createtable(L, n, 0);
for (uint i = 0; i < n; i++) {
lua::pushnumber(L, result_vector[i]);
lua::rawseti(L, i+1);
}
lua_settable(L, 3);
return 0;
}
} else {
const auto& b = lua::tovec<n>(L, 2); //vector
if (argc == 2) {
glm::vec<n, float> result_vector;
for (int i = 0; i < n; i++) {
result_vector[i] = pow(a[i], b[i]);
}
lua::createtable(L, n, 0);
for (uint i = 0; i < n; i++) {
lua::pushnumber(L, result_vector[i]);
lua::rawseti(L, i+1);
}
return 1;
} else {
glm::vec<n, float> result_vector;
for (int i = 0; i < n; i++) {
result_vector[i] = pow(a[i], b[i]);
}
lua::pushvalue(L, 3);
lua::createtable(L, n, 0);
for (uint i = 0; i < n; i++) {
lua::pushnumber(L, result_vector[i]);
lua::rawseti(L, i+1);
}
lua_settable(L, 3);
return 0;
}
}
}
} else {
return lua::setvec(L, 3, result_vector);
}
} else {
template<int n>
static int l_dot(lua::State* L) {
uint argc = lua::gettop(L);
if (argc != 2 && argc != 3) {
throw std::runtime_error("invalid arguments number (2 or 3 expected)");
}
const auto& a = lua::tovec<n>(L, 1);
const auto& b = lua::tovec<n>(L, 2);
if (argc == 2) {
lua::pushnumber(L, glm::dot(a, b));
return 1;
} else {
throw std::runtime_error("invalid arguments number (2 or 3 expected)");
lua::pushnumber(L, glm::dot(a, b));
lua_settable(L, 3);
return 0;
}
}
template<int n>
static int l_inverse(lua::State* L) {
uint argc = lua::gettop(L);
if (argc == 1) {
if (argc != 1 && argc != 2) {
throw std::runtime_error("invalid arguments number (1 or 2 expected)");
}
const auto& _vector = lua::tovec<n>(L, 1); //vector
glm::vec<n, float> result_vector;
@ -117,6 +165,7 @@ static int l_inverse(lua::State* L) {
result_vector[i] = -_vector[i];
}
if (argc == 1) {
lua::createtable(L, n, 0);
for (uint i = 0; i < n; i++) {
lua::pushnumber(L, result_vector[i]);
@ -124,20 +173,14 @@ static int l_inverse(lua::State* L) {
}
return 1;
} else {
throw std::runtime_error("invalid arguments number (1 expected)");
lua::pushvalue(L, 2);
lua::createtable(L, n, 0);
for (uint i = 0; i < n; i++) {
lua::pushnumber(L, result_vector[i]);
lua::rawseti(L, i+1);
}
}
template<int n>
static int l_dot(lua::State* L) {
uint argc = lua::gettop(L);
if (argc == 2 || argc == 3) {
const auto& a = lua::tovec<n>(L, 1);
const auto& b = lua::tovec<n>(L, 2);
lua::pushnumber(L, glm::dot(a, b));
return 1;
} else {
throw std::runtime_error("invalid arguments number (2 or 3 expected)");
lua_settable(L, 2);
return 0;
}
}