Esempio n. 1
0
    void UpdateActorSelection()
    {
        Camera camera = editMain.GetCamera();

        Vector2 dragMinViewport  = camera.ScreenToViewportPoint(Vector2.Min(startScreenCorner, endScreenCorner));
        Vector2 dragMaxViewport  = camera.ScreenToViewportPoint(Vector2.Max(startScreenCorner, endScreenCorner));
        Rect    dragViewportRect = new Rect(dragMinViewport, dragMaxViewport - dragMinViewport);


        Vector3[] dragFarWorldCorners = new Vector3[4];
        camera.CalculateFrustumCorners(dragViewportRect, MAX_DIST, Camera.MonoOrStereoscopicEye.Mono, dragFarWorldCorners);

        float dragBoxWidth = Mathf.Abs(dragFarWorldCorners[1].x - dragFarWorldCorners[2].x);
        float dragBoxHeigh = Mathf.Abs(dragFarWorldCorners[1].y - dragFarWorldCorners[0].y);

        Ray        centerRay     = camera.ScreenPointToRay(Vector2.Lerp(startScreenCorner, endScreenCorner, .5f));
        Vector3    dragBoxCenter = centerRay.GetPoint(MAX_DIST / 2f);
        Vector3    halfExtents   = new Vector3(dragBoxWidth / 2f, dragBoxHeigh / 2f, MAX_DIST / 2f);
        Quaternion rotation      = Quaternion.LookRotation(centerRay.direction, dragFarWorldCorners[1] - dragFarWorldCorners[0]);

        Collider[] colliders = Physics.OverlapBox(dragBoxCenter, halfExtents, rotation, userMain.GetLayerMask(), QueryTriggerInteraction.Collide);

        HashSet <VoosActor> actorsToAdd = new HashSet <VoosActor>();

        foreach (Collider collider in colliders)
        {
            VoosActor maybeActor = collider.GetComponentInParent <VoosActor>();
            if (maybeActor != null)
            {
                Vector3 viewportPosition = camera.WorldToViewportPoint(maybeActor.GetWorldRenderBoundsCenter());
                if (viewportPosition.z > 0 && dragViewportRect.Contains(viewportPosition))
                {
                    actorsToAdd.Add(maybeActor);
                }
            }
        }

        // it feels like there should be a better way of finding these add/remove lists?
        HashSet <VoosActor> actorsToRemove = new HashSet <VoosActor>(selectedActors);

        actorsToRemove.ExceptWith(actorsToAdd);
        actorsToAdd.ExceptWith(selectedActors);

        foreach (VoosActor actor in actorsToRemove)
        {
            //editMain.RemoveTargetActor(actor);

            selectedActors.Remove(actor);
            selectedFeedback[actor].RequestDestroy();
            selectedFeedback.Remove(actor);
        }

        foreach (VoosActor actor in actorsToAdd)
        {
            //editMain.AddTargetActor(actor);
            selectedActors.Add(actor);
            SelectionFeedback feedback = Instantiate(editMain.targetFeedbackPrefab);
            feedback.scaleMod = 1.1f;
            feedback.SetActor(actor);
            selectedFeedback[actor] = feedback;
        }
    }