void dgCollisionScene::ImproveTotalFitness() { dgInt32 maxPasses = 2 * exp_2(m_fitnessList.GetCount()) + 1; dgFloat64 newCost = dgFloat32(1.0e20f); dgFloat64 prevCost = newCost; do { prevCost = newCost; for (dgList<dgNode*>::dgListNode* node = m_fitnessList.GetFirst(); node; node = node->GetNext()) { ImproveNodeFitness(node->GetInfo()); } newCost = dgFloat32(0.0f); for (dgList<dgNode*>::dgListNode* node = m_fitnessList.GetFirst(); node; node = node->GetNext()) { newCost += node->GetInfo()->m_surfaceArea; } maxPasses--; } while (maxPasses && (newCost < prevCost)); SetCollisionBBox(m_rootNode->m_minBox, m_rootNode->m_maxBox); }
void dgCollisionDeformableMesh::ImproveTotalFitness() { dgInt32 count = m_nodesCount - m_trianglesCount; dgInt32 maxPasses = 2 * dgExp2 (count) + 1; dgDeformableNode* const nodes = &m_nodesMemory[m_trianglesCount]; dgFloat64 newCost = dgFloat32 (1.0e20f); dgFloat64 prevCost = newCost; do { prevCost = newCost; for (dgInt32 i = 0; i < count; i ++) { dgDeformableNode* const node = &nodes[i]; ImproveNodeFitness (node); } newCost = dgFloat32 (0.0f); for (dgInt32 i = 0; i < count; i ++) { const dgDeformableNode* const node = &nodes[i]; newCost += node->m_surfaceArea; } maxPasses --; } while (maxPasses && (newCost < (prevCost * dgFloat32 (0.9f)))); dgAssert (SanityCheck()); }