public void SetTicks(float[] ticks, float[] lim, List <string[]> tickLabels) { tickLocs = new List <Vector3>(); int numTicks = ticks.Length; foreach (var tick in ticks) { tickLocs.Add(Vector3.Lerp(start, end, (tick - lim[0]) / (lim[1] - lim[0]))); //Debug.LogFormat("Tick loc: {0}", tickLocs[tickLocs.Count-1]); } var tickDir = -1 * Vector3.one; switch (axis) { case Axis.x: tickDir.x = 0; break; case Axis.y: tickDir.y = 0; break; case Axis.z: tickDir.z = 0; break; } tickDir.Normalize(); tickDir.z = tickDir.z * -1; //Debug.LogFormat("Tick dir: {0}", tickDir); tickLines = new List <GameObject>(); tickTexts = new List <GameObject>(); for (int i = 0; i < numTicks; i++) { var go = new GameObject(); go.transform.SetParent(transform); go.name = "rAxisTick"; go.transform.localPosition = tickLocs[i]; go.transform.localScale = Vector3.one; var lineRenderer = go.AddComponent <LineRenderer>(); lineRenderer.useWorldSpace = false; lineRenderer.widthMultiplier = 0.005f; lineRenderer.positionCount = 2; var localTickVec = tickDir * tickLength; lineRenderer.SetPosition(0, Vector3.zero); lineRenderer.SetPosition(0, localTickVec); lineRenderer.material = Material; lineRenderer.material.color = _color; tickLines.Add(go); go = new GameObject(); go.transform.SetParent(transform); go.name = "rAxisTickLabel"; go.transform.localScale = Vector3.one; var text = go.AddComponent <MText>(); if (tickLabels != null && tickLabels[i] != null && tickLabels[i][0] != null) { text.String = tickLabels[i][0]; } text.HorizontalAlignment = "center"; text.VerticalAlignment = "top"; //TODO: set font size from axes' font size text.FontSize = new float[] { 10 }; text.Position = Misc.VecToArray(tickLocs[i] + localTickVec * 2); text.Units = MUnits.Unity; text.Color = Misc.ColorToArray(_color); text.UpVec = localTickVec; text.init(); text.refresh(); tickTexts.Add(go); } }
public override void refresh() { // called once all properties are read in from JSON Vector3 dataSpan = new Vector3(XLim[1] - XLim[0], YLim[1] - YLim[0], ZLim[1] - ZLim[0]); Vector3 dataOrigin = new Vector3(XLim[0], YLim[0], ZLim[0]); Vector3 pixelOrigin = convertFromDataToPixelSpace(dataOrigin, true); var axes = new List <Axis> { Axis.x, Axis.y, Axis.z }; foreach (Axis axis in axes) { var go = rAxisArrows[axis]; go.transform.SetParent(transform); var rAxis = go.GetComponent <rAxis>(); rAxis.transform.localPosition = Vector3.zero; rAxis.transform.localScale = Vector3.one; rAxis.Color = UnityEngine.Color.black; // TODO: dynamically set from axis decorator instead of hardcoding rAxis.Material = defaultMaterial; var end = new Vector3(XLim[0], YLim[0], ZLim[0]); switch (axis) { case Axis.x: end = new Vector3(XLim[1], YLim[0], ZLim[0]); break; case Axis.y: end = new Vector3(XLim[0], YLim[1], ZLim[0]); break; case Axis.z: end = new Vector3(XLim[0], YLim[0], ZLim[1]); break; } rAxis.start = pixelOrigin; rAxis.end = convertFromDataToPixelSpace(end, true); switch (axis) { case Axis.x: rAxis.SetTicks(XTick, XLim, XTickLabel); break; case Axis.y: rAxis.SetTicks(YTick, YLim, YTickLabel); break; case Axis.z: rAxis.SetTicks(ZTick, ZLim, ZTickLabel); break; } } // override Label positions since our axes may be in slightly different locations with respect to eachother foreach (Axis axis in axes) { var offAxisFactor = 5f; switch (axis) { case Axis.x: XLabel[0].GetComponent <MText>().Position = new float[] { XLim[0] + dataSpan[0] / 2f, YLim[0] - dataSpan[1] / offAxisFactor, ZLim[0] - dataSpan[2] / offAxisFactor }; break; case Axis.y: YLabel[0].GetComponent <MText>().Position = new float[] { XLim[0] - dataSpan[0] / offAxisFactor, YLim[0] + dataSpan[1] / 2f, ZLim[0] - dataSpan[2] / offAxisFactor }; break; case Axis.z: ZLabel[0].GetComponent <MText>().Position = new float[] { XLim[0] - dataSpan[0] / offAxisFactor, YLim[0] - dataSpan[1] / offAxisFactor, ZLim[0] + dataSpan[2] / 2f }; break; } } base.refresh(); if (needsRefresh) { return; } // override title position to centered above axes var center = dataOrigin + dataSpan / 2; center = convertFromDataToPixelSpace(center, true); center = center + transform.localPosition; center = transform.TransformPoint(center); // from local to world space; var bounds = new Bounds(center, Vector3.zero); foreach (GameObject child in Children) { if (Title.Contains(child)) { continue; // don't include title in bounds calculation } if (child.GetComponent <MText>() != null) { continue; // don't include text elements in bounds calculation } foreach (Renderer renderer in child.GetComponentsInChildren <Renderer>()) { if (renderer.gameObject.name == "Bounds") { continue; // don't include MGraphic bounding boxes in bounds calculation } bounds.Encapsulate(renderer.bounds); } } var titlePos = new Vector3(0, bounds.extents.y * 1.5f, 0) + bounds.center; titlePos = transform.InverseTransformPoint(titlePos); // convert from world to local var titleText = Title[0].GetComponent <MText>(); titleText.Position = Misc.VecToArray(titlePos); titleText.Units = MUnits.Unity; titleText.refresh(); }