|
|
|
|
|
namespace MagicaVoxelToolbox {
|
|
|
|
|
|
using System.Collections;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public class UnlimitiedMesh {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Global
|
|
|
|
|
|
private const int MAX_VERTEX_COUNT = 65532;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// API
|
|
|
|
|
|
public int Count {
|
|
|
|
|
|
get {
|
|
|
|
|
|
return Meshs.Count;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public Mesh this[int index] {
|
|
|
|
|
|
get {
|
|
|
|
|
|
return GetMeshAt(index);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Data
|
|
|
|
|
|
private List<Mesh> Meshs = new List<Mesh>();
|
|
|
|
|
|
private List<int> MaterialIndex = new List<int>();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// API
|
|
|
|
|
|
public UnlimitiedMesh (List<List<Vector3>> verticess, List<List<Vector2>> uvss, List<BoneWeight> boneWeights = null) {
|
|
|
|
|
|
|
|
|
|
|
|
if (verticess == null || uvss == null || verticess.Count != uvss.Count) { return; }
|
|
|
|
|
|
|
|
|
|
|
|
Meshs = new List<Mesh>();
|
|
|
|
|
|
MaterialIndex = new List<int>();
|
|
|
|
|
|
|
|
|
|
|
|
for (int matIndex = 0; matIndex < verticess.Count; matIndex++) {
|
|
|
|
|
|
|
|
|
|
|
|
var vertices = verticess[matIndex];
|
|
|
|
|
|
var uvs = uvss[matIndex];
|
|
|
|
|
|
int vCount = vertices.Count;
|
|
|
|
|
|
int meshNum = vCount / MAX_VERTEX_COUNT + 1;
|
|
|
|
|
|
|
|
|
|
|
|
for (int index = 0; index < meshNum; index++) {
|
|
|
|
|
|
|
|
|
|
|
|
var mesh = new Mesh();
|
|
|
|
|
|
|
|
|
|
|
|
// Vertices
|
|
|
|
|
|
int vertCount = Mathf.Min(MAX_VERTEX_COUNT, vertices.Count - index * MAX_VERTEX_COUNT);
|
|
|
|
|
|
mesh.SetVertices(vertices.GetRange(index * MAX_VERTEX_COUNT, vertCount));
|
|
|
|
|
|
|
|
|
|
|
|
// UV
|
|
|
|
|
|
mesh.SetUVs(0, uvs.GetRange(
|
|
|
|
|
|
index * MAX_VERTEX_COUNT,
|
|
|
|
|
|
Mathf.Min(MAX_VERTEX_COUNT, uvs.Count - index * MAX_VERTEX_COUNT)
|
|
|
|
|
|
));
|
|
|
|
|
|
|
|
|
|
|
|
// Tri
|
|
|
|
|
|
mesh.SetTriangles(GetDefaultTriangleData(vertCount), 0);
|
|
|
|
|
|
mesh.UploadMeshData(false);
|
|
|
|
|
|
|
|
|
|
|
|
// Color
|
|
|
|
|
|
mesh.colors = GetWhiteColors(vertCount);
|
|
|
|
|
|
|
|
|
|
|
|
// BoneWeights
|
|
|
|
|
|
if (boneWeights != null && boneWeights.Count > 0) {
|
|
|
|
|
|
mesh.boneWeights = boneWeights.GetRange(index * MAX_VERTEX_COUNT, vertCount).ToArray();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
mesh.RecalculateNormals();
|
|
|
|
|
|
mesh.RecalculateTangents();
|
|
|
|
|
|
mesh.RecalculateBounds();
|
|
|
|
|
|
mesh.UploadMeshData(false);
|
|
|
|
|
|
|
|
|
|
|
|
Meshs.Add(mesh);
|
|
|
|
|
|
MaterialIndex.Add(matIndex);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public UnlimitiedMesh (List<Vector3> vertices, List<Vector2> uvs, List<BoneWeight> boneWeights = null) : this(
|
|
|
|
|
|
new List<List<Vector3>>() { vertices }, new List<List<Vector2>>() { uvs }, boneWeights
|
|
|
|
|
|
) { }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public Mesh GetMeshAt (int index) {
|
|
|
|
|
|
return Meshs[index];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public int GetMaterialIndexAt (int index) {
|
|
|
|
|
|
return MaterialIndex[index];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private int[] GetDefaultTriangleData (int verCount) {
|
|
|
|
|
|
int quadCount = verCount / 4;
|
|
|
|
|
|
int[] result = new int[quadCount * 6];
|
|
|
|
|
|
for (int i = 0; i < quadCount; i++) {
|
|
|
|
|
|
result[i * 6] = i * 4;
|
|
|
|
|
|
result[i * 6 + 1] = i * 4 + 1;
|
|
|
|
|
|
result[i * 6 + 2] = i * 4 + 2;
|
|
|
|
|
|
result[i * 6 + 3] = i * 4;
|
|
|
|
|
|
result[i * 6 + 4] = i * 4 + 2;
|
|
|
|
|
|
result[i * 6 + 5] = i * 4 + 3;
|
|
|
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private Color[] GetWhiteColors (int verCount) {
|
|
|
|
|
|
var colors = new Color[verCount];
|
|
|
|
|
|
Color c = Color.white;
|
|
|
|
|
|
for (int i = 0; i < verCount; i++) {
|
|
|
|
|
|
colors[i] = c;
|
|
|
|
|
|
}
|
|
|
|
|
|
return colors;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|