Advertisement
Guest User

Untitled

a guest
Jul 16th, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.31 KB | None | 0 0
  1. using MeshSplitting.MeshTools;
  2. using MeshSplitting.SplitterMath;
  3. using System;
  4. using UnityEngine;
  5.  
  6. namespace MeshSplitting.Splitables
  7. {
  8. [AddComponentMenu("Mesh Splitting/Splitable")]
  9. public class Splitable : MonoBehaviour, ISplitable
  10. {
  11. #if UNITY_EDITOR
  12. [NonSerialized]
  13. public bool ShowDebug = false;
  14. #endif
  15.  
  16. public GameObject OptionalTargetObject;
  17. public bool Convex = false;
  18. public float SplitForce = 0f;
  19.  
  20. public bool CreateCap = true;
  21. public bool UseCapUV = false;
  22. public bool CustomUV = false;
  23. public Vector2 CapUVMin = Vector2.zero;
  24. public Vector2 CapUVMax = Vector2.one;
  25.  
  26. public bool ForceNoBatching = false;
  27.  
  28. private Transform _transform;
  29.  
  30. private PlaneMath _splitPlane;
  31. private MeshContainer[] _meshContainerStatic;
  32. private IMeshSplitter[] _meshSplitterStatic;
  33. private MeshContainer[] _meshContainerSkinned;
  34. private IMeshSplitter[] _meshSplitterSkinned;
  35.  
  36. private bool _isSplitting = false;
  37. private bool _splitMesh = false;
  38.  
  39. private void Awake()
  40. {
  41. _transform = GetComponent<Transform>();
  42. }
  43.  
  44. private void Update()
  45. {
  46. if (_splitMesh)
  47. {
  48. _splitMesh = false;
  49.  
  50. bool anySplit = false;
  51.  
  52. for (int i = 0; i < _meshContainerStatic.Length; i++)
  53. {
  54. _meshContainerStatic[i].MeshInitialize();
  55. _meshContainerStatic[i].CalculateWorldSpace();
  56.  
  57. // split mesh
  58. _meshSplitterStatic[i].MeshSplit();
  59.  
  60. if (_meshContainerStatic[i].IsMeshSplit())
  61. {
  62. anySplit = true;
  63. if (CreateCap) _meshSplitterStatic[i].MeshCreateCaps();
  64. }
  65. }
  66.  
  67. for (int i = 0; i < _meshContainerSkinned.Length; i++)
  68. {
  69. _meshContainerSkinned[i].MeshInitialize();
  70. _meshContainerSkinned[i].CalculateWorldSpace();
  71.  
  72. // split mesh
  73. _meshSplitterSkinned[i].MeshSplit();
  74.  
  75. if (_meshContainerSkinned[i].IsMeshSplit())
  76. {
  77. anySplit = true;
  78. if (CreateCap) _meshSplitterSkinned[i].MeshCreateCaps();
  79. }
  80. }
  81.  
  82. if (anySplit) CreateNewObjects();
  83. _isSplitting = false;
  84. }
  85. }
  86.  
  87. public void Split(Transform splitTransform)
  88. {
  89. if (!_isSplitting)
  90. {
  91. _isSplitting = _splitMesh = true;
  92. _splitPlane = new PlaneMath(splitTransform);
  93.  
  94. MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();
  95. SkinnedMeshRenderer[] skinnedRenderes = GetComponentsInChildren<SkinnedMeshRenderer>();
  96.  
  97. _meshContainerStatic = new MeshContainer[meshFilters.Length];
  98. _meshSplitterStatic = new IMeshSplitter[meshFilters.Length];
  99.  
  100. for (int i = 0; i < meshFilters.Length; i++)
  101. {
  102. _meshContainerStatic[i] = new MeshContainer(meshFilters[i]);
  103.  
  104. _meshSplitterStatic[i] = Convex ? (IMeshSplitter)new MeshSplitterConvex(_meshContainerStatic[i], _splitPlane, splitTransform.rotation) :
  105. (IMeshSplitter)new MeshSplitterConcave(_meshContainerStatic[i], _splitPlane, splitTransform.rotation);
  106.  
  107. if (UseCapUV) _meshSplitterStatic[i].SetCapUV(UseCapUV, CustomUV, CapUVMin, CapUVMax);
  108. #if UNITY_EDITOR
  109. _meshSplitterStatic[i].DebugDraw(ShowDebug);
  110. #endif
  111. }
  112.  
  113. _meshSplitterSkinned = new IMeshSplitter[skinnedRenderes.Length];
  114. _meshContainerSkinned = new MeshContainer[skinnedRenderes.Length];
  115.  
  116. for (int i = 0; i < skinnedRenderes.Length; i++)
  117. {
  118. _meshContainerSkinned[i] = new MeshContainer(skinnedRenderes[i]);
  119.  
  120. _meshSplitterSkinned[i] = Convex ? (IMeshSplitter)new MeshSplitterConvex(_meshContainerSkinned[i], _splitPlane, splitTransform.rotation) :
  121. (IMeshSplitter)new MeshSplitterConcave(_meshContainerSkinned[i], _splitPlane, splitTransform.rotation);
  122.  
  123. if (UseCapUV) _meshSplitterSkinned[i].SetCapUV(UseCapUV, CustomUV, CapUVMin, CapUVMax);
  124. #if UNITY_EDITOR
  125. _meshSplitterSkinned[i].DebugDraw(ShowDebug);
  126. #endif
  127. }
  128. }
  129. }
  130.  
  131. private void CreateNewObjects()
  132. {
  133. Transform parent = transform.parent; //$$namutil
  134. if (parent == null)
  135. {
  136. GameObject go = new GameObject("Parent: " + gameObject.name);
  137. parent = go.transform;
  138. parent.position = Vector3.zero;
  139. parent.rotation = Quaternion.identity;
  140. parent.localScale = Vector3.one;
  141. }
  142.  
  143. Mesh origMesh = GetMeshOnGameObject(gameObject);
  144. Rigidbody ownBody = null;
  145. float ownMass = 100f;
  146. float ownVolume = 1f;
  147.  
  148. if (origMesh != null)
  149. {
  150. ownBody = GetComponent<Rigidbody>();
  151. if (ownBody != null) ownMass = ownBody.mass;
  152. Vector3 ownMeshSize = origMesh.bounds.size;
  153. ownVolume = ownMeshSize.x * ownMeshSize.y * ownMeshSize.z;
  154. }
  155.  
  156. GameObject[] newGOs = new GameObject[2];
  157. if (OptionalTargetObject == null)
  158. {
  159. newGOs[0] = Instantiate(gameObject, parent, true) as GameObject;
  160. newGOs[0].name = gameObject.name;
  161. newGOs[1] = gameObject;
  162. Destroy(newGOs[0].GetComponent<FixedJoint>());
  163. Destroy(newGOs[1].GetComponent<FixedJoint>());
  164. }
  165. else
  166. {
  167. newGOs[0] = Instantiate(OptionalTargetObject) as GameObject;
  168. newGOs[1] = Instantiate(OptionalTargetObject) as GameObject;
  169. }
  170.  
  171. //Animation[] animSources = newGOs[1].GetComponentsInChildren<Animation>();
  172. //Animation[] animDests = newGOs[0].GetComponentsInChildren<Animation>();
  173. //for (int i = 0; i < animSources.Length; i++)
  174. //{
  175. // foreach (AnimationState stateSource in animSources[i])
  176. // {
  177. // AnimationState stateDest = animDests[i][stateSource.name];
  178. // stateDest.enabled = stateSource.enabled;
  179. // stateDest.weight = stateSource.weight;
  180. // stateDest.time = stateSource.time;
  181. // stateDest.speed = stateSource.speed;
  182. // stateDest.layer = stateSource.layer;
  183. // stateDest.blendMode = stateSource.blendMode;
  184. // }
  185. //}
  186.  
  187. for (int i = 0; i < 2; i++)
  188. {
  189. UpdateMeshesInChildren(i, newGOs[i]);
  190.  
  191. //Transform newTransform = newGOs[i].GetComponent<Transform>();
  192. //newTransform.parent = parent;
  193. Mesh newMesh = GetMeshOnGameObject(newGOs[i]);
  194. if (newMesh != null)
  195. {
  196. MeshCollider newCollider = newGOs[i].GetComponent<MeshCollider>();
  197.  
  198. if (newCollider != null)
  199. {
  200. newCollider.sharedMesh = newMesh;
  201. newCollider.convex = Convex;
  202.  
  203. // if hull has less than 255 polygons set convex, Unity limit!
  204. if (newCollider.convex && newMesh.triangles.Length > 765)
  205. newCollider.convex = false;
  206. }
  207.  
  208. Rigidbody newBody = newGOs[i].GetComponent<Rigidbody>();
  209. if (ownBody != null && newBody != null)
  210. {
  211. Vector3 newMeshSize = newMesh.bounds.size;
  212. float meshVolume = newMeshSize.x * newMeshSize.y * newMeshSize.z;
  213. float newMass = ownMass * (meshVolume / ownVolume);
  214.  
  215. newBody.useGravity = ownBody.useGravity;
  216. newBody.mass = newMass;
  217. newBody.velocity = ownBody.velocity;
  218. newBody.angularVelocity = ownBody.angularVelocity;
  219. if (SplitForce > 0f) newBody.AddForce(_splitPlane.Normal * newMass * (i == 0 ? SplitForce : -SplitForce), ForceMode.Impulse);
  220. }
  221. }
  222. PostProcessObject(newGOs[i]);
  223. }
  224. }
  225.  
  226. private void UpdateMeshesInChildren(int i, GameObject go)
  227. {
  228. if (_meshContainerStatic.Length > 0)
  229. {
  230. MeshFilter[] meshFilters = go.GetComponentsInChildren<MeshFilter>();
  231. for (int j = 0; j < _meshContainerStatic.Length; j++)
  232. {
  233. Renderer renderer = meshFilters[j].GetComponent<Renderer>();
  234. if (ForceNoBatching)
  235. {
  236. renderer.materials = renderer.materials;
  237. }
  238. if (i == 0)
  239. {
  240. if (_meshContainerStatic[j].HasMeshUpper() & _meshContainerStatic[j].HasMeshLower())
  241. {
  242. meshFilters[j].mesh = _meshContainerStatic[j].CreateMeshUpper();
  243. }
  244. else if (!_meshContainerStatic[j].HasMeshUpper())
  245. {
  246. if (renderer != null) Destroy(renderer);
  247. Destroy(meshFilters[j]);
  248. }
  249. }
  250. else
  251. {
  252. if (_meshContainerStatic[j].HasMeshUpper() & _meshContainerStatic[j].HasMeshLower())
  253. {
  254. meshFilters[j].mesh = _meshContainerStatic[j].CreateMeshLower();
  255. }
  256. else if (!_meshContainerStatic[j].HasMeshLower())
  257. {
  258. if (renderer != null) Destroy(renderer);
  259. Destroy(meshFilters[j]);
  260. }
  261. }
  262. }
  263. }
  264.  
  265. if (_meshContainerSkinned.Length > 0)
  266. {
  267. SkinnedMeshRenderer[] skinnedRenderer = go.GetComponentsInChildren<SkinnedMeshRenderer>();
  268. for (int j = 0; j < _meshContainerSkinned.Length; j++)
  269. {
  270. if (i == 0)
  271. {
  272. if (_meshContainerSkinned[j].HasMeshUpper() & _meshContainerSkinned[j].HasMeshLower())
  273. {
  274. skinnedRenderer[j].sharedMesh = _meshContainerSkinned[j].CreateMeshUpper();
  275. }
  276. else if (!_meshContainerSkinned[j].HasMeshUpper())
  277. {
  278. Destroy(skinnedRenderer[j]);
  279. }
  280. }
  281. else
  282. {
  283. if (_meshContainerSkinned[j].HasMeshUpper() & _meshContainerSkinned[j].HasMeshLower())
  284. {
  285. skinnedRenderer[j].sharedMesh = _meshContainerSkinned[j].CreateMeshLower();
  286. }
  287. else if (!_meshContainerSkinned[j].HasMeshLower())
  288. {
  289. Destroy(skinnedRenderer[j]);
  290. }
  291. }
  292. }
  293. }
  294. }
  295.  
  296. private Material[] GetSharedMaterials(GameObject go)
  297. {
  298. SkinnedMeshRenderer skinnedMeshRenderer = go.GetComponent<SkinnedMeshRenderer>();
  299. if (skinnedMeshRenderer != null)
  300. {
  301. return skinnedMeshRenderer.sharedMaterials;
  302. }
  303. else
  304. {
  305. Renderer renderer = go.GetComponent<Renderer>();
  306. if (renderer != null)
  307. {
  308. return renderer.sharedMaterials;
  309. }
  310. }
  311.  
  312. return null;
  313. }
  314.  
  315. private void SetSharedMaterials(GameObject go, Material[] materials)
  316. {
  317. SkinnedMeshRenderer skinnedMeshRenderer = go.GetComponent<SkinnedMeshRenderer>();
  318. if (skinnedMeshRenderer != null)
  319. {
  320. skinnedMeshRenderer.sharedMaterials = materials;
  321. }
  322. else
  323. {
  324. Renderer renderer = go.GetComponent<Renderer>();
  325. if (renderer != null)
  326. {
  327. renderer.sharedMaterials = materials;
  328. }
  329. }
  330. }
  331.  
  332. private void SetMeshOnGameObject(GameObject go, Mesh mesh)
  333. {
  334. SkinnedMeshRenderer skinnedMeshRenderer = go.GetComponent<SkinnedMeshRenderer>();
  335. if (skinnedMeshRenderer != null)
  336. {
  337. skinnedMeshRenderer.sharedMesh = mesh;
  338. }
  339. else
  340. {
  341. MeshFilter meshFilter = go.GetComponent<MeshFilter>();
  342. if (meshFilter != null)
  343. {
  344. meshFilter.mesh = mesh;
  345. }
  346. }
  347. }
  348.  
  349. private Mesh GetMeshOnGameObject(GameObject go)
  350. {
  351. SkinnedMeshRenderer skinnedMeshRenderer = go.GetComponent<SkinnedMeshRenderer>();
  352. if (skinnedMeshRenderer != null)
  353. {
  354. return skinnedMeshRenderer.sharedMesh;
  355. }
  356. else
  357. {
  358. MeshFilter meshFilter = go.GetComponent<MeshFilter>();
  359. if (meshFilter != null)
  360. {
  361. return meshFilter.mesh;
  362. }
  363. }
  364.  
  365. return null;
  366. }
  367.  
  368. protected virtual void PostProcessObject(GameObject go) { }
  369. }
  370. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement