22 static const float big_number = std::numeric_limits<float>::max();
23 vec3 xmin(big_number, big_number, big_number), xmax(-big_number, -big_number, -big_number),
24 ymin(big_number, big_number, big_number), ymax(-big_number, -big_number, -big_number),
25 zmin(big_number, big_number, big_number), zmax(-big_number, -big_number, -big_number), dia1, dia2;
28 const char* points = point_buffer;
29 for(
unsigned int i = 0; i < point_count; ++i, points += point_stride)
31 const vec3& p = *(vec3*)points;
47 float dx = xmax.x - xmin.x;
48 float dy = xmax.y - xmin.y;
49 float dz = xmax.z - xmin.z;
50 float xspan = dx * dx + dy * dy + dz * dz;
56 float yspan = dx * dx + dy * dy + dz * dz;
61 float zspan = dx * dx + dy * dy + dz * dz;
66 float maxspan = xspan;
83 position.x = (dia1.x + dia2.x) * 0.5f;
84 position.y = (dia1.y + dia2.y) * 0.5f;
85 position.z = (dia1.z + dia2.z) * 0.5f;
90 float radiusSq = dx * dx + dy * dy + dz * dz;
91 radius = glm::sqrt(radiusSq);
94 points = point_buffer;
95 for(
unsigned int i = 0; i < point_count; ++i, points += point_stride)
97 const vec3& p = *(vec3*)points;
101 float old_to_p_sq = dx * dx + dy * dy + dz * dz;
102 if(old_to_p_sq > radiusSq)
105 float old_to_p = glm::sqrt(old_to_p_sq);
109 float old_to_new = old_to_p -
radius;
111 float recip = 1.0f / old_to_p;
bsphere & from_points(const char *point_buffer, unsigned int point_count, unsigned int point_stride)
Calculates a tight fitting bounding sphere from the points supplied.