コード例 #1
0
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);
}
コード例 #2
0
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());
}