Snippets
Created by
David Williams
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using Cubiquity;
#if UNITY_EDITOR
using UnityEditor;
#endif
public class VoxelTerrainToMesh : MonoBehaviour {
#if UNITY_EDITOR
public TerrainVolume terrainVolume;
bool Exported = false;
MeshFilter filter;
new MeshRenderer renderer;
new MeshCollider collider;
Material[] meshMaterials;
Mesh tempMesh;
GameObject newObj;
GameObject tempObj;
protected GameObject RecursiveMeshExport(string MeshFolder, GameObject Obj, GameObject ParentObj) {
newObj = null;
if (Obj != null) {
newObj = new GameObject(Obj.name);
newObj.transform.position = Obj.transform.position;
newObj.transform.rotation = Obj.transform.rotation;
newObj.transform.localScale = Obj.transform.localScale;
newObj.transform.SetParent(ParentObj.transform);
filter = Obj.GetComponent<MeshFilter>();
if (filter != null && filter.sharedMesh != null) {
if (filter.sharedMesh.vertices.Length > 3) {
string MeshFile = MeshFolder + "/" + Obj.name + ".obj";
if (!Directory.Exists(MeshFolder)) {
Directory.CreateDirectory(MeshFolder);
}
tempMesh = Instantiate(filter.mesh);
AssetDatabase.CreateAsset(tempMesh, MeshFile);
AssetDatabase.SaveAssets();
filter = newObj.AddComponent<MeshFilter>();
filter.sharedMesh = tempMesh;//Resources.Load<Mesh>(MeshFile);
renderer = Obj.GetComponent<MeshRenderer>();
if (renderer != null) {
meshMaterials = renderer.sharedMaterials;
renderer = newObj.AddComponent<MeshRenderer>();
renderer.sharedMaterials = meshMaterials;
collider = newObj.AddComponent<MeshCollider>();
collider.sharedMesh = tempMesh;
}
} else {
Debug.Log("Excluding Single Triangle Mesh");
}
}
if (Obj.transform.childCount > 0) {
for (int c = 0; c < Obj.transform.childCount; c++) {
tempObj = RecursiveMeshExport(MeshFolder, Obj.transform.GetChild(c).gameObject, newObj);
if (tempObj != null) {
tempObj.transform.SetParent(ParentObj.transform);
}
}
}
}
return newObj;
}
public void VolumeFinished() {
Debug.Log("Volume Finished");
if (terrainVolume != null) {
string FilePath = "Assets/Drone/Terrains/" + name;
//TODO: Recurse Octree, grab all Meshes, combine, then write to file
Debug.Log("Attempting Mesh Export to \"" + FilePath + "\"");
Cubiquity.Impl.OctreeNode OctNode = GetComponentInChildren<Cubiquity.Impl.OctreeNode>();
if (OctNode != null) {
Vector3 OriginalScale = transform.localScale;
Vector3 OriginalPosition = transform.position;
Quaternion OriginalRotation = transform.rotation;
transform.localScale = Vector3.one;
transform.position = Vector3.zero;
transform.rotation = Quaternion.identity;
GameObject NewPrefab = new GameObject(name + "_mesh");
RecursiveMeshExport(FilePath, OctNode.gameObject, NewPrefab);
NewPrefab.transform.localScale = OriginalScale;
NewPrefab.transform.position = OriginalPosition;
NewPrefab.transform.rotation = OriginalRotation;
PrefabUtility.CreatePrefab(FilePath + "_mesh.prefab", NewPrefab);
transform.localScale = OriginalScale;
transform.position = OriginalPosition;
transform.rotation = OriginalRotation;
}
}
terrainVolume.OnMeshSyncComplete -= VolumeFinished;
terrainVolume.OnMeshSyncLost -= VolumeFailed;
Exported = true;
}
public void VolumeFailed() {
Debug.Log("Volume Failed");
terrainVolume.OnMeshSyncComplete -= VolumeFinished;
terrainVolume.OnMeshSyncLost -= VolumeFailed;
}
private void Start() {
if (!Exported) {
terrainVolume = GetComponent<TerrainVolume>();
if (terrainVolume != null) {
terrainVolume.OnMeshSyncComplete += VolumeFinished;
terrainVolume.OnMeshSyncLost += VolumeFailed;
}
} else {
Destroy(this);
}
}
#endif
}
|
Comments (0)
You can clone a snippet to your computer for local editing. Learn more.