Merge branch 'main' into heightmaps

This commit is contained in:
MihailRis
2024-08-20 21:46:56 +03:00
9 changed files with 196 additions and 19 deletions
+21 -3
View File
@@ -353,13 +353,30 @@ static int l_raycast(lua::State* L) {
auto start = lua::tovec<3>(L, 1);
auto dir = lua::tovec<3>(L, 2);
auto maxDistance = lua::tonumber(L, 3);
std::set<blockid_t> filteredBlocks {};
if (lua::gettop(L) >= 5) {
if (lua::istable(L, 5)) {
int addLen = lua::objlen(L, 5);
for (int i = 0; i < addLen; i++) {
lua::rawgeti(L, i + 1, 5);
auto blockName = std::string(lua::tostring(L, -1));
Block* block = content->blocks.find(blockName);
if (block != nullptr) {
filteredBlocks.insert(block->rt.id);
}
lua::pop(L);
}
} else {
throw std::runtime_error("table expected for filter");
}
}
glm::vec3 end;
glm::ivec3 normal;
glm::ivec3 iend;
if (auto voxel = level->chunks->rayCast(
start, dir, maxDistance, end, normal, iend
start, dir, maxDistance, end, normal, iend, filteredBlocks
)) {
if (lua::gettop(L) >= 4) {
if (lua::gettop(L) >= 4 && !lua::isnil(L, 4)) {
lua::pushvalue(L, 4);
} else {
lua::createtable(L, 0, 5);
@@ -452,4 +469,5 @@ const luaL_Reg blocklib[] = {
{"raycast", lua::wrap<l_raycast>},
{"compose_state", lua::wrap<l_compose_state>},
{"decompose_state", lua::wrap<l_decompose_state>},
{NULL, NULL}};
{NULL, NULL}
};
+27 -6
View File
@@ -8,6 +8,7 @@
#include "objects/rigging.hpp"
#include "physics/Hitbox.hpp"
#include "voxels/Chunks.hpp"
#include "voxels/Block.hpp"
#include "window/Camera.hpp"
using namespace scripting;
@@ -118,7 +119,25 @@ static int l_raycast(lua::State* L) {
auto start = lua::tovec<3>(L, 1);
auto dir = lua::tovec<3>(L, 2);
auto maxDistance = lua::tonumber(L, 3);
auto ignore = lua::tointeger(L, 4);
auto ignoreEntityId = lua::tointeger(L, 4);
std::set<blockid_t> filteredBlocks {};
if (lua::gettop(L) >= 6) {
if (lua::istable(L, 6)) {
int addLen = lua::objlen(L, 6);
for (int i = 0; i < addLen; i++) {
lua::rawgeti(L, i + 1, 6);
auto blockName = std::string(lua::tostring(L, -1));
Block* block = content->blocks.find(blockName);
if (block != nullptr) {
filteredBlocks.insert(block->rt.id);
}
lua::pop(L);
}
} else {
throw std::runtime_error("table expected for filter");
}
}
glm::vec3 end;
glm::ivec3 normal;
glm::ivec3 iend;
@@ -126,13 +145,14 @@ static int l_raycast(lua::State* L) {
blockid_t block = BLOCK_VOID;
if (auto voxel = level->chunks->rayCast(
start, dir, maxDistance, end, normal, iend
start, dir, maxDistance, end, normal, iend, filteredBlocks
)) {
maxDistance = glm::distance(start, end);
block = voxel->id;
}
if (auto ray = level->entities->rayCast(start, dir, maxDistance, ignore)) {
if (lua::gettop(L) >= 5) {
if (auto ray =
level->entities->rayCast(start, dir, maxDistance, ignoreEntityId)) {
if (lua::gettop(L) >= 5 && !lua::isnil(L, 5)) {
lua::pushvalue(L, 5);
} else {
lua::createtable(L, 0, 6);
@@ -157,7 +177,7 @@ static int l_raycast(lua::State* L) {
lua::setfield(L, "entity");
return 1;
} else if (block != BLOCK_VOID) {
if (lua::gettop(L) >= 5) {
if (lua::gettop(L) >= 5 && !lua::isnil(L, 5)) {
lua::pushvalue(L, 5);
} else {
lua::createtable(L, 0, 5);
@@ -194,4 +214,5 @@ const luaL_Reg entitylib[] = {
{"get_all_in_box", lua::wrap<l_get_all_in_box>},
{"get_all_in_radius", lua::wrap<l_get_all_in_radius>},
{"raycast", lua::wrap<l_raycast>},
{NULL, NULL}};
{NULL, NULL}
};
+128 -1
View File
@@ -1,5 +1,7 @@
#include "debug/Logger.hpp"
#include <iostream>
#include "api_lua.hpp"
#include "debug/Logger.hpp"
static debug::Logger logger("lua-debug");
@@ -21,6 +23,128 @@ static int l_debug_log(lua::State* L) {
return 0;
}
const int MAX_DEPTH = 10;
int l_debug_print(lua::State* L) {
auto addIndentation = [](int depth) {
for (int i = 0; i < depth; ++i) std::cout << " ";
};
auto printHexData = [](const void* ptr, size_t size) {
const auto* bytePtr = reinterpret_cast<const uint8_t*>(ptr);
for (size_t i = 0; i < size; ++i) {
std::cout << std::hex << std::setw(2) << std::setfill('0')
<< static_cast<int>(bytePtr[i])
<< ((i + 1) % 8 == 0 && i + 1 < size ? "\n" : " ");
}
};
auto printEscapedString = [](const char* str) {
while (*str) {
switch (*str) {
case '\\': std::cout << "\\\\"; break;
case '\"': std::cout << "\\\""; break;
case '\n': std::cout << "\\n"; break;
case '\t': std::cout << "\\t"; break;
case '\r': std::cout << "\\r"; break;
case '\b': std::cout << "\\b"; break;
case '\f': std::cout << "\\f"; break;
default:
if (iscntrl(static_cast<unsigned char>(*str))) {
// Print other control characters in \xHH format
std::cout << "\\x" << std::hex << std::setw(2) << std::setfill('0')
<< static_cast<int>(static_cast<unsigned char>(*str)) << std::dec;
} else {
std::cout << *str;
}
break;
}
++str;
}
};
std::function<void(int, int, bool)> debugPrint = [&](int index,
int depth,
bool is_key) {
if (depth > MAX_DEPTH) {
std::cout << "{...}";
return;
}
switch (lua::type(L, index)) {
case LUA_TSTRING:
if (is_key){
std::cout << lua::tostring(L, index);
}else{
std::cout << "\"";
printEscapedString(lua::tostring(L, index));
std::cout << "\"";
}
break;
case LUA_TBOOLEAN:
std::cout << (lua::toboolean(L, index) ? "true" : "false");
break;
case LUA_TNUMBER:
std::cout << lua::tonumber(L, index);
break;
case LUA_TTABLE: {
bool is_list = lua::objlen(L, index) > 0, hadItems = false;
int absTableIndex =
index > 0 ? index : lua::gettop(L) + index + 1;
std::cout << "{";
lua::pushnil(L);
while (lua::next(L, absTableIndex) != 0) {
if (hadItems)
std::cout << "," << '\n';
else
std::cout << '\n';
addIndentation(depth + 1);
if (!is_list) {
debugPrint(-2, depth, true);
std::cout << " = ";
}
debugPrint(-1, depth + 1, false);
lua::pop(L, 1);
hadItems = true;
}
if (hadItems) std::cout << '\n';
addIndentation(depth);
std::cout << "}";
break;
}
case LUA_TFUNCTION:
std::cout << "function(0x" << std::hex
<< lua::topointer(L, index) << std::dec << ")";
break;
case LUA_TUSERDATA:
std::cout << "userdata:\n";
printHexData(lua::topointer(L, index), lua::objlen(L, index));
break;
case LUA_TLIGHTUSERDATA:
std::cout << "lightuserdata:\n";
printHexData(lua::topointer(L, index), sizeof(void*));
break;
case LUA_TNIL:
std::cout << "nil";
break;
default:
std::cout << lua::type_name(L, lua::type(L, index));
break;
}
};
int n = lua::gettop(L);
std::cout << "debug.print(" << '\n';
for (int i = 1; i <= n; ++i) {
addIndentation(1);
debugPrint(i, 1, false);
if (i < n) std::cout << "," << '\n';
}
std::cout << '\n' << ")" << std::endl;
lua::pop(L, n);
return 0;
}
void initialize_libs_extends(lua::State* L) {
if (lua::getglobal(L, "debug")) {
lua::pushcfunction(L, lua::wrap<l_debug_error>);
@@ -32,6 +156,9 @@ void initialize_libs_extends(lua::State* L) {
lua::pushcfunction(L, lua::wrap<l_debug_log>);
lua::setfield(L, "log");
lua::pushcfunction(L, lua::wrap<l_debug_print>);
lua::setfield(L, "print");
lua::pop(L);
}
}