Exemple #1
0
    static void AddComponent()
    {
        for (int i = 0; i < Selection.gameObjects.Length; ++i)
        {
            GameObject go  = Selection.gameObjects[i];
            CSGObject  obj = go.GetComponent <CSGObject>();

            Mesh mesh = go.GetComponent <MeshFilter>() != null?go.GetComponent <MeshFilter>().sharedMesh : null;

            if (!obj && mesh)
            {
                // TODO: add bsp tree generation on add...
                CSGObject  csg    = go.AddComponent <CSGObject>();
                MeshFilter filter = go.GetComponent <MeshFilter>();

                // clone mesh as every csg object needs his own mesh
                filter.sharedMesh = ObjectCloner.CloneMesh(filter.sharedMesh);
                //
                csg.CreateFromMesh();
            }
            else
            {
                Debug.Log("No Mesh or already an CSG Object");
            }
        }
    }
Exemple #2
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(GlobalSettings.BspOptimization);

                obj.rootNode = gen.GenerateBspTree(obj.faces);
            }
        }
    }
Exemple #3
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, 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 );
    }