private void AddLinks()

in Assets/MixedRealityToolkit.SDK/Features/UX/Scripts/BoundingBox/BoundingBox.cs [650:791]


        private void AddLinks()
        {
            edgeCenters = new Vector3[12];

            CalculateEdgeCenters();

            edgeAxes = new CardinalAxisType[12];
            edgeAxes[0] = CardinalAxisType.X;
            edgeAxes[1] = CardinalAxisType.Y;
            edgeAxes[2] = CardinalAxisType.X;
            edgeAxes[3] = CardinalAxisType.Y;
            edgeAxes[4] = CardinalAxisType.X;
            edgeAxes[5] = CardinalAxisType.Y;
            edgeAxes[6] = CardinalAxisType.X;
            edgeAxes[7] = CardinalAxisType.Y;
            edgeAxes[8] = CardinalAxisType.Z;
            edgeAxes[9] = CardinalAxisType.Z;
            edgeAxes[10] = CardinalAxisType.Z;
            edgeAxes[11] = CardinalAxisType.Z;

            if (rotationHandlePrefab == null)
            {
                for (int i = 0; i < edgeCenters.Length; ++i)
                {
                    GameObject ball = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                    ball.name = "midpoint_" + i.ToString();
                    if (hideElementsInInspector == true)
                    {
                        ball.hideFlags = HideFlags.HideInHierarchy | HideFlags.HideInInspector;
                    }

                    ball.transform.localScale = new Vector3(rotationHandleDiameter, rotationHandleDiameter, rotationHandleDiameter);
                    ball.transform.position = edgeCenters[i];
                    ball.transform.parent = rigRoot.transform;

                    // In order for the ball to be grabbed using near interaction we need
                    // to add NearInteractionGrabbable;
                    var g = ball.EnsureComponent<NearInteractionGrabbable>();
                    g.ShowTetherWhenManipulating = drawTetherWhenManipulating;

                    SphereCollider collider = ball.GetComponent<SphereCollider>();
                    collider.radius *= 1.2f;
                    balls.Add(ball.transform);

                    if (handleMaterial != null)
                    {
                        Renderer renderer = ball.GetComponent<Renderer>();
                        renderer.material = handleMaterial;
                    }
                }
            }
            else
            {
                for (int i = 0; i < edgeCenters.Length; ++i)
                {
                    GameObject ball = Instantiate(rotationHandlePrefab, rigRoot.transform);
                    ball.name = "midpoint_" + i.ToString();
                    ball.transform.localPosition = edgeCenters[i];

                    // 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);
                        ball.transform.localRotation = realignment * ball.transform.localRotation;
                    }
                    else if (edgeAxes[i] == CardinalAxisType.Z)
                    {
                        Quaternion realignment = Quaternion.FromToRotation(Vector3.up, Vector3.forward);
                        ball.transform.localRotation = realignment * ball.transform.localRotation;
                    }

                    SphereCollider collider = ball.AddComponent<SphereCollider>();
                    collider.radius = 0.5f * rotationHandleDiameter;

                    // In order for the ball to be grabbed using near interaction we need
                    // to add NearInteractionGrabbable;
                    var g = ball.EnsureComponent<NearInteractionGrabbable>();
                    g.ShowTetherWhenManipulating = drawTetherWhenManipulating;

                    ApplyMaterialToAllRenderers(ball, handleMaterial);

                    if (hideElementsInInspector == true)
                    {
                        ball.hideFlags = HideFlags.HideInHierarchy | HideFlags.HideInInspector;
                    }

                    balls.Add(ball.transform);
                }
            }

            if (links != null)
            {
                GameObject link;
                for (int i = 0; i < edgeCenters.Length; ++i)
                {
                    if (wireframeShape == WireframeType.Cubic)
                    {
                        link = GameObject.CreatePrimitive(PrimitiveType.Cube);
                        Destroy(link.GetComponent<BoxCollider>());
                    }
                    else
                    {
                        link = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
                        Destroy(link.GetComponent<CapsuleCollider>());
                    }
                    link.name = "link_" + i.ToString();
                    if (hideElementsInInspector == true)
                    {
                        link.hideFlags = HideFlags.HideInHierarchy | HideFlags.HideInInspector;
                    }

                    Vector3 linkDimensions = GetLinkDimensions();
                    if (edgeAxes[i] == CardinalAxisType.Y)
                    {
                        link.transform.localScale = new Vector3(wireframeEdgeRadius, linkDimensions.y, wireframeEdgeRadius);
                        link.transform.Rotate(new Vector3(0.0f, 90.0f, 0.0f));
                    }
                    else if (edgeAxes[i] == CardinalAxisType.Z)
                    {
                        link.transform.localScale = new Vector3(wireframeEdgeRadius, linkDimensions.z, wireframeEdgeRadius);
                        link.transform.Rotate(new Vector3(90.0f, 0.0f, 0.0f));
                    }
                    else//X
                    {
                        link.transform.localScale = new Vector3(wireframeEdgeRadius, linkDimensions.x, wireframeEdgeRadius);
                        link.transform.Rotate(new Vector3(0.0f, 0.0f, 90.0f));
                    }

                    link.transform.position = edgeCenters[i];
                    link.transform.parent = rigRoot.transform;
                    Renderer linkRenderer = link.GetComponent<Renderer>();
                    linkRenderers.Add(linkRenderer);

                    if (wireframeMaterial != null)
                    {
                        linkRenderer.material = wireframeMaterial;
                    }

                    links.Add(link.transform);
                }
            }
        }