MCPcopy Create free account
hub / github.com/WolfireGames/overgrowth / GetClosestClusters

Function GetClosestClusters

Source/Graphics/kdtreecluster.cpp:33–110  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

31#include <cstdio>
32
33void GetClosestClusters(KDNode &node, const std::vector<vec3> &cluster_center, std::vector<int> candidates) {
34 node.cluster_info.closest_clusters.clear();
35 if (candidates.size() == 1) {
36 node.cluster_info.closest_clusters.push_back(candidates[0]);
37 for (auto &i : node.child) {
38 if (i) {
39 GetClosestClusters(*i,
40 cluster_center,
41 node.cluster_info.closest_clusters);
42 }
43 }
44 }
45 vec3 node_center = node.content_bounds[0] + node.content_bounds[1];
46 int closest_candidate = -1;
47 float closest_dist;
48 float dist;
49 for (unsigned i = 0; i < candidates.size(); ++i) {
50 dist = distance_squared(node_center, cluster_center[candidates[i]]);
51 if (closest_candidate == -1 || dist < closest_dist) {
52 closest_dist = dist;
53 closest_candidate = i;
54 }
55 }
56 node.cluster_info.closest_clusters.clear();
57 node.cluster_info.closest_clusters.push_back(candidates[closest_candidate]);
58 const vec3 &closest_pos = cluster_center[candidates[closest_candidate]];
59 vec3 dir;
60 // int closest_point;
61 // float greatest_dot_amount;
62 // float dot_amount;
63 vec3 corner;
64 vec3 closest_corner;
65 for (int i = 0; i < (int)candidates.size(); ++i) {
66 if (i == closest_candidate) {
67 continue;
68 }
69 const vec3 &other_pos = cluster_center[candidates[i]];
70 if (other_pos[0] >= node.content_bounds[0][0] &&
71 other_pos[1] >= node.content_bounds[0][1] &&
72 other_pos[2] >= node.content_bounds[0][2] &&
73 other_pos[0] <= node.content_bounds[1][0] &&
74 other_pos[1] <= node.content_bounds[1][1] &&
75 other_pos[2] <= node.content_bounds[1][2]) {
76 node.cluster_info.closest_clusters.push_back(candidates[i]);
77 continue;
78 }
79 dir = other_pos - closest_pos;
80 // closest_point = -1;
81 for (unsigned j = 0; j < 8; ++j) {
82 corner = vec3(node.content_bounds[j / 4][0],
83 node.content_bounds[j % 2][1],
84 node.content_bounds[(j / 2) % 2][2]);
85 /*dot_amount = dot(corner, dir);
86 if(closest_point == -1 || dot_amount > greatest_dot_amount){
87 greatest_dot_amount = dot_amount;
88 closest_point = j;
89 closest_corner = corner;
90 }*/

Callers

nothing calls this directly

Calls 5

distance_squaredFunction · 0.70
vec3Class · 0.50
clearMethod · 0.45
sizeMethod · 0.45
push_backMethod · 0.45

Tested by

no test coverage detected