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