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);
}
}
}