line parse

main
Brett 2024-01-09 00:50:12 -05:00
parent 00649a055d
commit 1817c50b4b
3 changed files with 87 additions and 11 deletions

View File

@ -85,23 +85,26 @@ namespace blt::gfx
}; };
}; };
class char_tokenizer;
class obj_loader class obj_loader
{ {
private: private:
std::vector<vertex_t> vertices; std::vector<vertex_t> vertices;
std::vector<uv_t> uvs; std::vector<uv_t> uvs;
std::vector<normal_t> normals; std::vector<normal_t> normals;
// maps between vertex indices -> face (constructed vertex)
HASHMAP<std::int32_t, constructed_vertex_t> vertex_data;
struct object_data struct object_data
{ {
std::string object_name; std::string object_name;
// maps between vertex indices -> face (constructed vertex)
HASHMAP<std::int32_t, constructed_vertex_t> vertex_data;
std::vector<std::int32_t> indices; std::vector<std::int32_t> indices;
}; };
std::vector<object_data> data;
private: private:
void parse_extra_line(char_tokenizer& tokenizer);
void parse_face(std::string_view line); void parse_face(std::string_view line);
public: public:
void parseFile(std::string_view file); void parseFile(std::string_view file);
}; };

@ -1 +1 @@
Subproject commit 903bac9fc10e48005d68a0f9e9d060de538e898c Subproject commit 9147a85dc32f06be2a4cfe4e422fdbc52679adc5

View File

@ -19,6 +19,8 @@
#include <blt/std/loader.h> #include <blt/std/loader.h>
#include <blt/std/string.h> #include <blt/std/string.h>
#include <blt/std/logging.h> #include <blt/std/logging.h>
#include <cctype>
#include <charconv>
namespace blt::gfx namespace blt::gfx
{ {
@ -31,22 +33,94 @@ namespace blt::gfx
explicit char_tokenizer(std::string_view view): string(view) explicit char_tokenizer(std::string_view view): string(view)
{} {}
char peek() inline char peek()
{ {
return string[current_pos]; return string[current_pos];
} }
char advance() inline char advance()
{ {
return string[current_pos++]; return string[current_pos++];
} }
bool has_next(size_t offset = 0) inline bool has_next(size_t offset = 0)
{ {
return current_pos + offset < string.size(); return current_pos + offset < string.size();
} }
inline std::string_view read_fully()
{
return blt::string::trim(string.substr(current_pos));
}
}; };
float get(std::string_view str)
{
float x;
const auto [ptr, ec] = std::from_chars(str.data(), str.data() + str.size(), x);
// probably not needed.
if (ec != std::errc())
{
// int i;
// const auto [ptr2, ec2] = std::from_chars(str.data(), str.data() + str.size(), i);
// if (ec2 == std::errc())
// {
// x = static_cast<float>(i);
// } else
// {
BLT_WARN("Unable to parse string '%s' into number!", std::string(str).c_str());
x = 0;
// }
}
return x;
}
void obj_loader::parse_extra_line(char_tokenizer& tokenizer)
{
char type = tokenizer.advance();
auto elements = blt::string::split(std::string(tokenizer.read_fully()), " ");
if (elements.size() < 2)
{
BLT_ERROR("Unable to parse line '%s' too few arguments to type '%c'", std::string(tokenizer.read_fully()).c_str(), type);
return;
}
float x = get(elements[0]), y = get(elements[1]);
if (std::isspace(type))
{
if (elements.size() < 3)
{
BLT_ERROR("Unable to parse line '%s' too few arguments to type '%c'", std::string(tokenizer.read_fully()).c_str(), type);
return;
}
float z = get(elements[2]);
vertices.push_back(vertex_t{x, y, z});
return;
}
switch (type)
{
case 't':
uvs.push_back(uv_t{x,y});
break;
case 'n':
{
if (elements.size() < 3)
{
BLT_ERROR("Unable to parse line '%s' too few arguments to type '%c'", std::string(tokenizer.read_fully()).c_str(), type);
return;
}
float z = get(elements[2]);
normals.push_back(vertex_t{x, y, z});
break;
}
case 'p':
// optional todo
break;
default:
BLT_WARN("Unexpected type '%c'", type);
break;
}
}
std::vector<obj_object_t> quick_load(std::string_view file) std::vector<obj_object_t> quick_load(std::string_view file)
{ {
std::vector<obj_object_t> objects; std::vector<obj_object_t> objects;
@ -61,8 +135,7 @@ namespace blt::gfx
for (const auto& line : lines) for (const auto& line : lines)
{ {
char_tokenizer token(line); char_tokenizer token(line);
// line is empty? if (!token.has_next() || token.read_fully().empty())
if (!token.has_next())
continue; continue;
switch (token.advance()) switch (token.advance())
{ {
@ -75,7 +148,7 @@ namespace blt::gfx
} }
case 'v': case 'v':
{ {
parse_extra_line(token);
break; break;
} }
case 'o': case 'o':