mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
mapgen stuff
This commit is contained in:
parent
7f2aa30bf2
commit
ea6740e900
17 changed files with 239 additions and 3396 deletions
177
src/utility.h
177
src/utility.h
|
@ -1482,183 +1482,6 @@ inline int myrand_range(int min, int max)
|
|||
return (myrand()%(max-min+1))+min;
|
||||
}
|
||||
|
||||
/*
|
||||
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
|
||||
{
|
||||
v2s16 p;
|
||||
Attribute attr;
|
||||
};
|
||||
|
||||
public:
|
||||
~PointAttributeList()
|
||||
{
|
||||
}
|
||||
|
||||
Attribute getNearAttr(v2s16 p)
|
||||
{
|
||||
core::list<PointWithAttr>::Iterator
|
||||
nearest_i = m_points.end();
|
||||
s16 nearest_d = 32767;
|
||||
for(core::list<PointWithAttr>::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(v3s16 p)
|
||||
{
|
||||
return getNearAttr(v2s16(p.X, p.Z));
|
||||
}
|
||||
|
||||
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(v2s16 p);
|
||||
|
||||
float getInterpolatedFloat(v3s16 p)
|
||||
{
|
||||
return getInterpolatedFloat(v2s16(p.X, p.Z));
|
||||
}
|
||||
|
||||
void addPoint(v2s16 p, const Attribute &attr)
|
||||
{
|
||||
PointWithAttr pattr;
|
||||
pattr.p = p;
|
||||
pattr.attr = attr;
|
||||
m_points.push_back(pattr);
|
||||
}
|
||||
|
||||
void addPoint(v3s16 p, const Attribute &attr)
|
||||
{
|
||||
addPoint(v2s16(p.X, p.Z), attr);
|
||||
}
|
||||
|
||||
private:
|
||||
core::list<PointWithAttr> m_points;
|
||||
};
|
||||
|
||||
/*
|
||||
Basically just a wrapper to core::map<PointAttributeList*>
|
||||
*/
|
||||
|
||||
class PointAttributeDatabase
|
||||
{
|
||||
public:
|
||||
~PointAttributeDatabase()
|
||||
{
|
||||
for(core::map<std::string, PointAttributeList*>::Iterator
|
||||
i = m_lists.getIterator();
|
||||
i.atEnd() == false; i++)
|
||||
{
|
||||
delete i.getNode()->getValue();
|
||||
}
|
||||
}
|
||||
|
||||
PointAttributeList *getList(const std::string &name)
|
||||
{
|
||||
PointAttributeList *list = NULL;
|
||||
|
||||
core::map<std::string, PointAttributeList*>::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<std::string, PointAttributeList*> m_lists;
|
||||
};
|
||||
|
||||
/*
|
||||
Miscellaneous functions
|
||||
*/
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue