From 183f0f0b905715f0d89b38174fdfd44641c1a79c Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Wed, 12 Aug 2009 12:03:18 +0000 Subject: src/model filenames cleanup, parse .map texture coordinates, early loading of material textures --- src/model/mapfile.h | 189 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 src/model/mapfile.h (limited to 'src/model/mapfile.h') diff --git a/src/model/mapfile.h b/src/model/mapfile.h new file mode 100644 index 0000000..fd6bf48 --- /dev/null +++ b/src/model/mapfile.h @@ -0,0 +1,189 @@ +/* + 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(); + + /// 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; +}; + +} + +#endif // __INCLUDED_MODEL_MAPFILE_H__ -- cgit v1.2.3