MegaWrap.cs 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361
  1. using UnityEngine;
  2. using System.Collections.Generic;
  3. public class MegaTriangle
  4. {
  5. public int t;
  6. public Vector3 a, b, c;
  7. public Bounds bounds;
  8. public MegaTriangle(Vector3 a, Vector3 b, Vector3 c, Vector3 dir, int t)
  9. {
  10. this.t = t;
  11. this.a = a;
  12. this.b = b;
  13. this.c = c;
  14. //Vector3 cross = Vector3.Cross(b - a, c - a);
  15. Vector3 min = Vector3.Min(Vector3.Min(a, b), c);
  16. Vector3 max = Vector3.Max(Vector3.Max(a, b), c);
  17. bounds.SetMinMax(min, max);
  18. }
  19. public void Barycentric(Vector3 p, out float u, out float v, out float w)
  20. {
  21. Vector3 v0 = b - a, v1 = c - a, v2 = p - a;
  22. float d00 = Vector3.Dot(v0, v0);
  23. float d01 = Vector3.Dot(v0, v1);
  24. float d11 = Vector3.Dot(v1, v1);
  25. float d20 = Vector3.Dot(v2, v0);
  26. float d21 = Vector3.Dot(v2, v1);
  27. float denom = 1f / (d00 * d11 - d01 * d01);
  28. v = (d11 * d20 - d01 * d21) * denom;
  29. w = (d00 * d21 - d01 * d20) * denom;
  30. u = 1.0f - v - w;
  31. }
  32. }
  33. public class MegaVoxel
  34. {
  35. public class Voxel_t
  36. {
  37. public Vector3 position;
  38. public List<MegaTriangle> tris;
  39. public Voxel_t()
  40. {
  41. position = Vector3.zero;
  42. tris = new List<MegaTriangle>();
  43. }
  44. }
  45. public static void GetGridIndex(Vector3 p, out int x, out int y, out int z, float unit)
  46. {
  47. x = (int)((p.x - start.x) / unit);
  48. y = (int)((p.y - start.y) / unit);
  49. z = (int)((p.z - start.z) / unit);
  50. }
  51. public static Voxel_t[,,] volume;
  52. public static int width;
  53. public static int height;
  54. public static int depth;
  55. static Vector3 start;
  56. public static void Voxelize(Vector3[] vertices, int[] indices, Bounds bounds, int resolution, out float unit)
  57. {
  58. float maxLength = Mathf.Max(bounds.size.x, Mathf.Max(bounds.size.y, bounds.size.z));
  59. unit = maxLength / resolution;
  60. float hunit = unit * 0.5f;
  61. start = bounds.min - new Vector3(hunit, hunit, hunit);
  62. Vector3 end = bounds.max + new Vector3(hunit, hunit, hunit);
  63. Vector3 size = end - start;
  64. width = Mathf.CeilToInt(size.x / unit);
  65. height = Mathf.CeilToInt(size.y / unit);
  66. depth = Mathf.CeilToInt(size.z / unit);
  67. volume = new Voxel_t[width, height, depth];
  68. Bounds[,,] boxes = new Bounds[width, height, depth];
  69. Vector3 voxelSize = Vector3.one * unit;
  70. for (int x = 0; x < width; x++)
  71. {
  72. for (int y = 0; y < height; y++)
  73. {
  74. for (int z = 0; z < depth; z++)
  75. {
  76. Vector3 p = new Vector3(x, y, z) * unit + start;
  77. Bounds aabb = new Bounds(p, voxelSize);
  78. boxes[x, y, z] = aabb;
  79. volume[x, y, z] = new Voxel_t();
  80. }
  81. }
  82. }
  83. Vector3 direction = Vector3.forward;
  84. for (int i = 0, n = indices.Length; i < n; i += 3)
  85. {
  86. MegaTriangle tri = new MegaTriangle(vertices[indices[i]], vertices[indices[i + 1]], vertices[indices[i + 2]], direction, i);
  87. Vector3 min = tri.bounds.min - start;
  88. Vector3 max = tri.bounds.max - start;
  89. int iminX = (int)(min.x / unit), iminY = (int)(min.y / unit), iminZ = (int)(min.z / unit);
  90. int imaxX = (int)(max.x / unit), imaxY = (int)(max.y / unit), imaxZ = (int)(max.z / unit);
  91. iminX = Mathf.Clamp(iminX, 0, width - 1);
  92. iminY = Mathf.Clamp(iminY, 0, height - 1);
  93. iminZ = Mathf.Clamp(iminZ, 0, depth - 1);
  94. imaxX = Mathf.Clamp(imaxX, 0, width - 1);
  95. imaxY = Mathf.Clamp(imaxY, 0, height - 1);
  96. imaxZ = Mathf.Clamp(imaxZ, 0, depth - 1);
  97. for (int x = iminX; x <= imaxX; x++)
  98. {
  99. for (int y = iminY; y <= imaxY; y++)
  100. {
  101. for (int z = iminZ; z <= imaxZ; z++)
  102. {
  103. if (Intersects(tri, boxes[x, y, z]))
  104. {
  105. Voxel_t voxel = volume[x, y, z];
  106. voxel.position = boxes[x, y, z].center;
  107. voxel.tris.Add(tri);
  108. volume[x, y, z] = voxel;
  109. }
  110. }
  111. }
  112. }
  113. }
  114. }
  115. public static bool Intersects(MegaTriangle tri, Bounds aabb)
  116. {
  117. float p0, p1, p2, r;
  118. Vector3 center = aabb.center, extents = aabb.max - center;
  119. Vector3 v0 = tri.a - center,
  120. v1 = tri.b - center,
  121. v2 = tri.c - center;
  122. Vector3 f0 = v1 - v0,
  123. f1 = v2 - v1,
  124. f2 = v0 - v2;
  125. Vector3 a00 = new Vector3(0, -f0.z, f0.y),
  126. a01 = new Vector3(0, -f1.z, f1.y),
  127. a02 = new Vector3(0, -f2.z, f2.y),
  128. a10 = new Vector3(f0.z, 0, -f0.x),
  129. a11 = new Vector3(f1.z, 0, -f1.x),
  130. a12 = new Vector3(f2.z, 0, -f2.x),
  131. a20 = new Vector3(-f0.y, f0.x, 0),
  132. a21 = new Vector3(-f1.y, f1.x, 0),
  133. a22 = new Vector3(-f2.y, f2.x, 0);
  134. // Test axis a00
  135. p0 = Vector3.Dot(v0, a00);
  136. p1 = Vector3.Dot(v1, a00);
  137. p2 = Vector3.Dot(v2, a00);
  138. r = extents.y * Mathf.Abs(f0.z) + extents.z * Mathf.Abs(f0.y);
  139. if (Mathf.Max(-Mathf.Max(p0, p1, p2), Mathf.Min(p0, p1, p2)) > r)
  140. return false;
  141. // Test axis a01
  142. p0 = Vector3.Dot(v0, a01);
  143. p1 = Vector3.Dot(v1, a01);
  144. p2 = Vector3.Dot(v2, a01);
  145. r = extents.y * Mathf.Abs(f1.z) + extents.z * Mathf.Abs(f1.y);
  146. if (Mathf.Max(-Mathf.Max(p0, p1, p2), Mathf.Min(p0, p1, p2)) > r)
  147. return false;
  148. // Test axis a02
  149. p0 = Vector3.Dot(v0, a02);
  150. p1 = Vector3.Dot(v1, a02);
  151. p2 = Vector3.Dot(v2, a02);
  152. r = extents.y * Mathf.Abs(f2.z) + extents.z * Mathf.Abs(f2.y);
  153. if (Mathf.Max(-Mathf.Max(p0, p1, p2), Mathf.Min(p0, p1, p2)) > r)
  154. return false;
  155. // Test axis a10
  156. p0 = Vector3.Dot(v0, a10);
  157. p1 = Vector3.Dot(v1, a10);
  158. p2 = Vector3.Dot(v2, a10);
  159. r = extents.x * Mathf.Abs(f0.z) + extents.z * Mathf.Abs(f0.x);
  160. if (Mathf.Max(-Mathf.Max(p0, p1, p2), Mathf.Min(p0, p1, p2)) > r)
  161. return false;
  162. // Test axis a11
  163. p0 = Vector3.Dot(v0, a11);
  164. p1 = Vector3.Dot(v1, a11);
  165. p2 = Vector3.Dot(v2, a11);
  166. r = extents.x * Mathf.Abs(f1.z) + extents.z * Mathf.Abs(f1.x);
  167. if (Mathf.Max(-Mathf.Max(p0, p1, p2), Mathf.Min(p0, p1, p2)) > r)
  168. return false;
  169. // Test axis a12
  170. p0 = Vector3.Dot(v0, a12);
  171. p1 = Vector3.Dot(v1, a12);
  172. p2 = Vector3.Dot(v2, a12);
  173. r = extents.x * Mathf.Abs(f2.z) + extents.z * Mathf.Abs(f2.x);
  174. if (Mathf.Max(-Mathf.Max(p0, p1, p2), Mathf.Min(p0, p1, p2)) > r)
  175. return false;
  176. // Test axis a20
  177. p0 = Vector3.Dot(v0, a20);
  178. p1 = Vector3.Dot(v1, a20);
  179. p2 = Vector3.Dot(v2, a20);
  180. r = extents.x * Mathf.Abs(f0.y) + extents.y * Mathf.Abs(f0.x);
  181. if (Mathf.Max(-Mathf.Max(p0, p1, p2), Mathf.Min(p0, p1, p2)) > r)
  182. return false;
  183. // Test axis a21
  184. p0 = Vector3.Dot(v0, a21);
  185. p1 = Vector3.Dot(v1, a21);
  186. p2 = Vector3.Dot(v2, a21);
  187. r = extents.x * Mathf.Abs(f1.y) + extents.y * Mathf.Abs(f1.x);
  188. if (Mathf.Max(-Mathf.Max(p0, p1, p2), Mathf.Min(p0, p1, p2)) > r)
  189. return false;
  190. // Test axis a22
  191. p0 = Vector3.Dot(v0, a22);
  192. p1 = Vector3.Dot(v1, a22);
  193. p2 = Vector3.Dot(v2, a22);
  194. r = extents.x * Mathf.Abs(f2.y) + extents.y * Mathf.Abs(f2.x);
  195. if (Mathf.Max(-Mathf.Max(p0, p1, p2), Mathf.Min(p0, p1, p2)) > r)
  196. return false;
  197. if (Mathf.Max(v0.x, v1.x, v2.x) < -extents.x || Mathf.Min(v0.x, v1.x, v2.x) > extents.x)
  198. return false;
  199. if (Mathf.Max(v0.y, v1.y, v2.y) < -extents.y || Mathf.Min(v0.y, v1.y, v2.y) > extents.y)
  200. return false;
  201. if (Mathf.Max(v0.z, v1.z, v2.z) < -extents.z || Mathf.Min(v0.z, v1.z, v2.z) > extents.z)
  202. return false;
  203. Vector3 normal = Vector3.Cross(f1, f0).normalized;
  204. Plane pl = new Plane(normal, Vector3.Dot(normal, tri.a));
  205. return Intersects(pl, aabb);
  206. }
  207. public static bool Intersects(Plane pl, Bounds aabb)
  208. {
  209. Vector3 center = aabb.center;
  210. Vector3 extents = aabb.max - center;
  211. float r = extents.x * Mathf.Abs(pl.normal.x) + extents.y * Mathf.Abs(pl.normal.y) + extents.z * Mathf.Abs(pl.normal.z);
  212. float s = Vector3.Dot(pl.normal, center) - pl.distance;
  213. return Mathf.Abs(s) <= r;
  214. }
  215. }
  216. [System.Serializable]
  217. public class MegaBindInf
  218. {
  219. public float dist;
  220. public int face;
  221. public int i0;
  222. public int i1;
  223. public int i2;
  224. public Vector3 bary;
  225. public float weight;
  226. public float area;
  227. }
  228. [System.Serializable]
  229. public class MegaBindVert
  230. {
  231. public float weight;
  232. public List<MegaBindInf> verts = new List<MegaBindInf>();
  233. }
  234. public struct MegaCloseFace
  235. {
  236. public int face;
  237. public float dist;
  238. }
  239. [ExecuteInEditMode]
  240. public class MegaWrap : MonoBehaviour
  241. {
  242. public float gap = 0.0f;
  243. public float shrink = 1.0f;
  244. public List<int> neededVerts = new List<int>();
  245. public Vector3[] skinnedVerts;
  246. public Mesh mesh = null;
  247. public Vector3 offset = Vector3.zero;
  248. public bool targetIsSkin = false;
  249. public bool sourceIsSkin = false;
  250. public int nomapcount = 0;
  251. public Matrix4x4[] bindposes;
  252. public BoneWeight[] boneweights;
  253. public Transform[] bones;
  254. public float size = 0.01f;
  255. public int vertindex = 0;
  256. public Vector3[] freeverts; // position for any vert with no attachments
  257. public Vector3[] startverts;
  258. public Vector3[] verts;
  259. public MegaBindVert[] bindverts;
  260. public MegaModifyObject target;
  261. public float maxdist = 0.25f;
  262. public int maxpoints = 4;
  263. public bool WrapEnabled = true;
  264. public MegaNormalMethod NormalMethod = MegaNormalMethod.Unity;
  265. #if UNITY_5 || UNITY_2017 || UNITY_2018 || UNITY_2019 || UNITY_2020
  266. public bool UseBakedMesh = true;
  267. #endif
  268. [ContextMenu("Help")]
  269. public void Help()
  270. {
  271. Application.OpenURL("http://www.west-racing.com/mf/?page_id=3709");
  272. }
  273. Vector4 Plane(Vector3 v1, Vector3 v2, Vector3 v3)
  274. {
  275. Vector3 normal = Vector4.zero;
  276. normal.x = (v2.y - v1.y) * (v3.z - v1.z) - (v2.z - v1.z) * (v3.y - v1.y);
  277. normal.y = (v2.z - v1.z) * (v3.x - v1.x) - (v2.x - v1.x) * (v3.z - v1.z);
  278. normal.z = (v2.x - v1.x) * (v3.y - v1.y) - (v2.y - v1.y) * (v3.x - v1.x);
  279. normal = normal.normalized;
  280. return new Vector4(normal.x, normal.y, normal.z, -Vector3.Dot(v2, normal));
  281. }
  282. float PlaneDist(Vector3 p, Vector4 plane)
  283. {
  284. Vector3 n = plane;
  285. return Vector3.Dot(n, p) + plane.w;
  286. }
  287. public float GetDistance(Vector3 p, Vector3 p0, Vector3 p1, Vector3 p2)
  288. {
  289. return MegaNearestPointTest.DistPoint3Triangle3Dbl(p, p0, p1, p2);
  290. }
  291. public float GetPlaneDistance(Vector3 p, Vector3 p0, Vector3 p1, Vector3 p2)
  292. {
  293. Vector4 pl = Plane(p0, p1, p2);
  294. return PlaneDist(p, pl);
  295. }
  296. public Vector3 MyBary(Vector3 p, Vector3 p0, Vector3 p1, Vector3 p2)
  297. {
  298. Vector3 bary = Vector3.zero;
  299. Vector3 normal = FaceNormal(p0, p1, p2);
  300. float areaABC = Vector3.Dot(normal, Vector3.Cross((p1 - p0), (p2 - p0)));
  301. float areaPBC = Vector3.Dot(normal, Vector3.Cross((p1 - p), (p2 - p)));
  302. float areaPCA = Vector3.Dot(normal, Vector3.Cross((p2 - p), (p0 - p)));
  303. bary.x = areaPBC / areaABC; // alpha
  304. bary.y = areaPCA / areaABC; // beta
  305. bary.z = 1.0f - bary.x - bary.y; // gamma
  306. return bary;
  307. }
  308. public Vector3 MyBary1(Vector3 p, Vector3 a, Vector3 b, Vector3 c)
  309. {
  310. Vector3 v0 = b - a, v1 = c - a, v2 = p - a;
  311. float d00 = Vector3.Dot(v0, v0);
  312. float d01 = Vector3.Dot(v0, v1);
  313. float d11 = Vector3.Dot(v1, v1);
  314. float d20 = Vector3.Dot(v2, v0);
  315. float d21 = Vector3.Dot(v2, v1);
  316. float denom = d00 * d11 - d01 * d01;
  317. float w = (d11 * d20 - d01 * d21) / denom;
  318. float v = (d00 * d21 - d01 * d20) / denom;
  319. float u = 1.0f - v - w;
  320. return new Vector3(u, v, w);
  321. }
  322. public Vector3 CalcBary(Vector3 p, Vector3 p0, Vector3 p1, Vector3 p2)
  323. {
  324. return MyBary(p, p0, p1, p2);
  325. }
  326. public float CalcArea(Vector3 p0, Vector3 p1, Vector3 p2)
  327. {
  328. Vector3 e1 = p1 - p0;
  329. Vector3 e2 = p2 - p0;
  330. Vector3 e3 = Vector3.Cross(e1, e2);
  331. return 0.5f * e3.magnitude;
  332. }
  333. Vector3 e11 = Vector3.zero;
  334. Vector3 e22 = Vector3.zero;
  335. Vector3 cr = Vector3.zero;
  336. public Vector3 FaceNormal(Vector3 p0, Vector3 p1, Vector3 p2)
  337. {
  338. //Vector3 e1 = p1 - p0;
  339. //Vector3 e2 = p2 - p0;
  340. e11.x = p1.x - p0.x;
  341. e11.y = p1.y - p0.y;
  342. e11.z = p1.z - p0.z;
  343. e22.x = p2.x - p0.x;
  344. e22.y = p2.y - p0.y;
  345. e22.z = p2.z - p0.z;
  346. //Vector3 e2 = p2 - p0;
  347. cr.x = e11.y * e22.z - e22.y * e11.z;
  348. cr.y = -(e11.x * e22.z - e22.x * e11.z); // * -1;
  349. cr.z = e11.x * e22.y - e22.x * e11.y;
  350. return cr; //Vector3.Cross(e11, e22);
  351. }
  352. static void CopyBlendShapes(Mesh mesh1, Mesh clonemesh)
  353. {
  354. #if UNITY_5_3 || UNITY_5_4 || UNITY_5_5 || UNITY_5_6 || UNITY_2017 || UNITY_2018 || UNITY_2019 || UNITY_2020
  355. int bcount = mesh1.blendShapeCount; //GetBlendShapeFrameCount();
  356. Vector3[] deltaverts = new Vector3[mesh1.vertexCount];
  357. Vector3[] deltanorms = new Vector3[mesh1.vertexCount];
  358. Vector3[] deltatans = new Vector3[mesh1.vertexCount];
  359. for ( int j = 0; j < bcount; j++ )
  360. {
  361. int frames = mesh1.GetBlendShapeFrameCount(j);
  362. string bname = mesh1.GetBlendShapeName(j);
  363. for ( int f = 0; f < frames; f++ )
  364. {
  365. mesh1.GetBlendShapeFrameVertices(j, f, deltaverts, deltanorms, deltatans);
  366. float weight = mesh1.GetBlendShapeFrameWeight(j, f);
  367. clonemesh.AddBlendShapeFrame(bname, weight, deltaverts, deltanorms, deltatans);
  368. }
  369. }
  370. #endif
  371. }
  372. public Mesh CloneMesh(Mesh m)
  373. {
  374. Mesh clonemesh = new Mesh();
  375. clonemesh.vertices = m.vertices;
  376. #if UNITY_5_0 || UNITY_5_1 || UNITY_5 || UNITY_2017 || UNITY_2018 || UNITY_2019 || UNITY_2020
  377. clonemesh.uv2 = m.uv2;
  378. clonemesh.uv3 = m.uv3;
  379. clonemesh.uv4 = m.uv4;
  380. #else
  381. clonemesh.uv1 = m.uv1;
  382. clonemesh.uv2 = m.uv2;
  383. #endif
  384. clonemesh.uv = m.uv;
  385. clonemesh.normals = m.normals;
  386. clonemesh.tangents = m.tangents;
  387. clonemesh.colors = m.colors;
  388. clonemesh.subMeshCount = m.subMeshCount;
  389. for ( int s = 0; s < m.subMeshCount; s++ )
  390. clonemesh.SetTriangles(m.GetTriangles(s), s);
  391. CopyBlendShapes(m, clonemesh);
  392. clonemesh.boneWeights = m.boneWeights;
  393. clonemesh.bindposes = m.bindposes;
  394. clonemesh.name = m.name; // + "_copy";
  395. clonemesh.RecalculateBounds();
  396. return clonemesh;
  397. }
  398. [ContextMenu("Reset Mesh")]
  399. public void ResetMesh()
  400. {
  401. if ( mesh )
  402. {
  403. mesh.vertices = startverts;
  404. mesh.RecalculateBounds();
  405. RecalcNormals();
  406. //mesh.RecalculateNormals();
  407. }
  408. target = null;
  409. bindverts = null;
  410. }
  411. public void SetMesh()
  412. {
  413. MeshFilter mf = GetComponent<MeshFilter>();
  414. Mesh srcmesh = null;
  415. if ( mf != null )
  416. srcmesh = mf.sharedMesh;
  417. else
  418. {
  419. SkinnedMeshRenderer smesh = (SkinnedMeshRenderer)GetComponent(typeof(SkinnedMeshRenderer));
  420. if ( smesh != null )
  421. srcmesh = smesh.sharedMesh;
  422. }
  423. if ( srcmesh != null )
  424. {
  425. mesh = CloneMesh(srcmesh);
  426. if ( mf )
  427. mf.sharedMesh = mesh;
  428. else
  429. {
  430. SkinnedMeshRenderer smesh = (SkinnedMeshRenderer)GetComponent(typeof(SkinnedMeshRenderer));
  431. smesh.sharedMesh = mesh;
  432. }
  433. }
  434. }
  435. public void Attach()
  436. {
  437. var modobj = target;
  438. var mod = this;
  439. mod.targetIsSkin = false;
  440. mod.sourceIsSkin = false;
  441. if (mod.mesh && mod.startverts != null)
  442. mod.mesh.vertices = mod.startverts;
  443. if (modobj == null)
  444. {
  445. mod.bindverts = null;
  446. return;
  447. }
  448. mod.nomapcount = 0;
  449. if (mod.mesh)
  450. mod.mesh.vertices = mod.startverts;
  451. MeshFilter mf = mod.GetComponent<MeshFilter>();
  452. Mesh srcmesh = null;
  453. if (mf != null)
  454. {
  455. //skinned = false;
  456. srcmesh = mf.sharedMesh;
  457. }
  458. else
  459. {
  460. SkinnedMeshRenderer smesh = (SkinnedMeshRenderer)mod.GetComponent(typeof(SkinnedMeshRenderer));
  461. if (smesh != null)
  462. {
  463. //skinned = true;
  464. srcmesh = smesh.sharedMesh;
  465. mod.sourceIsSkin = true;
  466. }
  467. }
  468. if (srcmesh == null)
  469. {
  470. Debug.LogWarning("No Mesh found on the target object, make sure target has a mesh and MegaFiers modifier attached!");
  471. return;
  472. }
  473. if (mod.mesh == null)
  474. mod.mesh = mod.CloneMesh(srcmesh); //mf.mesh);
  475. if (mf)
  476. mf.mesh = mod.mesh;
  477. else
  478. {
  479. SkinnedMeshRenderer smesh = (SkinnedMeshRenderer)mod.GetComponent(typeof(SkinnedMeshRenderer));
  480. smesh.sharedMesh = mod.mesh;
  481. }
  482. if (mod.sourceIsSkin == false)
  483. {
  484. SkinnedMeshRenderer tmesh = (SkinnedMeshRenderer)modobj.GetComponent(typeof(SkinnedMeshRenderer));
  485. if (tmesh != null)
  486. {
  487. mod.targetIsSkin = true;
  488. if (!mod.sourceIsSkin)
  489. {
  490. Mesh sm = tmesh.sharedMesh;
  491. mod.bindposes = sm.bindposes;
  492. mod.boneweights = sm.boneWeights;
  493. mod.bones = tmesh.bones;
  494. mod.skinnedVerts = sm.vertices; //new Vector3[sm.vertexCount];
  495. }
  496. }
  497. }
  498. if (mod.targetIsSkin)
  499. {
  500. if (mod.boneweights == null || mod.boneweights.Length == 0)
  501. mod.targetIsSkin = false;
  502. }
  503. mod.neededVerts.Clear();
  504. mod.verts = mod.mesh.vertices;
  505. mod.startverts = mod.mesh.vertices;
  506. mod.freeverts = new Vector3[mod.startverts.Length];
  507. Vector3[] baseverts = modobj.verts; //basemesh.vertices;
  508. int[] basefaces = modobj.tris; //basemesh.triangles;
  509. mod.bindverts = new MegaBindVert[mod.verts.Length];
  510. // matrix to get vertex into local space of target
  511. Matrix4x4 tm = mod.transform.localToWorldMatrix * modobj.transform.worldToLocalMatrix;
  512. List<MegaCloseFace> closefaces = new List<MegaCloseFace>();
  513. Vector3 p0 = Vector3.zero;
  514. Vector3 p1 = Vector3.zero;
  515. Vector3 p2 = Vector3.zero;
  516. Vector3[] tverts = new Vector3[mod.target.sverts.Length];
  517. for (int i = 0; i < tverts.Length; i++)
  518. {
  519. if (mod.targetIsSkin && !mod.sourceIsSkin)
  520. tverts[i] = modobj.transform.InverseTransformPoint(mod.GetSkinPos(i));
  521. else
  522. tverts[i] = baseverts[i];
  523. }
  524. //EditorUtility.ClearProgressBar();
  525. float unit = 0.0f;
  526. mod.target.mesh.RecalculateBounds();
  527. MegaVoxel.Voxelize(tverts, basefaces, mod.target.mesh.bounds, 16, out unit);
  528. //Vector3 min = mod.target.mesh.bounds.min;
  529. for (int i = 0; i < mod.verts.Length; i++)
  530. {
  531. MegaBindVert bv = new MegaBindVert();
  532. mod.bindverts[i] = bv;
  533. Vector3 p = tm.MultiplyPoint(mod.verts[i]);
  534. p = mod.transform.TransformPoint(mod.verts[i]);
  535. p = modobj.transform.InverseTransformPoint(p);
  536. mod.freeverts[i] = p;
  537. closefaces.Clear();
  538. int gx = 0;
  539. int gy = 0;
  540. int gz = 0;
  541. MegaVoxel.GetGridIndex(p, out gx, out gy, out gz, unit);
  542. for (int x = gx - 1; x <= gx + 1; x++)
  543. {
  544. if (x >= 0 && x < MegaVoxel.width)
  545. {
  546. for (int y = gy - 1; y <= gy + 1; y++)
  547. {
  548. if (y >= 0 && y < MegaVoxel.height)
  549. {
  550. for (int z = gz - 1; z <= gz + 1; z++)
  551. {
  552. if (z >= 0 && z < MegaVoxel.depth)
  553. {
  554. List<MegaTriangle> tris = MegaVoxel.volume[x, y, z].tris;
  555. for (int t = 0; t < tris.Count; t++)
  556. {
  557. float dist = mod.GetDistance(p, tris[t].a, tris[t].b, tris[t].c);
  558. if (Mathf.Abs(dist) < mod.maxdist)
  559. {
  560. MegaCloseFace cf = new MegaCloseFace();
  561. cf.dist = Mathf.Abs(dist);
  562. cf.face = tris[t].t;
  563. bool inserted = false;
  564. for (int k = 0; k < closefaces.Count; k++)
  565. {
  566. if (cf.dist < closefaces[k].dist)
  567. {
  568. closefaces.Insert(k, cf);
  569. inserted = true;
  570. break;
  571. }
  572. }
  573. if (!inserted)
  574. closefaces.Add(cf);
  575. }
  576. }
  577. }
  578. }
  579. }
  580. }
  581. }
  582. }
  583. float tweight = 0.0f;
  584. int maxp = mod.maxpoints;
  585. if (maxp == 0)
  586. maxp = closefaces.Count;
  587. for (int j = 0; j < maxp; j++)
  588. {
  589. if (j < closefaces.Count)
  590. {
  591. int t = closefaces[j].face;
  592. p0 = tverts[basefaces[t]];
  593. p1 = tverts[basefaces[t + 1]];
  594. p2 = tverts[basefaces[t + 2]];
  595. Vector3 normal = mod.FaceNormal(p0, p1, p2);
  596. float dist = closefaces[j].dist; //GetDistance(p, p0, p1, p2);
  597. MegaBindInf bi = new MegaBindInf();
  598. bi.dist = mod.GetPlaneDistance(p, p0, p1, p2); //dist;
  599. bi.face = t;
  600. bi.i0 = basefaces[t];
  601. bi.i1 = basefaces[t + 1];
  602. bi.i2 = basefaces[t + 2];
  603. bi.bary = mod.CalcBary(p, p0, p1, p2);
  604. bi.weight = 1.0f / (1.0f + dist);
  605. bi.area = normal.magnitude * 0.5f; //CalcArea(baseverts[basefaces[t]], baseverts[basefaces[t + 1]], baseverts[basefaces[t + 2]]); // Could calc once at start
  606. tweight += bi.weight;
  607. bv.verts.Add(bi);
  608. }
  609. }
  610. if (mod.maxpoints > 0 && mod.maxpoints < bv.verts.Count)
  611. bv.verts.RemoveRange(mod.maxpoints, bv.verts.Count - mod.maxpoints);
  612. // Only want to calculate skin vertices we use
  613. if (!mod.sourceIsSkin && mod.targetIsSkin)
  614. {
  615. for (int fi = 0; fi < bv.verts.Count; fi++)
  616. {
  617. if (!mod.neededVerts.Contains(bv.verts[fi].i0))
  618. mod.neededVerts.Add(bv.verts[fi].i0);
  619. if (!mod.neededVerts.Contains(bv.verts[fi].i1))
  620. mod.neededVerts.Add(bv.verts[fi].i1);
  621. if (!mod.neededVerts.Contains(bv.verts[fi].i2))
  622. mod.neededVerts.Add(bv.verts[fi].i2);
  623. }
  624. }
  625. if (tweight == 0.0f)
  626. {
  627. mod.nomapcount++;
  628. break;
  629. }
  630. bv.weight = tweight;
  631. }
  632. }
  633. public void Attach(MegaModifyObject modobj)
  634. {
  635. targetIsSkin = false;
  636. sourceIsSkin = false;
  637. if ( mesh && startverts != null )
  638. mesh.vertices = startverts;
  639. if ( modobj == null )
  640. {
  641. bindverts = null;
  642. return;
  643. }
  644. nomapcount = 0;
  645. if ( mesh )
  646. mesh.vertices = startverts;
  647. MeshFilter mf = GetComponent<MeshFilter>();
  648. Mesh srcmesh = null;
  649. if ( mf != null )
  650. {
  651. //skinned = false;
  652. srcmesh = mf.mesh;
  653. }
  654. else
  655. {
  656. SkinnedMeshRenderer smesh = (SkinnedMeshRenderer)GetComponent(typeof(SkinnedMeshRenderer));
  657. if ( smesh != null )
  658. {
  659. //skinned = true;
  660. srcmesh = smesh.sharedMesh;
  661. sourceIsSkin = true;
  662. }
  663. }
  664. if ( srcmesh == null )
  665. {
  666. Debug.LogWarning("No Mesh found on the target object, make sure target has a mesh and MegaFiers modifier attached!");
  667. return;
  668. }
  669. if ( mesh == null )
  670. mesh = CloneMesh(srcmesh); //mf.mesh);
  671. if ( mf )
  672. mf.mesh = mesh;
  673. else
  674. {
  675. SkinnedMeshRenderer smesh = (SkinnedMeshRenderer)GetComponent(typeof(SkinnedMeshRenderer));
  676. smesh.sharedMesh = mesh;
  677. }
  678. if ( sourceIsSkin == false )
  679. {
  680. SkinnedMeshRenderer tmesh = (SkinnedMeshRenderer)modobj.GetComponent(typeof(SkinnedMeshRenderer));
  681. if ( tmesh != null )
  682. {
  683. targetIsSkin = true;
  684. if ( !sourceIsSkin )
  685. {
  686. Mesh sm = tmesh.sharedMesh;
  687. bindposes = sm.bindposes;
  688. boneweights = sm.boneWeights;
  689. bones = tmesh.bones;
  690. skinnedVerts = sm.vertices; //new Vector3[sm.vertexCount];
  691. }
  692. }
  693. }
  694. if ( targetIsSkin )
  695. {
  696. if ( boneweights == null || boneweights.Length == 0 )
  697. targetIsSkin = false;
  698. }
  699. neededVerts.Clear();
  700. verts = mesh.vertices;
  701. startverts = mesh.vertices;
  702. freeverts = new Vector3[startverts.Length];
  703. Vector3[] baseverts = modobj.verts; //basemesh.vertices;
  704. int[] basefaces = modobj.tris; //basemesh.triangles;
  705. bindverts = new MegaBindVert[verts.Length];
  706. // matrix to get vertex into local space of target
  707. Matrix4x4 tm = transform.localToWorldMatrix * modobj.transform.worldToLocalMatrix;
  708. List<MegaCloseFace> closefaces = new List<MegaCloseFace>();
  709. Vector3 p0 = Vector3.zero;
  710. Vector3 p1 = Vector3.zero;
  711. Vector3 p2 = Vector3.zero;
  712. for ( int i = 0; i < verts.Length; i++ )
  713. {
  714. MegaBindVert bv = new MegaBindVert();
  715. bindverts[i] = bv;
  716. Vector3 p = tm.MultiplyPoint(verts[i]);
  717. p = transform.TransformPoint(verts[i]);
  718. p = modobj.transform.InverseTransformPoint(p);
  719. freeverts[i] = p;
  720. closefaces.Clear();
  721. for ( int t = 0; t < basefaces.Length; t += 3 )
  722. {
  723. if ( targetIsSkin && !sourceIsSkin )
  724. {
  725. p0 = modobj.transform.InverseTransformPoint(GetSkinPos(basefaces[t]));
  726. p1 = modobj.transform.InverseTransformPoint(GetSkinPos(basefaces[t + 1]));
  727. p2 = modobj.transform.InverseTransformPoint(GetSkinPos(basefaces[t + 2]));
  728. }
  729. else
  730. {
  731. p0 = baseverts[basefaces[t]];
  732. p1 = baseverts[basefaces[t + 1]];
  733. p2 = baseverts[basefaces[t + 2]];
  734. }
  735. float dist = GetDistance(p, p0, p1, p2);
  736. if ( Mathf.Abs(dist) < maxdist )
  737. {
  738. MegaCloseFace cf = new MegaCloseFace();
  739. cf.dist = Mathf.Abs(dist);
  740. cf.face = t;
  741. bool inserted = false;
  742. for ( int k = 0; k < closefaces.Count; k++ )
  743. {
  744. if ( cf.dist < closefaces[k].dist )
  745. {
  746. closefaces.Insert(k, cf);
  747. inserted = true;
  748. break;
  749. }
  750. }
  751. if ( !inserted )
  752. closefaces.Add(cf);
  753. }
  754. }
  755. float tweight = 0.0f;
  756. int maxp = maxpoints;
  757. if ( maxp == 0 )
  758. maxp = closefaces.Count;
  759. for ( int j = 0; j < maxp; j++ )
  760. {
  761. if ( j < closefaces.Count )
  762. {
  763. int t = closefaces[j].face;
  764. if ( targetIsSkin && !sourceIsSkin )
  765. {
  766. p0 = modobj.transform.InverseTransformPoint(GetSkinPos(basefaces[t]));
  767. p1 = modobj.transform.InverseTransformPoint(GetSkinPos(basefaces[t + 1]));
  768. p2 = modobj.transform.InverseTransformPoint(GetSkinPos(basefaces[t + 2]));
  769. }
  770. else
  771. {
  772. p0 = baseverts[basefaces[t]];
  773. p1 = baseverts[basefaces[t + 1]];
  774. p2 = baseverts[basefaces[t + 2]];
  775. }
  776. Vector3 normal = FaceNormal(p0, p1, p2);
  777. float dist = closefaces[j].dist; //GetDistance(p, p0, p1, p2);
  778. MegaBindInf bi = new MegaBindInf();
  779. bi.dist = GetPlaneDistance(p, p0, p1, p2); //dist;
  780. bi.face = t;
  781. bi.i0 = basefaces[t];
  782. bi.i1 = basefaces[t + 1];
  783. bi.i2 = basefaces[t + 2];
  784. bi.bary = CalcBary(p, p0, p1, p2);
  785. bi.weight = 1.0f / (1.0f + dist);
  786. bi.area = normal.magnitude * 0.5f; //CalcArea(baseverts[basefaces[t]], baseverts[basefaces[t + 1]], baseverts[basefaces[t + 2]]); // Could calc once at start
  787. tweight += bi.weight;
  788. bv.verts.Add(bi);
  789. }
  790. }
  791. if ( maxpoints > 0 && maxpoints < bv.verts.Count )
  792. bv.verts.RemoveRange(maxpoints, bv.verts.Count - maxpoints);
  793. // Only want to calculate skin vertices we use
  794. if ( !sourceIsSkin && targetIsSkin )
  795. {
  796. for ( int fi = 0; fi < bv.verts.Count; fi++ )
  797. {
  798. if ( !neededVerts.Contains(bv.verts[fi].i0) )
  799. neededVerts.Add(bv.verts[fi].i0);
  800. if ( !neededVerts.Contains(bv.verts[fi].i1) )
  801. neededVerts.Add(bv.verts[fi].i1);
  802. if ( !neededVerts.Contains(bv.verts[fi].i2) )
  803. neededVerts.Add(bv.verts[fi].i2);
  804. }
  805. }
  806. if ( tweight == 0.0f )
  807. nomapcount++;
  808. bv.weight = tweight;
  809. }
  810. }
  811. void LateUpdate()
  812. {
  813. DoUpdate();
  814. }
  815. public Vector3 GetSkinPos(int i)
  816. {
  817. Vector3 pos = target.sverts[i];
  818. Vector3 bpos = bindposes[boneweights[i].boneIndex0].MultiplyPoint(pos);
  819. Vector3 p = bones[boneweights[i].boneIndex0].TransformPoint(bpos) * boneweights[i].weight0;
  820. bpos = bindposes[boneweights[i].boneIndex1].MultiplyPoint(pos);
  821. p += bones[boneweights[i].boneIndex1].TransformPoint(bpos) * boneweights[i].weight1;
  822. bpos = bindposes[boneweights[i].boneIndex2].MultiplyPoint(pos);
  823. p += bones[boneweights[i].boneIndex2].TransformPoint(bpos) * boneweights[i].weight2;
  824. bpos = bindposes[boneweights[i].boneIndex3].MultiplyPoint(pos);
  825. p += bones[boneweights[i].boneIndex3].TransformPoint(bpos) * boneweights[i].weight3;
  826. return p;
  827. }
  828. Vector3 gcp = Vector3.zero;
  829. public Vector3 GetCoordMine(Vector3 A, Vector3 B, Vector3 C, Vector3 bary)
  830. {
  831. //Vector3 p = Vector3.zero;
  832. gcp.x = (bary.x * A.x) + (bary.y * B.x) + (bary.z * C.x);
  833. gcp.y = (bary.x * A.y) + (bary.y * B.y) + (bary.z * C.y);
  834. gcp.z = (bary.x * A.z) + (bary.y * B.z) + (bary.z * C.z);
  835. return gcp;
  836. }
  837. SkinnedMeshRenderer tmesh;
  838. #if UNITY_5 || UNITY_2017 || UNITY_2018 || UNITY_2019 || UNITY_2020
  839. Mesh bakedmesh = null;
  840. #endif
  841. void DoUpdate()
  842. {
  843. if ( WrapEnabled == false || target == null || bindverts == null ) //|| bindposes == null )
  844. return;
  845. if ( mesh == null )
  846. SetMesh();
  847. if ( mesh == null )
  848. return;
  849. if ( targetIsSkin && neededVerts != null && neededVerts.Count > 0 ) //|| (targetIsSkin && boneweights == null) )
  850. {
  851. if ( boneweights == null || tmesh == null )
  852. {
  853. tmesh = (SkinnedMeshRenderer)target.GetComponent(typeof(SkinnedMeshRenderer));
  854. if ( tmesh != null )
  855. {
  856. if ( !sourceIsSkin )
  857. {
  858. Mesh sm = tmesh.sharedMesh;
  859. bindposes = sm.bindposes;
  860. bones = tmesh.bones;
  861. boneweights = sm.boneWeights;
  862. }
  863. }
  864. }
  865. #if UNITY_5 || UNITY_2017 || UNITY_2018 || UNITY_2019 || UNITY_2020
  866. if ( tmesh == null )
  867. tmesh = (SkinnedMeshRenderer)target.GetComponent(typeof(SkinnedMeshRenderer));
  868. if ( UseBakedMesh )
  869. {
  870. if ( bakedmesh == null )
  871. bakedmesh = new Mesh();
  872. tmesh.BakeMesh(bakedmesh);
  873. skinnedVerts = bakedmesh.vertices;
  874. }
  875. else
  876. {
  877. for ( int i = 0; i < neededVerts.Count; i++ )
  878. skinnedVerts[neededVerts[i]] = GetSkinPos(neededVerts[i]);
  879. }
  880. #else
  881. for ( int i = 0; i < neededVerts.Count; i++ )
  882. skinnedVerts[neededVerts[i]] = GetSkinPos(neededVerts[i]);
  883. #endif
  884. }
  885. Matrix4x4 stm = Matrix4x4.identity;
  886. Vector3 p = Vector3.zero;
  887. if ( targetIsSkin && !sourceIsSkin )
  888. {
  889. #if UNITY_5 || UNITY_2017 || UNITY_2018 || UNITY_2019 || UNITY_2020
  890. if ( UseBakedMesh )
  891. stm = transform.worldToLocalMatrix * target.transform.localToWorldMatrix; // * transform.worldToLocalMatrix;
  892. else
  893. stm = transform.worldToLocalMatrix; // * target.transform.localToWorldMatrix; // * transform.worldToLocalMatrix;
  894. #else
  895. stm = transform.worldToLocalMatrix; // * target.transform.localToWorldMatrix; // * transform.worldToLocalMatrix;
  896. #endif
  897. for ( int i = 0; i < bindverts.Length; i++ )
  898. {
  899. if ( bindverts[i].verts.Count > 0 )
  900. {
  901. p = Vector3.zero;
  902. float oow = 1.0f / bindverts[i].weight;
  903. int cnt = bindverts[i].verts.Count;
  904. for ( int j = 0; j < cnt; j++ )
  905. {
  906. MegaBindInf bi = bindverts[i].verts[j];
  907. Vector3 p0 = skinnedVerts[bi.i0];
  908. Vector3 p1 = skinnedVerts[bi.i1];
  909. Vector3 p2 = skinnedVerts[bi.i2];
  910. Vector3 cp = GetCoordMine(p0, p1, p2, bi.bary);
  911. Vector3 norm = FaceNormal(p0, p1, p2);
  912. float sq = 1.0f / Mathf.Sqrt(norm.x * norm.x + norm.y * norm.y + norm.z * norm.z);
  913. float d = (bi.dist * shrink) + gap;
  914. //cp += d * norm.x;
  915. cp.x += d * norm.x * sq;
  916. cp.y += d * norm.y * sq;
  917. cp.z += d * norm.z * sq;
  918. float bw = bi.weight * oow;
  919. if ( j == 0 )
  920. {
  921. p.x = cp.x * bw;
  922. p.y = cp.y * bw;
  923. p.z = cp.z * bw;
  924. }
  925. else
  926. {
  927. p.x += cp.x * bw;
  928. p.y += cp.y * bw;
  929. p.z += cp.z * bw;
  930. }
  931. //cp += ((bi.dist * shrink) + gap) * norm.normalized;
  932. //p += cp * (bi.weight / bindverts[i].weight);
  933. }
  934. Vector3 pp = stm.MultiplyPoint3x4(p);
  935. verts[i].x = pp.x + offset.x;
  936. verts[i].y = pp.y + offset.y;
  937. verts[i].z = pp.z + offset.z;
  938. //verts[i] = transform.InverseTransformPoint(p) + offset;
  939. }
  940. }
  941. }
  942. else
  943. {
  944. stm = transform.worldToLocalMatrix * target.transform.localToWorldMatrix; // * transform.worldToLocalMatrix;
  945. //Matrix4x4 tm = target.transform.localToWorldMatrix;
  946. for ( int i = 0; i < bindverts.Length; i++ )
  947. {
  948. if ( bindverts[i].verts.Count > 0 )
  949. {
  950. p = Vector3.zero;
  951. float oow = 1.0f / bindverts[i].weight;
  952. for ( int j = 0; j < bindverts[i].verts.Count; j++ )
  953. {
  954. MegaBindInf bi = bindverts[i].verts[j];
  955. Vector3 p0 = target.sverts[bi.i0];
  956. Vector3 p1 = target.sverts[bi.i1];
  957. Vector3 p2 = target.sverts[bi.i2];
  958. Vector3 cp = GetCoordMine(p0, p1, p2, bi.bary);
  959. Vector3 norm = FaceNormal(p0, p1, p2);
  960. float sq = 1.0f / Mathf.Sqrt(norm.x * norm.x + norm.y * norm.y + norm.z * norm.z);
  961. float d = (bi.dist * shrink) + gap;
  962. //cp += d * norm.x;
  963. cp.x += d * norm.x * sq;
  964. cp.y += d * norm.y * sq;
  965. cp.z += d * norm.z * sq;
  966. float bw = bi.weight * oow;
  967. if ( j == 0 )
  968. {
  969. p.x = cp.x * bw;
  970. p.y = cp.y * bw;
  971. p.z = cp.z * bw;
  972. }
  973. else
  974. {
  975. p.x += cp.x * bw;
  976. p.y += cp.y * bw;
  977. p.z += cp.z * bw;
  978. }
  979. //cp += ((bi.dist * shrink) + gap) * norm.normalized;
  980. //p += cp * (bi.weight / bindverts[i].weight);
  981. }
  982. }
  983. else
  984. p = freeverts[i]; //startverts[i];
  985. Vector3 pp = stm.MultiplyPoint3x4(p);
  986. verts[i].x = pp.x + offset.x;
  987. verts[i].y = pp.y + offset.y;
  988. verts[i].z = pp.z + offset.z;
  989. //p = target.transform.TransformPoint(p);
  990. //verts[i] = transform.InverseTransformPoint(p) + offset;
  991. }
  992. }
  993. mesh.vertices = verts;
  994. RecalcNormals();
  995. mesh.RecalculateBounds();
  996. }
  997. public MegaNormMap[] mapping;
  998. public int[] tris;
  999. public Vector3[] facenorms;
  1000. public Vector3[] norms;
  1001. int[] FindFacesUsing(Vector3 p, Vector3 n)
  1002. {
  1003. List<int> faces = new List<int>();
  1004. Vector3 v = Vector3.zero;
  1005. for ( int i = 0; i < tris.Length; i += 3 )
  1006. {
  1007. v = verts[tris[i]];
  1008. if ( v.x == p.x && v.y == p.y && v.z == p.z )
  1009. {
  1010. if ( n.Equals(norms[tris[i]]) )
  1011. faces.Add(i / 3);
  1012. }
  1013. else
  1014. {
  1015. v = verts[tris[i + 1]];
  1016. if ( v.x == p.x && v.y == p.y && v.z == p.z )
  1017. {
  1018. if ( n.Equals(norms[tris[i + 1]]) )
  1019. faces.Add(i / 3);
  1020. }
  1021. else
  1022. {
  1023. v = verts[tris[i + 2]];
  1024. if ( v.x == p.x && v.y == p.y && v.z == p.z )
  1025. {
  1026. if ( n.Equals(norms[tris[i + 2]]) )
  1027. faces.Add(i / 3);
  1028. }
  1029. }
  1030. }
  1031. }
  1032. return faces.ToArray();
  1033. }
  1034. // Should call this from inspector when we change to mega
  1035. public void BuildNormalMapping(Mesh mesh, bool force)
  1036. {
  1037. if ( mapping == null || mapping.Length == 0 || force )
  1038. {
  1039. // so for each normal we have a vertex, so find all faces that share that vertex
  1040. tris = mesh.triangles;
  1041. norms = mesh.normals;
  1042. facenorms = new Vector3[tris.Length / 3];
  1043. mapping = new MegaNormMap[verts.Length];
  1044. for ( int i = 0; i < verts.Length; i++ )
  1045. {
  1046. mapping[i] = new MegaNormMap();
  1047. mapping[i].faces = FindFacesUsing(verts[i], norms[i]);
  1048. }
  1049. }
  1050. }
  1051. public void RecalcNormals()
  1052. {
  1053. if ( NormalMethod == MegaNormalMethod.Unity ) //|| mapping == null )
  1054. mesh.RecalculateNormals();
  1055. else
  1056. {
  1057. if ( mapping == null )
  1058. BuildNormalMapping(mesh, false);
  1059. RecalcNormals(mesh, verts);
  1060. }
  1061. }
  1062. public void RecalcNormals(Mesh ms, Vector3[] _verts)
  1063. {
  1064. int index = 0;
  1065. Vector3 v30 = Vector3.zero;
  1066. Vector3 v31 = Vector3.zero;
  1067. Vector3 v32 = Vector3.zero;
  1068. Vector3 va = Vector3.zero;
  1069. Vector3 vb = Vector3.zero;
  1070. for ( int f = 0; f < tris.Length; f += 3 )
  1071. {
  1072. v30 = _verts[tris[f]];
  1073. v31 = _verts[tris[f + 1]];
  1074. v32 = _verts[tris[f + 2]];
  1075. va.x = v31.x - v30.x;
  1076. va.y = v31.y - v30.y;
  1077. va.z = v31.z - v30.z;
  1078. vb.x = v32.x - v31.x;
  1079. vb.y = v32.y - v31.y;
  1080. vb.z = v32.z - v31.z;
  1081. v30.x = va.y * vb.z - va.z * vb.y;
  1082. v30.y = va.z * vb.x - va.x * vb.z;
  1083. v30.z = va.x * vb.y - va.y * vb.x;
  1084. // Uncomment this if you dont want normals weighted by poly size
  1085. //float l = v30.x * v30.x + v30.y * v30.y + v30.z * v30.z;
  1086. //l = 1.0f / Mathf.Sqrt(l);
  1087. //v30.x *= l;
  1088. //v30.y *= l;
  1089. //v30.z *= l;
  1090. facenorms[index++] = v30;
  1091. }
  1092. for ( int n = 0; n < norms.Length; n++ )
  1093. {
  1094. if ( mapping[n].faces.Length > 0 )
  1095. {
  1096. Vector3 norm = facenorms[mapping[n].faces[0]];
  1097. for ( int i = 1; i < mapping[n].faces.Length; i++ )
  1098. {
  1099. v30 = facenorms[mapping[n].faces[i]];
  1100. norm.x += v30.x;
  1101. norm.y += v30.y;
  1102. norm.z += v30.z;
  1103. }
  1104. float l = norm.x * norm.x + norm.y * norm.y + norm.z * norm.z;
  1105. l = 1.0f / Mathf.Sqrt(l);
  1106. norm.x *= l;
  1107. norm.y *= l;
  1108. norm.z *= l;
  1109. norms[n] = norm;
  1110. }
  1111. else
  1112. norms[n] = Vector3.up;
  1113. }
  1114. ms.normals = norms;
  1115. }
  1116. }