Exemple #1
0
        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(BooleanSettings.BspOptimization);

                    obj.rootNode = gen.GenerateBspTree(obj.faces);
                }
            }
        }
Exemple #2
0
        /// <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, CSGObject[] inSlaves)
        {
            //
            CreateFromMesh();

            // create bsp generator
            BspGen gen = new BspGen(BooleanSettings.BspOptimization);

            rootNode = gen.GenerateBspTree(faces);

            List <Face> savedFaces = new List <Face>();

            //
            foreach (var slave in inSlaves)
            {
                // if we have a csg object and we are not our self
                // and intersecting
                if (slave && slave.gameObject != gameObject && intersect(slave))
                {
                    Debug.Log(slave.gameObject.name);

                    //
                    slave.CreateFromMesh();

                    // ....
                    BspGen genSlave = new BspGen(BooleanSettings.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 (BooleanSettings.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;
            }

            // copy to unity structure
            TransferFacesToMesh();
        }