// Update is called once per frame void Update() { foreach (var i in segments) { Debug.DrawLine(i.start, i.end); } if (Input.GetMouseButtonDown(0)) { var item = Instantiate(redX); objs.Add(item); Vector2 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition); item.transform.position = pos; baseShape.Add(pos); } if (Input.GetMouseButtonDown(1)) { var item = Instantiate(blueX); objs.Add(item); Vector2 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition); item.transform.position = pos; notShape.Add(pos); } if (Input.GetKeyDown(KeyCode.Space)) { bool none; var retr = CSGshape.not(new CSGshape(baseShape), new CSGshape(notShape), false, out none); foreach (var i in objs) { Destroy(i); } baseShape.Clear(); notShape.Clear(); segments.Clear(); foreach (var j in retr) { foreach (var i in j.externalHull.segments) { var item = Instantiate(redX); objs.Add(item); item.transform.position = i.start; baseShape.Add(i.start); segments.Add(i); //Debug.DrawLine(i.start,i.end); /*item = Instantiate(redX); * item.transform.position = i.end; * baseShape.Add(i.end);*/ } } } }
private void ShapeOp(CSGshape other, bool isNot) { List <CollisionHull> hulls = new List <CollisionHull>(); bool isShapeUsedUp = false; foreach (var coll in colliders) { if (!isShapeUsedUp || isNot == false) { var result = CSGshape.not(coll.externalHull, other, isNot, out isShapeUsedUp, coll.holes); hulls.AddRange(result); } } if (!isShapeUsedUp && !isNot) { var foo = new CollisionHull(); foo.externalHull = other; hulls.Add(foo); } colliders = hulls; }
// Update is called once per frame void Update() { Draw(); if (Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1)) { try { doNotRender.Clear(); Vector2 center = Camera.main.ScreenToWorldPoint(Input.mousePosition); List <Vector2[]> newShapes = new List <Vector2[]>(); List <List <CSGshape> > shapeHoles = new List <List <CSGshape> >(); List <Vector2> square = getCircle(center, 1, 20); //List<CollisionHull> shapesSoFar = new List<CollisionHull>();//#garbagelife //Debug.Log("shapesofarleng:" + shapesSoFar.Count); bool isShapesUsedUp = false; //prevents applying positive and to multiple for (int path = 0; path < baseCollider.pathCount; path++) { if (!isShapesUsedUp || Input.GetMouseButtonDown(0)) { var b = new CSGshape(new List <Vector2>(baseCollider.GetPath(path))); //List<Vector2> square = getCircle();//getSquare(center); { var retr = CSGshape.not(b, new CSGshape(square), Input.GetMouseButtonDown(0), out isShapesUsedUp, null); //retr = CSGshape.prune(shapesSoFar,retr); //shapesSoFar.AddRange(retr); foreach (var returnVal in retr) { newShapes.Add(collisionHullToVector2(returnVal.externalHull)); doNotRender.Add(false); if (returnVal.holes != null) { newShapes.AddRange(returnVal.holes.Select(a => collisionHullToVector2(a))); for (var i = 0; i < returnVal.holes.Count; i++) { doNotRender.Add(true); } } //shapeHoles.Add(returnVal.holes); } } } else { newShapes.Add(baseCollider.GetPath(path)); doNotRender.Add(false); } } if (!isShapesUsedUp && Input.GetMouseButtonDown(1)) { newShapes.Add(square.ToArray()); doNotRender.Add(false); } if (newShapes.Count != doNotRender.Count) { throw new Exception("F**K"); } baseCollider.pathCount = newShapes.Count(); int counter = 0; foreach (var i in newShapes) { baseCollider.SetPath(counter, i); counter++; } } catch (NotImplementedException e)//(Exception e) { //Debug.Log("EXCEPTION:" + e.ToString()); } } }