17int main(
int argc,
char **argv)
20 std::cerr <<
"Usage: glsl_preprocess <data_file_from> <data_file_to> <metadata_file_to> "
26 const char *input_file_name = argv[1];
27 const char *output_file_name = argv[2];
28 const char *metadata_file_name = argv[3];
29 const char *infos_file_name = argv[4];
32 std::ifstream input_file(input_file_name);
34 std::cerr <<
"Error: Could not open input file " << input_file_name << std::endl;
42 std::filesystem::path parent_dir = std::filesystem::path(output_file_name).parent_path();
44 if (!std::filesystem::create_directories(parent_dir, ec)) {
46 std::cerr <<
"Unable to create " << parent_dir <<
" : " << ec.message() << std::endl;
52 std::ofstream output_file(output_file_name, std::ofstream::out | std::ofstream::binary);
54 std::cerr <<
"Error: Could not open output file " << output_file_name << std::endl;
60 std::ofstream metadata_file(metadata_file_name, std::ofstream::out | std::ofstream::binary);
62 std::cerr <<
"Error: Could not open output file " << metadata_file_name << std::endl;
68 std::ofstream infos_file(infos_file_name, std::ofstream::out | std::ofstream::binary);
70 std::cerr <<
"Error: Could not open output file " << infos_file_name << std::endl;
75 std::stringstream buffer;
76 buffer << input_file.rdbuf();
81 [&](
int err_line,
int err_char,
const std::string &line,
const char *err_msg) {
82 std::cerr << input_file_name;
83 std::cerr <<
':' << std::to_string(err_line) <<
':' << std::to_string(err_char + 1);
84 std::cerr <<
": error: " << err_msg << std::endl;
85 std::cerr << line << std::endl;
86 std::cerr << std::string(err_char,
' ') <<
'^' << std::endl;
90 std::string filename(output_file_name);
91 const bool is_info = filename.find(
"infos.hh") != std::string::npos;
92 const bool is_glsl = filename.find(
".glsl") != std::string::npos;
93 const bool is_shared = filename.find(
"shared.h") != std::string::npos;
94 const bool is_library = is_glsl &&
95 (filename.find(
"gpu_shader_material_") != std::string::npos ||
96 filename.find(
"gpu_shader_common_") != std::string::npos ||
97 filename.find(
"gpu_shader_compositor_") != std::string::npos);
100 Preprocessor processor;
102 Preprocessor::SourceLanguage language = Preprocessor::language_from_filename(filename);
104 if (language == Preprocessor::SourceLanguage::GLSL) {
106 language = Preprocessor::SourceLanguage::BLENDER_GLSL;
115 output_file << processor.process(
116 language, buffer.str(), input_file_name, is_library, is_shared, report_error, metadata);
120 std::string metadata_function_name =
"metadata_" +
122 filename, std::regex(R
"((?:.*)\/(.*))"), "$1");
123 std::replace(metadata_function_name.begin(), metadata_function_name.end(),
'.',
'_');
125 metadata_file << metadata.
serialize(metadata_function_name);
128 std::string
str = std::regex_replace(
129 buffer.str(), std::regex(R
"(_infos.hh")"), "_infos.hh.info\"");
135 metadata_file.close();