/* 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 "model/trianglelist.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); /// check if the last read key is one of the axis related keys (angle, angles, pitch, yaw, roll) bool got_key_axis(math::Axis &axis); /// 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; } inline const math::BoundingBox3f & box() const { return map_box; } inline bool collinear(const math::Vector3f & a, const math::Vector3f & b, const math::Vector3f & c) { if ((distance(a, b) + distance(b, c)) == distance(a, c)) return true; else return false; } /// close the file void close(); /// generate triangles for one plane in the plane list void make_brushface(Face *face); /// 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(); /// print 'unkown class' warning message to the console void unknown_class() const; /// print 'unkown key' warning message to the console void unknown_key() const; /// print 'unkown value' warning message to the console void unknown_value() const; /// print 'depricated key' warning message to the console void warn_depricated() const; /// print a generic error message void unknown_error(const char *text = 0) const; /// print a generic error message void unknown_error(const std::string &text) 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; bool map_load_clip; CollisionModel *map_collisionmodel; 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::BoundingBox3f map_box; math::BoundingBox3f class_box; math::Axis class_axis; float class_speed; float class_distance; bool class_engine; /** *@brief list of vertices with origin material * */ std::vector class_origin_vertices; /** * @brief list of vertices with bounds material */ std::vector map_bounds_vertices; Materials map_materials; TriangleList map_collisiontriangles; bool warning_q2brush; bool in_patchdef; }; } #endif // __INCLUDED_MODEL_MAPFILE_H__