Example #1
0
 private void SetMaterials()
 {
     //ensure materials
     if (wireframeMaterial == null)
     {
         wireframeMaterial = BoundsControlVisualUtils.CreateDefaultMaterial();
     }
 }
 internal void SetHighlighted()
 {
     //update the box material to the grabbed material
     if (boxDisplay != null)
     {
         BoundsControlVisualUtils.ApplyMaterialToAllRenderers(boxDisplay, boxGrabbedMaterial);
     }
 }
 internal void ResetVisibility(bool activate)
 {
     //set box display visibility
     if (boxDisplay != null)
     {
         boxDisplay.SetActive(activate);
         BoundsControlVisualUtils.ApplyMaterialToAllRenderers(boxDisplay, boxMaterial);
     }
 }
        private void CreateHandles(Transform parent, bool drawManipulationTether)
        {
            for (int i = 0; i < edgeCenters.Length; ++i)
            {
                GameObject midpoint = new GameObject();
                midpoint.name = "midpoint_" + i.ToString();
                midpoint.transform.position = edgeCenters[i];
                midpoint.transform.parent   = parent;

                GameObject midpointVisual;
                GameObject prefabType = HandlePrefab;
                if (prefabType != null)
                {
                    midpointVisual = GameObject.Instantiate(prefabType);
                }
                else
                {
                    midpointVisual = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                    GameObject.Destroy(midpointVisual.GetComponent <SphereCollider>());
                }

                // Align handle with its edge assuming that the prefab is initially aligned with the up direction
                if (edgeAxes[i] == CardinalAxisType.X)
                {
                    Quaternion realignment = Quaternion.FromToRotation(Vector3.up, Vector3.right);
                    midpointVisual.transform.localRotation = realignment * midpointVisual.transform.localRotation;
                }
                else if (edgeAxes[i] == CardinalAxisType.Z)
                {
                    Quaternion realignment = Quaternion.FromToRotation(Vector3.up, Vector3.forward);
                    midpointVisual.transform.localRotation = realignment * midpointVisual.transform.localRotation;
                }

                Bounds midpointBounds = BoundsControlVisualUtils.GetMaxBounds(midpointVisual);
                float  maxDim         = Mathf.Max(
                    Mathf.Max(midpointBounds.size.x, midpointBounds.size.y),
                    midpointBounds.size.z);
                float invScale = HandleSize / maxDim;

                midpointVisual.name                    = "visuals";
                midpointVisual.transform.parent        = midpoint.transform;
                midpointVisual.transform.localScale    = new Vector3(invScale, invScale, invScale);
                midpointVisual.transform.localPosition = Vector3.zero;

                BoundsControlVisualUtils.AddComponentsToAffordance(midpoint, new Bounds(midpointBounds.center * invScale, midpointBounds.size * invScale),
                                                                   rotationHandlePrefabColliderType, CursorContextInfo.CursorAction.Rotate, ColliderPadding, parent, drawManipulationTether);

                handles.Add(midpoint.transform);

                if (HandleMaterial != null)
                {
                    BoundsControlVisualUtils.ApplyMaterialToAllRenderers(midpointVisual, HandleMaterial);
                }
            }
        }
 internal protected void SetMaterials()
 {
     if (handleMaterial == null)
     {
         handleMaterial = BoundsControlVisualUtils.CreateDefaultMaterial();
     }
     if (handleGrabbedMaterial == null && handleGrabbedMaterial != handleMaterial)
     {
         handleGrabbedMaterial = BoundsControlVisualUtils.CreateDefaultMaterial();
     }
 }
 internal void ResetHandleVisibility(bool isVisible)
 {
     if (handles != null)
     {
         for (int i = 0; i < handles.Count; ++i)
         {
             handles[i].gameObject.SetActive(isVisible && IsVisible(handles[i]));
             BoundsControlVisualUtils.ApplyMaterialToAllRenderers(handles[i].gameObject, handleMaterial);
         }
     }
 }
        internal void AddBoxDisplay(Transform parent, Vector3 currentBoundsExtents, FlattenModeType flattenAxis)
        {
            if (boxMaterial != null)
            {
                bool isFlattened = flattenAxis != FlattenModeType.DoNotFlatten;

                boxDisplay = GameObject.CreatePrimitive(isFlattened ? PrimitiveType.Quad : PrimitiveType.Cube);
                GameObject.Destroy(boxDisplay.GetComponent <Collider>());
                boxDisplay.name = "bounding box";

                BoundsControlVisualUtils.ApplyMaterialToAllRenderers(boxDisplay, boxMaterial);

                boxDisplay.transform.localScale = GetBoxDisplayScale(currentBoundsExtents, flattenAxis);
                boxDisplay.transform.parent     = parent;
            }
        }
 internal void SetHighlighted(Transform handleToHighlight)
 {
     // turn off all handles that aren't the handle we want to highlight
     if (handles != null)
     {
         for (int i = 0; i < handles.Count; ++i)
         {
             if (handles[i] != handleToHighlight)
             {
                 handles[i].gameObject.SetActive(false);
             }
             else
             {
                 BoundsControlVisualUtils.ApplyMaterialToAllRenderers(handles[i].gameObject, handleGrabbedMaterial);
             }
         }
     }
 }
 internal void HandleIgnoreCollider(Collider handlesIgnoreCollider)
 {
     BoundsControlVisualUtils.HandleIgnoreCollider(handlesIgnoreCollider, handles);
 }
        internal void Create(ref Vector3[] boundsCorners, Transform parent, bool drawManipulationTether, bool isFlattened)
        {
            // ensure materials are set
            SetMaterials();

            // create corners
            for (int i = 0; i < boundsCorners.Length; ++i)
            {
                GameObject corner = new GameObject
                {
                    name = "corner_" + i.ToString()
                };
                corner.transform.parent        = parent;
                corner.transform.localPosition = boundsCorners[i];

                GameObject visualsScale = new GameObject();
                visualsScale.name                    = "visualsScale";
                visualsScale.transform.parent        = corner.transform;
                visualsScale.transform.localPosition = Vector3.zero;

                // Compute mirroring scale
                {
                    Vector3 p = boundsCorners[i];
                    visualsScale.transform.localScale = new Vector3(Mathf.Sign(p[0]), Mathf.Sign(p[1]), Mathf.Sign(p[2]));
                }

                // figure out which prefab to instantiate
                GameObject cornerVisual = null;
                GameObject prefabType   = isFlattened ? HandleSlatePrefab : HandlePrefab;
                if (prefabType == null)
                {
                    // instantiate default prefab, a cube. Remove the box collider from it
                    cornerVisual = GameObject.CreatePrimitive(PrimitiveType.Cube);
                    cornerVisual.transform.parent        = visualsScale.transform;
                    cornerVisual.transform.localPosition = Vector3.zero;
                    GameObject.Destroy(cornerVisual.GetComponent <BoxCollider>());
                }
                else
                {
                    cornerVisual = GameObject.Instantiate(prefabType, visualsScale.transform);
                }

                if (isFlattened)
                {
                    // Rotate 2D slate handle asset for proper orientation
                    cornerVisual.transform.Rotate(0, 0, -90);
                }

                cornerVisual.name = "visuals";

                // this is the size of the corner visuals
                var   cornerbounds = BoundsControlVisualUtils.GetMaxBounds(cornerVisual);
                float maxDim       = Mathf.Max(Mathf.Max(cornerbounds.size.x, cornerbounds.size.y), cornerbounds.size.z);
                cornerbounds.size = maxDim * Vector3.one;

                // we need to multiply by this amount to get to desired scale handle size
                var invScale = HandleSize / cornerbounds.size.x;
                cornerVisual.transform.localScale = new Vector3(invScale, invScale, invScale);

                BoundsControlVisualUtils.ApplyMaterialToAllRenderers(cornerVisual, HandleMaterial);

                BoundsControlVisualUtils.AddComponentsToAffordance(corner, new Bounds(cornerbounds.center * invScale, cornerbounds.size * invScale),
                                                                   RotationHandlePrefabCollider.Box, CursorContextInfo.CursorAction.Scale, ColliderPadding, parent, drawManipulationTether);
                handles.Add(corner.transform);
            }
        }