Пример #1
0
/** Utility function that calculates filling factor */
const float CalculateFillingFactor(const FSphere& ASphere, const float AFillingFactor, const FSphere& BSphere, const float BFillingFactor)
{
	const float OverlapVolume = CalculateOverlap( ASphere, AFillingFactor, BSphere, BFillingFactor);
	FSphere UnionSphere = ASphere + BSphere;
	// it shouldn't be zero or it should be checked outside
	ensure(UnionSphere.W != 0.f);

	// http://deim.urv.cat/~rivi/pub/3d/icra04b.pdf
	// cost is calculated based on r^3 / filling factor
	// since it subtract by AFillingFactor * 1/2 overlap volume + BfillingFactor * 1/2 overlap volume
	return FMath::Max(0.0f, (AFillingFactor * ASphere.GetVolume() + BFillingFactor * BSphere.GetVolume() - OverlapVolume) / UnionSphere.GetVolume());
}
Пример #2
0
void ApplyNoteExpulsion (FloatNote * psNote, NotesPersist * psNotesData) {
  float fXForce, fYForce;
  FloatNote * psNoteCount;
  GSList * psNoteListPos;
	float fCoverage;
	float fXDirection, fYDirection, fLength;
	float fFade;

  fXForce = 0.0f;
  fYForce = 0.0f;

  psNoteListPos = psNotesData->psNoteList;
  while (psNoteListPos) {
    psNoteCount = (FloatNote *)psNoteListPos->data;

    if (psNoteCount != psNote) {
    	// Calculate fade
		  fFade = (1.0f - ((psNoteCount->vsAnchor.fZ - psNotesData->fFocusFar + NOTE_FOCUSSHIFT) * NOTE_FOCUSFADE));

			if ((psNoteCount->szText->len > 0) && (fFade > 0.0f) && (fFade < 50.0f))  {
				// Calculate coverage
				fCoverage = CalculateOverlap (psNote->vsPos.fX, psNote->vsSize.fX, psNoteCount->vsPos.fX, psNoteCount->vsSize.fX) * CalculateOverlap (psNote->vsPos.fY, psNote->vsSize.fY, psNoteCount->vsPos.fY, psNoteCount->vsSize.fY);
				if (fCoverage > 0.0f) {
					fXDirection = ((psNote->vsPos.fX + (psNote->vsSize.fX / 2.0f)) - (psNoteCount->vsPos.fX + (psNoteCount->vsSize.fX / 2.0f)));
					fYDirection = ((psNote->vsPos.fY + (psNote->vsSize.fY / 2.0f)) - (psNoteCount->vsPos.fY + (psNoteCount->vsSize.fY / 2.0f)));
					fLength = sqrt ((fXDirection * fXDirection) + (fYDirection * fYDirection));
					fXForce += psNotesData->fExpulsion * (40.0f + fCoverage) * fXDirection * fFade / fLength;
					fYForce += psNotesData->fExpulsion * (40.0f + fCoverage) * fYDirection * fFade / fLength;
				}
			}
    }
    psNoteListPos = psNoteListPos->next;
  }

  psNote->vsVel.fX += 0.01f * fXForce;
  psNote->vsVel.fY += 0.01f * fYForce;
}