2 #include "client/client_node.h"
3 #include "client/client_terrain.h"
4 #include "client/raycast.h"
6 bool raycast(v3f64 pos, v3f64 dir, f64 len, v3s32 *node_pos, NodeType *node)
8 f64 dir_len = sqrt(dir.x * dir.x + dir.y * dir.y + dir.z * dir.z);
11 *node = terrain_get_node(client_terrain,
12 *node_pos = (v3s32) {floor(pos.x + 0.5), floor(pos.y + 0.5), floor(pos.z + 0.5)}).type;
14 if (*node == NODE_UNLOADED)
17 if (client_node_defs[*node].pointable)
20 f64 vpos[3] = {pos.x, pos.y, pos.z};
21 f64 vdir[3] = {dir.x, dir.y, dir.z};
24 for (int i = 0; i < 3; i++) {
28 f64 p = vpos[i] + 0.5;
29 f64 d = vdir[i] / fabs(vdir[i]);
36 f64 mul = f / vdir[i];
37 if (min_mul > mul && mul)
41 pos = v3f64_add(pos, v3f64_scale(dir, min_mul));
42 len -= dir_len * min_mul;