Exemple #1
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 );
		
	}
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, 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 );
    }