#define KEYWORD_ENTITY "entity" #define KEYWORD_BRUSH "brush" #define KEYWORD_VERTICES "vertices" #define KEYWORD_FACES "faces" #define KEYWORD_GLOBAL "global" #define KEYWORD_PREFAB "prefab" #include "oopless-parser.hpp" #include #include using namespace std; void write(const struct TBrush &object, const char * const fn) { ; } void write(const vector &entity, const char * const fn) { ; } // entities will vary widely depending on their type and available flags. // for now, acquire entity data, and handle their conversion in the write methods. vector get_entity(ifstream & f) { vector output; string line; unsigned int pos = f.tellg(); while (getline(f, line)) { if (line.find(KEYWORD_ENTITY) != string::npos || line.find(KEYWORD_BRUSH) != string::npos || line.find(KEYWORD_PREFAB) != string::npos) { f.seekg(pos); return output; } else { output.push_back(line); } } } vector parse_vertices(ifstream &f) { #define FIRSTCH(x) x[0] vector output; string line; unsigned int pos = f.tellg(); while(getline(f, line)) { if (line.find(KEYWORD_FACES) != string::npos || line.find(KEYWORD_BRUSH) != string::npos || line.find(KEYWORD_ENTITY) != string::npos || line.find(KEYWORD_PREFAB) != string::npos) { f.seekg(pos); return output; } else { Eigen::Vector3f v; stringstream ss(line); string vdata; unsigned int i = 0; while (ss >> vdata) { if (isdigit(FIRSTCH(vdata)) || FIRSTCH(vdata) == '-') { v[i] = stod(vdata); } i = (i + 1) % 3; } } pos = f.tellg(); } return output; } vector parse_face(ifstream & f) { #define FIRSTCH(x) x[0] // it is possible for the next line to be unrelated to faces // so it is needed to reset the stream prior to reading // the new label, e.g '\tbrush'. vector output; string line; unsigned int pos = f.tellg(); while(getline(f, line)) { if (line.find(KEYWORD_VERTICES) != string::npos || line.find(KEYWORD_BRUSH) != string::npos || line.find(KEYWORD_ENTITY) != string::npos || line.find(KEYWORD_PREFAB) != string::npos) { f.seekg(pos); return output; } else { struct TFace x; float *f = &x.m_fXOffset;; stringstream ss(line); string fdata; unsigned int i = 0; while (ss >> fdata) { if (i < 5) { if (isdigit(FIRSTCH(fdata)) || FIRSTCH(fdata) == '-') { double dvalue = stod(fdata); *f = (float)dvalue; f++; } } else if (i == 9) { ; } else { if (isdigit(FIRSTCH(fdata)) || FIRSTCH(fdata) == '-') { x.m_Indices.push_back(stoi(fdata)); } else { x.m_Material = fdata; } } i++; } // end, per field iteration output.push_back(x); } pos = f.tellg(); } // end, per line iteration // the odd case when the map file ends with a face indent. return output; } struct TBrush parse_brush(ifstream & f) { struct TBrush output; string l; getline(f, l); cout << l << endl; // wip: note must return the entire brush, adjust control flow if (l.find(KEYWORD_VERTICES) != string::npos) { output.m_Vertices = parse_vertices(f); } else if (l.find(KEYWORD_FACES) != string::npos) { output.m_Faces = parse_face(f); } return output; } void parse_prefab(ifstream & f, const char * const out) { string l; getline(f, l); if (l.find(KEYWORD_BRUSH) != string::npos) { write(parse_brush(f), out); } else if (l.find(KEYWORD_ENTITY) != string::npos) { write(get_entity(f), out); } } bool loadmap(const char* infile, const char * const outfile) { ifstream fin; fin.open(infile); if (!fin.good()){ return false; } // reflex maps start with a line saying which version it is, string line; while (getline(fin, line)) { if (line.find(KEYWORD_PREFAB) != string::npos || line.find(KEYWORD_GLOBAL) != string::npos) { parse_prefab(fin, outfile); } else if (line.find(KEYWORD_ENTITY) != string::npos) { write(get_entity(fin), outfile); } else if (line.find(KEYWORD_BRUSH) != string::npos) { write(parse_brush(fin), outfile); } } fin.close(); return true; }