private void SaveCollisionEnterData(EventManager.EDCollisionEnter event1, EventManager.EDCollisionEnter event2)
    {
        // create collision data
        CollEnterDataBundle collEnterData1 = new CollEnterDataBundle(event1);
        CollEnterDataBundle collEnterData2 = new CollEnterDataBundle(event2);

        // calculate collision momentum if desired
        if (event1.momentumCalcRequired || event2.momentumCalcRequired)
        {
            // calculate collision momentum for non static objects
            if (!event1.interactionCont.SupportsInteraction(INTERACTION.COLL_IS_STATIC))
            {
                collEnterData1.collMomentum = GetCollMomentum(event1.collision2D, event1.collisionCont);
            }
            if (!event2.interactionCont.SupportsInteraction(INTERACTION.COLL_IS_STATIC))
            {
                collEnterData2.collMomentum = GetCollMomentum(event2.collision2D, event2.collisionCont);
            }
        }

        // create the internal data
        CollisionEnterDataInternal internalData = new CollisionEnterDataInternal(collEnterData1, collEnterData2);

        internalCollEnterData.Add(internalData);

        // save collision enter data for both objects
        SaveDataHelper <CollisionEnterDataInternal, CollEnterDataBundle, CollisionEnterData>(event1.interactionCont, event2.interactionCont,
                                                                                             internalData, collEnterData1, collEnterData2, AddCollisionEnterDataToInfoBundle);
        SaveDataHelper <CollisionEnterDataInternal, CollEnterDataBundle, CollisionEnterData>(event2.interactionCont, event1.interactionCont,
                                                                                             internalData, collEnterData2, collEnterData1, AddCollisionEnterDataToInfoBundle);
    }
 public CollEnterDataBundle(EventManager.EDCollisionEnter collEvent)
 {
     collision       = new Coll2D(collEvent.flippedColl ? collEvent.collider : collEvent.collision2D.collider, collEvent.collision2D, collEvent.flippedColl);
     collisionCont   = collEvent.collisionCont;
     callback        = collEvent.collisionCallback;
     interactionCont = collEvent.interactionCont;
 }
 public void OnCollisionEnterEvent(EventManager.EDCollisionEnter eventData)
 {
     OrganizeEvent(eventData.interactionCont, eventData.otherInteractionCont, eventData, collEnterEventData, CollEnterMatches, SaveCollisionEnterData);
 }
 private bool CollEnterMatches(EventManager.EDCollisionEnter coll1, EventManager.EDCollisionEnter coll2)
 {
     return(coll1.collider == coll2.collision2D.collider && coll2.collider == coll1.collision2D.collider);
 }
    private void CompleteUnmatchedEvents()
    {
        // report unmatched events
        // TODO : option to pass dummy data with unmatched event to complete it
        foreach (KeyValuePair <int, List <EventManager.EDCollisionEnter> > eventList in collEnterEventData)
        {
            foreach (EventManager.EDCollisionEnter eventData in eventList.Value)
            {
                EventManager.EDCollisionEnter flippedEventData = new EventManager.EDCollisionEnter();
                flippedEventData.collider             = eventData.collider;
                flippedEventData.interactionCont      = eventData.otherInteractionCont;
                flippedEventData.otherInteractionCont = eventData.interactionCont;
                flippedEventData.collisionCont        = eventData.otherInteractionCont.GetRbodyCollCont();
                flippedEventData.collision2D          = eventData.collision2D;
                flippedEventData.momentumCalcRequired = eventData.momentumCalcRequired;
                flippedEventData.flippedColl          = true;

                // if either collider is null do not save
                if (eventData.collider == null || flippedEventData.collider == null)
                {
                    return;
                }
                SaveCollisionEnterData(eventData, flippedEventData);
            }
        }
        foreach (KeyValuePair <int, List <EventManager.EDCollisionStay> > eventList in collStayEventData)
        {
            foreach (EventManager.EDCollisionStay eventData in eventList.Value)
            {
                EventManager.EDCollisionStay flippedEventData = new EventManager.EDCollisionStay();
                flippedEventData.collider             = eventData.collider;
                flippedEventData.interactionCont      = eventData.otherInteractionCont;
                flippedEventData.otherInteractionCont = eventData.interactionCont;
                flippedEventData.collisionCont        = eventData.otherInteractionCont.GetRbodyCollCont();
                flippedEventData.collision2D          = eventData.collision2D;
                flippedEventData.flippedColl          = true;
                SaveCollisionStayData(eventData, flippedEventData);
            }
        }
        foreach (KeyValuePair <int, List <EventManager.EDCollisionExit> > eventList in collExitEventData)
        {
            foreach (EventManager.EDCollisionExit eventData in eventList.Value)
            {
                EventManager.EDCollisionExit flippedEventData = new EventManager.EDCollisionExit();
                flippedEventData.collider             = eventData.collider;
                flippedEventData.interactionCont      = eventData.otherInteractionCont;
                flippedEventData.otherInteractionCont = eventData.interactionCont;
                flippedEventData.collisionCont        = eventData.otherInteractionCont.GetRbodyCollCont();
                flippedEventData.collision2D          = eventData.collision2D;
                flippedEventData.flippedColl          = true;
                SaveCollisionExitData(eventData, flippedEventData);
            }
        }

        foreach (KeyValuePair <int, List <EventManager.EDTriggerEnter> > eventList in triggerEnterEventData)
        {
            foreach (EventManager.EDTriggerEnter eventData in eventList.Value)
            {
                EventManager.EDTriggerEnter flippedEventData = new EventManager.EDTriggerEnter();
                flippedEventData.collider             = eventData.eventCollider;
                flippedEventData.eventCollider        = eventData.collider;
                flippedEventData.interactionCont      = eventData.otherInteractionCont;
                flippedEventData.otherInteractionCont = eventData.interactionCont;
                flippedEventData.collisionCont        = eventData.otherInteractionCont.GetRbodyCollCont();
                SaveTriggerEnterData(eventData, flippedEventData);
            }
        }
        foreach (KeyValuePair <int, List <EventManager.EDTriggerStay> > eventList in triggerStayEventData)
        {
            foreach (EventManager.EDTriggerStay eventData in eventList.Value)
            {
                EventManager.EDTriggerStay flippedEventData = new EventManager.EDTriggerStay();
                flippedEventData.collider             = eventData.eventCollider;
                flippedEventData.eventCollider        = eventData.collider;
                flippedEventData.interactionCont      = eventData.otherInteractionCont;
                flippedEventData.otherInteractionCont = eventData.interactionCont;
                flippedEventData.collisionCont        = eventData.otherInteractionCont.GetRbodyCollCont();
                SaveTriggerStayData(eventData, flippedEventData);
            }
        }
        foreach (KeyValuePair <int, List <EventManager.EDTriggerExit> > eventList in triggerExitEventData)
        {
            foreach (EventManager.EDTriggerExit eventData in eventList.Value)
            {
                EventManager.EDTriggerExit flippedEventData = new EventManager.EDTriggerExit();
                flippedEventData.collider             = eventData.eventCollider;
                flippedEventData.eventCollider        = eventData.collider;
                flippedEventData.interactionCont      = eventData.otherInteractionCont;
                flippedEventData.otherInteractionCont = eventData.interactionCont;
                flippedEventData.collisionCont        = eventData.otherInteractionCont.GetRbodyCollCont();
                SaveTriggerExitData(eventData, flippedEventData);
            }
        }
    }