コード例 #1
0
    private void GetClosestPointCandidatesImpl(Vector3 scale, Pose pose, ISupportClosestPointQueries<T> otherPartition, Vector3 otherScale, Pose otherPose, Func<T, T, float> callback)
    {
      // Test leaf nodes against other partition.

      // Use a wrapper for the callback to reduce the parameters from Func<T, T, float> to 
      // Func<T, float>.
      ClosestPointCallbackWrapper<T> callbackWrapper = ClosestPointCallbackWrapper<T>.Create();
      callbackWrapper.OriginalCallback = callback;

      // Prepare transformation to transform leaf AABBs into local space of other partition.
      Pose toOther = otherPose.Inverse * pose;
      Vector3 otherScaleInverse = Vector3.One / otherScale;

      float closestPointDistanceSquared = float.PositiveInfinity;
      foreach (var leaf in _leaves.Values)
      {
        callbackWrapper.Item = leaf.Item;

        // Transform AABB into local space of other partition.
        Aabb aabb = leaf.Aabb.GetAabb(scale, toOther);
        aabb.Scale(otherScaleInverse);

        closestPointDistanceSquared = otherPartition.GetClosestPointCandidates(aabb, closestPointDistanceSquared, callbackWrapper.Callback);
        if (closestPointDistanceSquared < 0)
        {
          // closestPointDistanceSquared == -1 indicates early exit.
          break;
        }
      }

      callbackWrapper.Recycle();
    }
コード例 #2
0
        private void GetClosestPointCandidatesImpl(Vector3F scale, Pose pose, ISupportClosestPointQueries<int> otherPartition, Vector3F otherScale, Pose otherPose, Func<int, int, float> callback)
        {
            // Test leaf nodes against other partition.

              // Use a wrapper for the callback to reduce the parameters from Func<T, T, float> to
              // Func<T, float>.
              ClosestPointCallbackWrapper<int> callbackWrapper = ClosestPointCallbackWrapper<int>.Create();
              callbackWrapper.OriginalCallback = callback;

              // Prepare transformation to transform leaf AABBs into local space of other partition.
              Pose toOther = otherPose.Inverse * pose;
              Vector3F otherScaleInverse = Vector3F.One / otherScale;

              float closestPointDistanceSquared = float.PositiveInfinity;
              foreach (Node node in _nodes)
              {
            if (node.IsLeaf)
            {
              callbackWrapper.Item = node.Item;

              // Transform AABB into local space of other partition.
              Aabb aabb = GetAabb(node).GetAabb(scale, toOther);
              aabb.Scale(otherScaleInverse);

              closestPointDistanceSquared = otherPartition.GetClosestPointCandidates(aabb, closestPointDistanceSquared, callbackWrapper.Callback);
              if (closestPointDistanceSquared < 0)
              {
            // closestPointDistanceSquared == -1 indicates early exit.
            break;
              }
            }
              }

              callbackWrapper.Recycle();
        }