static void BuildTree() { for (int i = 0; i < Selection.gameObjects.Length; ++i) { GameObject go = Selection.gameObjects[i]; CSGObject obj = go.GetComponent <CSGObject>(); if (obj) { obj.CreateFromMesh(); BspGen gen = new BspGen(GlobalSettings.BspOptimization); obj.rootNode = gen.GenerateBspTree(obj.faces); } } }
// public void Perform(ECsgOperation inOper, CSGObject inMaster, CSGObject inSlave) { // we are processing our slave faces processState = EProcessState.Process_Slave; // process faces against master tree PerformFaces(inMaster.rootNode, inSlave.faces); // process face from master tree processState = EProcessState.Process_Master; // perform master faces on slave bsp tree PerformTree(inMaster.rootNode, inSlave.rootNode); // check if how do we need to process generated faces if (inOper == ECsgOperation.CsgOper_Additive || inOper == ECsgOperation.CsgOper_Subtractive) { // add deferred faces to master tree... for (int i = 0; i < deferredFaces.Count; i++) { CSGFace defFace = ((DeferredFace)deferredFaces[i]).face; BspNode startNode = ((DeferredFace)deferredFaces[i]).node; // testing startNode = inMaster.rootNode; // add node to master tree BspGen.AddNodeRecursive(startNode, defFace, BspNode.BspFlags_IsNew); } } else { // clear old faces list inMaster.faces.Clear(); // copy created faces for (int i = 0; i < deferredFaces.Count; i++) { inMaster.faces.Add(deferredFaces[i].face); } } // clear deferred faces deferredFaces.Clear(); }
/// <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<Face> savedFaces = new List<Face>(); // 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<Face> newFaces = new List<Face>(); // 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 ); }
/// <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 ); }
/* Intersection * * * // Master Faces against Slave Tree * private void AdditiveMaster( Face inFace, EPolySide inSide, OperationInfo info ) * { * Debug.Log( inSide ); * * switch( inSide ) * { * case EPolySide.PolySide_Outside: * case EPolySide.PolySide_Planar_Front: * // discard original node * currentNode.flags |= BspNode.BspFlags_IsDestroyed; * break; * case EPolySide.PolySide_Inside: * case EPolySide.PolySide_Planar_Back: * case EPolySide.PolySide_CoPlanar_Back: * case EPolySide.PolySide_CoPlanar_Front: * // add cutted polygons * if( (inFace.flags & Face.FaceFlags_WasCutted) != 0 ) * BspGen.AddNode( currentNode, BspNode.EBspLocation.BspLocation_Planar, inFace, BspNode.BspFlags_IsNew ); * break; * * } * } * * // Slave Polygons against Master Tree * private void AdditiveSlave( Face inFace, EPolySide inSide, OperationInfo info ) * { * * // Debug.Log( inSide ); * * switch( inSide ) * { * case EPolySide.PolySide_Outside: * case EPolySide.PolySide_CoPlanar_Front: * case EPolySide.PolySide_Planar_Front: * break; * case EPolySide.PolySide_Inside: * case EPolySide.PolySide_Planar_Back: * case EPolySide.PolySide_CoPlanar_Back: * * // add to deferred faces * DeferredFace defFace; * defFace.face = inFace; * defFace.node = currentNode; * deferredFaces.Add( defFace ); * break; * * } * } */ // Callback for Visitor public void AddPlanarFace(CSGFace inFace) { BspGen.AddNode(currentNode, BspNode.EBspLocation.BspLocation_Planar, inFace, BspNode.BspFlags_IsNew); }
static void BuildTree() { for( int i = 0; i < Selection.gameObjects.Length; ++i ) { GameObject go = Selection.gameObjects[i]; CSGObject obj = go.GetComponent<CSGObject>(); if( obj ) { obj.CreateFromMesh(); BspGen gen = new BspGen( GlobalSettings.BspOptimization ); obj.rootNode = gen.GenerateBspTree( obj.faces ); } } }