PropManager.cs 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using UnityEngine;
  5. using UnityEngine.Rendering;
  6. namespace COM3D2.MeidoPhotoStudio.Plugin
  7. {
  8. internal class PropManager
  9. {
  10. private static bool cubeActive = true;
  11. public static bool CubeActive
  12. {
  13. get => cubeActive;
  14. set
  15. {
  16. if (value != cubeActive)
  17. {
  18. cubeActive = value;
  19. CubeActiveChange?.Invoke(null, EventArgs.Empty);
  20. }
  21. }
  22. }
  23. private static bool cubeSmall;
  24. public static bool CubeSmall
  25. {
  26. get => cubeSmall;
  27. set
  28. {
  29. if (value != cubeSmall)
  30. {
  31. cubeSmall = value;
  32. CubeSmallChange?.Invoke(null, EventArgs.Empty);
  33. }
  34. }
  35. }
  36. private static event EventHandler CubeActiveChange;
  37. private static event EventHandler CubeSmallChange;
  38. private List<DragDogu> doguList = new List<DragDogu>();
  39. private DragType dragTypeOld = DragType.None;
  40. private DragType currentDragType = DragType.None;
  41. private bool showGizmos = false;
  42. private enum DragType
  43. {
  44. None, Move, Rotate, Scale, Delete, Other
  45. }
  46. public void Activate()
  47. {
  48. CubeSmallChange += OnCubeSmall;
  49. }
  50. public void Deactivate()
  51. {
  52. foreach (DragDogu dogu in doguList)
  53. {
  54. GameObject.Destroy(dogu.gameObject);
  55. }
  56. doguList.Clear();
  57. CubeSmallChange -= OnCubeSmall;
  58. }
  59. public void Update()
  60. {
  61. if (Input.GetKeyDown(KeyCode.Space))
  62. {
  63. // showGizmos = !showGizmos;
  64. // currentDragType = dragTypeOld = DragType.None;
  65. // UpdateDragType();
  66. }
  67. if (CubeActive && (Input.GetKey(KeyCode.Z) || Input.GetKey(KeyCode.X) || Input.GetKey(KeyCode.C)
  68. || Input.GetKey(KeyCode.D))
  69. )
  70. {
  71. currentDragType = DragType.Other;
  72. }
  73. else
  74. {
  75. currentDragType = DragType.None;
  76. }
  77. if (currentDragType != dragTypeOld) UpdateDragType();
  78. dragTypeOld = currentDragType;
  79. }
  80. private void UpdateDragType()
  81. {
  82. bool dragPointActive = (currentDragType == DragType.Other);
  83. foreach (DragDogu dogu in doguList)
  84. {
  85. dogu.SetDragProp(showGizmos, dragPointActive, dragPointActive);
  86. }
  87. }
  88. private GameObject GetDeploymentObject()
  89. {
  90. GameObject go = GameObject.Find("Deployment Object Parent");
  91. if (go == null) go = new GameObject("Deployment Object Parent");
  92. return go;
  93. }
  94. public void SpawnObject(string assetName)
  95. {
  96. // TODO: Add a couple more things to ignore list
  97. GameObject dogu = null;
  98. if (assetName.StartsWith("mirror"))
  99. {
  100. Material mirrorMaterial = new Material(Shader.Find("Mirror"));
  101. dogu = GameObject.CreatePrimitive(PrimitiveType.Plane);
  102. Renderer mirrorRenderer = dogu.GetComponent<Renderer>();
  103. mirrorRenderer.material = mirrorMaterial;
  104. mirrorRenderer.enabled = true;
  105. MirrorReflection2 mirrorReflection = dogu.AddComponent<MirrorReflection2>();
  106. mirrorReflection.m_TextureSize = 2048;
  107. Vector3 localPosition = new Vector3(0f, 0.96f, 0f);
  108. dogu.transform.Rotate(dogu.transform.right, 90f);
  109. switch (assetName)
  110. {
  111. case "mirror1":
  112. dogu.transform.localScale = new Vector3(0.2f, 0.4f, 0.2f);
  113. break;
  114. case "mirror2":
  115. dogu.transform.localScale = new Vector3(0.1f, 0.4f, 0.2f);
  116. break;
  117. case "mirror3":
  118. localPosition.y = 0.85f;
  119. dogu.transform.localScale = new Vector3(0.03f, 0.18f, 0.124f);
  120. break;
  121. }
  122. dogu.transform.localPosition = localPosition;
  123. }
  124. else if (assetName.IndexOf(':') >= 0)
  125. {
  126. string[] assetParts = assetName.Split(':');
  127. GameObject obj = GameMain.Instance.BgMgr.CreateAssetBundle(assetParts[0]);
  128. if (obj == null)
  129. {
  130. obj = Resources.Load("BG/" + assetParts[0]) as GameObject;
  131. }
  132. GameObject bg = GameObject.Instantiate(obj);
  133. int num = int.Parse(assetParts[1]);
  134. dogu = bg.transform.GetChild(num).gameObject;
  135. dogu.transform.SetParent(null);
  136. GameObject.Destroy(bg);
  137. bg.SetActive(false);
  138. }
  139. else
  140. {
  141. GameObject obj = GameMain.Instance.BgMgr.CreateAssetBundle(assetName);
  142. if (obj == null) obj = Resources.Load("Prefab/" + assetName) as GameObject;
  143. dogu = GameObject.Instantiate(obj) as GameObject;
  144. dogu.transform.localPosition = Vector3.zero;
  145. MeshRenderer[] meshRenderers = dogu.GetComponentsInChildren<MeshRenderer>();
  146. for (int i = 0; i < meshRenderers.Length; i++)
  147. {
  148. if (meshRenderers[i] != null)
  149. {
  150. meshRenderers[i].shadowCastingMode = ShadowCastingMode.Off;
  151. }
  152. }
  153. Collider collider = dogu.transform.GetComponent<Collider>();
  154. if (collider != null) collider.enabled = false;
  155. foreach (Transform transform in dogu.transform)
  156. {
  157. collider = transform.GetComponent<Collider>();
  158. if (collider != null)
  159. {
  160. collider.enabled = false;
  161. }
  162. }
  163. #region particle system experiment
  164. // if (asset.StartsWith("Particle/"))
  165. // {
  166. // ParticleSystem particleSystem = go.GetComponent<ParticleSystem>();
  167. // if (particleSystem != null)
  168. // {
  169. // ParticleSystem.MainModule main;
  170. // main = particleSystem.main;
  171. // main.loop = true;
  172. // main.duration = Mathf.Infinity;
  173. // ParticleSystem[] particleSystems = particleSystem.GetComponents<ParticleSystem>();
  174. // foreach (ParticleSystem part in particleSystems)
  175. // {
  176. // ParticleSystem.EmissionModule emissionModule = part.emission;
  177. // ParticleSystem.Burst[] bursts = new ParticleSystem.Burst[emissionModule.burstCount];
  178. // emissionModule.GetBursts(bursts);
  179. // for (int i = 0; i < bursts.Length; i++)
  180. // {
  181. // bursts[i].cycleCount = Int32.MaxValue;
  182. // }
  183. // emissionModule.SetBursts(bursts);
  184. // main = part.main;
  185. // main.loop = true;
  186. // main.duration = Mathf.Infinity;
  187. // }
  188. // }
  189. // }
  190. #endregion
  191. }
  192. if (dogu != null)
  193. {
  194. // TODO: Figure out why some props aren't centred properly
  195. // Doesn't happen in MM but even after copy pasting the code, it doesn't work :/
  196. GameObject deploymentObject = GetDeploymentObject();
  197. GameObject finalDogu = new GameObject();
  198. dogu.transform.SetParent(finalDogu.transform, true);
  199. finalDogu.transform.SetParent(deploymentObject.transform, false);
  200. finalDogu.transform.position = new Vector3(0f, 0f, 0.5f);
  201. GameObject dragPoint = BaseDrag.MakeDragPoint(
  202. PrimitiveType.Cube, Vector3.one * 0.12f, BaseDrag.LightBlue
  203. );
  204. DragDogu dragDogu = dragPoint.AddComponent<DragDogu>();
  205. dragDogu.Initialize(finalDogu);
  206. dragDogu.Delete += (s, a) => DeleteDogu();
  207. dragDogu.SetDragProp(showGizmos, false, false);
  208. doguList.Add(dragDogu);
  209. dragDogu.DragPointScale = dragDogu.BaseScale * (CubeSmall ? 0.4f : 1f);
  210. }
  211. }
  212. private void DeleteDogu()
  213. {
  214. doguList.RemoveAll(dragDogu =>
  215. {
  216. if (dragDogu.DeleteMe)
  217. {
  218. GameObject.Destroy(dragDogu.gameObject);
  219. return true;
  220. }
  221. return false;
  222. }
  223. );
  224. }
  225. private void OnCubeSmall(object sender, EventArgs args)
  226. {
  227. foreach (DragDogu dogu in doguList)
  228. {
  229. dogu.DragPointScale = dogu.BaseScale * (CubeSmall ? 0.4f : 1f);
  230. }
  231. }
  232. }
  233. }