Example #1
0
        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];
        }
Example #2
0
 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);
     }
 }
Example #3
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);
             }
         }
     }
 }