2013-02-13 92 views
7

我試圖讓我的頭繞着增強波,到目前爲止,我沒有太多的運氣。使用增強波

我試着從網站的示例代碼。它下面是:

#include <iostream> 
#include <iomanip> 
#include <fstream> 
#include <string> 
#include <vector> 

/////////////////////////////////////////////////////////////////////////////// 
// Include Wave itself 
#include <boost/wave.hpp> 

/////////////////////////////////////////////////////////////////////////////// 
// Include the lexer stuff 
#include <boost/wave/cpplexer/cpp_lex_token.hpp> // token class 
#include <boost/wave/cpplexer/cpp_lex_iterator.hpp> // lexer class 

int main() { 
    // The following preprocesses a given input file. 
    // Open the file and read it into a string variable 
    std::ifstream instream("lex_infile"); 
    std::string input(
     std::istreambuf_iterator<char>(instream.rdbuf()), 
     std::istreambuf_iterator<char>()); 

    // The template boost::wave::cpplexer::lex_token<> is the 
    // token type to be used by the Wave library. 
    // This token type is one of the central types throughout 
    // the library, because it is a template parameter to some 
    // of the public classes and templates and it is returned 
    // from the iterators. 
    // The template boost::wave::cpplexer::lex_iterator<> is 
    // the lexer iterator to use as the token source for the 
    // preprocessing engine. In this case this is parametrized 
    // with the token type. 
    typedef boost::wave::cpplexer::lex_iterator< 
      boost::wave::cpplexer::lex_token<> > 
     lex_iterator_type; 
    typedef boost::wave::context< 
      std::string::iterator, lex_iterator_type> 
     context_type; 

    context_type ctx(input.begin(), input.end(), "lex_infile"); 

    // At this point you may want to set the parameters of the 
    // preprocessing as include paths and/or predefined macros. 
     //ctx.add_include_path("..."); 
     //ctx.add_macro_definition(...); 

    // Get the preprocessor iterators and use them to generate 
    // the token sequence. 
    context_type::iterator_type first = ctx.begin(); 
    context_type::iterator_type last = ctx.end(); 

    std::cout << "HERE" << std::endl; 

    // The input stream is preprocessed for you during iteration 
    // over [first, last) 
     while (first != last) { 
      std::cout << (*first).get_value() << std::endl; 
      ++first; 
     } 
} 

它編譯好了,但是當我養活一個文件到它,我得到以下錯誤:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl >'
what(): boost::wave::preprocess_exception
Aborted

我想「預處理」的代碼是在文件名爲lex_infile,具有以下內容:

#include <oglre> 
#include <light> 
#include <material> 

in vec3 in_Position; 
in vec2 in_Texture; 
in vec3 in_Normal; 

out vec2 textureCoord; 
out vec4 pass_Color; 




void main() { 
    gl_Position = pvmMatrix * vec4(in_Position, 1.0); 

    textureCoord = in_Texture; 


    vec3 normalDirection = normalize(normalMatrix * in_Normal); 
    vec3 lightDirection = normalize(vec3(lightSources[0].direction)); 

    vec3 diffuseReflection = vec3(lightSources[0].diffuse) * vec3(mymaterial.diffuse) * max(0.0, dot(normalDirection, lightDirection)); 

    /* 
    float bug = 0.0; 
    bvec3 result = equal(diffuseReflection, vec3(0.0, 0.0, 0.0)); 
    if(result[0]) bug = 1.0; 

    diffuseReflection.x += bug; 
    */ 

    pass_Color = vec4(diffuseReflection, 1.0); 
} 

我想我需要定義包括地點....我怎麼會連做呢?

對不起,如果這是簡單的東西,我只是有點失落。

回答

7

想通了。

我需要延長類public wave::context_policies::default_preprocessing_hooks,然後覆蓋方法found_unknown_directive

一旦完成,我需要將我的新預處理掛鉤類作爲模板參數傳入typedef boost::wave::context

它看起來像這樣:

typedef boost::wave::context< 
       std::string::iterator, 
       lex_iterator_type, 
       load_file_to_string, 
       custom_directives_hooks 
      > context_type; 

class custom_directives_hooks 
: public wave::context_policies::default_preprocessing_hooks 
{ 
public: 

    template <typename ContextT, typename ContainerT> 
    bool 
    found_unknown_directive(ContextT const& ctx, ContainerT const& line, 
     ContainerT& pending) 
    { 
     typedef typename ContainerT::const_iterator iterator_type; 
     iterator_type it = line.begin(); 
     wave::token_id id = wave::util::impl::skip_whitespace(it, line.end()); 

     if (id != wave::T_IDENTIFIER) 
      return false;  // nothing we could do 

     if (it->get_value() == "version" || it->get_value() == "extension") { 
      // Handle #version and #extension directives 
      std::copy(line.begin(), line.end(), std::back_inserter(pending)); 
      return true; 
     } 

     if (it->get_value() == "type") { 
      // Handle type directive 
      return true; 
     } 

     // Unknown directive 
     return false; 
    } 
}; 

希望幫助其他人有這個問題。