X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futility.cpp;h=7ffbe716066cf467df04d392687494a1e3845313;hb=013921782b1a8506f4aee1d1be0312002eddd575;hp=5f3833e167397d75c4558b9b7158f4bc4e088d80;hpb=fc26dcdb19dd4e296d850714019ed7da1de0b021;p=oweals%2Fminetest.git diff --git a/src/utility.cpp b/src/utility.cpp index 5f3833e16..7ffbe7160 100644 --- a/src/utility.cpp +++ b/src/utility.cpp @@ -22,6 +22,57 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "utility.h" +#include "gettime.h" +#include "sha1.h" +#include "base64.h" +#include "log.h" + +TimeTaker::TimeTaker(const char *name, u32 *result) +{ + m_name = name; + m_result = result; + m_running = true; + m_time1 = getTimeMs(); +} + +u32 TimeTaker::stop(bool quiet) +{ + if(m_running) + { + u32 time2 = getTimeMs(); + u32 dtime = time2 - m_time1; + if(m_result != NULL) + { + (*m_result) += dtime; + } + else + { + if(quiet == false) + infostream< MYRAND_MAX) + { + errorstream<<"WARNING: myrand_range: max-min > MYRAND_MAX"< max) + { + assert(0); + return max; + } + return (myrand()%(max-min+1))+min; +} + +#ifndef SERVER +// Sets the color of all vertices in the mesh +void setMeshVerticesColor(scene::IMesh* mesh, video::SColor& color) +{ + if(mesh == NULL) + return; + + u16 mc = mesh->getMeshBufferCount(); + for(u16 j=0; jgetMeshBuffer(j); + video::S3DVertex *vertices = (video::S3DVertex*)buf->getVertices(); + u16 vc = buf->getVertexCount(); + for(u16 i=0; i range * BS) + 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; +} + +// Get an sha-1 hash of the player's name combined with +// the password entered. That's what the server uses as +// their password. (Exception : if the password field is +// blank, we send a blank password - this is for backwards +// compatibility with password-less players). +std::string translatePassword(std::string playername, std::wstring password) +{ + if(password.length() == 0) + return ""; + + std::string slt = playername + wide_to_narrow(password); + SHA1 sha1; + sha1.addBytes(slt.c_str(), slt.length()); + unsigned char *digest = sha1.getDigest(); + std::string pwd = base64_encode(digest, 20); + free(digest); + return pwd; +} + +