internal CsgOperation(CsgVisitor inVisitor) { // csgVisitor = inVisitor; // deferredFaces = new List <DeferredFace>(8); }
public CsgOperation( CsgVisitor inVisitor ) { // csgVisitor = inVisitor; // deferredFaces = new List<DeferredFace>(8); }
/// <summary> /// Performs CSG Operation on this Object (Master) with given Slaves. /// </summary> /// <param name='inOper'> /// In oper. /// </param> /// <param name='inSlaves'> /// In slaves. /// </param> public void PerformCSG(CsgOperation.ECsgOperation inOper, GameObject[] inSlaves) { // CreateFromMesh(); // create bsp generator BspGen gen = new BspGen(GlobalSettings.BspOptimization); rootNode = gen.GenerateBspTree(faces); List <CSGFace> savedFaces = new List <CSGFace>(); // foreach (GameObject g in inSlaves) { CSGObject slave = g.GetComponent <CSGObject>(); // if we have a csg object and we are not our self // and intersecting if (slave && g != gameObject && intersect(slave)) { Debug.Log(g.name); // slave.CreateFromMesh(); // .... BspGen genSlave = new BspGen(GlobalSettings.BspOptimization); slave.rootNode = genSlave.GenerateBspTree(slave.faces); CsgVisitor visitor = null; switch (inOper) { case CsgOperation.ECsgOperation.CsgOper_Additive: visitor = new UnionVisitor(); break; case CsgOperation.ECsgOperation.CsgOper_Subtractive: visitor = new SubtractiveVisitor(); break; case CsgOperation.ECsgOperation.CsgOper_Intersect: visitor = new IntersectVisitor(); break; case CsgOperation.ECsgOperation.CsgOper_DeIntersect: visitor = new DeIntersectVisitor(); break; default: visitor = null; break; } CsgOperation oper = new CsgOperation(visitor); oper.Perform(inOper, this, slave); // save faces savedFaces.AddRange(faces); } } // If we want to merge Coplanars after every Operation if (GlobalSettings.MergeCoplanars) { MergeFaces(); } // for additive or subtracte operation, built faces list from bsp tree // for others, use faces directly if (inOper == CsgOperation.ECsgOperation.CsgOper_Additive || inOper == CsgOperation.ECsgOperation.CsgOper_Subtractive) { // create new face list List <CSGFace> newFaces = new List <CSGFace>(); // create faces from bsp nodes BspHelper.FacesFromNodes(rootNode, newFaces); // copy to face list faces = newFaces; } else { // copy saved faces faces = savedFaces; } // Face.MergeCoplanars( faces ); // copy to unity structure TransferFacesToMesh(); // dumb tree // BspHelper.DumpTree( rootNode ); }