LuaVoxelManip: Add option to allocate blank data
[oweals/minetest.git] / src / mg_decoration.cpp
index a8fd9eaadf0b87fe362d9bd588a42f263e0bc7c6..50e8fb05a65f31eec9a71f203445e84d55d33040 100644 (file)
@@ -27,7 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 const char *DecorationManager::ELEMENT_TITLE = "decoration";
 
-FlagDesc flagdesc_deco_schematic[] = {
+FlagDesc flagdesc_deco[] = {
        {"place_center_x", DECO_PLACE_CENTER_X},
        {"place_center_y", DECO_PLACE_CENTER_Y},
        {"place_center_z", DECO_PLACE_CENTER_Z},
@@ -38,6 +38,12 @@ FlagDesc flagdesc_deco_schematic[] = {
 ///////////////////////////////////////////////////////////////////////////////
 
 
+DecorationManager::DecorationManager(IGameDef *gamedef) :
+       GenElementManager(gamedef)
+{
+}
+
+
 size_t DecorationManager::placeAllDecos(Mapgen *mg, u32 seed, v3s16 nmin, v3s16 nmax)
 {
        size_t nplaced = 0;
@@ -55,21 +61,36 @@ size_t DecorationManager::placeAllDecos(Mapgen *mg, u32 seed, v3s16 nmin, v3s16
 }
 
 
+void DecorationManager::clear()
+{
+       for (size_t i = 0; i < m_elements.size(); i++) {
+               Decoration *deco = (Decoration *)m_elements[i];
+               delete deco;
+       }
+       m_elements.clear();
+}
+
+
 ///////////////////////////////////////////////////////////////////////////////
 
 
 Decoration::Decoration()
 {
        mapseed    = 0;
-       np         = NULL;
        fill_ratio = 0;
        sidelen    = 1;
+       flags      = 0;
 }
 
 
 Decoration::~Decoration()
 {
-       delete np;
+}
+
+
+void Decoration::resolveNodeNames(NodeResolveInfo *nri)
+{
+       m_ndef->getIdsFromResolveInfo(nri, c_place_on);
 }
 
 
@@ -104,8 +125,8 @@ size_t Decoration::placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
                );
 
                // Amount of decorations
-               float nval = np ?
-                       NoisePerlin2D(np, p2d_center.X, p2d_center.Y, mapseed) :
+               float nval = (flags & DECO_USE_NOISE) ?
+                       NoisePerlin2D(&np, p2d_center.X, p2d_center.Y, mapseed) :
                        fill_ratio;
                u32 deco_count = area * MYMAX(nval, 0.f);
 
@@ -137,7 +158,7 @@ size_t Decoration::placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
                        if (mg->biomemap) {
                                std::set<u8>::iterator iter;
 
-                               if (biomes.size()) {
+                               if (!biomes.empty()) {
                                        iter = biomes.find(mg->biomemap[mapindex]);
                                        if (iter == biomes.end())
                                                continue;
@@ -211,6 +232,14 @@ void Decoration::placeCutoffs(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
 ///////////////////////////////////////////////////////////////////////////////
 
 
+void DecoSimple::resolveNodeNames(NodeResolveInfo *nri)
+{
+       Decoration::resolveNodeNames(nri);
+       m_ndef->getIdsFromResolveInfo(nri, c_decos);
+       m_ndef->getIdsFromResolveInfo(nri, c_spawnby);
+}
+
+
 bool DecoSimple::canPlaceDecoration(ManualMapVoxelManipulator *vm, v3s16 p)
 {
        // Don't bother if there aren't any decorations to place