using UnityEngine;
using System.Collections.Generic;
namespace Pathfinding.Voxels {
using Pathfinding.Util;
/// Various utilities for voxel rasterization.
public class Utility {
public static float Min (float a, float b, float c) {
a = a < b ? a : b;
return a < c ? a : c;
}
public static float Max (float a, float b, float c) {
a = a > b ? a : b;
return a > c ? a : c;
}
///
/// Removes duplicate vertices from the array and updates the triangle array.
/// Returns: The new array of vertices
///
public static Int3[] RemoveDuplicateVertices (Int3[] vertices, int[] triangles) {
// Get a dictionary from an object pool to avoid allocating a new one
var firstVerts = ObjectPoolSimple >.Claim();
firstVerts.Clear();
// Remove duplicate vertices
var compressedPointers = new int[vertices.Length];
int count = 0;
for (int i = 0; i < vertices.Length; i++) {
if (!firstVerts.ContainsKey(vertices[i])) {
firstVerts.Add(vertices[i], count);
compressedPointers[i] = count;
vertices[count] = vertices[i];
count++;
} else {
// There are some cases, rare but still there, that vertices are identical
compressedPointers[i] = firstVerts[vertices[i]];
}
}
firstVerts.Clear();
ObjectPoolSimple >.Release(ref firstVerts);
for (int i = 0; i < triangles.Length; i++) {
triangles[i] = compressedPointers[triangles[i]];
}
var compressed = new Int3[count];
for (int i = 0; i < count; i++) compressed[i] = vertices[i];
return compressed;
}
}
}