using System.Collections.Generic; using UnityEngine; using System.Diagnostics; using Habrador_Computational_Geometry; public class MeshWithHole : MonoBehaviour { private List outerPolygon; private List holeVertices; private MeshFilter meshFilter; private Mesh mesh; void Start() { // Initialize the mesh filter and renderer meshFilter = gameObject.GetComponent(); if (meshFilter == null) { UnityEngine.Debug.LogError("MeshFilter is missing."); return; } gameObject.AddComponent(); // Initialize the mesh object mesh = new Mesh(); // Define the outer polygon vertices (clockwise) outerPolygon = new() { // Counter new(-50f, -45f), new(50f, -45f), new(50f, 30f), new(-50f, 50f) }; // Define the hole vertices (counterclockwise) holeVertices = new() { //Clock new(-10f, -10f), new(-10f, 10f), new(10f, 10f), new(10f, -10f) }; List holeVertices2 = new() { //Clock new(-30f, -20f), new(-30f, 20f), new(-20f, 20f), new(-20f, -20f) }; List holeVertices3 = new() { //Clock new(30f, -20f), new(30f, 20f), new(40f, 20f), new(40f, -20f) }; List holeVertices4 = new() { //Clock new(-40f, -40f), new(-40f, -30f), new(-30f, -30f), new(-30f, -40f) }; List holeVertices5 = new() { //Clock new(-20f, -40f), new(-20f, -30f), new(20f, -30f), new(20f, -40f) }; List holeVertices6 = new() { //Clock new(30f, -40f), new(30f, -30f), new(40f, -30), new(40f, -40f) }; List holeVertices7 = new() { //Clock new(-10f, 20f), new(0f, 30f), new(10f, 20) }; // Debugging to check the input data UnityEngine.Debug.Log("Outer polygon vertices count: " + outerPolygon.Count); UnityEngine.Debug.Log("Hole vertices count: " + holeVertices.Count); List> holes = new List>() { holeVertices,holeVertices2,holeVertices3,holeVertices4,holeVertices5,holeVertices6,holeVertices7}; Stopwatch timer = new Stopwatch(); timer.Start(); // Perform triangulation and check if it's valid HashSet triangulation = _EarClipping.Triangulate(outerPolygon, holes); if (triangulation == null) { UnityEngine.Debug.LogError("Triangulation failed, check input data."); return; } // Convert the triangulated data to a Unity mesh and check if it's valid mesh = _TransformBetweenDataStructures.Triangles2ToMesh(triangulation, true); if (mesh == null) { UnityEngine.Debug.LogError("Mesh conversion failed."); return; } timer.Stop(); UnityEngine.Debug.Log("Triangulation and mesh generation took: " + timer.ElapsedMilliseconds + " ms"); //FlipMeshTriangles(mesh); meshFilter.mesh = mesh; mesh.RecalculateNormals(); mesh.RecalculateBounds(); gameObject.GetComponent().material=CreateDoubleSidedURPMaterial(); } private Material CreateDoubleSidedURPMaterial() { // Create a URP-compatible material Material urpMaterial = new Material(Shader.Find("Universal Render Pipeline/Lit")); // Set material properties (color, texture, etc.) urpMaterial.color = Color.green; // Example: set the material color to green // Enable double-sided rendering urpMaterial.SetFloat("_CullMode", 0); // 0 means no culling, rendering both sides of the faces return urpMaterial; } void FlipMeshTriangles(Mesh mesh) { int[] triangles = mesh.triangles; // Flip each triangle by swapping the second and third vertices for (int i = 0; i < triangles.Length; i += 3) { int temp = triangles[i + 1]; triangles[i + 1] = triangles[i + 2]; triangles[i + 2] = temp; } // Assign the flipped triangles back to the mesh mesh.triangles = triangles; } }