/// <summary> /// function to create control points /// </summary> public void CreateControlPoints() { //Merge the same CPs that have different tags(belong to different segments)(with hierarchy and tree node) //loop for the different segments cpDataList.Clear(); for (var i = 0; i < readJson.treeNodeLevelx.Count; i++) { for (var j = 0; j < readJson.treeNodeLevelx[i].GetData().cageVerticesIndex.Count; j++) { var cpData = new ControlPointsData(); cpData = cpDataList.Find(x => x.goIndex == readJson.treeNodeLevelx[i].GetData().cageVerticesIndex[j]); if (cpData != null) { var getColor = readJson.treeNodeLevelx[i].GetData().color; cpData.goTags.Add(readJson.treeNodeLevelx[i].GetData().tag); cpData.goLevel = readJson.treeNodeLevelx[i].GetLevel(); cpData.goColor.Add(new Color(getColor[0], getColor[1], getColor[2], 255) / 255); } else { cpData = new ControlPointsData(); //cpData.go = cube; var getColor = readJson.treeNodeLevelx[i].GetData().color; cpData.goIndex = readJson.treeNodeLevelx[i].GetData().cageVerticesIndex[j]; cpData.goTags.Add(readJson.treeNodeLevelx[i].GetData().tag); cpData.goLevel = readJson.treeNodeLevelx[i].GetLevel(); cpData.goColor.Add(new Color(getColor[0], getColor[1], getColor[2], 255) / 255); //Debug.Log("cpData.goTags vertices" + cpData.goTags.Last()); cpDataList.Add(cpData); } } } // compute(mix) the color for each Control Point; add level for each CP for (var i = 0; i < cpDataList.Count; i++) { var mycolor = new Color(0, 0, 0, 0); for (var j = 0; j < cpDataList[i].goColor.Count; j++) { mycolor += cpDataList[i].goColor[j]; } mycolor /= cpDataList[i].goColor.Count; cpDataList[i].goColor.Clear(); cpDataList[i].goColor.Add(mycolor); } CreateMaterial(); //load the defaut materials for the segments on the cage(with hierarchy) materialGroup1.Clear(); outlineMaterialGroup1.Clear(); for (var k = 0; k < colorAmountsOfDifferentlevels; k++) { materialGroup1.Add( Resources.Load(string.Format("level{0}, Default Material Group {1}", cpDataList.Last().goLevel, k), typeof(Material)) as Material); outlineMaterialGroup1.Add( Resources.Load(string.Format("level{0}, Outlined Material Group {1}", cpDataList.Last().goLevel, k), typeof(Material)) as Material); } //create all CPs if (controlPointList.Count == 0) { for (var i = 0; i < meshCage.vertices.Length; i++) { var ControlPoint = GameObject.CreatePrimitive(PrimitiveType.Sphere); var K = initialControlPointPosition[i]; ControlPoint.transform.position = new Vector3(K[0], K[1], K[2]); ControlPoint.transform.localScale = new Vector3(0.2f, 0.2f, 0.2f); ControlPoint.tag = selectableTag; ControlPoint.name = "Control Point " + goCounter; interactCP.Add(ControlPoint.AddComponent <InteractionBehaviour>()); ControlPoint.GetComponent <Rigidbody>().useGravity = false; ControlPoint.GetComponent <Rigidbody>().isKinematic = true; ControlPoint.AddComponent <ChangeColor>(); goCounter++; ControlPoint.transform.parent = _initializedControlPoints; controlPointList.Add(ControlPoint); } } //color, add tags to CPs of different for (var i = 0; i < cpDataList.Count; i++) { for (var j = 0; j < controlPointList.Count; j++) { if (controlPointList[j].transform.position == cageVertices[cpDataList[i].goIndex]) { cpDataList[i].go = controlPointList[j]; var tagSystem0 = cpDataList[i].go.GetComponent <CustomTag>(); if (tagSystem0 == null) { cpDataList[i].go.AddComponent <CustomTag>(); } var tagSystem1 = cpDataList[i].go.GetComponent <CustomTag>(); tagSystem1.Clear(); for (var k = 0; k < cpDataList[i].goTags.Count; k++) { tagSystem1.Add(cpDataList[i].goTags[k]); } var controlPointRenderer = cpDataList[i].go.GetComponent <MeshRenderer>(); //Find the correct material for this CP for (var k = 0; k < materialGroup1.Count; k++) { if (!treatSelectionManager.selectionList.Contains(cpDataList[i].go.transform)) { if (cpDataList[i].goColor[0] == materialGroup1[k].color) { controlPointRenderer.material = materialGroup1[k]; //Debug.Log("this is a string inside add material to class 0"); cpDataList[i].defautMaterial = materialGroup1[k]; //Debug.Log("this is a string inside add material to class 1"); cpDataList[i].outlineMaterial = outlineMaterialGroup1[k]; } } } } } } //find out the control points that belong to no segment in the cpDatalist, assign them materials etc. for (var i = 0; i < controlPointList.Count; i++) { var cpData = new ControlPointsData(); cpData.go = controlPointList[i]; var controlPointsOfNoSegment = cpDataList.Find(x => x.go.name == controlPointList[i].name); if (controlPointsOfNoSegment == null && !treatSelectionManager.selectionList.Contains(cpData.go.transform) ) //belong to the non=annotated segment { cpData.go.GetComponent <MeshRenderer>().material = defaultMaterial; cpData.defautMaterial = defaultMaterial; cpData.outlineMaterial = outlineMaterial; cpData.goColor.Add(new Color(0, 0, 0, 1)); cpDataList.Add(cpData); } } //make the transforms inside the _newPosCP have the right order _newPosCP.Clear(); for (var i = 0; i < cageVertices.Length; i++) { for (var j = 0; j < controlPointList.Count; j++) { if (controlPointList[j].transform.position == cageVertices[i]) { _newPosCP.Add(controlPointList[j].transform); PositionControlPoints.Add(controlPointList[j].transform); } } } }
// Start is called before the first frame update void Start() { GameObject obj0 = new GameObject(); GameObject obj1 = new GameObject(); GameObject obj2 = new GameObject(); GameObject obj3 = new GameObject(); GameObject obj4 = new GameObject(); List <ControlPointsData> cpDataList = new List <ControlPointsData>(); cpDataList.Add(new ControlPointsData {/*go = obj0,*/ goTags = { "little finger", "palm" }, goColor = { Color.red }, goIndex = 0 }); cpDataList.Add(new ControlPointsData {/*go = obj1,*/ goTags = { "little finger" }, goColor = { Color.red }, goIndex = 1 }); cpDataList.Add(new ControlPointsData {/*go = obj2,*/ goTags = { "pinky" }, goColor = { Color.red }, goIndex = 0 }); cpDataList.Add(new ControlPointsData {/*go = obj3,*/ goTags = { "ring finger" }, goColor = { Color.red }, goIndex = 0 }); cpDataList.Add(new ControlPointsData {/*go = obj4,*/ goTags = { "palm" }, goColor = { Color.red }, goIndex = 1 }); List <ControlPointsData> result = new List <ControlPointsData>(); while (cpDataList.Count > 0) { ControlPointsData m = cpDataList[0]; cpDataList.RemoveAt(0); List <ControlPointsData> listB = new List <ControlPointsData>(); foreach (var VARIABLE in cpDataList) { if (VARIABLE.goIndex.Equals(m.goIndex)) { m.goTags.Add(VARIABLE.goTags[0]); m.goColor[0] = (VARIABLE.goColor[0] + m.goColor[0]) / 2; } else { listB.Add(VARIABLE); } } cpDataList = listB; result.Add(m); } foreach (var VARIABLE in result) { Debug.Log("start of segment"); Debug.Log(VARIABLE.goIndex.ToString()); foreach (var item in VARIABLE.goTags) { Debug.Log(item.ToString()); } Debug.Log("finish of segment"); } }