//See Destroy tool for simpler destroy understanding. //Doodles when destroyed spolit into multiples, thus new doodles must be //recreated dynamically. public List <Doodle> eraseSphere(Vector3 center, float radius) { List <List <Vector3> > segs = new List <List <Vector3> >(); Vector3[] positions = new Vector3[lr.positionCount]; lr.GetPositions(positions); bool pErase = Vector3.Distance(positions[0], center) < radius; bool initErase = pErase; segs.Add(new List <Vector3>()); segs[segs.Count - 1].Add(positions[0]); //Find points in the doodle to be erased. for (int i = 1; i < positions.Length; ++i) { bool iErase = Vector3.Distance(positions[i], center) < radius; if (iErase == pErase) { segs[segs.Count - 1].Add(positions[i]); } else { Vector3 orig = pErase ? positions[i - 1] : positions[i]; Vector3 dir = pErase ? positions[i] - positions[i - 1] : positions[i - 1] - positions[i]; Vector3 hit = GeometryUtil.raySphereHit(orig, dir, center, radius); segs[segs.Count - 1].Add(hit); segs.Add(new List <Vector3>()); segs[segs.Count - 1].Add(hit); segs[segs.Count - 1].Add(positions[i]); } pErase = iErase; } if (segs.Count == 1) { return(new List <Doodle>()); } List <Doodle> doods = new List <Doodle>(); ItemBase.changeIndex(this.colorIndex); //Create new doodles from where the doodle was split. foreach (List <Vector3> seg in segs) { if (!initErase) { Doodle dood = Instantiate(ItemBase.itemBase.DoodlePrefab).GetComponent <Doodle>(); dood.gameObject.SetActive(true); dood.lr = dood.GetComponent <LineRenderer>(); ItemBase.itemBase.Add(dood); dood.CmdSetPoints(seg.ToArray()); doods.Add(dood); //ItemBase.items.Add(dood); } initErase = !initErase; } destroyed = true; ItemBase.itemBase.Remove(this); return(doods); }
//deprecated public void erasePoint(Vector3 p) { Vector3[] verts = new Vector3[lr.positionCount]; lr.GetPositions(verts); int index = -1; for (int i = 0; i < lr.positionCount; ++i) { if (verts[i] == p) { index = i; break; } } if (index == -1) { Debug.LogError("Attempted to erase non-existent point " + p); } else if (index <= 1) //front end { for (int i = index; i < lr.positionCount - index - 1; ++i) { verts[i] = verts[i + index + 1]; } lr.positionCount -= (index + 1); } else if (index >= lr.positionCount - 1) //back end { lr.positionCount = index; } else //somewhere in the middle { List <Vector3> newDoodPositions = new List <Vector3>(); for (int i = index; i < lr.positionCount - 1; ++i) { newDoodPositions.Add(verts[i]); } lr.positionCount = index - 1; Doodle newDood = Instantiate(ItemBase.itemBase.DoodlePrefab).GetComponent <Doodle>(); newDood.CmdSetPoints(newDoodPositions.ToArray()); } }