1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
#include "connection.h"
#include "vector.h"
using std::min;
using std::max;
uint32_t Connection::next_id = 0;
Connection::Connection(boost::asio::io_service& io_service_) : io_service(io_service_), socket(io_service_) {
id = ++next_id;
}
float Connection::distance(float px, float pz) {
bool in_width = px > pos.x && px < pos.x+1;
bool in_height = pz > pos.z && pz < pos.z+1;
if(in_width && in_height)
return 0;
Vector2 p(px, pz);
float a = (p - pos.xz()).length();
float b = (p - (pos.xz() + Vector2(1, 0))).length();
float c = (p - (pos.xz() + Vector2(0, 1))).length();
float d = (p - (pos.xz() + Vector2(1, 1))).length();
float dist = min(min(min(a, b), c), d);
if(in_width)
dist = min(dist, (float)min(abs(pos.z - pz), abs(pos.z+1 - pz)));
if(in_height)
dist = min(dist, (float)min(abs(pos.x - px), abs(pos.x+1 - px)));
return dist;
}
std::set<std::pair<int64_t, int64_t> > Connection::check_chunks() {
// TODO: make configurable
const int chunk_size = 32;
const int chunk_dist_threshold = chunk_size*4;
// list of chunks client should hold
std::set<std::pair<int64_t, int64_t> > new_chunks;
int i = pos.x - chunk_dist_threshold;
i -= i % chunk_size;
for(; i < pos.x + chunk_dist_threshold; i += chunk_size) {
int j = pos.z - chunk_dist_threshold;
j -= j % chunk_size;
for(; j < pos.z + chunk_dist_threshold; j += chunk_size) {
if(chunk_indices.find(std::pair<int64_t, int64_t>(i, j)) != chunk_indices.end())
continue;
float a = i - pos.x + chunk_size/2;
float b = j - pos.z + chunk_size/2;
if(sqrtf(a*a + b*b) < chunk_dist_threshold) {
chunk_indices.insert(std::pair<int64_t, int64_t>(i, j));
new_chunks.insert(std::pair<int64_t, int64_t>(i, j));
}
}
}
return new_chunks;
}
uint32_t Connection::get_id() {
return id;
}
|