DragPointManager.cs 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace COM3D2.MeidoPhotoStudio.Plugin
  5. {
  6. using ModKey = Utility.ModKey;
  7. public class DragPointManager
  8. {
  9. enum IKMode
  10. {
  11. None, UpperLock, Mune, RotLocal, BodyTransform, FingerRotLocalY, FingerRotLocalXZ, BodySelect
  12. }
  13. enum Bone
  14. {
  15. Head, HeadNub, ClavicleL, ClavicleR,
  16. UpperArmL, UpperArmR, ForearmL, ForearmR,
  17. HandL, HandR, IKHandL, IKHandR,
  18. MuneL, MuneSubL, MuneR, MuneSubR,
  19. Neck, Spine, Spine0a, Spine1, Spine1a, ThighL, ThighR,
  20. Pelvis, Hip,
  21. CalfL, CalfR, FootL, FootR,
  22. // Dragpoint specific
  23. Cube, Body, Torso,
  24. // Fingers
  25. Finger0L, Finger01L, Finger02L, Finger0NubL,
  26. Finger1L, Finger11L, Finger12L, Finger1NubL,
  27. Finger2L, Finger21L, Finger22L, Finger2NubL,
  28. Finger3L, Finger31L, Finger32L, Finger3NubL,
  29. Finger4L, Finger41L, Finger42L, Finger4NubL,
  30. Finger0R, Finger01R, Finger02R, Finger0NubR,
  31. Finger1R, Finger11R, Finger12R, Finger1NubR,
  32. Finger2R, Finger21R, Finger22R, Finger2NubR,
  33. Finger3R, Finger31R, Finger32R, Finger3NubR,
  34. Finger4R, Finger41R, Finger42R, Finger4NubR,
  35. // Toes
  36. Toe0L, Toe01L, Toe0NubL,
  37. Toe1L, Toe11L, Toe1NubL,
  38. Toe2L, Toe21L, Toe2NubL,
  39. Toe0R, Toe01R, Toe0NubR,
  40. Toe1R, Toe11R, Toe1NubR,
  41. Toe2R, Toe21R, Toe2NubR
  42. }
  43. private static readonly Dictionary<IKMode, Bone[]> IKGroup = new Dictionary<IKMode, Bone[]>()
  44. {
  45. [IKMode.None] = new[]
  46. {
  47. Bone.UpperArmL, Bone.ForearmL, Bone.HandL, Bone.UpperArmR,
  48. Bone.ForearmR, Bone.HandR, Bone.CalfL, Bone.FootL, Bone.CalfR, Bone.FootR
  49. },
  50. [IKMode.UpperLock] = new[] { Bone.HandL, Bone.HandR, Bone.FootL, Bone.FootR },
  51. [IKMode.Mune] = new[] { Bone.Head, Bone.MuneL, Bone.MuneR },
  52. [IKMode.RotLocal] = new[]
  53. {
  54. Bone.Head, Bone.CalfL, Bone.CalfR, Bone.Torso,
  55. Bone.Pelvis, Bone.HandL, Bone.HandR, Bone.FootL, Bone.FootR
  56. },
  57. [IKMode.BodyTransform] = new[] { Bone.Body, Bone.Cube },
  58. [IKMode.BodySelect] = new[] { Bone.Head, Bone.Body },
  59. [IKMode.FingerRotLocalXZ] = new[]
  60. {
  61. Bone.Finger01L, Bone.Finger02L, Bone.Finger0NubL,
  62. Bone.Finger11L, Bone.Finger12L, Bone.Finger1NubL,
  63. Bone.Finger21L, Bone.Finger22L, Bone.Finger2NubL,
  64. Bone.Finger31L, Bone.Finger32L, Bone.Finger3NubL,
  65. Bone.Finger41L, Bone.Finger42L, Bone.Finger4NubL,
  66. Bone.Finger01R, Bone.Finger02R, Bone.Finger0NubR,
  67. Bone.Finger11R, Bone.Finger12R, Bone.Finger1NubR,
  68. Bone.Finger21R, Bone.Finger22R, Bone.Finger2NubR,
  69. Bone.Finger31R, Bone.Finger32R, Bone.Finger3NubR,
  70. Bone.Finger41R, Bone.Finger42R, Bone.Finger4NubR,
  71. Bone.Toe01L, Bone.Toe0NubL, Bone.Toe11L, Bone.Toe1NubL,
  72. Bone.Toe21L, Bone.Toe2NubL, Bone.Toe01R, Bone.Toe0NubR,
  73. Bone.Toe11R, Bone.Toe1NubR, Bone.Toe21R, Bone.Toe2NubR
  74. },
  75. [IKMode.FingerRotLocalY] = new[] {
  76. Bone.Finger01L, Bone.Finger11L, Bone.Finger21L, Bone.Finger31L, Bone.Finger41L,
  77. Bone.Finger01R, Bone.Finger11R, Bone.Finger21R, Bone.Finger31R, Bone.Finger41R,
  78. Bone.Toe01L, Bone.Toe11L, Bone.Toe21L, Bone.Toe01R, Bone.Toe11R, Bone.Toe21R
  79. }
  80. };
  81. private Meido meido;
  82. private Maid maid;
  83. private Dictionary<Bone, GameObject> DragPoint;
  84. private Dictionary<Bone, Transform> BoneTransform;
  85. private IKMode ikMode;
  86. private IKMode ikModeOld = IKMode.None;
  87. public event EventHandler<MeidoChangeEventArgs> SelectMaid;
  88. public bool Initialized { get; private set; }
  89. public bool Active { get; set; }
  90. public DragPointManager(Meido meido)
  91. {
  92. this.meido = meido;
  93. this.maid = meido.Maid;
  94. this.meido.BodyLoad += Initialize;
  95. }
  96. public void Initialize(object sender, EventArgs args)
  97. {
  98. if (Initialized) return;
  99. this.Active = true;
  100. InitializeBones();
  101. InitializeDragPoints();
  102. Initialized = true;
  103. meido.BodyLoad -= Initialize;
  104. }
  105. public void Destroy()
  106. {
  107. foreach (KeyValuePair<Bone, GameObject> dragPoint in DragPoint)
  108. {
  109. GameObject.Destroy(dragPoint.Value);
  110. }
  111. DragPoint.Clear();
  112. BoneTransform.Clear();
  113. Initialized = false;
  114. this.Active = false;
  115. }
  116. public void Deactivate()
  117. {
  118. this.Active = false;
  119. foreach (KeyValuePair<Bone, GameObject> dragPoint in DragPoint)
  120. {
  121. dragPoint.Value.SetActive(false);
  122. }
  123. }
  124. public void Activate()
  125. {
  126. this.Active = true;
  127. ikMode = ikModeOld = IKMode.None;
  128. UpdateIK();
  129. }
  130. public void Update()
  131. {
  132. if (Input.GetKey(KeyCode.Z) || Input.GetKey(KeyCode.X) || Input.GetKey(KeyCode.C))
  133. {
  134. ikMode = IKMode.BodyTransform;
  135. }
  136. else if (Input.GetKey(KeyCode.A))
  137. {
  138. ikMode = IKMode.BodySelect;
  139. }
  140. else if (Utility.GetModKey(ModKey.Control) && Utility.GetModKey(ModKey.Alt))
  141. {
  142. ikMode = IKMode.Mune;
  143. }
  144. else if (Utility.GetModKey(ModKey.Shift) && Input.GetKey(KeyCode.Space))
  145. {
  146. ikMode = IKMode.FingerRotLocalY;
  147. }
  148. else if (Utility.GetModKey(ModKey.Alt) /* && Utility.GetModKey(ModKey.Shift) */)
  149. {
  150. ikMode = IKMode.RotLocal;
  151. }
  152. else if (Input.GetKey(KeyCode.Space))
  153. {
  154. ikMode = IKMode.FingerRotLocalXZ;
  155. }
  156. else if (Utility.GetModKey(ModKey.Control))
  157. {
  158. ikMode = IKMode.UpperLock;
  159. }
  160. else
  161. {
  162. ikMode = IKMode.None;
  163. }
  164. if (ikMode != ikModeOld) UpdateIK();
  165. ikModeOld = ikMode;
  166. }
  167. private void UpdateIK()
  168. {
  169. if (Active)
  170. {
  171. foreach (KeyValuePair<Bone, GameObject> dragPoint in DragPoint)
  172. {
  173. dragPoint.Value.SetActive(false);
  174. }
  175. foreach (Bone bone in IKGroup[ikMode])
  176. {
  177. DragPoint[bone].SetActive(true);
  178. }
  179. }
  180. else
  181. {
  182. if (ikMode == IKMode.BodySelect)
  183. {
  184. DragPoint[Bone.Body].SetActive(true);
  185. DragPoint[Bone.Head].SetActive(true);
  186. }
  187. else if (ikMode == IKMode.BodyTransform)
  188. {
  189. DragPoint[Bone.Body].SetActive(true);
  190. DragPoint[Bone.Cube].SetActive(true);
  191. }
  192. else
  193. {
  194. DragPoint[Bone.Body].SetActive(false);
  195. DragPoint[Bone.Head].SetActive(false);
  196. DragPoint[Bone.Cube].SetActive(false);
  197. }
  198. }
  199. }
  200. // TODO: Rework this a little to reduce number of needed BaseDrag derived components
  201. private void InitializeDragPoints()
  202. {
  203. DragPoint = new Dictionary<Bone, GameObject>();
  204. Vector3 limbDragPointSize = Vector3.one * 0.12f;
  205. Vector3 fingerDragPointSize = Vector3.one * 0.015f;
  206. Material transparentBlue = new Material(Shader.Find("Transparent/Diffuse"))
  207. {
  208. color = new Color(0.4f, 0.4f, 1f, 0.3f)
  209. };
  210. Material transparentBlue2 = new Material(Shader.Find("Transparent/Diffuse"))
  211. {
  212. color = new Color(0.5f, 0.5f, 1f, 0.8f)
  213. };
  214. Func<PrimitiveType, Vector3, Material, GameObject> MakeDragPoint = (primitive, scale, material) =>
  215. {
  216. GameObject dragPoint = GameObject.CreatePrimitive(primitive);
  217. dragPoint.transform.localScale = scale;
  218. dragPoint.GetComponent<Renderer>().material = material;
  219. dragPoint.layer = 8;
  220. return dragPoint;
  221. };
  222. Func<Transform[], Transform[], Transform[], bool, GameObject[]> MakeIKChainDragPoint = (upper, middle, lower, leg) =>
  223. {
  224. GameObject[] dragPoints = new GameObject[3];
  225. for (int i = 0; i < dragPoints.Length; i++)
  226. {
  227. dragPoints[i] = MakeDragPoint(PrimitiveType.Sphere, limbDragPointSize, transparentBlue);
  228. }
  229. DragJointForearm dragUpper = dragPoints[0].AddComponent<DragJointForearm>();
  230. dragUpper.Initialize(upper, false, meido, () => upper[2].position, () => Vector3.zero);
  231. // dragUpper.DragEvent += OnDragEvent;
  232. DragJointForearm dragMiddle = dragPoints[1].AddComponent<DragJointForearm>();
  233. dragMiddle.Initialize(middle, leg, meido, () => middle[2].position, () => Vector3.zero);
  234. // dragMiddle.DragEvent += OnDragEvent;
  235. DragJointHand dragLower = dragPoints[2].AddComponent<DragJointHand>();
  236. dragLower.Initialize(lower, leg, meido, () => lower[2].position, () => Vector3.zero);
  237. // dragLower.DragEvent += OnDragEvent;
  238. return dragPoints;
  239. };
  240. // Cube Dragpoint
  241. DragPoint[Bone.Cube] = MakeDragPoint(PrimitiveType.Cube, new Vector3(0.12f, 0.12f, 0.12f), transparentBlue2);
  242. DragPoint[Bone.Cube].AddComponent<DragBody>()
  243. .Initialize(meido,
  244. () => maid.transform.position,
  245. () => maid.transform.eulerAngles
  246. );
  247. // Body Dragpoint
  248. DragPoint[Bone.Body] = MakeDragPoint(PrimitiveType.Capsule, new Vector3(0.2f, 0.3f, 0.24f), transparentBlue);
  249. DragBody dragBody = DragPoint[Bone.Body].AddComponent<DragBody>();
  250. dragBody.Initialize(meido,
  251. () => new Vector3(
  252. (BoneTransform[Bone.Hip].position.x + BoneTransform[Bone.Spine0a].position.x) / 2f,
  253. (BoneTransform[Bone.Spine1].position.y + BoneTransform[Bone.Spine0a].position.y) / 2f,
  254. (BoneTransform[Bone.Spine0a].position.z + BoneTransform[Bone.Hip].position.z) / 2f
  255. ),
  256. () => new Vector3(
  257. BoneTransform[Bone.Spine0a].transform.eulerAngles.x,
  258. BoneTransform[Bone.Spine0a].transform.eulerAngles.y,
  259. BoneTransform[Bone.Spine0a].transform.eulerAngles.z + 90f
  260. )
  261. );
  262. dragBody.Select += (s, e) => OnMeidoSelect(new MeidoChangeEventArgs(meido.ActiveSlot, true));
  263. // Head Dragpoint
  264. DragPoint[Bone.Head] = MakeDragPoint(PrimitiveType.Sphere, new Vector3(0.2f, 0.24f, 0.2f), transparentBlue);
  265. DragHead dragHead = DragPoint[Bone.Head].AddComponent<DragHead>();
  266. dragHead.Initialize(BoneTransform[Bone.Neck], meido,
  267. () => new Vector3(
  268. BoneTransform[Bone.Head].position.x,
  269. (BoneTransform[Bone.Head].position.y * 1.2f + BoneTransform[Bone.HeadNub].position.y * 0.8f) / 2f,
  270. BoneTransform[Bone.Head].position.z
  271. ),
  272. () => new Vector3(BoneTransform[Bone.Head].eulerAngles.x, BoneTransform[Bone.Head].eulerAngles.y, BoneTransform[Bone.Head].eulerAngles.z + 90f)
  273. );
  274. dragHead.Select += (s, a) => OnMeidoSelect(new MeidoChangeEventArgs(meido.ActiveSlot, true, false));
  275. // dragHead.DragEvent += OnDragEvent;
  276. // Torso Dragpoint
  277. DragPoint[Bone.Torso] = MakeDragPoint(PrimitiveType.Capsule, new Vector3(0.2f, 0.19f, 0.24f), transparentBlue);
  278. Transform spineTrans1 = BoneTransform[Bone.Spine1];
  279. Transform spineTrans2 = BoneTransform[Bone.Spine1a];
  280. Transform[] spineParts = new Transform[4] {
  281. BoneTransform[Bone.Spine1a],
  282. BoneTransform[Bone.Spine1],
  283. BoneTransform[Bone.Spine0a],
  284. BoneTransform[Bone.Spine]
  285. };
  286. DragTorso dragTorso = DragPoint[Bone.Torso].AddComponent<DragTorso>();
  287. dragTorso.Initialize(spineParts, meido,
  288. () => new Vector3(
  289. spineTrans1.position.x,
  290. (spineTrans2.position.y * 2f) / 2f,
  291. spineTrans1.position.z
  292. ),
  293. () => new Vector3(
  294. spineTrans1.eulerAngles.x,
  295. spineTrans1.eulerAngles.y,
  296. spineTrans1.eulerAngles.z + 90f
  297. )
  298. );
  299. // dragTorso.DragEvent += OnDragEvent;
  300. // Pelvis Dragpoint
  301. DragPoint[Bone.Pelvis] = MakeDragPoint(PrimitiveType.Capsule, new Vector3(0.2f, 0.15f, 0.24f), transparentBlue);
  302. Transform pelvisTrans = BoneTransform[Bone.Pelvis];
  303. Transform spineTrans = BoneTransform[Bone.Spine];
  304. DragPelvis dragPelvis = DragPoint[Bone.Pelvis].AddComponent<DragPelvis>();
  305. dragPelvis.Initialize(BoneTransform[Bone.Pelvis], meido,
  306. () => new Vector3(
  307. pelvisTrans.position.x,
  308. (pelvisTrans.position.y + spineTrans.position.y) / 2f,
  309. pelvisTrans.position.z
  310. ),
  311. () => new Vector3(
  312. pelvisTrans.eulerAngles.x + 90f,
  313. pelvisTrans.eulerAngles.y + 90f,
  314. pelvisTrans.eulerAngles.z
  315. )
  316. );
  317. // dragPelvis.DragEvent += OnDragEvent;
  318. // Left Mune Dragpoint
  319. DragPoint[Bone.MuneL] = MakeDragPoint(PrimitiveType.Sphere, new Vector3(0.12f, 0.12f, 0.12f), transparentBlue);
  320. DragMune dragMuneL = DragPoint[Bone.MuneL].AddComponent<DragMune>();
  321. Transform[] muneIKChainL = new Transform[3] {
  322. BoneTransform[Bone.MuneL],
  323. BoneTransform[Bone.MuneL],
  324. BoneTransform[Bone.MuneSubL]
  325. };
  326. dragMuneL.Initialize(muneIKChainL, meido,
  327. () => (BoneTransform[Bone.MuneL].position + BoneTransform[Bone.MuneSubL].position) / 2f,
  328. () => Vector3.zero
  329. );
  330. // dragMuneL.DragEvent += OnDragEvent;
  331. // Right Mune Dragpoint
  332. DragPoint[Bone.MuneR] = MakeDragPoint(PrimitiveType.Sphere, new Vector3(0.12f, 0.12f, 0.12f), transparentBlue);
  333. DragMune dragMuneR = DragPoint[Bone.MuneR].AddComponent<DragMune>();
  334. Transform[] muneIKChainR = new Transform[3] {
  335. BoneTransform[Bone.MuneR],
  336. BoneTransform[Bone.MuneR],
  337. BoneTransform[Bone.MuneSubR]
  338. };
  339. dragMuneR.Initialize(muneIKChainR, meido,
  340. () => (BoneTransform[Bone.MuneR].position + BoneTransform[Bone.MuneSubR].position) / 2f,
  341. () => Vector3.zero
  342. );
  343. // dragMuneR.DragEvent += OnDragEvent;
  344. // Left Arm Dragpoint
  345. GameObject[] ikChainArmL = MakeIKChainDragPoint(
  346. new Transform[3] {
  347. BoneTransform[Bone.ClavicleL],
  348. BoneTransform[Bone.ClavicleL],
  349. BoneTransform[Bone.UpperArmL]
  350. },
  351. new Transform[3] {
  352. BoneTransform[Bone.UpperArmL],
  353. BoneTransform[Bone.UpperArmL],
  354. BoneTransform[Bone.ForearmL]
  355. },
  356. new Transform[3] {
  357. BoneTransform[Bone.UpperArmL],
  358. BoneTransform[Bone.ForearmL],
  359. BoneTransform[Bone.HandL]
  360. },
  361. false
  362. );
  363. DragPoint[Bone.UpperArmL] = ikChainArmL[0];
  364. DragPoint[Bone.ForearmL] = ikChainArmL[1];
  365. DragPoint[Bone.HandL] = ikChainArmL[2];
  366. // Right Arm Dragpoint
  367. GameObject[] ikChainArmR = MakeIKChainDragPoint(
  368. new Transform[3] {
  369. BoneTransform[Bone.ClavicleR],
  370. BoneTransform[Bone.ClavicleR],
  371. BoneTransform[Bone.UpperArmR]
  372. },
  373. new Transform[3] {
  374. BoneTransform[Bone.UpperArmR],
  375. BoneTransform[Bone.UpperArmR],
  376. BoneTransform[Bone.ForearmR]
  377. },
  378. new Transform[3] {
  379. BoneTransform[Bone.UpperArmR],
  380. BoneTransform[Bone.ForearmR],
  381. BoneTransform[Bone.HandR]
  382. },
  383. false
  384. );
  385. DragPoint[Bone.UpperArmR] = ikChainArmR[0];
  386. DragPoint[Bone.ForearmR] = ikChainArmR[1];
  387. DragPoint[Bone.HandR] = ikChainArmR[2];
  388. // Left Leg Dragpoint
  389. GameObject[] ikChainLegL = MakeIKChainDragPoint(
  390. new Transform[3] {
  391. BoneTransform[Bone.ThighL],
  392. BoneTransform[Bone.CalfL],
  393. BoneTransform[Bone.FootL]
  394. },
  395. new Transform[3] {
  396. BoneTransform[Bone.ThighL],
  397. BoneTransform[Bone.ThighL],
  398. BoneTransform[Bone.CalfL]
  399. },
  400. new Transform[3] {
  401. BoneTransform[Bone.ThighL],
  402. BoneTransform[Bone.CalfL],
  403. BoneTransform[Bone.FootL]
  404. },
  405. true
  406. );
  407. DragPoint[Bone.CalfL] = ikChainLegL[1];
  408. DragPoint[Bone.FootL] = ikChainLegL[2];
  409. // Right Arm Dragpoint
  410. GameObject[] ikChainLegR = MakeIKChainDragPoint(
  411. new Transform[3] {
  412. BoneTransform[Bone.ThighR],
  413. BoneTransform[Bone.CalfR],
  414. BoneTransform[Bone.FootR]
  415. },
  416. new Transform[3] {
  417. BoneTransform[Bone.ThighR],
  418. BoneTransform[Bone.ThighR],
  419. BoneTransform[Bone.CalfR]
  420. },
  421. new Transform[3] {
  422. BoneTransform[Bone.ThighR],
  423. BoneTransform[Bone.CalfR],
  424. BoneTransform[Bone.FootR]
  425. },
  426. true
  427. );
  428. DragPoint[Bone.CalfR] = ikChainLegR[1];
  429. DragPoint[Bone.FootR] = ikChainLegR[2];
  430. // destroy unused thigh dragpoints
  431. GameObject.Destroy(ikChainLegL[0]);
  432. GameObject.Destroy(ikChainLegR[0]);
  433. // Spine Dragpoints
  434. for (Bone bone = Bone.Neck; bone <= Bone.ThighR; ++bone)
  435. {
  436. Transform pos = BoneTransform[bone];
  437. DragPoint[bone] = MakeDragPoint(PrimitiveType.Sphere, limbDragPointSize, transparentBlue);
  438. DragSpine dragSpine = DragPoint[bone].AddComponent<DragSpine>();
  439. dragSpine.Initialize(BoneTransform[bone], meido,
  440. () => pos.position,
  441. () => Vector3.zero
  442. );
  443. // dragSpine.DragEvent += OnDragEvent;
  444. }
  445. // Finger Dragpoints
  446. for (Bone finger = Bone.Finger0L; finger <= Bone.Finger4R; finger += 4)
  447. {
  448. for (int i = 0; i < 3; i++)
  449. {
  450. Bone bone = finger + 1 + i; // Bone.Finger01
  451. DragPoint[bone] = MakeDragPoint(PrimitiveType.Sphere, fingerDragPointSize, transparentBlue);
  452. Transform[] trans = new Transform[3] {
  453. BoneTransform[bone - 1],
  454. BoneTransform[bone - 1],
  455. BoneTransform[bone]
  456. };
  457. Func<Vector3> pos = () => BoneTransform[bone].position;
  458. bool baseFinger = i == 0;
  459. DragJointFinger dragJointFinger = DragPoint[bone].AddComponent<DragJointFinger>();
  460. dragJointFinger.Initialize(trans, baseFinger, meido, pos, () => Vector3.zero);
  461. // dragJointFinger.DragEvent += OnDragEvent;
  462. }
  463. }
  464. // Toe Dragpoints
  465. for (Bone toe = Bone.Toe0L; toe <= Bone.Toe2R; toe += 3)
  466. {
  467. for (int i = 0; i < 2; i++)
  468. {
  469. Bone bone = toe + 1 + i; // Bone.Toe01
  470. DragPoint[bone] = MakeDragPoint(PrimitiveType.Sphere, fingerDragPointSize, transparentBlue);
  471. Transform[] trans = new Transform[3] {
  472. BoneTransform[bone - 1],
  473. BoneTransform[bone - 1],
  474. BoneTransform[bone]
  475. };
  476. Func<Vector3> pos = () => BoneTransform[bone].position;
  477. bool baseFinger = i == 0;
  478. DragJointFinger dragJointFinger = DragPoint[bone].AddComponent<DragJointFinger>();
  479. dragJointFinger.Initialize(trans, baseFinger, meido, pos, () => Vector3.zero);
  480. // dragJointFinger.DragEvent += OnDragEvent;
  481. }
  482. }
  483. ikModeOld = IKMode.None;
  484. ikMode = IKMode.None;
  485. UpdateIK();
  486. }
  487. private void InitializeBones()
  488. {
  489. BoneTransform = new Dictionary<Bone, Transform>()
  490. {
  491. [Bone.Head] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 Head", true),
  492. [Bone.Neck] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 Neck", true),
  493. [Bone.HeadNub] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 HeadNub", true),
  494. [Bone.IKHandL] = CMT.SearchObjName(maid.body0.m_Bones.transform, "_IK_handL", true),
  495. [Bone.IKHandR] = CMT.SearchObjName(maid.body0.m_Bones.transform, "_IK_handR", true),
  496. [Bone.MuneL] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Mune_L", true),
  497. [Bone.MuneSubL] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Mune_L_sub", true),
  498. [Bone.MuneR] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Mune_R", true),
  499. [Bone.MuneSubR] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Mune_R_sub", true),
  500. [Bone.Pelvis] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 Pelvis", true),
  501. [Bone.Hip] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01", true),
  502. [Bone.Spine] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 Spine", true),
  503. [Bone.Spine0a] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 Spine0a", true),
  504. [Bone.Spine1] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 Spine1", true),
  505. [Bone.Spine1a] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 Spine1a", true),
  506. [Bone.ClavicleL] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Clavicle", true),
  507. [Bone.ClavicleR] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Clavicle", true),
  508. [Bone.UpperArmL] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L UpperArm", true),
  509. [Bone.ForearmL] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Forearm", true),
  510. [Bone.HandL] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Hand", true),
  511. [Bone.UpperArmR] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R UpperArm", true),
  512. [Bone.ForearmR] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Forearm", true),
  513. [Bone.HandR] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Hand", true),
  514. [Bone.ThighL] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Thigh", true),
  515. [Bone.CalfL] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Calf", true),
  516. [Bone.FootL] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Foot", true),
  517. [Bone.ThighR] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Thigh", true),
  518. [Bone.CalfR] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Calf", true),
  519. [Bone.FootR] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Foot", true),
  520. // fingers
  521. [Bone.Finger0L] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Finger0", true),
  522. [Bone.Finger01L] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Finger01", true),
  523. [Bone.Finger02L] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Finger02", true),
  524. [Bone.Finger0NubL] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Finger0Nub", true),
  525. [Bone.Finger1L] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Finger1", true),
  526. [Bone.Finger11L] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Finger11", true),
  527. [Bone.Finger12L] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Finger12", true),
  528. [Bone.Finger1NubL] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Finger1Nub", true),
  529. [Bone.Finger2L] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Finger2", true),
  530. [Bone.Finger21L] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Finger21", true),
  531. [Bone.Finger22L] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Finger22", true),
  532. [Bone.Finger2NubL] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Finger2Nub", true),
  533. [Bone.Finger3L] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Finger3", true),
  534. [Bone.Finger31L] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Finger31", true),
  535. [Bone.Finger32L] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Finger32", true),
  536. [Bone.Finger3NubL] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Finger3Nub", true),
  537. [Bone.Finger4L] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Finger4", true),
  538. [Bone.Finger41L] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Finger41", true),
  539. [Bone.Finger42L] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Finger42", true),
  540. [Bone.Finger4NubL] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Finger4Nub", true),
  541. [Bone.Finger0R] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Finger0", true),
  542. [Bone.Finger01R] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Finger01", true),
  543. [Bone.Finger02R] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Finger02", true),
  544. [Bone.Finger0NubR] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Finger0Nub", true),
  545. [Bone.Finger1R] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Finger1", true),
  546. [Bone.Finger11R] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Finger11", true),
  547. [Bone.Finger12R] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Finger12", true),
  548. [Bone.Finger1NubR] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Finger1Nub", true),
  549. [Bone.Finger2R] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Finger2", true),
  550. [Bone.Finger21R] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Finger21", true),
  551. [Bone.Finger22R] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Finger22", true),
  552. [Bone.Finger2NubR] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Finger2Nub", true),
  553. [Bone.Finger3R] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Finger3", true),
  554. [Bone.Finger31R] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Finger31", true),
  555. [Bone.Finger32R] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Finger32", true),
  556. [Bone.Finger3NubR] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Finger3Nub", true),
  557. [Bone.Finger4R] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Finger4", true),
  558. [Bone.Finger41R] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Finger41", true),
  559. [Bone.Finger42R] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Finger42", true),
  560. [Bone.Finger4NubR] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Finger4Nub", true),
  561. // Toes
  562. [Bone.Toe0L] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Toe0", true),
  563. [Bone.Toe01L] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Toe01", true),
  564. [Bone.Toe0NubL] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Toe0Nub", true),
  565. [Bone.Toe1L] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Toe1", true),
  566. [Bone.Toe11L] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Toe11", true),
  567. [Bone.Toe1NubL] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Toe1Nub", true),
  568. [Bone.Toe2L] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Toe2", true),
  569. [Bone.Toe21L] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Toe21", true),
  570. [Bone.Toe2NubL] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 L Toe2Nub", true),
  571. [Bone.Toe0R] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Toe0", true),
  572. [Bone.Toe01R] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Toe01", true),
  573. [Bone.Toe0NubR] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Toe0Nub", true),
  574. [Bone.Toe1R] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Toe1", true),
  575. [Bone.Toe11R] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Toe11", true),
  576. [Bone.Toe1NubR] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Toe1Nub", true),
  577. [Bone.Toe2R] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Toe2", true),
  578. [Bone.Toe21R] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Toe21", true),
  579. [Bone.Toe2NubR] = CMT.SearchObjName(maid.body0.m_Bones.transform, "Bip01 R Toe2Nub", true)
  580. };
  581. }
  582. private void OnMeidoSelect(MeidoChangeEventArgs args)
  583. {
  584. SelectMaid?.Invoke(this, args);
  585. }
  586. private void OnDragEvent(object sender, EventArgs args)
  587. {
  588. this.meido.IsStop = true;
  589. }
  590. }
  591. }