Ejemplo n.º 1
0
    //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);
    }
Ejemplo n.º 2
0
    //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());
        }
    }