Пример #1
0
        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);
            }
        }
Пример #2
0
        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();
        }