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