// Original CSG.JS library by Evan Wallace (http://madebyevan.com), under the MIT license.
// GitHub: https://github.com/evanw/csg.js/
//
// C++ port by Tomasz Dabrowski (http://28byteslater.com), under the MIT license.
// GitHub: https://github.com/dabroz/csgjs-cpp/
//
// C# port by Karl Henkel (parabox.co), under MIT license.
//
// Constructive Solid Geometry (CSG) is a modeling technique that uses Boolean
// operations like union and intersection to combine 3D solids. This library
// implements CSG operations on meshes elegantly and concisely using BSP trees,
// and is meant to serve as an easily understandable implementation of the
// algorithm. All edge cases involving overlapping coplanar polygons in both
// solids are correctly handled.
using UnityEngine;
using System.Collections.Generic;
namespace UnityEngine.ProBuilder.Csg
{
///
/// Base class for CSG operations. Contains GameObject level methods for Subtraction, Intersection, and Union operations.
/// The GameObjects passed to these functions will not be modified.
///
static class Boolean
{
// Tolerance used by `splitPolygon()` to decide if a point is on the plane.
internal const float k_Epsilon = 0.00001f;
///
/// Returns a new mesh by merging @lhs with @rhs.
///
/// The base mesh of the boolean operation.
/// The input mesh of the boolean operation.
/// A new mesh if the operation succeeds, or null if an error occurs.
public static Model Union(GameObject lhs, GameObject rhs)
{
Model csg_model_a = new Model(lhs);
Model csg_model_b = new Model(rhs);
Node a = new Node(csg_model_a.ToPolygons());
Node b = new Node(csg_model_b.ToPolygons());
List polygons = Node.Union(a, b).AllPolygons();
return new Model(polygons);
}
///
/// Returns a new mesh by subtracting @lhs with @rhs.
///
/// The base mesh of the boolean operation.
/// The input mesh of the boolean operation.
/// A new mesh if the operation succeeds, or null if an error occurs.
public static Model Subtract(GameObject lhs, GameObject rhs)
{
Model csg_model_a = new Model(lhs);
Model csg_model_b = new Model(rhs);
Node a = new Node(csg_model_a.ToPolygons());
Node b = new Node(csg_model_b.ToPolygons());
List polygons = Node.Subtract(a, b).AllPolygons();
return new Model(polygons);
}
///
/// Returns a new mesh by intersecting @lhs with @rhs.
///
/// The base mesh of the boolean operation.
/// The input mesh of the boolean operation.
/// A new mesh if the operation succeeds, or null if an error occurs.
public static Model Intersect(GameObject lhs, GameObject rhs)
{
Model csg_model_a = new Model(lhs);
Model csg_model_b = new Model(rhs);
Node a = new Node(csg_model_a.ToPolygons());
Node b = new Node(csg_model_b.ToPolygons());
List polygons = Node.Intersect(a, b).AllPolygons();
return new Model(polygons);
}
}
}