/// <summary>
        /// Handles mouse down. This method will fire the mouse click event if an item is clicked
        /// </summary>
        private void HandleMouseDown()
        {
            if (Application.isPlaying == false)
            {
                return;
            }
            if (mPickedIndex != -1 && mPickedType != -1)
            {
                if (Click != null)
                {
                    mCaster = GetComponentInParent <GraphicRaycaster>();
                    if (mCaster == null)
                    {
                        return;
                    }
                    var chart   = GetComponentInParent <AnyChart>();
                    var pointer = ChartCommon.EnsureComponent <CustomChartPointer>(chart.gameObject);

                    if (pointer == null)
                    {
                        return;
                    }
                    Vector3 checkMousePos = pointer.ScreenPosition;
                    Vector2 mousePos;
                    RectTransformUtility.ScreenPointToLocalPointInRectangle(transform as RectTransform, checkMousePos, mCaster.eventCamera, out mousePos);
                    Vector3 pos = transform.InverseTransformPoint(mousePos);
                    Click(mPickedIndex, mPickedType, mPickedData, pos);
                }
            }
        }
예제 #2
0
        public ChartItemEffect LockHoverObject(int index)
        {
            int             count  = mHoverFreeObjects.Count;
            ChartItemEffect effect = null;

            if (count > 0)
            {
                effect = mHoverFreeObjects[count - 1];
                mHoverFreeObjects.RemoveAt(count - 1);
            }
            else
            {
                if (mHoverPrefab == null)
                {
                    return(null);
                }
                GameObject      obj = GameObject.Instantiate(mHoverPrefab.gameObject);
                MaskableGraphic g   = obj.GetComponent <MaskableGraphic>();
                if (g != null)
                {
                    g.maskable = false;
                }
                ChartCommon.EnsureComponent <ChartItem>(obj);
                obj.transform.SetParent(transform);
                effect             = obj.GetComponent <ChartItemEffect>();
                effect.Deactivate += Effect_Deactivate;
            }
            effect.LineTag = index;
            mHoverObjectes.Add(effect);
            return(effect);
        }
예제 #3
0
        /// <summary>
        /// Takes a hover object out of the pool , or creates a new one if the pool is empty
        /// </summary>
        /// <param name="index">the index of the data item , this index will be assigned to the returned object</param>
        /// <returns></returns>
        public ChartItemEffect LockHoverObject(int index,int type,object selectionData)
        {
            int count = mHoverFreeObjects.Count;
            ChartItemEffect effect = null;

            if (count > 0)
            {
                effect = mHoverFreeObjects[count - 1];
                mHoverFreeObjects.RemoveAt(count - 1); 
            }
            else
            {
                if (mHoverPrefab == null)
                    return null;
                GameObject obj = GameObject.Instantiate(mHoverPrefab.gameObject);
                MaskableGraphic g = obj.GetComponent<MaskableGraphic>();
                if (g != null)
                    g.maskable = false;
                ChartCommon.EnsureComponent<ChartItem>(obj);
                Transform parent = transform;
                if (mHoverTransform != null)
                    parent = mHoverTransform;
                obj.transform.SetParent(parent);
                effect = obj.GetComponent<ChartItemEffect>();
                effect.Deactivate += Effect_Deactivate;
            }

            effect.ItemType = type;
            effect.ItemIndex = index;
            effect.ItemData = selectionData;
            mHoverObjectes.Add(effect);
            return effect;
        }
        protected GameObject CreatePrefab(GameObject container, GameObject prefab)
        {
            GameObject obj = GameObject.Instantiate(prefab);

            ChartCommon.HideObject(obj, hideHierarchy);
            ChartCommon.EnsureComponent <ChartItem>(obj);
            obj.transform.SetParent(container.transform, false);
            obj.transform.localScale    = new Vector3(1f, 1f, 1f);
            obj.transform.localPosition = Vector3.zero;
            obj.transform.localRotation = Quaternion.identity;
            return(obj);
        }
