From 68c799bf99bbf624401500e116663d2326331473 Mon Sep 17 00:00:00 2001 From: kwolekr Date: Tue, 2 Dec 2014 03:58:57 -0500 Subject: [PATCH] Use setting groups for NoiseParams Add format example to minetest.conf.example Add Settings::setU16() Throw exception on attempted access of NULL settings groups --- minetest.conf.example | 14 ++++++++ src/noise.h | 15 ++++----- src/settings.cpp | 76 ++++++++++++++++++++++++++++++++++++++++++- src/settings.h | 6 ++++ src/test.cpp | 2 +- 5 files changed, 103 insertions(+), 10 deletions(-) diff --git a/minetest.conf.example b/minetest.conf.example index 819888278..7b8ab3692 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -443,7 +443,21 @@ #mgv5_np_wetness = 0, 1, (40, 40, 40), 32474, 4, 1.1 #mgv6_spflags = biomeblend, jungles, mudflow + +# +# Noise parameters can be specified as a set of positional values: #mgv6_np_terrain_base = -4, 20, (250, 250, 250), 82341, 5, 0.6 +# +# Or the new group format can be used instead: +#mgv6_np_terrain_base = { +# offset = -4 +# scale = 20 +# spread = (250, 250, 250) +# seed = 82341 +# octaves = 5 +# persistence = 0.6 +#} + #mgv6_np_terrain_higher = 20, 16, (500, 500, 500), 85039, 5, 0.6 #mgv6_np_steepness = 0.85, 0.5, (125, 125, 125), -932, 5, 0.7 #mgv6_np_height_select = 0.5, 1, (250, 250, 250), 4213, 5, 0.69 diff --git a/src/noise.h b/src/noise.h index 3c726f17f..7d055d2e1 100644 --- a/src/noise.h +++ b/src/noise.h @@ -70,8 +70,8 @@ struct NoiseParams { float offset; float scale; v3f spread; - int seed; - int octaves; + s32 seed; + u16 octaves; float persist; bool eased; @@ -91,12 +91,11 @@ struct NoiseParams { }; -// Convenience macros for getting/setting NoiseParams in Settings - -#define NOISEPARAMS_FMT_STR "f,f,v3,s32,s32,f" - -#define getNoiseParams(x, y) getStruct((x), NOISEPARAMS_FMT_STR, &(y), sizeof(y)) -#define setNoiseParams(x, y) setStruct((x), NOISEPARAMS_FMT_STR, &(y)) +// Convenience macros for getting/setting NoiseParams in Settings as a string +// WARNING: Deprecated, use Settings::getNoiseParamsFromValue() instead +#define NOISEPARAMS_FMT_STR "f,f,v3,s32,u16,f" +//#define getNoiseParams(x, y) getStruct((x), NOISEPARAMS_FMT_STR, &(y), sizeof(y)) +//#define setNoiseParams(x, y) setStruct((x), NOISEPARAMS_FMT_STR, &(y)) class Noise { public: diff --git a/src/settings.cpp b/src/settings.cpp index fddadbea6..8bb4f5c9c 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -29,6 +29,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "log.h" #include "util/serialize.h" #include "filesys.h" +#include "noise.h" #include #include @@ -358,7 +359,10 @@ const SettingsEntry &Settings::getEntry(const std::string &name) const Settings *Settings::getGroup(const std::string &name) const { - return getEntry(name).group; + Settings *group = getEntry(name).group; + if (group == NULL) + throw SettingNotFoundException("Setting [" + name + "] is not a group."); + return group; } @@ -461,6 +465,55 @@ bool Settings::getStruct(const std::string &name, const std::string &format, } +bool Settings::getNoiseParams(const std::string &name, NoiseParams &np) const +{ + return getNoiseParamsFromGroup(name, np) || getNoiseParamsFromValue(name, np); +} + + +bool Settings::getNoiseParamsFromValue(const std::string &name, + NoiseParams &np) const +{ + std::string value; + + if (!getNoEx(name, value)) + return false; + + Strfnd f(value); + + np.offset = stof(f.next(",")); + np.scale = stof(f.next(",")); + f.next("("); + np.spread.X = stof(f.next(",")); + np.spread.Y = stof(f.next(",")); + np.spread.Z = stof(f.next(")")); + np.seed = stoi(f.next(",")); + np.octaves = stoi(f.next(",")); + np.persist = stof(f.next("")); + + return true; +} + + +bool Settings::getNoiseParamsFromGroup(const std::string &name, + NoiseParams &np) const +{ + Settings *group = NULL; + + if (!getGroupNoEx(name, group)) + return false; + + group->getFloatNoEx("offset", np.offset); + group->getFloatNoEx("scale", np.scale); + group->getV3FNoEx("spread", np.spread); + group->getS32NoEx("seed", np.seed); + group->getU16NoEx("octaves", np.octaves); + group->getFloatNoEx("persistence", np.persist); + + return true; +} + + bool Settings::exists(const std::string &name) const { JMutexAutoLock lock(m_mutex); @@ -682,6 +735,12 @@ void Settings::setS16(const std::string &name, s16 value) } +void Settings::setU16(const std::string &name, u16 value) +{ + set(name, itos(value)); +} + + void Settings::setS32(const std::string &name, s32 value) { set(name, itos(value)); @@ -737,6 +796,21 @@ bool Settings::setStruct(const std::string &name, const std::string &format, } +void Settings::setNoiseParams(const std::string &name, const NoiseParams &np) +{ + Settings *group = new Settings; + + group->setFloat("offset", np.offset); + group->setFloat("scale", np.scale); + group->setV3F("spread", np.spread); + group->setS32("seed", np.seed); + group->setU16("octaves", np.octaves); + group->setFloat("persistence", np.persist); + + setGroup(name, group); +} + + bool Settings::remove(const std::string &name) { JMutexAutoLock lock(m_mutex); diff --git a/src/settings.h b/src/settings.h index 542fae2a4..cc7ea365d 100644 --- a/src/settings.h +++ b/src/settings.h @@ -29,6 +29,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include class Settings; +struct NoiseParams; /** function type to register a changed callback */ typedef void (*setting_changed_callback)(const std::string); @@ -142,6 +143,9 @@ public: // the behavior is undefined. bool getStruct(const std::string &name, const std::string &format, void *out, size_t olen) const; + bool getNoiseParams(const std::string &name, NoiseParams &np) const; + bool getNoiseParamsFromValue(const std::string &name, NoiseParams &np) const; + bool getNoiseParamsFromGroup(const std::string &name, NoiseParams &np) const; // return all keys used std::vector getNames() const; @@ -181,6 +185,7 @@ public: void setGroupDefault(const std::string &name, Settings *group); void setBool(const std::string &name, bool value); void setS16(const std::string &name, s16 value); + void setU16(const std::string &name, u16 value); void setS32(const std::string &name, s32 value); void setU64(const std::string &name, u64 value); void setFloat(const std::string &name, float value); @@ -188,6 +193,7 @@ public: void setV3F(const std::string &name, v3f value); void setFlagStr(const std::string &name, u32 flags, const FlagDesc *flagdesc, u32 flagmask); + void setNoiseParams(const std::string &name, const NoiseParams &np); // N.B. if setStruct() is used to write a non-POD aggregate type, // the behavior is undefined. bool setStruct(const std::string &name, const std::string &format, void *value); diff --git a/src/test.cpp b/src/test.cpp index 6454f8a28..932f9e7cc 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -512,7 +512,7 @@ struct TestSettings: public TestBase // Test settings groups Settings *group = s.getGroup("asdf"); UASSERT(group != NULL); - UASSERT(s.getGroup("zoop") == NULL); + UASSERT(s.getGroupNoEx("zoop", group) == false); UASSERT(group->getS16("a") == 5); UASSERT(fabs(group->getFloat("b") - 2.5) < 0.001);