Optimize liquid queue on generate map for liquid_finite
authorproller <proller@github.com>
Sat, 29 Jun 2013 21:29:21 +0000 (01:29 +0400)
committerproller <proller@github.com>
Sat, 29 Jun 2013 21:29:21 +0000 (01:29 +0400)
src/content_abm.cpp
src/mapgen.cpp

index 3704fe83d4c45ffb0e84591fa23f974ff20eb298..6adcbf708ef94c328957654216c2fb6fb3da6526 100644 (file)
@@ -228,9 +228,12 @@ public:
                ServerMap *map = &env->getServerMap();
                if (map->transforming_liquid_size() > 500)
                        return;
-               //todo: look around except top
-               MapNode n_below = map->getNodeNoEx(p - v3s16(0, 1, 0));
-               if (n_below.getContent() != CONTENT_AIR)
+               if (       map->getNodeNoEx(p - v3s16(0,  1, 0 )).getContent() != CONTENT_AIR  // below
+                       && map->getNodeNoEx(p - v3s16(1,  0, 0 )).getContent() != CONTENT_AIR  // right
+                       && map->getNodeNoEx(p - v3s16(-1, 0, 0 )).getContent() != CONTENT_AIR  // left
+                       && map->getNodeNoEx(p - v3s16(0,  0, 1 )).getContent() != CONTENT_AIR  // back 
+                       && map->getNodeNoEx(p - v3s16(0,  0, -1)).getContent() != CONTENT_AIR  // front
+               )
                        return;
                map->transforming_liquid_add(p);
        }
index 7343d10fdfab65e9d92d2ebefaa8691c20d452a7..23af1f39803b46aa39c659944b2dd715dc0d0950 100644 (file)
@@ -836,8 +836,10 @@ void Mapgen::updateHeightmap(v3s16 nmin, v3s16 nmax) {
 
 
 void Mapgen::updateLiquid(UniqueQueue<v3s16> *trans_liquid, v3s16 nmin, v3s16 nmax) {
-       bool isliquid, wasliquid;
+       bool isliquid, wasliquid, rare;
        v3s16 em  = vm->m_area.getExtent();
+       rare = g_settings->getBool("liquid_finite");
+       int rarecnt = 0;
 
        for (s16 z = nmin.Z; z <= nmax.Z; z++) {
                for (s16 x = nmin.X; x <= nmax.X; x++) {
@@ -847,8 +849,8 @@ void Mapgen::updateLiquid(UniqueQueue<v3s16> *trans_liquid, v3s16 nmin, v3s16 nm
                        for (s16 y = nmax.Y; y >= nmin.Y; y--) {
                                isliquid = ndef->get(vm->m_data[i]).isLiquid();
 
-                               // there was a change between liquid and nonliquid, add to queue
-                               if (isliquid != wasliquid)
+                               // there was a change between liquid and nonliquid, add to queue. no need to add every with liquid_finite
+                               if (isliquid != wasliquid && (!rare || !(rarecnt++ % 36)))
                                        trans_liquid->push_back(v3s16(x, y, z));
 
                                wasliquid = isliquid;