public static Mesh GenerateMeshFromScriptableObject(CScriptableCharacter character) { Mesh mesh = new Mesh(); CCubeMesh[] cubesMesh = new CCubeMesh[character.CubePositions.Length]; for (int amount = 0; amount < cubesMesh.Length; amount++) { cubesMesh[amount] = new CCubeMesh(character.CubePositions[amount]); } List <BasicMesh> cubesMeshData = new List <BasicMesh>(); foreach (var cubeMesh in cubesMesh) { bool[] neighbours = HasNeighbours(cubeMesh.Position, character); cubesMeshData.Add(cubeMesh.GetMeshData(!neighbours[0], !neighbours[1], !neighbours[2], !neighbours[3], !neighbours[4], !neighbours[5])); } BasicMesh complete = new BasicMesh(); foreach (var basicMesh in cubesMeshData) { CombineBasicMeshes(ref complete, basicMesh, character); } if (cubesMesh != null) { mesh.Clear(); mesh.vertices = complete.Vertices.ToArray(); mesh.triangles = complete.Triangles.ToArray(); mesh.RecalculateNormals(); } return(mesh); }
private static bool HasCubeAt(Vector3Int pos, CScriptableCharacter character) { for (int i = 0; i < character.CubePositions.Length; i++) { if (character.CubePositions[i].Equals(pos)) { return(true); } } return(false); }
private static void CombineBasicMeshes(ref BasicMesh first, BasicMesh second, CScriptableCharacter character) { int triOffset = first.Vertices.Count; foreach (var vert in second.Vertices) { first.Vertices.Add((vert - character.Offset) / character.CharacterScaling); } foreach (var tri in second.Triangles) { first.Triangles.Add(tri + triOffset); } }
private static bool[] HasNeighbours(Vector3Int position, CScriptableCharacter character) { return(new bool[] { HasCubeAt(position + new Vector3Int(0, 0, 1), character), HasCubeAt(position + new Vector3Int(0, 0, -1), character), HasCubeAt(position + new Vector3Int(1, 0, 0), character), HasCubeAt(position + new Vector3Int(-1, 0, 0), character), HasCubeAt(position + new Vector3Int(0, 1, 0), character), HasCubeAt(position + new Vector3Int(0, -1, 0), character) }); }