aboutsummaryrefslogtreecommitdiff
path: root/src/mapnode.cpp
Commit message (Expand)AuthorAge
* MapNode constructor to allow ndef+namePerttu Ahola2011-11-29
* Node definition namesPerttu Ahola2011-11-29
* Clean mapnode.h and fix other files accordinglyPerttu Ahola2011-11-29
* Completely generalized mesh generation; ContentFeatures serializationPerttu Ahola2011-11-29
* GameDef compilesPerttu Ahola2011-11-29
* Create framework for getting rid of global definitions of node/tool/item/what...Perttu Ahola2011-11-29
* Move ContentFeatures to mapnode_contentfeatures.{h,cpp} and clean stuffPerttu Ahola2011-11-29
* Fix water-glass and water-lava surfacesPerttu Ahola2011-11-08
* Make CONTENT_IGNORE to not block the view when occlusion cullingPerttu Ahola2011-11-03
* Automate texture listing for texture atlas makingPerttu Ahola2011-10-18
* Header file tweaking; mainly for speedPerttu Ahola2011-10-12
* lava!Perttu Ahola2011-08-15
* Added MaterialItem conversion from old content type namespace to newPerttu Ahola2011-07-31
* extended content-type rangePerttu Ahola2011-07-23
* Fixed the problem of <=r548 clients fucking up maps on >=r549 servers. Also, ...Perttu Ahola2011-07-22
* Fixed small error in mapnode.cpp (didn't cause any harm though)Perttu Ahola2011-07-22
* initial steps in doing content type extensionPerttu Ahola2011-07-02
* fixed bug in inventory textures caused from better handling of unknown blocksPerttu Ahola2011-06-27
* better handling of unknown blocks on clientPerttu Ahola2011-06-27
* Moved stuff from mapblock{h,cpp} to mapblock_mesh.{h,cpp} and content_mapbloc...Perttu Ahola2011-06-17
* Moved some mapnode content stuff from mapnode.{h,cpp} and digging property st...Perttu Ahola2011-06-17
* A very poor (but better than nothing) inventory icon for fencesCiaran Gultnieks2011-05-24
* Merged CiaranG's fence and fixed two thingsPerttu Ahola2011-05-24
|\
| * Added fences (but still needs an icon or something to display in inventory)Ciaran Gultnieks2011-05-24
* | Some work-in-progress stuff and many comment updatesPerttu Ahola2011-05-22
|/
* fixed a small memory leak in mapnode.cppPerttu Ahola2011-05-21
* Added glass, with rendering and furnace support.Ciaran Gultnieks2011-05-09
* added cobblestone to the texture atlasPerttu Ahola2011-04-29
* updated menu a bit, and some other small fixesPerttu Ahola2011-04-24
* Furnace is now usable. Added more tools.Perttu Ahola2011-04-05
* initial workings of the furnacePerttu Ahola2011-04-05
* changed node metadata format to better accomodate future needs and problemsPerttu Ahola2011-04-05
* initial chest metadataPerttu Ahola2011-04-04
* fully implemented the sign with the new frameworkPerttu Ahola2011-04-04
* Node metadata frameworkPerttu Ahola2011-04-04
* commit before some more radical changesPerttu Ahola2011-04-03
* Some fiddling around with fog... not much changedPerttu Ahola2011-02-14
* New way of determining the outcome of diggingPerttu Ahola2011-02-14
* new texture stuff quite workingPerttu Ahola2011-02-11
* some texture stuffPerttu Ahola2011-02-10
* work-in-progress texture atlas optimizationPerttu Ahola2011-02-10
* bug-fixin'Perttu Ahola2011-02-08
* nicer looking waterPerttu Ahola2011-02-04
* all kinds of tweaking and fixingPerttu Ahola2011-02-04
* a little backwards compatibility with coalPerttu Ahola2011-02-03
* some tweakingPerttu Ahola2011-02-02
* This map generator is starting to look pretty good now... also, disabled load...Perttu Ahola2011-02-01
* server builds now!Perttu Ahola2011-01-28
* Now texture handling is fast. Also now players are saved on disk.Perttu Ahola2011-01-28
* backing up some stuffPerttu Ahola2011-01-26
l opt">= 0; b->min_pos = v3s16(-MAX_MAP_GENERATION_LIMIT, -MAX_MAP_GENERATION_LIMIT, -MAX_MAP_GENERATION_LIMIT); b->max_pos = v3s16(MAX_MAP_GENERATION_LIMIT, MAX_MAP_GENERATION_LIMIT, MAX_MAP_GENERATION_LIMIT); b->heat_point = 0.0; b->humidity_point = 0.0; b->vertical_blend = 0; b->m_nodenames.emplace_back("mapgen_stone"); b->m_nodenames.emplace_back("mapgen_stone"); b->m_nodenames.emplace_back("mapgen_stone"); b->m_nodenames.emplace_back("mapgen_water_source"); b->m_nodenames.emplace_back("mapgen_water_source"); b->m_nodenames.emplace_back("mapgen_river_water_source"); b->m_nodenames.emplace_back("mapgen_stone"); b->m_nodenames.emplace_back("ignore"); b->m_nodenames.emplace_back("ignore"); b->m_nodenames.emplace_back("ignore"); b->m_nodenames.emplace_back("ignore"); b->m_nodenames.emplace_back("ignore"); m_ndef->pendNodeResolve(b); add(b); } void BiomeManager::clear() { EmergeManager *emerge = m_server->getEmergeManager(); // Remove all dangling references in Decorations DecorationManager *decomgr = emerge->decomgr; for (size_t i = 0; i != decomgr->getNumObjects(); i++) { Decoration *deco = (Decoration *)decomgr->getRaw(i); deco->biomes.clear(); } // Don't delete the first biome for (size_t i = 1; i < m_objects.size(); i++) delete (Biome *)m_objects[i]; m_objects.resize(1); } // For BiomeGen type 'BiomeGenOriginal' float BiomeManager::getHeatAtPosOriginal(v3s16 pos, NoiseParams &np_heat, NoiseParams &np_heat_blend, u64 seed) { return NoisePerlin2D(&np_heat, pos.X, pos.Z, seed) + NoisePerlin2D(&np_heat_blend, pos.X, pos.Z, seed); } // For BiomeGen type 'BiomeGenOriginal' float BiomeManager::getHumidityAtPosOriginal(v3s16 pos, NoiseParams &np_humidity, NoiseParams &np_humidity_blend, u64 seed) { return NoisePerlin2D(&np_humidity, pos.X, pos.Z, seed) + NoisePerlin2D(&np_humidity_blend, pos.X, pos.Z, seed); } // For BiomeGen type 'BiomeGenOriginal' Biome *BiomeManager::getBiomeFromNoiseOriginal(float heat, float humidity, v3s16 pos) { Biome *biome_closest = nullptr; Biome *biome_closest_blend = nullptr; float dist_min = FLT_MAX; float dist_min_blend = FLT_MAX; for (size_t i = 1; i < getNumObjects(); i++) { Biome *b = (Biome *)getRaw(i); if (!b || pos.Y < b->min_pos.Y || pos.Y > b->max_pos.Y + b->vertical_blend || pos.X < b->min_pos.X || pos.X > b->max_pos.X || pos.Z < b->min_pos.Z || pos.Z > b->max_pos.Z) continue; float d_heat = heat - b->heat_point; float d_humidity = humidity - b->humidity_point; float dist = (d_heat * d_heat) + (d_humidity * d_humidity); if (pos.Y <= b->max_pos.Y) { // Within y limits of biome b if (dist < dist_min) { dist_min = dist; biome_closest = b; } } else if (dist < dist_min_blend) { // Blend area above biome b dist_min_blend = dist; biome_closest_blend = b; } } mysrand(pos.Y + (heat + humidity) * 0.9f); if (biome_closest_blend && dist_min_blend <= dist_min && myrand_range(0, biome_closest_blend->vertical_blend) >= pos.Y - biome_closest_blend->max_pos.Y) return biome_closest_blend; return (biome_closest) ? biome_closest : (Biome *)getRaw(BIOME_NONE); } //////////////////////////////////////////////////////////////////////////////// void BiomeParamsOriginal::readParams(const Settings *settings) { settings->getNoiseParams("mg_biome_np_heat", np_heat); settings->getNoiseParams("mg_biome_np_heat_blend", np_heat_blend); settings->getNoiseParams("mg_biome_np_humidity", np_humidity); settings->getNoiseParams("mg_biome_np_humidity_blend", np_humidity_blend); } void BiomeParamsOriginal::writeParams(Settings *settings) const { settings->setNoiseParams("mg_biome_np_heat", np_heat); settings->setNoiseParams("mg_biome_np_heat_blend", np_heat_blend); settings->setNoiseParams("mg_biome_np_humidity", np_humidity); settings->setNoiseParams("mg_biome_np_humidity_blend", np_humidity_blend); } //////////////////////////////////////////////////////////////////////////////// BiomeGenOriginal::BiomeGenOriginal(BiomeManager *biomemgr, BiomeParamsOriginal *params, v3s16 chunksize) { m_bmgr = biomemgr; m_params = params; m_csize = chunksize; noise_heat = new Noise(&params->np_heat, params->seed, m_csize.X, m_csize.Z); noise_humidity = new Noise(&params->np_humidity, params->seed, m_csize.X, m_csize.Z); noise_heat_blend = new Noise(&params->np_heat_blend, params->seed, m_csize.X, m_csize.Z); noise_humidity_blend = new Noise(&params->np_humidity_blend, params->seed, m_csize.X, m_csize.Z); heatmap = noise_heat->result; humidmap = noise_humidity->result; biomemap = new biome_t[m_csize.X * m_csize.Z]; // Initialise with the ID of 'BIOME_NONE' so that cavegen can get the // fallback biome when biome generation (which calculates the biomemap IDs) // is disabled. memset(biomemap, 0, sizeof(biome_t) * m_csize.X * m_csize.Z); } BiomeGenOriginal::~BiomeGenOriginal() { delete []biomemap; delete noise_heat; delete noise_humidity; delete noise_heat_blend; delete noise_humidity_blend; } // Only usable in a mapgen thread Biome *BiomeGenOriginal::calcBiomeAtPoint(v3s16 pos) const { float heat = NoisePerlin2D(&m_params->np_heat, pos.X, pos.Z, m_params->seed) + NoisePerlin2D(&m_params->np_heat_blend, pos.X, pos.Z, m_params->seed); float humidity = NoisePerlin2D(&m_params->np_humidity, pos.X, pos.Z, m_params->seed) + NoisePerlin2D(&m_params->np_humidity_blend, pos.X, pos.Z, m_params->seed); return calcBiomeFromNoise(heat, humidity, pos); } void BiomeGenOriginal::calcBiomeNoise(v3s16 pmin) { m_pmin = pmin; noise_heat->perlinMap2D(pmin.X, pmin.Z); noise_humidity->perlinMap2D(pmin.X, pmin.Z); noise_heat_blend->perlinMap2D(pmin.X, pmin.Z); noise_humidity_blend->perlinMap2D(pmin.X, pmin.Z); for (s32 i = 0; i < m_csize.X * m_csize.Z; i++) { noise_heat->result[i] += noise_heat_blend->result[i]; noise_humidity->result[i] += noise_humidity_blend->result[i]; } } biome_t *BiomeGenOriginal::getBiomes(s16 *heightmap, v3s16 pmin) { for (s16 zr = 0; zr < m_csize.Z; zr++) for (s16 xr = 0; xr < m_csize.X; xr++) { s32 i = zr * m_csize.X + xr; Biome *biome = calcBiomeFromNoise( noise_heat->result[i], noise_humidity->result[i], v3s16(pmin.X + xr, heightmap[i], pmin.Z + zr)); biomemap[i] = biome->index; } return biomemap; } Biome *BiomeGenOriginal::getBiomeAtPoint(v3s16 pos) const { return getBiomeAtIndex( (pos.Z - m_pmin.Z) * m_csize.X + (pos.X - m_pmin.X), pos); } Biome *BiomeGenOriginal::getBiomeAtIndex(size_t index, v3s16 pos) const { return calcBiomeFromNoise( noise_heat->result[index], noise_humidity->result[index], pos); } Biome *BiomeGenOriginal::calcBiomeFromNoise(float heat, float humidity, v3s16 pos) const { Biome *biome_closest = nullptr; Biome *biome_closest_blend = nullptr; float dist_min = FLT_MAX; float dist_min_blend = FLT_MAX; for (size_t i = 1; i < m_bmgr->getNumObjects(); i++) { Biome *b = (Biome *)m_bmgr->getRaw(i); if (!b || pos.Y < b->min_pos.Y || pos.Y > b->max_pos.Y + b->vertical_blend || pos.X < b->min_pos.X || pos.X > b->max_pos.X || pos.Z < b->min_pos.Z || pos.Z > b->max_pos.Z) continue; float d_heat = heat - b->heat_point; float d_humidity = humidity - b->humidity_point; float dist = (d_heat * d_heat) + (d_humidity * d_humidity); if (pos.Y <= b->max_pos.Y) { // Within y limits of biome b if (dist < dist_min) { dist_min = dist; biome_closest = b; } } else if (dist < dist_min_blend) { // Blend area above biome b dist_min_blend = dist; biome_closest_blend = b; } } // Carefully tune pseudorandom seed variation to avoid single node dither // and create larger scale blending patterns similar to horizontal biome // blend. mysrand(pos.Y + (heat + humidity) * 0.9f); if (biome_closest_blend && dist_min_blend <= dist_min && myrand_range(0, biome_closest_blend->vertical_blend) >= pos.Y - biome_closest_blend->max_pos.Y) return biome_closest_blend; return (biome_closest) ? biome_closest : (Biome *)m_bmgr->getRaw(BIOME_NONE); } //////////////////////////////////////////////////////////////////////////////// void Biome::resolveNodeNames() { getIdFromNrBacklog(&c_top, "mapgen_stone", CONTENT_AIR, false); getIdFromNrBacklog(&c_filler, "mapgen_stone", CONTENT_AIR, false); getIdFromNrBacklog(&c_stone, "mapgen_stone", CONTENT_AIR, false); getIdFromNrBacklog(&c_water_top, "mapgen_water_source", CONTENT_AIR, false); getIdFromNrBacklog(&c_water, "mapgen_water_source", CONTENT_AIR, false); getIdFromNrBacklog(&c_river_water, "mapgen_river_water_source", CONTENT_AIR, false); getIdFromNrBacklog(&c_riverbed, "mapgen_stone", CONTENT_AIR, false); getIdFromNrBacklog(&c_dust, "ignore", CONTENT_IGNORE, false); getIdFromNrBacklog(&c_cave_liquid, "ignore", CONTENT_IGNORE, false); getIdFromNrBacklog(&c_dungeon, "ignore", CONTENT_IGNORE, false); getIdFromNrBacklog(&c_dungeon_alt, "ignore", CONTENT_IGNORE, false); getIdFromNrBacklog(&c_dungeon_stair, "ignore", CONTENT_IGNORE, false); }