예제 #5
0
 protected override IPieGenerator PreparePieObject(out GameObject pieObject)
 {
     if (Prefab == null)
     {
         pieObject = new GameObject();
     }
     else
     {
         pieObject = GameObject.Instantiate(Prefab.gameObject);
     }
     ChartCommon.EnsureComponent <CanvasRenderer>(pieObject);
     return(ChartCommon.EnsureComponent <PieCanvasGenerator>(pieObject));
 }
 protected IPyramidGenerator PreparePyramidObject(out GameObject pyramidObject)
 {
     if (Prefab == null)
     {
         pyramidObject = new GameObject();
     }
     else
     {
         pyramidObject = GameObject.Instantiate(Prefab.gameObject);
     }
     ChartCommon.EnsureComponent <RectTransform>(pyramidObject);
     ChartCommon.EnsureComponent <CanvasRenderer>(pyramidObject);
     return(ChartCommon.EnsureComponent <PyramidCanvasGenerator>(pyramidObject));
 }
예제 #7
0
        private void HandleMouseDrag()
        {
            if (verticalPanning == false && horizontalPanning == false)
            {
                return;
            }
            mCaster = GetComponentInParent <GraphicRaycaster>();
            if (mCaster == null)
            {
                return;
            }
            if (Application.isPlaying == false)
            {
                return;
            }

            Vector2 mousePos;
            var     chart   = GetComponentInParent <AnyChart>();
            var     pointer = ChartCommon.EnsureComponent <CustomChartPointer>(chart.gameObject);

            if (pointer == null)
            {
                return;
            }
            Vector3 checkMousePos = pointer.ScreenPosition;

            RectTransformUtility.ScreenPointToLocalPointInRectangle(transform as RectTransform, checkMousePos, mCaster.eventCamera, out mousePos);
            var  cam     = mCaster.eventCamera;
            bool mouseIn = RectTransformUtility.RectangleContainsScreenPoint(transform as RectTransform, checkMousePos, cam);

            if (((pointer != null && pointer.IsMouseDown)) && mouseIn)
            {
                if (mLastPosition.HasValue)
                {
                    Vector2 delta = mousePos - mLastPosition.Value;
                    MouseDraged(delta);
                }
                mLastPosition = mousePos;
            }
            else
            {
                mLastPosition = null;
            }
        }
        public void Generate(float startAngle, float angleSpan, float radius, float innerRadius, int segments, float outerDepth, float innerDepth)
        {
            WorldSpaceChartMesh mesh = new WorldSpaceChartMesh(1);
            float maxDepth           = Mathf.Max(outerDepth, innerDepth);

            if (maxDepth <= 0f)
            {
                PieMesh.Generate2dMesh(mesh, startAngle, angleSpan, radius, innerRadius, segments);
            }
            else
            {
                PieMesh.Generate3dMesh(mesh, startAngle, angleSpan, radius, innerRadius, segments, outerDepth, innerDepth);
            }

            if (mCleanMesh != null)
            {
                mCleanMesh.Clear();
                mesh.ApplyToMesh(mCleanMesh);
                MeshCollider collider = ChartCommon.EnsureComponent <MeshCollider>(gameObject);
                if (collider != null)
                {
                    collider.sharedMesh = null;
                    collider.sharedMesh = mCleanMesh;
                }
            }
            else
            {
                Mesh newMesh = mesh.Generate();
                newMesh.hideFlags = HideFlags.DontSave;
                if (mFilter == null)
                {
                    mFilter = GetComponent <MeshFilter>();
                }
                mFilter.sharedMesh = newMesh;
                MeshCollider collider = ChartCommon.EnsureComponent <MeshCollider>(gameObject);
                if (collider != null)
                {
                    collider.sharedMesh = newMesh;
                }
                ChartCommon.CleanMesh(newMesh, ref mCleanMesh);
            }
        }
예제 #9
0
        protected override IPieGenerator PreparePieObject(out GameObject pieObject)
        {
            if (Prefab == null)
            {
                pieObject = new GameObject();
            }
            else
            {
                pieObject = GameObject.Instantiate(Prefab);
            }
            ChartCommon.EnsureComponent <MeshFilter>(pieObject);
            ChartCommon.EnsureComponent <MeshRenderer>(pieObject);
            IPieGenerator gen = pieObject.GetComponent <IPieGenerator>();

            if (gen != null)
            {
                return(gen);
            }
            return(ChartCommon.EnsureComponent <WorldSpacePieGenerator>(pieObject));
        }
 protected override void Start()
 {
     base.Start();
     mGroup = ChartCommon.EnsureComponent <CanvasGroup>(gameObject);
 }
