aboutsummaryrefslogtreecommitdiff
path: root/src/script/cpp_api/s_node.h
Commit message (Collapse)AuthorAge
* Rework use_texture_alpha to provide three opaque/clip/blend modessfan52021-01-29
| | | | | The change that turns nodeboxes and meshes opaque when possible is kept, as is the compatibility code that warns modders to adjust their nodedefs.
* Value copy / allocation optimizations mostly in server, SAO and serialize codesfan52020-05-27
|
* Remove nodeupdate completely (#6358)Rui2017-09-01
|
* Modernize source code: last part (#6285)Loïc Blot2017-08-20
| | | | | | | | | | | * Modernize source code: last par * Use empty when needed * Use emplace_back instead of push_back when needed * For range-based loops * Initializers fixes * constructors, destructors default * c++ C stl includes
* C++ modernize: Pragma once (#6264)Loïc Blot2017-08-17
| | | | * Migrate cpp headers to pragma once
* Add on_flood() callback.Auke Kok2017-04-22
| | | | | | | | | | | | | | | | | | | | | This callback is called if a liquid definitely floods a non-air node on the map. The callback arguments are (pos, oldnode, newnode) and can return a `bool` value indicating whether flooding the node should be cancelled (`return true` will prevent the node from flooding). Documentation is added, the callback function was tested with a modified minetest_game. Note that `return true` will likely cause the node's `on_flood()` callback to be called every second until the node gets removed, so care must be taken to prevent many callbacks from using this return value. The current default liquid update interval is 1.0 seconds, which isn't unmanageable. The larger aim of this patch is to remove the lava cooling ABM, which is a significant cost to idle servers that have lava on their map. This callback will be much more efficient.
* Replace instances of std::map<std::string, std::string> with StringMapkwolekr2015-05-19
| | | | | | Also, clean up surrounding code style Replace by-value parameter passing with const refs when possible Fix post-increment of iterators
* Pass pointed_thing to on_punch and minetest.register_on_punchnode callbacksShadowNinja2014-01-23
|
* Weather supportproller2013-07-27
|
* Fix class/struct forward declaration inconsistencies (good on ya, MSVC)Kahrl2013-06-06
|
* Move scriptapi to separate folder (by sapier)sapier2013-05-25
On the lua side, notably minetest.env:<function>(<args>) should now be replaced by minetest.<function>(<args>). The old way is and will stay supported for a long time. Also: Update and clean up lua_api.txt (by celeron55) Move EnvRef to lua and remove add_rat and add_firefly (by kahrl) Add separate src/util/CMakeLists.txt, other minor fixes (by kahrl)
0) { list.push_back(v3s16(0,0,0)); return; } if(d == 1) { /* This is an optimized sequence of coordinates. */ list.push_back(v3s16( 0, 1, 0)); // top list.push_back(v3s16( 0, 0, 1)); // back list.push_back(v3s16(-1, 0, 0)); // left list.push_back(v3s16( 1, 0, 0)); // right list.push_back(v3s16( 0, 0,-1)); // front list.push_back(v3s16( 0,-1, 0)); // bottom // 6 list.push_back(v3s16(-1, 0, 1)); // back left list.push_back(v3s16( 1, 0, 1)); // back right list.push_back(v3s16(-1, 0,-1)); // front left list.push_back(v3s16( 1, 0,-1)); // front right list.push_back(v3s16(-1,-1, 0)); // bottom left list.push_back(v3s16( 1,-1, 0)); // bottom right list.push_back(v3s16( 0,-1, 1)); // bottom back list.push_back(v3s16( 0,-1,-1)); // bottom front list.push_back(v3s16(-1, 1, 0)); // top left list.push_back(v3s16( 1, 1, 0)); // top right list.push_back(v3s16( 0, 1, 1)); // top back list.push_back(v3s16( 0, 1,-1)); // top front // 18 list.push_back(v3s16(-1, 1, 1)); // top back-left list.push_back(v3s16( 1, 1, 1)); // top back-right list.push_back(v3s16(-1, 1,-1)); // top front-left list.push_back(v3s16( 1, 1,-1)); // top front-right list.push_back(v3s16(-1,-1, 1)); // bottom back-left list.push_back(v3s16( 1,-1, 1)); // bottom back-right list.push_back(v3s16(-1,-1,-1)); // bottom front-left list.push_back(v3s16( 1,-1,-1)); // bottom front-right // 26 return; } // Take blocks in all sides, starting from y=0 and going +-y for(s16 y=0; y<=d-1; y++) { // Left and right side, including borders for(s16 z=-d; z<=d; z++) { list.push_back(v3s16(d,y,z)); list.push_back(v3s16(-d,y,z)); if(y != 0) { list.push_back(v3s16(d,-y,z)); list.push_back(v3s16(-d,-y,z)); } } // Back and front side, excluding borders for(s16 x=-d+1; x<=d-1; x++) { list.push_back(v3s16(x,y,d)); list.push_back(v3s16(x,y,-d)); if(y != 0) { list.push_back(v3s16(x,-y,d)); list.push_back(v3s16(x,-y,-d)); } } } // Take the bottom and top face with borders // -d<x<d, y=+-d, -d<z<d for(s16 x=-d; x<=d; x++) for(s16 z=-d; z<=d; z++) { list.push_back(v3s16(x,-d,z)); list.push_back(v3s16(x,d,z)); } } /* myrand */ static unsigned long next = 1; /* RAND_MAX assumed to be 32767 */ int myrand(void) { next = next * 1103515245 + 12345; return((unsigned)(next/65536) % 32768); } void mysrand(unsigned seed) { next = seed; } int myrand_range(int min, int max) { if(max-min > MYRAND_MAX) { errorstream<<"WARNING: myrand_range: max-min > MYRAND_MAX"<<std::endl; max = min + MYRAND_MAX; } if(min > max) { errorstream<<"WARNING: myrand_range: min > max"<<std::endl; return max; } return (myrand()%(max-min+1))+min; } /* blockpos: position of block in block coordinates camera_pos: position of camera in nodes camera_dir: an unit vector pointing to camera direction range: viewing range */ bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir, f32 camera_fov, f32 range, f32 *distance_ptr) { v3s16 blockpos_nodes = blockpos_b * MAP_BLOCKSIZE; // Block center position v3f blockpos( ((float)blockpos_nodes.X + MAP_BLOCKSIZE/2) * BS, ((float)blockpos_nodes.Y + MAP_BLOCKSIZE/2) * BS, ((float)blockpos_nodes.Z + MAP_BLOCKSIZE/2) * BS ); // Block position relative to camera v3f blockpos_relative = blockpos - camera_pos; // Distance in camera direction (+=front, -=back) f32 dforward = blockpos_relative.dotProduct(camera_dir); // Total distance f32 d = blockpos_relative.getLength(); if(distance_ptr) *distance_ptr = d; // If block is very close, it is always in sight if(d < 1.44*1.44*MAP_BLOCKSIZE*BS/2) return true; // If block is far away, it's not in sight if(d > range) return false; // Maximum radius of a block f32 block_max_radius = 0.5*1.44*1.44*MAP_BLOCKSIZE*BS; // If block is (nearly) touching the camera, don't // bother validating further (that is, render it anyway) if(d < block_max_radius) return true; // Cosine of the angle between the camera direction // and the block direction (camera_dir is an unit vector) f32 cosangle = dforward / d; // Compensate for the size of the block // (as the block has to be shown even if it's a bit off FOV) // This is an estimate, plus an arbitary factor cosangle += block_max_radius / d * 0.5; // If block is not in the field of view, skip it if(cosangle < cos(camera_fov / 2)) return false; return true; }