OGL4ShaderPtr OGL4ShaderCompiler::CreateShaderFromFile(SHADER_TYPE type, const boost::filesystem::path& path, const std::string& entry) { std::string source = LoadShaderSource(path.string()); if(source == "") { return OGL4ShaderPtr(); } std::vector<IncludeInfo> inc_list; IncludeInfo inc; inc.file = path; inc.lines = GetSourceLines(source); inc_list.push_back(inc); source = ProcessInclude(path.parent_path(), source, inc_list); inc_list.push_back(inc); inc_list.erase(inc_list.begin()); source = ClearVersionComment(source); return CreateShaderFromSource(type, source, inc_list, entry); }
void SlicSegment::GetDescription(char *str, sint32 maxsize) { if(m_firstLineNumber < 0) { sint32 offset, lastline; GetSourceLines(m_firstLineNumber, offset, lastline); } sprintf(str, "'%s': %s@%d", m_id, m_filename, m_firstLineNumber); }
std::string OGL4ShaderCompiler::ProcessInclude(const boost::filesystem::path& basePath, const std::string& source, std::vector<IncludeInfo>& inc_list) { std::vector<IncludeInfo> include_list = ExtractIncludeList(source); if(include_list.size() == 0) { return source; } std::string ret = ""; for(size_t i = 0; i < include_list.size(); ++i) { bool included = false; for(auto v : inc_list) { if((basePath / v.file) == (basePath / include_list[i].file)) { included = true; break; } } if(included) { continue; } std::string inc_source = LoadShaderSource(basePath / include_list[i].file); include_list[i].lines = GetSourceLines(inc_source); ret += ProcessInclude(basePath, inc_source, inc_list) + "\n"; inc_list.push_back(include_list[i]); } ret += source; return ret; }