oopless-parser.hpp / oopless-parser.cpp Parses Reflex's .map file, both version 6 and version 8. Reflex Map Format Reflex maps are plain text files featuring keywords and indentation levels. Reflex map keywords: Ordered by indentation level (outer to inner). "global" "prefab" "entity" "brush" "vertices" "faces" "vertices" and "faces", sharing the level, are contained in brushes. "brush" and "entity", sharing the level are contained in prefabs. "global" largely behaves the same as prefabs. There are two distinct map formats from Reflex- V6 and V8. V6 was the map format before the addition of prefabs (V8 feature). As far as the conversion process is concerned: 'global' and 'prefab' are containers for map objects. 'entity' and 'brush' are map objects (but entity may contain a brush). 'vertices' and 'faces' are details of brushes. Brush Data Brushes contain faces and vertices. A brush's faces and vertices are listed in its "faces" and "vertices". Vertex Data A vertex contains 3 floats representing a coordinate. Reflex uses a right-handed coordinate system while idTech engine uses left. Face Data Faces contain the texture definition, indices, & the texture to be applied. Each field in the line, being the entire face, is separated by space. The first 5 fields are always data for the texture definition. In order, * texture x offset * texture y offset * texture x scale * texture y scale * texture rotation The next fields are integers being indices for the list of vertices for the brush. Followed by an hex digit for the color code in sRGB to apply to the face. Then followed by the path to the texture asset. Parsing States GLOBAL or PREFAB -> {BRUSH, ENTITY} BRUSH -> {FACES, VERTICES} VERTICES -> {FACES, BRUSH, ENTITY} FACES -> {VERTICES, BRUSH, ENTITY, PREFAB} ENTITY -> {ENTITY, BRUSH, PREFAB} In all observations, VERTICES are defined before FACES. Entities may contain brushes as a part of its data; however it is not reflected in indentation levels in Reflex. Thus for the conversion, brushes must be contained in the entity string, and converted in a different phase (because the worldspawn entity in idTech excludes entity-brushes). The parser transitions out of handling the entity when it hits the brush keyword and the entity's type does not match is not of a specific set of types. Implementation Overview Each parsing function: - assumes by the time it is called, the respective keyword has already been advanced past. - retrieves the next line from the input stream - detects next possible parsing states - will output its respective data structure