A.child2 = iG; G.parent = iA; A.aabb.combine(B.aabb, G.aabb); C.aabb.combine(A.aabb, F.aabb); A.child2 = iF; F.parent = iA; A.aabb.combine(B.aabb, F.aabb); C.aabb.combine(A.aabb, G.aabb); A.child1 = iE; E.parent = iA; A.aabb.combine(C.aabb, E.aabb); B.aabb.combine(A.aabb, D.aabb); A.child1 = iD; D.parent = iA; A.aabb.combine(C.aabb, D.aabb); B.aabb.combine(A.aabb, E.aabb);
m_child2[A] = iG; m_parent[G] = iA; m_aabb[A].combine(m_aabb[B], m_aabb[G]); m_aabb[C].combine(m_aabb[A], m_aabb[F]); m_child2[A] = iF; m_parent[F] = iA; m_aabb[A].combine(m_aabb[B], m_aabb[F]); m_aabb[C].combine(m_aabb[A], m_aabb[G]); m_child1[A] = iE; m_parent[E] = iA; m_aabb[A].combine(m_aabb[C], m_aabb[E]); m_aabb[B].combine(m_aabb[A], m_aabb[D]); m_child1[A] = iD; m_parent[D] = iA; m_aabb[A].combine(m_aabb[C], m_aabb[D]); m_aabb[B].combine(m_aabb[A], m_aabb[E]);
combinedAABB.combine(node.aabb, leafAABB); float combinedArea = combinedAABB.getPerimeter(); combinedAABB.combine(leafAABB, child1.aabb); cost1 = combinedAABB.getPerimeter() + inheritanceCost; } else { combinedAABB.combine(leafAABB, child1.aabb); float oldArea = child1.aabb.getPerimeter(); float newArea = combinedAABB.getPerimeter(); combinedAABB.combine(leafAABB, child2.aabb); cost2 = combinedAABB.getPerimeter() + inheritanceCost; } else { combinedAABB.combine(leafAABB, child2.aabb); float oldArea = child2.aabb.getPerimeter(); float newArea = combinedAABB.getPerimeter(); newParent.parent = oldParent; newParent.userData = null; newParent.aabb.combine(leafAABB, sibling.aabb); newParent.height = sibling.height + 1; index.aabb.combine(child1.aabb, child2.aabb);
combinedAABB.combine(nodeAABB, leafAABB); float combinedArea = combinedAABB.getPerimeter(); AABB child1AABB = m_aabb[child1]; if (m_child1[child1] == NULL_NODE) { combinedAABB.combine(leafAABB, child1AABB); cost1 = combinedAABB.getPerimeter() + inheritanceCost; } else { combinedAABB.combine(leafAABB, child1AABB); float oldArea = child1AABB.getPerimeter(); float newArea = combinedAABB.getPerimeter(); AABB child2AABB = m_aabb[child2]; if (m_child1[child2] == NULL_NODE) { combinedAABB.combine(leafAABB, child2AABB); cost2 = combinedAABB.getPerimeter() + inheritanceCost; } else { combinedAABB.combine(leafAABB, child2AABB); float oldArea = child2AABB.getPerimeter(); float newArea = combinedAABB.getPerimeter(); m_parent[newParent] = oldParent; m_userData[newParent] = null; m_aabb[newParent].combine(leafAABB, m_aabb[sibling]); m_height[newParent] = m_height[sibling] + 1; m_aabb[index].combine(m_aabb[child1], m_aabb[child2]);
DynamicTreeNode child2 = index.child2; index.aabb.combine(child1.aabb, child2.aabb); index.height = 1 + MathUtils.max(child1.height, child2.height);
int child2 = m_child2[index]; m_aabb[index].combine(m_aabb[child1], m_aabb[child2]); m_height[index] = 1 + MathUtils.max(m_height[child1], m_height[child2]);
private void validateMetrics(DynamicTreeNode node) { if (node == null) { return; } DynamicTreeNode child1 = node.child1; DynamicTreeNode child2 = node.child2; if (node.child1 == null) { assert (child1 == null); assert (child2 == null); assert (node.height == 0); return; } assert (child1 != null && 0 <= child1.id && child1.id < m_nodeCapacity); assert (child2 != null && 0 <= child2.id && child2.id < m_nodeCapacity); int height1 = child1.height; int height2 = child2.height; int height; height = 1 + MathUtils.max(height1, height2); assert (node.height == height); AABB aabb = new AABB(); aabb.combine(child1.aabb, child2.aabb); assert (aabb.lowerBound.equals(node.aabb.lowerBound)); assert (aabb.upperBound.equals(node.aabb.upperBound)); validateMetrics(child1); validateMetrics(child2); }
private void validateMetrics(int node) { if (node == NULL_NODE) { return; } int child1 = m_child1[node]; int child2 = m_child2[node]; if (child1 == NULL_NODE) { assert (child1 == NULL_NODE); assert (child2 == NULL_NODE); assert (m_height[node] == 0); return; } assert (child1 != NULL_NODE && 0 <= child1 && child1 < m_nodeCapacity); assert (child2 != child1 && 0 <= child2 && child2 < m_nodeCapacity); int height1 = m_height[child1]; int height2 = m_height[child2]; int height; height = 1 + MathUtils.max(height1, height2); assert (m_height[node] == height); AABB aabb = new AABB(); aabb.combine(m_aabb[child1], m_aabb[child2]); assert (aabb.lowerBound.equals(m_aabb[node].lowerBound)); assert (aabb.upperBound.equals(m_aabb[node].upperBound)); validateMetrics(child1); validateMetrics(child2); }
AABB childAABB = temp2; shape.computeAABB(childAABB, identity, childIndex); aabb.combine(childAABB);
m_child2[A] = iG; m_parent[G] = iA; m_aabb[A].combine(m_aabb[B], m_aabb[G]); m_aabb[C].combine(m_aabb[A], m_aabb[F]); m_child2[A] = iF; m_parent[F] = iA; m_aabb[A].combine(m_aabb[B], m_aabb[F]); m_aabb[C].combine(m_aabb[A], m_aabb[G]); m_child1[A] = iE; m_parent[E] = iA; m_aabb[A].combine(m_aabb[C], m_aabb[E]); m_aabb[B].combine(m_aabb[A], m_aabb[D]); m_child1[A] = iD; m_parent[D] = iA; m_aabb[A].combine(m_aabb[C], m_aabb[D]); m_aabb[B].combine(m_aabb[A], m_aabb[E]);
A.child2 = iG; G.parent = iA; A.aabb.combine(B.aabb, G.aabb); C.aabb.combine(A.aabb, F.aabb); A.child2 = iF; F.parent = iA; A.aabb.combine(B.aabb, F.aabb); C.aabb.combine(A.aabb, G.aabb); A.child1 = iE; E.parent = iA; A.aabb.combine(C.aabb, E.aabb); B.aabb.combine(A.aabb, D.aabb); A.child1 = iD; D.parent = iA; A.aabb.combine(C.aabb, D.aabb); B.aabb.combine(A.aabb, E.aabb);
combinedAABB.combine(node.aabb, leafAABB); float combinedArea = combinedAABB.getPerimeter(); combinedAABB.combine(leafAABB, child1.aabb); cost1 = combinedAABB.getPerimeter() + inheritanceCost; } else { combinedAABB.combine(leafAABB, child1.aabb); float oldArea = child1.aabb.getPerimeter(); float newArea = combinedAABB.getPerimeter(); combinedAABB.combine(leafAABB, child2.aabb); cost2 = combinedAABB.getPerimeter() + inheritanceCost; } else { combinedAABB.combine(leafAABB, child2.aabb); float oldArea = child2.aabb.getPerimeter(); float newArea = combinedAABB.getPerimeter(); newParent.parent = oldParent; newParent.userData = null; newParent.aabb.combine(leafAABB, sibling.aabb); newParent.height = sibling.height + 1; index.aabb.combine(child1.aabb, child2.aabb);
combinedAABB.combine(nodeAABB, leafAABB); float combinedArea = combinedAABB.getPerimeter(); AABB child1AABB = m_aabb[child1]; if (m_child1[child1] == NULL_NODE) { combinedAABB.combine(leafAABB, child1AABB); cost1 = combinedAABB.getPerimeter() + inheritanceCost; } else { combinedAABB.combine(leafAABB, child1AABB); float oldArea = child1AABB.getPerimeter(); float newArea = combinedAABB.getPerimeter(); AABB child2AABB = m_aabb[child2]; if (m_child1[child2] == NULL_NODE) { combinedAABB.combine(leafAABB, child2AABB); cost2 = combinedAABB.getPerimeter() + inheritanceCost; } else { combinedAABB.combine(leafAABB, child2AABB); float oldArea = child2AABB.getPerimeter(); float newArea = combinedAABB.getPerimeter(); m_parent[newParent] = oldParent; m_userData[newParent] = null; m_aabb[newParent].combine(leafAABB, m_aabb[sibling]); m_height[newParent] = m_height[sibling] + 1; m_aabb[index].combine(m_aabb[child1], m_aabb[child2]);
DynamicTreeNode child2 = index.child2; index.aabb.combine(child1.aabb, child2.aabb); index.height = 1 + MathUtils.max(child1.height, child2.height);
int child2 = m_child2[index]; m_aabb[index].combine(m_aabb[child1], m_aabb[child2]); m_height[index] = 1 + MathUtils.max(m_height[child1], m_height[child2]);
private void validateMetrics(int node) { if (node == NULL_NODE) { return; } int child1 = m_child1[node]; int child2 = m_child2[node]; if (child1 == NULL_NODE) { assert (child1 == NULL_NODE); assert (child2 == NULL_NODE); assert (m_height[node] == 0); return; } assert (child1 != NULL_NODE && 0 <= child1 && child1 < m_nodeCapacity); assert (child2 != child1 && 0 <= child2 && child2 < m_nodeCapacity); int height1 = m_height[child1]; int height2 = m_height[child2]; int height; height = 1 + MathUtils.max(height1, height2); assert (m_height[node] == height); AABB aabb = new AABB(); aabb.combine(m_aabb[child1], m_aabb[child2]); assert (aabb.lowerBound.equals(m_aabb[node].lowerBound)); assert (aabb.upperBound.equals(m_aabb[node].upperBound)); validateMetrics(child1); validateMetrics(child2); }
private void validateMetrics(DynamicTreeNode node) { if (node == null) { return; } DynamicTreeNode child1 = node.child1; DynamicTreeNode child2 = node.child2; if (node.child1 == null) { assert (child1 == null); assert (child2 == null); assert (node.height == 0); return; } assert (child1 != null && 0 <= child1.id && child1.id < m_nodeCapacity); assert (child2 != null && 0 <= child2.id && child2.id < m_nodeCapacity); int height1 = child1.height; int height2 = child2.height; int height; height = 1 + MathUtils.max(height1, height2); assert (node.height == height); AABB aabb = new AABB(); aabb.combine(child1.aabb, child2.aabb); assert (aabb.lowerBound.equals(node.aabb.lowerBound)); assert (aabb.upperBound.equals(node.aabb.upperBound)); validateMetrics(child1); validateMetrics(child2); }
AABB childAABB = temp2; shape.computeAABB(childAABB, identity, childIndex); aabb.combine(childAABB);