/* model/map.h This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #ifndef __INCLUDED_MODEL_MAPFILE_H__ #define __INCLUDED_MODEL_MAPFILE_H__ #include #include #include "model/material.h" #include "model/model.h" #include "model/face.h" #include "model/primitives.h" #include "filesystem/filestream.h" namespace model { /// class to parse the .map file structure and load geometry data into a model class MapFile { public: /** * @brief load a .map file into a Model * @param name name of the model to be loaded, without .map extension or maps/ prefix * If the file can not be read, load() returns the NULL-pointer */ static Model *load(std::string const &name); private: MapFile(); ~MapFile(); /// tpye definition for a per-material list of Primitives typedef std::map Materials; /// open the file for reading /** the filename will get the "maps/" prefix and ".map" suffix */ bool open(std::string const & name); /// parse one line, returns false on end-of-file bool getline(); bool read_patchdef(); /// current classname inline std::string classname() const { return classname_current; } /// current key inline std::string key() const { return key_current; } /// current value inline std::string value() const { return value_current; } /// true if the last read line contained a new classname bool got_classname() const; /// true if we are inside the requested class bool in_class(const char *name) { return (classname_current.compare(name) == 0); } /// true if the last read line contained a class closing bracket inline bool got_classend() const { return last_read_was_classend; } /// true if the last read line contained the closing bracket for the requested class bool got_classend(const char*) const; /// true if the last read line contained a new classname bool got_classname(const char*) const; /// true if the last read statement was a key=value pair inline bool got_key() const { return last_read_was_key; } bool got_key(const char * keylabel); /// check if the last read key=value pair matches keylabel and store the value in valuestring bool got_key_string(const char * keylabel, std::string & valuestring); /// check if the last read key=value pair matches keylabel and store the value in color bool got_key_color(const char * keylabel, math::Color & color); /// check if the last read key=value pair matches keylabel and store the value in f bool got_key_float(const char * keylabel, float & f); /// check if the last read key=value pair matches keylabel and store the value in f bool got_key_int(const char * keylabel, unsigned int & u); /// check if the last read key=value pair matches keylabel and store the value in valuestring bool got_key_angle(const char * keylabel, float & f); bool got_key_vector3f(const char * keylabel, math::Vector3f & v); /// return the number of lines read so far inline unsigned int line() const { return line_number; } /// return true of the map file is open for reading inline bool is_open() { return mapfile_ifs.is_open(); } /// current filename inline std::string const & name() const { return mapfile_name; } /// close the file void close(); /// generate triangles for one plane in the plane list void make_brushface(Face *face); /// load parsed primitives into model worldspawn void load_worldspawn(Model *model); /// load parsed primitives into a FragmentGroup void load_fragmentgroup(Model *model, const FragmentGroup::Type class_type); /// clear the current list of per-material geometry void clear_materials(); /// clear class bounding box void clear_bbox(); void unknown_class() const; void unknown_key() const; void unknown_value() const; /// list of planes for the current brush std::vector planes; std::string classname_current; std::string key_current; std::string value_current; bool last_read_was_key; bool last_read_was_classname; bool last_read_was_classend; unsigned int map_brushes; unsigned int map_faces; unsigned int map_faces_detail; unsigned int parse_level; unsigned int line_number; filesystem::IFileStream mapfile_ifs; std::string mapfile_name; math::Vector3f class_maxbbox; math::Vector3f class_minbbox; math::Axis class_axis; float class_speed; math::Vector3f map_center; Materials map_materials; bool warning_q2brush; bool in_patchdef; }; } #endif // __INCLUDED_MODEL_MAPFILE_H__