diff -Nru minetest-201707250702/builtin/settingtypes.txt minetest-201707260702/builtin/settingtypes.txt --- minetest-201707250702/builtin/settingtypes.txt 2017-07-25 07:02:38.000000000 +0000 +++ minetest-201707260702/builtin/settingtypes.txt 2017-07-26 07:02:50.000000000 +0000 @@ -1157,6 +1157,9 @@ # Flags starting with 'no' are used to explicitly disable them. mgv7_spflags (Mapgen v7 specific flags) flags mountains,ridges,nofloatlands,caverns,biomerepeat mountains,ridges,floatlands,caverns,biomerepeat,nomountains,noridges,nofloatlands,nocaverns,nobiomerepeat +# Y of mountain density gradient zero level. Used to shift mountains vertically. +mgv7_mount_zero_level (Mountain zero level) int 0 + # Controls width of tunnels, a smaller value creates wider tunnels. mgv7_cave_width (Cave width) float 0.09 diff -Nru minetest-201707250702/debian/changelog minetest-201707260702/debian/changelog --- minetest-201707250702/debian/changelog 2017-07-25 07:02:43.000000000 +0000 +++ minetest-201707260702/debian/changelog 2017-07-26 07:02:53.000000000 +0000 @@ -1,8 +1,8 @@ -minetest (201707250702-0~31b84ce~ubuntu16.04.1) xenial; urgency=low +minetest (201707260702-0~9a17b65~ubuntu16.04.1) xenial; urgency=low * Auto build. - -- Launchpad Package Builder Tue, 25 Jul 2017 07:02:43 +0000 + -- Launchpad Package Builder Wed, 26 Jul 2017 07:02:53 +0000 minetestc55 (0.4.4-0ppa2) raring; urgency=low diff -Nru minetest-201707250702/debian/git-build-recipe.manifest minetest-201707260702/debian/git-build-recipe.manifest --- minetest-201707250702/debian/git-build-recipe.manifest 2017-07-25 07:02:43.000000000 +0000 +++ minetest-201707260702/debian/git-build-recipe.manifest 2017-07-26 07:02:53.000000000 +0000 @@ -1,4 +1,4 @@ -# git-build-recipe format 0.4 deb-version 201707250702-0~31b84ce -lp:~minetestdevs/minetest-c55/+git/upstream git-commit:31b84ce1f2c4f9c6264f32427c3e7be1215360f1 +# git-build-recipe format 0.4 deb-version 201707260702-0~9a17b65 +lp:~minetestdevs/minetest-c55/+git/upstream git-commit:9a17b65f26eea5b9d7176e7df205f72ed2ff6c0f nest packaging lp:~minetestdevs/minetest-c55/+git/packaging debian git-commit:0a3d82dba36a2dfa39353330b4667b552cdd818d nest minetest_game lp:~minetestdevs/minetest-c55/+git/upstream_game games/minetest_game git-commit:40ed77185e68ac5de835055b98910a632fee0318 diff -Nru minetest-201707250702/doc/lua_api.txt minetest-201707260702/doc/lua_api.txt --- minetest-201707250702/doc/lua_api.txt 2017-07-25 07:02:38.000000000 +0000 +++ minetest-201707260702/doc/lua_api.txt 2017-07-26 07:02:50.000000000 +0000 @@ -2847,18 +2847,25 @@ ### Schematics * `minetest.create_schematic(p1, p2, probability_list, filename, slice_prob_list)` * Create a schematic from the volume of map specified by the box formed by p1 and p2. - * Apply the specified probability values to the specified nodes in `probability_list`. + * Apply the specified probability and per-node force-place to the specified nodes + according to the `probability_list`. * `probability_list` is an array of tables containing two fields, `pos` and `prob`. * `pos` is the 3D vector specifying the absolute coordinates of the node being modified, - * `prob` is the integer value from `0` to `255` of the probability (see: Schematic specifier). + * `prob` is an integer value from `0` to `255` that encodes probability and + per-node force-place. Probability has levels 0-127, then 128 is added to + encode per-node force-place. + For probability stated as 0-255, divide by 2 and round down to get values + 0-127, then add 128 to apply per-node force-place. * If there are two or more entries with the same pos value, the last entry is used. * If `pos` is not inside the box formed by `p1` and `p2`, it is ignored. * If `probability_list` equals `nil`, no probabilities are applied. - * Slice probability works in the same manner, except takes a field - called `ypos` instead which - indicates the y position of the slice with a probability applied. + * Apply the specified probability to the specified horizontal slices according to the + `slice_prob_list`. + * `slice_prob_list` is an array of tables containing two fields, `ypos` and `prob`. + * `ypos` indicates the y position of the slice with a probability applied, + the lowest slice being `ypos = 0`. * If slice probability list equals `nil`, no slice probabilities are applied. * Saves schematic in the Minetest Schematic format to filename. diff -Nru minetest-201707250702/minetest.conf.example minetest-201707260702/minetest.conf.example --- minetest-201707250702/minetest.conf.example 2017-07-25 07:02:38.000000000 +0000 +++ minetest-201707260702/minetest.conf.example 2017-07-26 07:02:50.000000000 +0000 @@ -1397,6 +1397,10 @@ # type: flags possible values: mountains, ridges, floatlands, caverns, biomerepeat, nomountains, noridges, nofloatlands, nocaverns, nobiomerepeat # mgv7_spflags = mountains,ridges,nofloatlands,caverns,biomerepeat +# Y of mountain density gradient zero level. Used to shift mountains vertically. +# type: int +# mgv7_mount_zero_level = 0 + # Controls width of tunnels, a smaller value creates wider tunnels. # type: float # mgv7_cave_width = 0.09 diff -Nru minetest-201707250702/src/cavegen.cpp minetest-201707260702/src/cavegen.cpp --- minetest-201707250702/src/cavegen.cpp 2017-07-25 07:02:38.000000000 +0000 +++ minetest-201707260702/src/cavegen.cpp 2017-07-26 07:02:51.000000000 +0000 @@ -73,7 +73,7 @@ noise_cave1->perlinMap3D(nmin.X, nmin.Y - 1, nmin.Z); noise_cave2->perlinMap3D(nmin.X, nmin.Y - 1, nmin.Z); - v3s16 em = vm->m_area.getExtent(); + const v3s16 &em = vm->m_area.getExtent(); u32 index2d = 0; // Biomemap index for (s16 z = nmin.Z; z <= nmax.Z; z++) @@ -208,7 +208,7 @@ //// Place nodes bool near_cavern = false; - v3s16 em = vm->m_area.getExtent(); + const v3s16 &em = vm->m_area.getExtent(); u32 index2d = 0; for (s16 z = nmin.Z; z <= nmax.Z; z++) diff -Nru minetest-201707250702/src/dungeongen.cpp minetest-201707260702/src/dungeongen.cpp --- minetest-201707250702/src/dungeongen.cpp 2017-07-25 07:02:38.000000000 +0000 +++ minetest-201707260702/src/dungeongen.cpp 2017-07-26 07:02:51.000000000 +0000 @@ -151,7 +151,7 @@ void DungeonGen::makeDungeon(v3s16 start_padding) { - v3s16 areasize = vm->m_area.getExtent(); + const v3s16 &areasize = vm->m_area.getExtent(); v3s16 roomsize; v3s16 roomplace; diff -Nru minetest-201707250702/src/mapblock_mesh.cpp minetest-201707260702/src/mapblock_mesh.cpp --- minetest-201707250702/src/mapblock_mesh.cpp 2017-07-25 07:02:38.000000000 +0000 +++ minetest-201707260702/src/mapblock_mesh.cpp 2017-07-26 07:02:51.000000000 +0000 @@ -202,7 +202,7 @@ Calculate smooth lighting at the XYZ- corner of p. Both light banks */ -static u16 getSmoothLightCombined(v3s16 p, MeshMakeData *data) +static u16 getSmoothLightCombined(const v3s16 &p, MeshMakeData *data) { static const v3s16 dirs8[8] = { v3s16(0,0,0), @@ -855,11 +855,10 @@ */ static void updateFastFaceRow( MeshMakeData *data, - v3s16 startpos, + const v3s16 &&startpos, v3s16 translate_dir, - v3f translate_dir_f, - v3s16 face_dir, - v3f face_dir_f, + const v3f &&translate_dir_f, + const v3s16 &&face_dir, std::vector &dest) { v3s16 p = startpos; @@ -966,7 +965,6 @@ v3s16(1,0,0), //dir v3f (1,0,0), v3s16(0,1,0), //face dir - v3f (0,1,0), dest); } } @@ -981,7 +979,6 @@ v3s16(0,0,1), //dir v3f (0,0,1), v3s16(1,0,0), //face dir - v3f (1,0,0), dest); } } @@ -996,7 +993,6 @@ v3s16(1,0,0), //dir v3f (1,0,0), v3s16(0,0,1), //face dir - v3f (0,0,1), dest); } } @@ -1525,14 +1521,12 @@ { if (m_use_tangent_vertices) for (int layer = 0; layer < MAX_TILE_LAYERS; layer++) { - std::vector *p = &prebuffers[layer]; - for (std::vector::iterator it = p->begin(); - it != p->end(); ++it) { - video::SColor tc = it->layer.color; + for (auto &pmb : prebuffers[layer]) { + video::SColor tc = pmb.layer.color; if (tc == video::SColor(0xFFFFFFFF)) continue; - for (u32 index = 0; index < it->tangent_vertices.size(); index++) { - video::SColor *c = &it->tangent_vertices[index].Color; + for (auto &tangent_vertice : pmb.tangent_vertices) { + video::SColor *c = &tangent_vertice.Color; c->set(c->getAlpha(), c->getRed() * tc.getRed() / 255, c->getGreen() * tc.getGreen() / 255, c->getBlue() * tc.getBlue() / 255); @@ -1541,14 +1535,12 @@ } else for (int layer = 0; layer < MAX_TILE_LAYERS; layer++) { - std::vector *p = &prebuffers[layer]; - for (std::vector::iterator it = p->begin(); - it != p->end(); ++it) { - video::SColor tc = it->layer.color; + for (auto &pmb : prebuffers[layer]) { + video::SColor tc = pmb.layer.color; if (tc == video::SColor(0xFFFFFFFF)) continue; - for (u32 index = 0; index < it->vertices.size(); index++) { - video::SColor *c = &it->vertices[index].Color; + for (auto &vertice : pmb.vertices) { + video::SColor *c = &vertice.Color; c->set(c->getAlpha(), c->getRed() * tc.getRed() / 255, c->getGreen() * tc.getGreen() / 255, c->getBlue() * tc.getBlue() / 255); diff -Nru minetest-201707250702/src/mapgen.cpp minetest-201707260702/src/mapgen.cpp --- minetest-201707250702/src/mapgen.cpp 2017-07-25 07:02:38.000000000 +0000 +++ minetest-201707260702/src/mapgen.cpp 2017-07-26 07:02:51.000000000 +0000 @@ -237,7 +237,7 @@ // Returns Y one under area minimum if not found s16 Mapgen::findGroundLevelFull(v2s16 p2d) { - v3s16 em = vm->m_area.getExtent(); + const v3s16 &em = vm->m_area.getExtent(); s16 y_nodes_max = vm->m_area.MaxEdge.Y; s16 y_nodes_min = vm->m_area.MinEdge.Y; u32 i = vm->m_area.index(p2d.X, y_nodes_max, p2d.Y); @@ -257,7 +257,7 @@ // Returns -MAX_MAP_GENERATION_LIMIT if not found s16 Mapgen::findGroundLevel(v2s16 p2d, s16 ymin, s16 ymax) { - v3s16 em = vm->m_area.getExtent(); + const v3s16 &em = vm->m_area.getExtent(); u32 i = vm->m_area.index(p2d.X, ymax, p2d.Y); s16 y; @@ -275,7 +275,7 @@ // Returns -MAX_MAP_GENERATION_LIMIT if not found or if ground is found first s16 Mapgen::findLiquidSurface(v2s16 p2d, s16 ymin, s16 ymax) { - v3s16 em = vm->m_area.getExtent(); + const v3s16 &em = vm->m_area.getExtent(); u32 i = vm->m_area.index(p2d.X, ymax, p2d.Y); s16 y; @@ -344,7 +344,7 @@ void Mapgen::updateLiquid(UniqueQueue *trans_liquid, v3s16 nmin, v3s16 nmax) { bool isignored, isliquid, wasignored, wasliquid, waschecked, waspushed; - v3s16 em = vm->m_area.getExtent(); + const v3s16 &em = vm->m_area.getExtent(); for (s16 z = nmin.Z + 1; z <= nmax.Z - 1; z++) for (s16 x = nmin.X + 1; x <= nmax.X - 1; x++) { @@ -467,7 +467,7 @@ //TimeTaker t("propagateSunlight"); VoxelArea a(nmin, nmax); bool block_is_underground = (water_level >= nmax.Y); - v3s16 em = vm->m_area.getExtent(); + const v3s16 &em = vm->m_area.getExtent(); // NOTE: Direct access to the low 4 bits of param1 is okay here because, // by definition, sunlight will never be in the night lightbank. @@ -627,7 +627,7 @@ assert(biomegen); assert(biomemap); - v3s16 em = vm->m_area.getExtent(); + const v3s16 &em = vm->m_area.getExtent(); u32 index = 0; MgStoneType stone_type = MGSTONE_STONE; @@ -764,7 +764,7 @@ if (node_max.Y < water_level) return; - v3s16 em = vm->m_area.getExtent(); + const v3s16 &em = vm->m_area.getExtent(); u32 index = 0; for (s16 z = node_min.Z; z <= node_max.Z; z++) diff -Nru minetest-201707250702/src/mapgen_flat.cpp minetest-201707260702/src/mapgen_flat.cpp --- minetest-201707250702/src/mapgen_flat.cpp 2017-07-25 07:02:38.000000000 +0000 +++ minetest-201707260702/src/mapgen_flat.cpp 2017-07-26 07:02:51.000000000 +0000 @@ -230,7 +230,7 @@ MapNode n_stone(c_stone); MapNode n_water(c_water_source); - v3s16 em = vm->m_area.getExtent(); + const v3s16 &em = vm->m_area.getExtent(); s16 stone_surface_max_y = -MAX_MAP_GENERATION_LIMIT; u32 ni2d = 0; diff -Nru minetest-201707250702/src/mapgen_v6.cpp minetest-201707260702/src/mapgen_v6.cpp --- minetest-201707250702/src/mapgen_v6.cpp 2017-07-25 07:02:38.000000000 +0000 +++ minetest-201707260702/src/mapgen_v6.cpp 2017-07-26 07:02:51.000000000 +0000 @@ -206,7 +206,7 @@ // Returns Y one under area minimum if not found s16 MapgenV6::find_stone_level(v2s16 p2d) { - v3s16 em = vm->m_area.getExtent(); + const v3s16 &em = vm->m_area.getExtent(); s16 y_nodes_max = vm->m_area.MaxEdge.Y; s16 y_nodes_min = vm->m_area.MinEdge.Y; u32 i = vm->m_area.index(p2d.X, y_nodes_max, p2d.Y); @@ -681,7 +681,7 @@ BiomeV6Type bt = getBiome(v2s16(x, z)); // Fill ground with stone - v3s16 em = vm->m_area.getExtent(); + const v3s16 &em = vm->m_area.getExtent(); u32 i = vm->m_area.index(x, node_min.Y, z); for (s16 y = node_min.Y; y <= node_max.Y; y++) { if (vm->m_data[i].getContent() == CONTENT_IGNORE) { @@ -750,7 +750,7 @@ // Add mud on ground s16 mudcount = 0; - v3s16 em = vm->m_area.getExtent(); + const v3s16 &em = vm->m_area.getExtent(); s16 y_start = surface_y + 1; u32 i = vm->m_area.index(x, y_start, z); for (s16 y = y_start; y <= node_max.Y; y++) { @@ -784,7 +784,7 @@ // Node position in 2d v2s16 p2d = v2s16(node_min.X, node_min.Z) + v2s16(x, z); - v3s16 em = vm->m_area.getExtent(); + const v3s16 &em = vm->m_area.getExtent(); u32 i = vm->m_area.index(p2d.X, node_max.Y, p2d.Y); s16 y = node_max.Y; @@ -947,7 +947,7 @@ if (c_junglegrass == CONTENT_IGNORE) c_junglegrass = CONTENT_AIR; MapNode n_junglegrass(c_junglegrass); - v3s16 em = vm->m_area.getExtent(); + const v3s16 &em = vm->m_area.getExtent(); // Divide area into parts s16 div = 8; @@ -1055,7 +1055,7 @@ MapNode n_dirt_with_snow(c_dirt_with_snow); MapNode n_snowblock(c_snowblock); MapNode n_snow(c_snow); - v3s16 em = vm->m_area.getExtent(); + const v3s16 &em = vm->m_area.getExtent(); u32 index = 0; for (s16 z = full_node_min.Z; z <= full_node_max.Z; z++) diff -Nru minetest-201707250702/src/mapgen_v7.cpp minetest-201707260702/src/mapgen_v7.cpp --- minetest-201707250702/src/mapgen_v7.cpp 2017-07-25 07:02:38.000000000 +0000 +++ minetest-201707260702/src/mapgen_v7.cpp 2017-07-26 07:02:51.000000000 +0000 @@ -56,6 +56,7 @@ : MapgenBasic(mapgenid, params, emerge) { spflags = params->spflags; + mount_zero_level = params->mount_zero_level; cave_width = params->cave_width; large_cave_depth = params->large_cave_depth; lava_depth = params->lava_depth; @@ -149,6 +150,7 @@ void MapgenV7Params::readParams(const Settings *settings) { settings->getFlagStrNoEx("mgv7_spflags", spflags, flagdesc_mapgen_v7); + settings->getS16NoEx("mgv7_mount_zero_level", mount_zero_level); settings->getFloatNoEx("mgv7_cave_width", cave_width); settings->getS16NoEx("mgv7_large_cave_depth", large_cave_depth); settings->getS16NoEx("mgv7_lava_depth", lava_depth); @@ -180,6 +182,7 @@ void MapgenV7Params::writeParams(Settings *settings) const { settings->setFlagStr("mgv7_spflags", spflags, flagdesc_mapgen_v7, U32_MAX); + settings->setS16("mgv7_mount_zero_level", mount_zero_level); settings->setFloat("mgv7_cave_width", cave_width); settings->setS16("mgv7_large_cave_depth", large_cave_depth); settings->setS16("mgv7_lava_depth", lava_depth); @@ -397,7 +400,7 @@ { float mnt_h_n = MYMAX(NoisePerlin2D(&noise_mount_height->np, x, z, seed), 1.0f); - float density_gradient = -((float)y / mnt_h_n); + float density_gradient = -((float)(y - mount_zero_level) / mnt_h_n); float mnt_n = NoisePerlin3D(&noise_mountain->np, x, y, z, seed); return mnt_n + density_gradient >= 0.0; @@ -407,7 +410,7 @@ bool MapgenV7::getMountainTerrainFromMap(int idx_xyz, int idx_xz, s16 y) { float mounthn = MYMAX(noise_mount_height->result[idx_xz], 1.0f); - float density_gradient = -((float)y / mounthn); + float density_gradient = -((float)(y - mount_zero_level) / mounthn); float mountn = noise_mountain->result[idx_xyz]; return mountn + density_gradient >= 0.0; @@ -486,7 +489,7 @@ } //// Place nodes - v3s16 em = vm->m_area.getExtent(); + const v3s16 &em = vm->m_area.getExtent(); s16 stone_surface_max_y = -MAX_MAP_GENERATION_LIMIT; u32 index2d = 0; diff -Nru minetest-201707250702/src/mapgen_v7.h minetest-201707260702/src/mapgen_v7.h --- minetest-201707250702/src/mapgen_v7.h 2017-07-25 07:02:38.000000000 +0000 +++ minetest-201707260702/src/mapgen_v7.h 2017-07-26 07:02:51.000000000 +0000 @@ -38,6 +38,7 @@ struct MapgenV7Params : public MapgenParams { u32 spflags = MGV7_MOUNTAINS | MGV7_RIDGES | MGV7_CAVERNS | MGV7_BIOMEREPEAT; + s16 mount_zero_level = 0; float cave_width = 0.09f; s16 large_cave_depth = -33; s16 lava_depth = -256; @@ -92,6 +93,7 @@ void generateRidgeTerrain(); private: + s16 mount_zero_level; s16 large_cave_depth; float float_mount_density; float float_mount_height; diff -Nru minetest-201707250702/src/mapgen_valleys.cpp minetest-201707260702/src/mapgen_valleys.cpp --- minetest-201707250702/src/mapgen_valleys.cpp 2017-07-25 07:02:38.000000000 +0000 +++ minetest-201707260702/src/mapgen_valleys.cpp 2017-07-26 07:02:51.000000000 +0000 @@ -475,7 +475,7 @@ MapNode n_stone(c_stone); MapNode n_water(c_water_source); - v3s16 em = vm->m_area.getExtent(); + const v3s16 &em = vm->m_area.getExtent(); s16 surface_max_y = -MAX_MAP_GENERATION_LIMIT; u32 index_2d = 0; @@ -597,7 +597,7 @@ MapNode n_lava(c_lava_source); MapNode n_water(c_river_water_source); - v3s16 em = vm->m_area.getExtent(); + const v3s16 &em = vm->m_area.getExtent(); // Cave blend distance near YMIN, YMAX const float massive_cave_blend = 128.f; diff -Nru minetest-201707250702/src/mg_decoration.cpp minetest-201707260702/src/mg_decoration.cpp --- minetest-201707250702/src/mg_decoration.cpp 2017-07-25 07:02:38.000000000 +0000 +++ minetest-201707260702/src/mg_decoration.cpp 2017-07-26 07:02:51.000000000 +0000 @@ -299,7 +299,7 @@ bool force_placement = (flags & DECO_FORCE_PLACEMENT); - v3s16 em = vm->m_area.getExtent(); + const v3s16 &em = vm->m_area.getExtent(); u32 vi = vm->m_area.index(p); for (int i = 0; i < height; i++) { vm->m_area.add_y(em, vi, 1); diff -Nru minetest-201707250702/src/minimap.cpp minetest-201707260702/src/minimap.cpp --- minetest-201707250702/src/minimap.cpp 2017-07-25 07:02:38.000000000 +0000 +++ minetest-201707260702/src/minimap.cpp 2017-07-26 07:02:51.000000000 +0000 @@ -606,7 +606,7 @@ //// MinimapMapblock //// -void MinimapMapblock::getMinimapNodes(VoxelManipulator *vmanip, v3s16 pos) +void MinimapMapblock::getMinimapNodes(VoxelManipulator *vmanip, const v3s16 &pos) { for (s16 x = 0; x < MAP_BLOCKSIZE; x++) diff -Nru minetest-201707250702/src/minimap.h minetest-201707260702/src/minimap.h --- minetest-201707250702/src/minimap.h 2017-07-25 07:02:38.000000000 +0000 +++ minetest-201707260702/src/minimap.h 2017-07-26 07:02:51.000000000 +0000 @@ -63,7 +63,7 @@ }; struct MinimapMapblock { - void getMinimapNodes(VoxelManipulator *vmanip, v3s16 pos); + void getMinimapNodes(VoxelManipulator *vmanip, const v3s16 &pos); MinimapPixel data[MAP_BLOCKSIZE * MAP_BLOCKSIZE]; }; diff -Nru minetest-201707250702/src/voxel.cpp minetest-201707260702/src/voxel.cpp --- minetest-201707250702/src/voxel.cpp 2017-07-25 07:02:38.000000000 +0000 +++ minetest-201707260702/src/voxel.cpp 2017-07-26 07:02:51.000000000 +0000 @@ -55,7 +55,7 @@ void VoxelManipulator::print(std::ostream &o, INodeDefManager *ndef, VoxelPrintMode mode) { - v3s16 em = m_area.getExtent(); + const v3s16 &em = m_area.getExtent(); v3s16 of = m_area.MinEdge; o<<"size: "< & from_nodes, - std::set & light_sources, INodeDefManager *nodemgr) -{ - if(from_nodes.empty()) - return; - - for(std::map::iterator j = from_nodes.begin(); - j != from_nodes.end(); ++j) - { - unspreadLight(bank, j->first, j->second, light_sources, nodemgr); - } -} - void VoxelManipulator::spreadLight(enum LightBank bank, v3s16 p, INodeDefManager *nodemgr) { diff -Nru minetest-201707250702/src/voxel.h minetest-201707260702/src/voxel.h --- minetest-201707250702/src/voxel.h 2017-07-25 07:02:38.000000000 +0000 +++ minetest-201707260702/src/voxel.h 2017-07-26 07:02:51.000000000 +0000 @@ -28,7 +28,7 @@ #include "mapnode.h" #include #include -#include +#include "util/basic_macros.h" class INodeDefManager; @@ -62,15 +62,18 @@ // Starts as zero sized VoxelArea() {} - VoxelArea(v3s16 min_edge, v3s16 max_edge): + VoxelArea(const v3s16 &min_edge, const v3s16 &max_edge): MinEdge(min_edge), MaxEdge(max_edge) { + cacheExtent(); } - VoxelArea(v3s16 p): + + VoxelArea(const v3s16 &p): MinEdge(p), MaxEdge(p) { + cacheExtent(); } /* @@ -90,13 +93,16 @@ if(a.MaxEdge.X > MaxEdge.X) MaxEdge.X = a.MaxEdge.X; if(a.MaxEdge.Y > MaxEdge.Y) MaxEdge.Y = a.MaxEdge.Y; if(a.MaxEdge.Z > MaxEdge.Z) MaxEdge.Z = a.MaxEdge.Z; + cacheExtent(); } + void addPoint(const v3s16 &p) { if(hasEmptyExtent()) { MinEdge = p; MaxEdge = p; + cacheExtent(); return; } if(p.X < MinEdge.X) MinEdge.X = p.X; @@ -105,6 +111,7 @@ if(p.X > MaxEdge.X) MaxEdge.X = p.X; if(p.Y > MaxEdge.Y) MaxEdge.Y = p.Y; if(p.Z > MaxEdge.Z) MaxEdge.Z = p.Z; + cacheExtent(); } // Pad with d nodes @@ -114,25 +121,13 @@ MaxEdge += d; } - /*void operator+=(v3s16 off) - { - MinEdge += off; - MaxEdge += off; - } - - void operator-=(v3s16 off) - { - MinEdge -= off; - MaxEdge -= off; - }*/ - /* const methods */ - v3s16 getExtent() const + const v3s16 &getExtent() const { - return MaxEdge - MinEdge + v3s16(1,1,1); + return m_cache_extent; } /* Because MaxEdge and MinEdge are included in the voxel area an empty extent @@ -145,9 +140,9 @@ s32 getVolume() const { - v3s16 e = getExtent(); - return (s32)e.X * (s32)e.Y * (s32)e.Z; + return (s32)m_cache_extent.X * (s32)m_cache_extent.Y * (s32)m_cache_extent.Z; } + bool contains(const VoxelArea &a) const { // No area contains an empty area @@ -179,12 +174,12 @@ && MaxEdge == other.MaxEdge); } - VoxelArea operator+(v3s16 off) const + VoxelArea operator+(const v3s16 &off) const { return VoxelArea(MinEdge+off, MaxEdge+off); } - VoxelArea operator-(v3s16 off) const + VoxelArea operator-(const v3s16 &off) const { return VoxelArea(MinEdge-off, MaxEdge-off); } @@ -273,10 +268,9 @@ */ s32 index(s16 x, s16 y, s16 z) const { - v3s16 em = getExtent(); - v3s16 off = MinEdge; - s32 i = (s32)(z-off.Z)*em.Y*em.X + (y-off.Y)*em.X + (x-off.X); - //dstream<<" i("< & light_sources, INodeDefManager *nodemgr); - void unspreadLight(enum LightBank bank, - std::map & from_nodes, - std::set & light_sources, INodeDefManager *nodemgr); void spreadLight(enum LightBank bank, v3s16 p, INodeDefManager *nodemgr); void spreadLight(enum LightBank bank, std::set & from_nodes, INodeDefManager *nodemgr); /* - Virtual functions - */ - - /* Member variables */