/// <summary>
        /// Fills the results array with interaction results based on the given interaction data.
        /// </summary>
        /// <param name="interactionData">The interaction data to create results for.</param>
        /// <param name="results">An array to fill with interaction results.</param>
        /// <returns>The number of results.</returns>
        public override int GetInteractionResultsNonAlloc <T>(T interactionData, IInteractionResult[] results)
        {
            int count = 0;

            ImpactTagMask tagMask = interactionData.TagMask ?? FallbackTagMask;

            for (int i = 0; i < InteractionSetCount || count >= results.Length; i++)
            {
                ImpactMaterialInteractionSet interactionSet = _interactionSets[i];
                populateCollisionResultsForInteractionSet(interactionData, interactionSet, tagMask, results, ref count);
            }

            return(count);
        }
 public void AddInteractionSet(ImpactMaterialInteractionSet item)
 {
     _interactionSets.Add(item);
 }
        private void populateCollisionResultsForInteractionSet <T>(T interactionData, ImpactMaterialInteractionSet interactionSet, ImpactTagMask tagMask, IInteractionResult[] results, ref int count) where T : IInteractionData
        {
            if (interactionSet.CompareTagMaskFilters(tagMask))
            {
                for (int j = 0; j < interactionSet.InteractionCount || count >= results.Length; j++)
                {
                    IInteractionResult c = interactionSet[j].GetInteractionResult(interactionData);
                    if (c == null)
                    {
                        continue;
                    }

                    if (c.IsValid)
                    {
                        results[count] = c;
                        count++;
                    }
                    else
                    {
                        c.Dispose();
                    }
                }
            }
        }