2

だから私は自分の肌の下でboost::spirit::qiを取得しようと懸命に努力しています。これまでの私のおもちゃの例は、次の形式を持つ Wavefront OBJ マテリアル ライブラリを解析するパーサーです。

newmtl ShortBox
Ka  0.6 0.6 0.6
Kd  0.5 0.5 0.5
Ks  0 0 0
d  1
Ns  0
illum 2

ただし、マテリアル ShortBox への引数の順序は異なる場合があります。それを正常に解析する次の文法を作成しました。

template <typename Iterator>
struct mtllib_grammar : qi::grammar<Iterator, qi::blank_type> {

    mtllib_grammar() : mtllib_grammar::base_type(mtl)
    {
        using qi::char_;
        using qi::double_;
        using qi::int_;


        mtl =
            (
            ("newmtl" >> +(char_ - qi::eol)  >> qi::eol >> *(mtl_details) >> *(mtl))
            | ("#" >> *(qi::char_ - qi::eol) >> qi::eol >> *(mtl))
            );

        mtl_details =
            (
            ("Ka" >> double_ >> double_ >> double_ >> qi::eol >> *(mtl_details))
            | ("Kd" >> double_ >> double_ >> double_ >> qi::eol >> *(mtl_details))
            | ("Ks" >> double_ >> double_ >> double_ >> qi::eol >> *(mtl_details))
            | ("d" >> int_ >> qi::eol >> *(mtl_details))
            | ("Ns" >> int_ >> qi::eol >> *(mtl_details))
            | ("illum" >> int_ >> qi::eol >> *(mtl_details))
            );
    }
    qi::rule<Iterator, qi::blank_type> mtl;
    qi::rule<Iterator, qi::blank_type> mtl_details;
};

今、次のように定義されているstd::map<std::string,Material>場所を構築したいと思います。Material

struct Material {
    Material()
    {
        Ns = 0.0f;
        Ke = glm::vec3(0.0f);
        Kd = glm::vec3(0.0f);
        Ks = glm::vec3(0.0f);
        Ka = glm::vec3(0.0f);
    }
    ~Material() {}
    glm::vec3 Ka;
    glm::vec3 Kd;
    glm::vec3 Ks;
    glm::vec3 Ke;
    float Ns;
};

以下のフュージョン適応:

BOOST_FUSION_ADAPT_STRUCT(
    glm::vec3,
    (float, x)
    (float, y)
    (float, z)
    )

BOOST_FUSION_ADAPT_STRUCT(
    Material,
    (glm::vec3, Ka)
    (glm::vec3, Kd)
    (glm::vec3, Ks)
    (glm::vec3, Ke)
    (float, Ns)
    )

したがって、私の現在の考えはmtl_details、完全なMaterialルールmtlを返すようにルールを変更し、キーが の後の文字列であるマテリアルのマップを返すルールに変更することnewmtlです。ただし、属性を使用して解析ツリーから Material オブジェクトを構築し、Ka, Kd, Ksect のすべてのヒットをマッピングする方法がわかりません。同じ構造体に。例を読むと、それらはすべて、関連付けられている変数に暗黙的にマップされるか、オブジェクトではなく単純な値にのみマップされるようです。

4

1 に答える 1