Beispiel #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(GlobalSettings.BspOptimization);

                obj.rootNode = gen.GenerateBspTree(obj.faces);
            }
        }
    }
Beispiel #2
0
    //
    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();
    }
Beispiel #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<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 );
		
	}
Beispiel #4
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 );
    }
Beispiel #5
0
    /* 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);
    }
Beispiel #6
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 );
			}
		}
		
	}