예제 #11
0
        private void GeneratePie(bool update)
        {
            if (mFixPositionPie == null)
            {
                update = false;
            }
            if (update == false)
            {
                ClearChart();
            }
            else
            {
                EnsureTextController();
            }
            if (((IInternalPieData)Data).InternalDataSource == null)
            {
                return;
            }

            double[,] data = ((IInternalPieData)Data).InternalDataSource.getRawData();
            int rowCount    = data.GetLength(0);
            int columnCount = data.GetLength(1);

            if (rowCount != 1) // row count for pie must be 1
            {
                return;
            }

            double total = 0.0;

            for (int i = 0; i < columnCount; ++i)
            {
                double val = Math.Max(data[0, i], 0);
                total += val;
            }

            float start = startAngle;

            if (clockWise)
            {
                start -= angleSpan;
            }
            float totalGaps       = columnCount * spacingAngle;
            float spanWithoutGaps = angleSpan - totalGaps;

            if (spanWithoutGaps < 0f)
            {
                spanWithoutGaps = 0f;
            }

            if (mFixPositionPie == null)
            {
                mFixPositionPie = new GameObject("FixPositionPie", typeof(ChartItem));
                ChartCommon.HideObject(mFixPositionPie, hideHierarchy);
                mFixPositionPie.transform.SetParent(transform, false);
                if (IsCanvas)
                {
                    var rectTrans = mFixPositionPie.AddComponent <RectTransform>();
                    rectTrans.anchorMax        = new Vector2(0.5f, 0.5f);
                    rectTrans.anchorMin        = new Vector2(0.5f, 0.5f);
                    rectTrans.pivot            = new Vector2(0.5f, 0.5f);
                    rectTrans.anchoredPosition = new Vector2(0.5f, 0.5f);
                }
            }

            for (int i = 0; i < columnCount; ++i)
            {
                object userData    = ((IInternalPieData)Data).InternalDataSource.Columns[i].UserData;
                float  radiusScale = 1f;
                float  depthScale  = 1f;
                float  depthOffset = 0f;
                if (userData != null && userData is PieData.CategoryData)
                {
                    radiusScale = ((PieData.CategoryData)userData).RadiusScale;
                    depthScale  = ((PieData.CategoryData)userData).DepthScale;
                    depthOffset = ((PieData.CategoryData)userData).DepthOffset;
                }
                if (radiusScale <= 0.001f)
                {
                    radiusScale = 1f;
                }
                if (depthScale <= 0.001f)
                {
                    depthScale = 1f;
                }
                string name   = ((IInternalPieData)Data).InternalDataSource.Columns[i].Name;
                double amount = Math.Max(data[0, i], 0);
                if (amount == 0f)
                {
                    continue;
                }
                float                    weight      = (float)(amount / total);
                float                    currentSpan = spanWithoutGaps * weight;
                GameObject               pieObject   = null;
                IPieGenerator            generator   = null;
                PieObject                dataObject;
                CanvasLines.LineSegement line;
                float                    modifiedRadius = Mathf.Max(radius * radiusScale, torusRadius);
                //  float modifiedDepth = d
                float lineAngle = start + currentSpan * 0.5f;
                if (mPies.TryGetValue(name, out dataObject))
                {
                    dataObject.StartAngle = start;
                    dataObject.AngleSpan  = currentSpan;
                    generator             = dataObject.Generator;
                    if (dataObject.ItemLabel)
                    {
                        Vector3 labelPos = AlignTextPosition(mItemLabels, dataObject, out line, modifiedRadius);
                        dataObject.ItemLabel.transform.localPosition = labelPos;
                        string toSet = ChartAdancedSettings.Instance.FormatFractionDigits(mItemLabels.FractionDigits, amount, CustomNumberFormat);
                        toSet = mItemLabels.TextFormat.Format(toSet, name, "");
                        ChartCommon.UpdateTextParams(dataObject.ItemLabel.UIText, toSet);
                        if (dataObject.ItemLine != null)
                        {
                            var lst = new List <CanvasLines.LineSegement>();
                            lst.Add(line);
                            dataObject.ItemLine.SetLines(lst);
                        }
                    }
                    if (dataObject.CategoryLabel != null)
                    {
                        Vector3 labelPos = AlignTextPosition(mCategoryLabels, dataObject, out line, modifiedRadius);
                        dataObject.CategoryLabel.transform.localPosition = labelPos;
                        if (dataObject.CategoryLine != null)
                        {
                            var lst = new List <CanvasLines.LineSegement>();
                            lst.Add(line);
                            dataObject.CategoryLine.SetLines(lst);
                        }
                    }
                    Vector2 add = ChartCommon.FromPolar(start + currentSpan * 0.5f, Extrusion);
                    dataObject.TopObject.transform.localPosition = new Vector3(add.x, add.y, 0f);
                }
                else
                {
                    GameObject topObject = new GameObject();
                    if (IsCanvas)
                    {
                        topObject.AddComponent <RectTransform>();
                    }
                    ChartCommon.HideObject(topObject, hideHierarchy);
                    topObject.AddComponent <ChartItem>();
                    topObject.transform.SetParent(mFixPositionPie.transform);
                    topObject.transform.localPosition = new Vector3();
                    topObject.transform.localRotation = Quaternion.identity;
                    topObject.transform.localScale    = new Vector3(1f, 1f, 1f);

                    generator = PreparePieObject(out pieObject);

                    ChartCommon.EnsureComponent <ChartItem>(pieObject);
                    ChartMaterialController control = ChartCommon.EnsureComponent <ChartMaterialController>(pieObject);
                    control.Materials = Data.GetMaterial(name);
                    control.Refresh();
                    dataObject            = new PieObject();
                    dataObject.StartAngle = start;
                    dataObject.AngleSpan  = currentSpan;
                    dataObject.TopObject  = topObject;
                    dataObject.Generator  = generator;
                    dataObject.category   = name;
                    var pieInfo = pieObject.AddComponent <PieInfo>();
                    pieInfo.pieObject = dataObject;
                    pieObject.transform.SetParent(topObject.transform);
                    Vector2 add = ChartCommon.FromPolar(start + currentSpan * 0.5f, Extrusion);
                    pieObject.transform.localPosition = new Vector3(0f, 0f, 0f);
                    pieObject.transform.localScale    = new Vector3(1f, 1f, 1f);
                    pieObject.transform.localRotation = Quaternion.identity;
                    mPies.Add(name, dataObject);

                    topObject.transform.localPosition = new Vector3(add.x, add.y, 0f);
                    CharItemEffectController effect = ChartCommon.EnsureComponent <CharItemEffectController>(pieObject);
                    effect.WorkOnParent = true;
                    effect.InitialScale = false;

                    ChartItemEvents[] events = pieObject.GetComponentsInChildren <ChartItemEvents>();
                    for (int j = 0; j < events.Length; ++j)
                    {
                        if (events[j] == null)
                        {
                            continue;
                        }
                        InternalItemEvents comp = (InternalItemEvents)events[j];
                        comp.Parent   = this;
                        comp.UserData = dataObject;
                    }

                    if (mItemLabels != null)
                    {
                        Vector3 labelPos = AlignTextPosition(mItemLabels, dataObject, out line, modifiedRadius);
                        if (line != null && IsUnderCanvas)
                        {
                            dataObject.ItemLine = AddLineRenderer(topObject, line);
                        }
                        string toSet = ChartAdancedSettings.Instance.FormatFractionDigits(mItemLabels.FractionDigits, amount, CustomNumberFormat);
                        toSet = mItemLabels.TextFormat.Format(toSet, name, "");
                        BillboardText billboard = ChartCommon.CreateBillboardText(null, mItemLabels.TextPrefab, topObject.transform, toSet, labelPos.x, labelPos.y, labelPos.z, lineAngle, topObject.transform, hideHierarchy, mItemLabels.FontSize, mItemLabels.FontSharpness);
                        dataObject.ItemLabel = billboard;
                        TextController.AddText(billboard);
                    }

                    if (mCategoryLabels != null)
                    {
                        Vector3 labelPos = AlignTextPosition(mCategoryLabels, dataObject, out line, modifiedRadius);
                        if (line != null && IsUnderCanvas)
                        {
                            dataObject.CategoryLine = AddLineRenderer(topObject, line);
                        }
                        string toSet = name;
                        toSet = mCategoryLabels.TextFormat.Format(toSet, "", "");
                        BillboardText billboard = ChartCommon.CreateBillboardText(null, mCategoryLabels.TextPrefab, topObject.transform, toSet, labelPos.x, labelPos.y, labelPos.z, lineAngle, topObject.transform, hideHierarchy, mCategoryLabels.FontSize, mCategoryLabels.FontSharpness);
                        dataObject.CategoryLabel = billboard;
                        TextController.AddText(billboard);
                    }
                }
                float maxDepth  = Mathf.Max(OuterDepthLink, InnerDepthLink);
                float depthSize = maxDepth * depthScale;
                if (pieObject != null)
                {
                    float depthStart = (maxDepth - depthSize) * 0.5f;
                    pieObject.transform.localPosition = new Vector3(0f, 0f, depthStart - depthSize * depthOffset);
                }
                dataObject.Value = (float)data[0, i];
                generator.Generate(Mathf.Deg2Rad * start, Mathf.Deg2Rad * currentSpan, modifiedRadius, torusRadius, meshSegements, OuterDepthLink * depthScale, InnerDepthLink * depthScale);
                start += spacingAngle + currentSpan;
            }
        }
        /// <summary>
        /// Handles a mouse move event.
        /// </summary>
        /// <param name="force"></param>
        public bool HandleMouseMove(bool force)
        {
            if (Application.isPlaying == false)
            {
                return(false);
            }

            mCaster = GetComponentInParent <GraphicRaycaster>();
            if (mCaster == null)
            {
                return(false);
            }
            Vector2 mousePos;
            var     chart = GetComponentInParent <AnyChart>();


            // on some machines and settings , it seems that Input.mousePosition returns invalid coordinates, the following checks make sure that the mouse position is valid
            //Vector3 checkMousePos = Input.mousePosition;


            var pointer = ChartCommon.EnsureComponent <CustomChartPointer>(chart.gameObject);

            if (pointer == null)
            {
                return(false);
            }
            Vector3 checkMousePos = pointer.ScreenPosition;
            Camera  checkCamera   = mCaster.eventCamera;

            if (checkCamera == null)
            {
                checkCamera = Camera.main;
            }
            if (checkCamera == null)
            {
                return(false);
            }
            if (checkCamera.pixelRect.Contains(checkMousePos) == false)
            {
                return(false);
            }

            RectTransformUtility.ScreenPointToLocalPointInRectangle(transform as RectTransform, checkMousePos, mCaster.eventCamera, out mousePos);
            //DoMouse(mousePos, false);
            float thresh = MouseInThreshold;

            if (force)
            {
                SetUpAllHoverObjects();
            }

            Vector2 min = Min;
            Vector2 max = Max;

            if (mousePos.x < min.x - thresh || mousePos.y < min.y - thresh || mousePos.x > max.x + thresh || mousePos.y > max.y + thresh)
            {
                if (mIsMouseIn)
                {
                    mIsMouseIn = false;
                    DoMouse(mousePos, true, force);
                }
                return(true);
            }
            else
            {
                if (mIsMouseIn == false)
                {
                    mIsMouseIn         = true;
                    mLastMousePosition = mousePos;
                    DoMouse(mousePos, false, force);
                }
                else
                {
                    if (((mLastMousePosition - mousePos).sqrMagnitude > 1) || force)
                    {
                        mLastMousePosition = mousePos;
                        DoMouse(mousePos, false, force);
                    }
                }
            }

            if (pointer != null && pointer.Click)
            {
                HandleMouseDown();
            }
            return(true);
        }
        private void GeneratePyramid(bool update)
        {
            if (update == false)
            {
                ClearChart();
            }
            else
            {
                EnsureTextController();
            }
            if (((IInternalPyramidData)Data).InternalDataSource == null)
            {
                return;
            }

            double[,] data = ((IInternalPyramidData)Data).InternalDataSource.getRawData();
            int rowCount    = data.GetLength(0);
            int columnCount = data.GetLength(1);

            if (rowCount != 1) // row count for pie must be 1
            {
                return;
            }

            double total = 0.0;

            for (int i = 0; i < columnCount; ++i)
            {
                double val = Math.Max(data[0, i], 0);
                total += val;
            }

            var rectTrans = GetComponent <RectTransform>();

            totalHeight = rectTrans.rect.height;
            totalWidth  = rectTrans.rect.width;

            float baseX1            = 0;
            float baseX2            = totalWidth;
            float accumilatedHeight = 0;
            float?firstCenterHeight = null;
            float acummilatedWeight = 0;

            for (int i = 0; i < columnCount; ++i)
            {
                object userData     = ((IInternalPyramidData)Data).InternalDataSource.Columns[i].UserData;
                var    categoryData = ((PyramidData.CategoryData)userData);

                string name   = ((IInternalPyramidData)Data).InternalDataSource.Columns[i].Name;
                double amount = Math.Max(data[0, i], 0);
                if (amount == 0f)
                {
                    continue;
                }

                float weight       = (float)(amount / total);
                float actualHeight = totalHeight * weight;

                float slopeRight = categoryData.RightSlope;
                float slopeLeft  = categoryData.LeftSlope;
                float atan;
                switch (slope)
                {
                case SlopeType.Center:
                    atan       = -Mathf.Atan2(totalHeight, totalWidth * 0.5f) * Mathf.Rad2Deg + 90;
                    slopeRight = atan;
                    slopeLeft  = atan;
                    break;

                case SlopeType.Left:
                    atan       = -Mathf.Atan2(totalHeight, totalWidth) * Mathf.Rad2Deg + 90;
                    slopeLeft  = 0;
                    slopeRight = atan;
                    break;

                case SlopeType.Right:
                    atan       = -Mathf.Atan2(totalHeight, totalWidth) * Mathf.Rad2Deg + 90;
                    slopeLeft  = atan;
                    slopeRight = 0;
                    break;

                default:
                    break;
                }
                GameObject        pyramidObject     = null;
                GameObject        pyramidBackObject = null;
                IPyramidGenerator generator         = null;
                IPyramidGenerator backgenerator     = null;
                PyramidObject     dataObject;
                float             centerHeight    = actualHeight * 0.5f + accumilatedHeight;
                float             unblendedHeight = centerHeight;
                if (firstCenterHeight.HasValue == false)
                {
                    firstCenterHeight = centerHeight;
                }
                centerHeight = Mathf.Lerp(firstCenterHeight.Value, centerHeight, categoryData.PositionBlend);

                if (mPyramids.TryGetValue(name, out dataObject))
                {
                    pyramidBackObject = dataObject.backObject;
                    pyramidObject     = dataObject.pyramidObject;
                    backgenerator     = dataObject.BackGenerator;
                    generator         = dataObject.Generator;
                    generator.SetParams(baseX1, baseX2, totalWidth, slopeLeft, slopeRight, actualHeight, inset, 0f, 1f);
                    if (backgenerator != null)
                    {
                        backgenerator.SetParams(baseX1, baseX2, totalWidth, slopeLeft, slopeRight, actualHeight, 0f, acummilatedWeight, acummilatedWeight + weight);
                    }
                    if (dataObject.ItemLabel)
                    {
                        Vector3 labelPos = AlignTextPosition(mItemLabels, dataObject, generator, centerHeight);
                        dataObject.ItemLabel.transform.localPosition = labelPos;
                        ChartCommon.UpdateTextParams(dataObject.ItemLabel.UIText, categoryData.Title);
                    }
                }
                else
                {
                    dataObject = new PyramidObject();

                    if (backMaterial != null)
                    {
                        var backGenerator = PreparePyramidObject(out pyramidBackObject);
                        backGenerator.SetParams(baseX1, baseX2, totalWidth, slopeLeft, slopeRight, actualHeight, 0f, acummilatedWeight, acummilatedWeight + weight);
                        dataObject.backObject    = pyramidBackObject;
                        dataObject.BackGenerator = backGenerator;
                        ChartCommon.HideObject(pyramidBackObject, hideHierarchy);
                        pyramidBackObject.transform.SetParent(transform, false);
                        ChartCommon.EnsureComponent <ChartItem>(pyramidBackObject);
                        ChartMaterialController backcontrol = ChartCommon.EnsureComponent <ChartMaterialController>(pyramidBackObject);
                        backcontrol.Materials = new ChartDynamicMaterial(backMaterial);
                        foreach (var itemEffect  in pyramidBackObject.GetComponents <ChartItemEffect>())
                        {
                            ChartCommon.SafeDestroy(itemEffect);
                        }
                        ChartCommon.SafeDestroy(backGenerator.ContainerObject);
                    }

                    generator = PreparePyramidObject(out pyramidObject);
                    generator.SetParams(baseX1, baseX2, totalWidth, slopeLeft, slopeRight, actualHeight, inset, 0f, 1f);
                    ChartCommon.HideObject(pyramidObject, hideHierarchy);
                    pyramidObject.transform.SetParent(transform, false);
                    ChartCommon.EnsureComponent <ChartItem>(pyramidObject);



                    ChartMaterialController control = ChartCommon.EnsureComponent <ChartMaterialController>(pyramidObject);
                    control.Materials = Data.GetMaterial(name);
                    control.Refresh();


                    dataObject.Generator     = generator;
                    dataObject.category      = name;
                    dataObject.pyramidObject = pyramidObject;
                    mPyramids.Add(name, dataObject);

                    CharItemEffectController effect = ChartCommon.EnsureComponent <CharItemEffectController>(pyramidObject);
                    effect.WorkOnParent = false;
                    effect.InitialScale = false;

                    ChartItemEvents[] events = pyramidObject.GetComponentsInChildren <ChartItemEvents>();
                    for (int j = 0; j < events.Length; ++j)
                    {
                        if (events[j] == null)
                        {
                            continue;
                        }
                        InternalItemEvents comp = (InternalItemEvents)events[j];
                        comp.Parent   = this;
                        comp.UserData = dataObject;
                    }


                    if (mItemLabels != null)
                    {
                        Vector3       labelPos  = AlignTextPosition(mItemLabels, dataObject, generator, 0f);
                        float         angle     = justification == JustificationType.LeftAligned ? -180f : 180f;
                        BillboardText billboard = ChartCommon.CreateBillboardText(null, mItemLabels.TextPrefab, dataObject.pyramidObject.transform, categoryData.Title, labelPos.x, labelPos.y, labelPos.z, angle, null, hideHierarchy, mItemLabels.FontSize, mItemLabels.FontSharpness);
                        dataObject.ItemLabel = billboard;
                        dataObject.ItemLabel.transform.localPosition = labelPos;
                        TextController.AddText(billboard);
                    }
                }

                dataObject.Text  = categoryData.Text;
                dataObject.Title = categoryData.Title;

                if (IsCanvas)
                {
                    if (pyramidObject != null)
                    {
                        Vector2 actualPosition = new Vector2(0.5f, centerHeight) + categoryData.Shift;
                        actualPosition = new Vector2(actualPosition.x, actualPosition.y / TotalHeight);
                        var objectRect = pyramidObject.GetComponent <RectTransform>();
                        objectRect.pivot            = new Vector2(0.5f, 0.5f);
                        objectRect.anchorMin        = actualPosition;
                        objectRect.anchorMax        = actualPosition;
                        objectRect.anchoredPosition = new Vector2();
                        objectRect.sizeDelta        = new Vector2(totalWidth, actualHeight);
                    }
                    if (pyramidBackObject != null)
                    {
                        Vector2 actualPosition = new Vector2(0.5f, unblendedHeight);
                        actualPosition = new Vector2(actualPosition.x, actualPosition.y / TotalHeight);
                        var objectRect = pyramidBackObject.GetComponent <RectTransform>();
                        objectRect.pivot            = new Vector2(0f, 0f);
                        objectRect.anchorMin        = actualPosition;
                        objectRect.anchorMax        = actualPosition;
                        objectRect.anchoredPosition = new Vector2();
                    }
                }
                accumilatedHeight += actualHeight;
                acummilatedWeight += weight;
                if (backgenerator != null)
                {
                    backgenerator.Generate();
                }
                generator.Generate();
                generator.GetUpperBase(out baseX1, out baseX2);
                generator.ApplyInfo(categoryData.Title, categoryData.Text, categoryData.Image, categoryData.Scale);
                generator.SetAlpha(categoryData.Alpha);
            }
        }