From 7068bc90af1f452359a1fcfe20fa01fc88f3d70a Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sun, 16 Jan 2011 19:32:14 +0200 Subject: Initial commit of mapgen v.2. Lacks configuration and saving to disk. --- src/utility.h | 243 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 241 insertions(+), 2 deletions(-) (limited to 'src/utility.h') diff --git a/src/utility.h b/src/utility.h index e2a6afdea..28cc95ddd 100644 --- a/src/utility.h +++ b/src/utility.h @@ -666,6 +666,20 @@ inline s32 stoi(std::string s) return atoi(s.c_str()); } +inline std::string itos(s32 i) +{ + std::ostringstream o; + o<::Iterator + i = other.m_settings.getIterator(); + i.atEnd() == false; i++) + { + m_settings.insert(i.getNode()->getKey(), + i.getNode()->getValue()); + } + + for(core::map::Iterator + i = other.m_defaults.getIterator(); + i.atEnd() == false; i++) + { + m_defaults.insert(i.getNode()->getKey(), + i.getNode()->getValue()); + } + + } + + Settings & operator=(Settings &other) + { + if(&other == this) + return *this; + + clear(); + (*this) += other; + + return *this; + } + private: core::map m_settings; core::map m_defaults; @@ -1331,9 +1385,194 @@ void mysrand(unsigned seed); #define MYRAND_MAX 32767 /* - TODO: Some kind of a thing that stores arbitary data related to - 2D coordinate points + Some kind of a thing that stores attributes related to + coordinate points */ +struct Attribute +{ + Attribute() + { + } + + Attribute(const std::string &value): + m_value(value) + { + } + + Attribute(float value) + { + m_value = ftos(value); + } + + void set(const std::string &value) + { + m_value = value; + } + + std::string get() + { + return m_value; + } + + bool getBool() + { + return is_yes(get()); + } + + float getFloat() + { + float f; + std::istringstream vis(get()); + vis>>f; + return f; + } + + u16 getU16() + { + return stoi(get(), 0, 65535); + } + + s16 getS16() + { + return stoi(get(), -32768, 32767); + } + + s32 getS32() + { + return stoi(get()); + } + + std::string m_value; +}; + +class PointAttributeList +{ + struct PointWithAttr + { + v3s16 p; + Attribute attr; + }; + +public: + ~PointAttributeList() + { + /*for(core::list::Iterator + i = m_points.begin(); + i != m_points.end(); i++) + { + PointWithAttr &pwa = *i; + //delete pwa.attr; + }*/ + } + + Attribute getNearAttr(v3s16 p) + { + core::list::Iterator + nearest_i = m_points.end(); + s16 nearest_d = 32767; + for(core::list::Iterator + i = m_points.begin(); + i != m_points.end(); i++) + { + PointWithAttr &pwa = *i; + s16 d = pwa.p.getDistanceFrom(p); + if(d < nearest_d) + { + nearest_i = i; + nearest_d = d; + } + } + + if(nearest_i == m_points.end()) + Attribute(); + + return nearest_i->attr; + } + + Attribute getNearAttr(v2s16 p) + { + return getNearAttr(v3s16(p.X, 0, p.Y)); + } + + bool empty() + { + return (m_points.size() == 0); + } + + /* + Take all points in range, or at least the nearest point, + and interpolate the values as floats + */ + float getInterpolatedFloat(v3s16 p); + + float getInterpolatedFloat(v2s16 p) + { + return getInterpolatedFloat(v3s16(p.X, 0, p.Y)); + } + + //float getInterpolatedFloat(v3s16 p, s32 range); + /*float getInterpolatedFloat(v2s16 p, s32 range) + { + return getInterpolatedFloat(v3s16(p.X, 0, p.Y), range); + }*/ + + void addPoint(v3s16 p, const Attribute &attr) + { + PointWithAttr pattr; + pattr.p = p; + pattr.attr = attr; + m_points.push_back(pattr); + } + + void addPoint(v2s16 p, const Attribute &attr) + { + addPoint(v3s16(p.X, 0, p.Y), attr); + } + +private: + core::list m_points; +}; + +/* + Basically just a wrapper to core::map +*/ + +class PointAttributeDatabase +{ +public: + ~PointAttributeDatabase() + { + for(core::map::Iterator + i = m_lists.getIterator(); + i.atEnd() == false; i++) + { + delete i.getNode()->getValue(); + } + } + + PointAttributeList *getList(const std::string &name) + { + PointAttributeList *list = NULL; + + core::map::Node *n; + n = m_lists.find(name); + + if(n == NULL) + { + list = new PointAttributeList(); + m_lists.insert(name, list); + } + else + { + list = n->getValue(); + } + + return list; + } +private: + core::map m_lists; +}; + #endif -- cgit v1.2.3