public void CalculateGravityFields() { if (_attractorInfo.Count == 0) { return; } //settup closest valid attractor element on each group for (int i = 0; i < _attractorInfo.Count; i++) { if (_attractorInfo[i].CanApplyGravity && _attractorInfo[i].AttractorRef.CurrentGroup != null) { _attractorInfo[i].AttractorRef.CurrentGroup.AttemptToSetNewClosestGravityField(_attractorInfo[i].AttractorRef, _attractorInfo[i].SqrDistance); } } //invalidate all attractor that are not the closest in each group for (int i = 0; i < _attractorInfo.Count; i++) { if (_attractorInfo[i].CanApplyGravity && _attractorInfo[i].AttractorRef.CurrentGroup != null) { bool canReallyApplyGravity = _attractorInfo[i].AttractorRef.CurrentGroup.IsTheValidOneInTheGroup(_attractorInfo[i].AttractorRef); if (_attractorInfo[i].CanApplyGravity != canReallyApplyGravity) { _tmpAttractorInfo = _attractorInfo[i]; _tmpAttractorInfo.CanApplyGravity = canReallyApplyGravity; _attractorInfo[i] = _tmpAttractorInfo; } } } //find closest index _closestIndex = -1; float shortestDistance = 9999999; for (int i = 0; i < _attractorInfo.Count; i++) { if (!_attractorInfo[i].CanApplyGravity) { continue; } if (_closestIndex == -1 || _attractorInfo[i].SqrDistance < shortestDistance) { _closestIndex = i; shortestDistance = _attractorInfo[i].SqrDistance; } } if (_closestIndex == -1) { return; } _closestAttractor = _attractorInfo[_closestIndex]; }
public void SetupGravityFields(List <Attractor> attractorApplyingForce, Vector3 position) { //calculate all force from all shape (even the ones in the same groups) _attractorInfo.Clear(); _forceAmount.Clear(); for (int i = 0; i < attractorApplyingForce.Count; i++) { Vector3 closestPoint = Vector3.zero; _tmpAttractorInfo = attractorApplyingForce[i].GetGravityDirectionFromPointInSpace(position, ref closestPoint); if (_tmpAttractorInfo.AttractorRef.CurrentGroup != null) { _tmpAttractorInfo.AttractorRef.CurrentGroup.ResetGroup(); } _attractorInfo.Add(_tmpAttractorInfo); _forceAmount.Add(0); } }
public void RemoveAttractorFromOneDirection(Vector3 directionToIgnore, float dotMargin) { //settup closest valid attractor element on each group for (int i = _attractorInfo.Count - 1; i >= 0; i--) { if (_attractorInfo[i].CanApplyGravity && i != _closestIndex) { float dotGravity = Vector3.Dot(_attractorInfo[i].NormalizedDirection, directionToIgnore); //Debug.Log("dot: " + dotGravity); if (dotGravity > dotMargin) { //Debug.Log("remove " + _attractorInfo[i].AttractorRef, _attractorInfo[i].AttractorRef.gameObject); //_attractorInfo.RemoveAt(i); _tmpAttractorInfo = _attractorInfo[i]; _tmpAttractorInfo.CanApplyGravity = false; _attractorInfo[i] = _tmpAttractorInfo; //_forceAmount.RemoveAt(i); } } } }