Compute nodes' enclosing radius in the same place.

This commit is contained in:
Andrzej Kapolka 2013-05-21 13:32:41 -07:00
parent 1118c06f5d
commit 0377ca1adb
3 changed files with 8 additions and 8 deletions

View file

@ -247,6 +247,10 @@ void VoxelNode::printDebugDetails(const char* label) const {
printOctalCode(_octalCode); printOctalCode(_octalCode);
} }
float VoxelNode::getEnclosingRadius() const {
return getScale() * sqrtf(3.0f) / 2.0f;
}
bool VoxelNode::isInView(const ViewFrustum& viewFrustum) const { bool VoxelNode::isInView(const ViewFrustum& viewFrustum) const {
AABox box = _box; // use temporary box so we can scale it AABox box = _box; // use temporary box so we can scale it
box.scale(TREE_SCALE); box.scale(TREE_SCALE);

View file

@ -57,6 +57,8 @@ public:
float getScale() const { return _box.getSize().x; /* voxelScale = (1 / powf(2, *node->getOctalCode())); */ }; float getScale() const { return _box.getSize().x; /* voxelScale = (1 / powf(2, *node->getOctalCode())); */ };
int getLevel() const { return *_octalCode + 1; /* one based or zero based? */ }; int getLevel() const { return *_octalCode + 1; /* one based or zero based? */ };
float getEnclosingRadius() const;
bool isColored() const { return (_trueColor[3]==1); }; bool isColored() const { return (_trueColor[3]==1); };
bool isInView(const ViewFrustum& viewFrustum) const; bool isInView(const ViewFrustum& viewFrustum) const;
ViewFrustum::location inFrustum(const ViewFrustum& viewFrustum) const; ViewFrustum::location inFrustum(const ViewFrustum& viewFrustum) const;

View file

@ -693,12 +693,9 @@ bool findSpherePenetrationOp(VoxelNode* node, void* extraData) {
// currently, we treat each node as a sphere enveloping the box // currently, we treat each node as a sphere enveloping the box
const glm::vec3& nodeCenter = node->getCenter(); const glm::vec3& nodeCenter = node->getCenter();
float halfNodeScale = node->getScale() * 0.5f;
float halfNodeScale2 = halfNodeScale * halfNodeScale;
float nodeRadius = sqrtf(halfNodeScale2*3.0f);
glm::vec3 vector = args->center - nodeCenter; glm::vec3 vector = args->center - nodeCenter;
float vectorLength = glm::length(vector); float vectorLength = glm::length(vector);
float distance = vectorLength - nodeRadius - args->radius; float distance = vectorLength - node->getEnclosingRadius() - args->radius;
if (distance >= 0.0f) { if (distance >= 0.0f) {
return false; return false;
} }
@ -748,12 +745,9 @@ bool findCapsulePenetrationOp(VoxelNode* node, void* extraData) {
// currently, we treat each node as a sphere enveloping the box // currently, we treat each node as a sphere enveloping the box
const glm::vec3& nodeCenter = node->getCenter(); const glm::vec3& nodeCenter = node->getCenter();
float halfNodeScale = node->getScale() * 0.5f;
float halfNodeScale2 = halfNodeScale * halfNodeScale;
float nodeRadius = sqrtf(halfNodeScale2*3.0f);
glm::vec3 vector = computeVectorFromPointToSegment(nodeCenter, args->start, args->end); glm::vec3 vector = computeVectorFromPointToSegment(nodeCenter, args->start, args->end);
float vectorLength = glm::length(vector); float vectorLength = glm::length(vector);
float distance = vectorLength - nodeRadius - args->radius; float distance = vectorLength - node->getEnclosingRadius() - args->radius;
if (distance >= 0.0f) { if (distance >= 0.0f) {
return false; return false;
} }