具有增强精神的 OBJ 解析器 - 忽略评论
OBJ Parser with Boost Spirit - Ignoring comments
我正在尝试使用Boost Spirit库编写一个基本的OBJ文件加载器。虽然我使用标准 std::ifstreams 让它工作,但我想知道是否可以使用内存映射文件对整个文件进行phrase_parse,因为它似乎提供了此处发布的最佳性能。
我有以下代码,它似乎运行良好,但是当文件中有注释时它会中断。所以,我的问题是你如何使用 Spririt 忽略 OBJ 文件中以"#"开头的注释?
struct vertex {
double x, y, z;
};
BOOST_FUSION_ADAPT_STRUCT(
vertex,
(double, x)
(double, y)
(double, z)
)
std::vector<vertex> b_vertices
boost::iostreams::mapped_file mmap(
path,
boost::iostreams::mapped_file::readonly);
const char* f = mmap.const_data();
const char* l = f + mmap.size();
using namespace boost::spirit::qi;
bool ok = phrase_parse(f,l,(("v" >> double_ >> double_ >> double_) |
("vn" >> double_ >> double_>> double_)) % eol ,
blank, b_vertices);
当除了顶点/法线之外没有注释或任何其他数据时,上面的代码运行良好。但是当有不同类型的数据时,解析器会失败(因为它应该失败),我想知道是否有办法让它工作而不回到解析每一行,因为它更慢(在我的测试中几乎是 2.5 倍)。谢谢!
想到的最简单方法是简单地使注释可跳过:
bool ok = qi::phrase_parse(
f,l,
(
("v" >> qi::double_ >> qi::double_ >> qi::double_) |
("vn" >> qi::double_ >> qi::double_ >> qi::double_)
)
% qi::eol,
('#' >> *(qi::char_ - qi::eol) >> qi::eol | qi::blank), b_vertices);
请注意,如果#
出现在行内的某处,这也"识别"注释。这可能很好(因为它会使解析失败,除非它是在其他有效输入行上尾随的注释)。
在科里鲁现场观看
或者,使用一些凤凰魔法来处理"注释行",就像处理"vn"或"v"行一样。
我意识到我的评论/帖子不是直接相关的代码,但如果可能的话,我不重新发明轮子,我想知道这个库。 我正在使用手写的 OBJ/Wavefront 加载器,但在我的研究中,我发现了这个库 Tiny Obj Loader。 此库是C++编写的,除了 STL C++没有依赖项。 它很好地处理了Wavefront规范的边缘情况,并且非常快。 用户要做的就是将 Tiny OBJ 对象转换为他们的代码。 TinyObjLoader也被相当多的项目采用。 我很抱歉没有直接回答这个问题,我的愿望是了解这个伟大的图书馆。
相关文章:
- 如何以叮当格式设置评论的行长?
- 如何在.obj文件上运行IlDasm?
- 如何使用Qt 3D库加载和显示搅拌机.obj源文件场景
- 在 opengl 中渲染 obj 文件时出现黑窗口
- 叮叮当当:什么可能导致NOLINT评论不被尊重?
- 使用 Boost.Spirit 解析具有混合数据类型的 OBJ 文件?
- 正在读取 obj 文件!(指数)
- 我在主函数的左括号上不断收到错误,消息为obj\Debug\main.o||在函数"ZN11linked_listC1Ev"中:|
- float* 已在 Gameobject.obj 中定义
- 可执行文件C++包括.obj,.lib和.dll吗?
- C++成功复制动态分配的 obj 而不复制 ctor?
- OBJ 文件C++与 ubuntu 问题
- 在 // C++注释中使用 \\ 是否合法?(C++评论中的LaTeX方程)
- 为什么定义复制构造函数会给我错误:无法将类型 'obj&' 的非常量左值引用绑定到类型为"obj"的右值?
- OBJ 向量到成员函数
- 在istream_iterator中使用后的 C++ FSTREAM obj 回滚
- 使用sscaf_s从obj读取顶点线不起作用
- 移植DXUT SDKMesh以导入OBJ文件,在哪里添加纹理坐标和索引
- /usr/bin/ld: build-debug/obj/gpsitem.o: 文件无法识别: 文件被截断
- 具有增强精神的 OBJ 解析器 - 忽略评论