MenuItems.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. using System;
  4. using BansheeEngine;
  5. namespace BansheeEditor
  6. {
  7. /// <summary>
  8. /// Contains various menu item callbacks for the main editor menu bar.
  9. /// </summary>
  10. static class MenuItems
  11. {
  12. /// <summary>
  13. /// Adds a camera component to the currently selected scene object.
  14. /// </summary>
  15. [MenuItem("Components/Camera", 7050)]
  16. private static void AddCamera()
  17. {
  18. SceneObject so = Selection.SceneObject;
  19. if (so == null)
  20. return;
  21. UndoRedo.RecordSO(so, false, "Added a Camera component");
  22. Camera cam = so.AddComponent<Camera>();
  23. cam.Main = true;
  24. EditorApplication.SetSceneDirty();
  25. }
  26. /// <summary>
  27. /// Adds a renderable component to the currently selected scene object.
  28. /// </summary>
  29. [MenuItem("Components/Renderable", 7049)]
  30. private static void AddRenderable()
  31. {
  32. SceneObject so = Selection.SceneObject;
  33. if (so == null)
  34. return;
  35. UndoRedo.RecordSO(so, false, "Added a Renderable component");
  36. so.AddComponent<Renderable>();
  37. EditorApplication.SetSceneDirty();
  38. }
  39. /// <summary>
  40. /// Adds a point light component to the currently selected scene object.
  41. /// </summary>
  42. [MenuItem("Components/Point light", 7048)]
  43. private static void AddPointLight()
  44. {
  45. SceneObject so = Selection.SceneObject;
  46. if (so == null)
  47. return;
  48. UndoRedo.RecordSO(so, false, "Added a Light component");
  49. Light light = so.AddComponent<Light>();
  50. light.Type = LightType.Point;
  51. EditorApplication.SetSceneDirty();
  52. }
  53. /// <summary>
  54. /// Adds a spot light component to the currently selected scene object.
  55. /// </summary>
  56. [MenuItem("Components/Spot light", 7047)]
  57. private static void AddSpotLight()
  58. {
  59. SceneObject so = Selection.SceneObject;
  60. if (so == null)
  61. return;
  62. UndoRedo.RecordSO(so, false, "Added a Light component");
  63. Light light = so.AddComponent<Light>();
  64. light.Type = LightType.Spot;
  65. EditorApplication.SetSceneDirty();
  66. }
  67. /// <summary>
  68. /// Adds a directional light component to the currently selected scene object.
  69. /// </summary>
  70. [MenuItem("Components/Directional light", 7046)]
  71. private static void AddDirectionalLight()
  72. {
  73. SceneObject so = Selection.SceneObject;
  74. if (so == null)
  75. return;
  76. UndoRedo.RecordSO(so, false, "Added a Light component");
  77. Light light = so.AddComponent<Light>();
  78. light.Type = LightType.Directional;
  79. EditorApplication.SetSceneDirty();
  80. }
  81. /// <summary>
  82. /// Adds a GUI widget component to the currently selected scene object.
  83. /// </summary>
  84. [MenuItem("Components/GUI widget", 7045)]
  85. private static void AddGUIWidget()
  86. {
  87. SceneObject so = Selection.SceneObject;
  88. if (so == null)
  89. return;
  90. UndoRedo.RecordSO(so, false, "Added a GUIWidget component");
  91. so.AddComponent<GUIWidget>();
  92. EditorApplication.SetSceneDirty();
  93. }
  94. /// <summary>
  95. /// Adds a BoxCollider component to the currently selected scene object.
  96. /// </summary>
  97. [MenuItem("Components/Physics/Box collider", 7044)]
  98. private static void AddBoxCollider()
  99. {
  100. SceneObject so = Selection.SceneObject;
  101. if (so == null)
  102. so = UndoRedo.CreateSO("BoxCollider", "New scene object");
  103. UndoRedo.RecordSO(so, false, "Added a BoxCollider component");
  104. so.AddComponent<BoxCollider>();
  105. EditorApplication.SetSceneDirty();
  106. }
  107. /// <summary>
  108. /// Adds a SphereCollider component to the currently selected scene object.
  109. /// </summary>
  110. [MenuItem("Components/Physics/Sphere collider", 7043)]
  111. private static void AddSphereCollider()
  112. {
  113. SceneObject so = Selection.SceneObject;
  114. if (so == null)
  115. so = UndoRedo.CreateSO("SphereCollider", "New scene object");
  116. UndoRedo.RecordSO(so, false, "Added a SphereCollider component");
  117. so.AddComponent<SphereCollider>();
  118. EditorApplication.SetSceneDirty();
  119. }
  120. /// <summary>
  121. /// Adds a CapsuleCollider component to the currently selected scene object.
  122. /// </summary>
  123. [MenuItem("Components/Physics/Capsule collider", 7042)]
  124. private static void AddCapsuleCollider()
  125. {
  126. SceneObject so = Selection.SceneObject;
  127. if (so == null)
  128. so = UndoRedo.CreateSO("CapsuleCollider", "New scene object");
  129. UndoRedo.RecordSO(so, false, "Added a CapsuleCollider component");
  130. so.AddComponent<CapsuleCollider>();
  131. EditorApplication.SetSceneDirty();
  132. }
  133. /// <summary>
  134. /// Adds a MeshCollider component to the currently selected scene object.
  135. /// </summary>
  136. [MenuItem("Components/Physics/Mesh collider", 7041)]
  137. private static void AddMeshCollider()
  138. {
  139. SceneObject so = Selection.SceneObject;
  140. if (so == null)
  141. so = UndoRedo.CreateSO("MeshCollider", "New scene object");
  142. UndoRedo.RecordSO(so, false, "Added a MeshCollider component");
  143. so.AddComponent<MeshCollider>();
  144. EditorApplication.SetSceneDirty();
  145. }
  146. /// <summary>
  147. /// Adds a PlaneCollider component to the currently selected scene object.
  148. /// </summary>
  149. [MenuItem("Components/Physics/Plane collider", 7040)]
  150. private static void AddPlaneCollider()
  151. {
  152. SceneObject so = Selection.SceneObject;
  153. if (so == null)
  154. so = UndoRedo.CreateSO("PlaneCollider", "New scene object");
  155. UndoRedo.RecordSO(so, false, "Added a PlaneCollider component");
  156. so.AddComponent<PlaneCollider>();
  157. EditorApplication.SetSceneDirty();
  158. }
  159. /// <summary>
  160. /// Adds a Rigidbody component to the currently selected scene object.
  161. /// </summary>
  162. [MenuItem("Components/Physics/Rigidbody", 7039, true)]
  163. private static void AddRigidbody()
  164. {
  165. SceneObject so = Selection.SceneObject;
  166. if (so == null)
  167. so = UndoRedo.CreateSO("Rigidbody", "New scene object");
  168. UndoRedo.RecordSO(so, false, "Added a Rigidbody component");
  169. so.AddComponent<Rigidbody>();
  170. EditorApplication.SetSceneDirty();
  171. }
  172. /// <summary>
  173. /// Adds a CharacterController component to the currently selected scene object.
  174. /// </summary>
  175. [MenuItem("Components/Physics/Character controller", 7038)]
  176. private static void AddCharacterController()
  177. {
  178. SceneObject so = Selection.SceneObject;
  179. if (so == null)
  180. so = UndoRedo.CreateSO("CharacterController", "New scene object");
  181. UndoRedo.RecordSO(so, false, "Added a CharacterController component");
  182. so.AddComponent<CharacterController>();
  183. EditorApplication.SetSceneDirty();
  184. }
  185. /// <summary>
  186. /// Adds a FixedJoint component to the currently selected scene object.
  187. /// </summary>
  188. [MenuItem("Components/Physics/Fixed joint", 7037, true)]
  189. private static void AddFixedJoint()
  190. {
  191. SceneObject so = Selection.SceneObject;
  192. if (so == null)
  193. so = UndoRedo.CreateSO("FixedJoint", "New scene object");
  194. UndoRedo.RecordSO(so, false, "Added a FixedJoint component");
  195. so.AddComponent<FixedJoint>();
  196. EditorApplication.SetSceneDirty();
  197. }
  198. /// <summary>
  199. /// Adds a DistanceJoint component to the currently selected scene object.
  200. /// </summary>
  201. [MenuItem("Components/Physics/Distance joint", 7036)]
  202. private static void AddDistanceJoint()
  203. {
  204. SceneObject so = Selection.SceneObject;
  205. if (so == null)
  206. so = UndoRedo.CreateSO("DistanceJoint", "New scene object");
  207. UndoRedo.RecordSO(so, false, "Added a DistanceJoint component");
  208. so.AddComponent<DistanceJoint>();
  209. EditorApplication.SetSceneDirty();
  210. }
  211. /// <summary>
  212. /// Adds a HingeJoint component to the currently selected scene object.
  213. /// </summary>
  214. [MenuItem("Components/Physics/Hinge joint", 7035)]
  215. private static void AddHingeJoint()
  216. {
  217. SceneObject so = Selection.SceneObject;
  218. if (so == null)
  219. so = UndoRedo.CreateSO("HingeJoint", "New scene object");
  220. UndoRedo.RecordSO(so, false, "Added a HingeJoint component");
  221. so.AddComponent<HingeJoint>();
  222. EditorApplication.SetSceneDirty();
  223. }
  224. /// <summary>
  225. /// Adds a SphericalJoint component to the currently selected scene object.
  226. /// </summary>
  227. [MenuItem("Components/Physics/Spherical joint", 7034)]
  228. private static void AddSphericalJoint()
  229. {
  230. SceneObject so = Selection.SceneObject;
  231. if (so == null)
  232. so = UndoRedo.CreateSO("SphericalJoint", "New scene object");
  233. UndoRedo.RecordSO(so, false, "Added a SphericalJoint component");
  234. so.AddComponent<SphericalJoint>();
  235. EditorApplication.SetSceneDirty();
  236. }
  237. /// <summary>
  238. /// Adds a SliderJoint component to the currently selected scene object.
  239. /// </summary>
  240. [MenuItem("Components/Physics/Slider joint", 7032)]
  241. private static void AddSliderJoint()
  242. {
  243. SceneObject so = Selection.SceneObject;
  244. if (so == null)
  245. so = UndoRedo.CreateSO("SliderJoint", "New scene object");
  246. UndoRedo.RecordSO(so, false, "Added a SliderJoint component");
  247. so.AddComponent<SliderJoint>();
  248. EditorApplication.SetSceneDirty();
  249. }
  250. /// <summary>
  251. /// Adds a D6Joint component to the currently selected scene object.
  252. /// </summary>
  253. [MenuItem("Components/Physics/D6 joint", 7032)]
  254. private static void AddD6Joint()
  255. {
  256. SceneObject so = Selection.SceneObject;
  257. if (so == null)
  258. so = UndoRedo.CreateSO("D6Joint", "New scene object");
  259. UndoRedo.RecordSO(so, false, "Added a D6Joint component");
  260. so.AddComponent<D6Joint>();
  261. EditorApplication.SetSceneDirty();
  262. }
  263. /// <summary>
  264. /// Creates a new empty scene object.
  265. /// </summary>
  266. [MenuItem("Scene Objects/Scene Object", 8051)]
  267. [ToolbarItem("SceneObject", ToolbarIcon.NewSceneObject, "Creates a new empty scene object", 1601, true)]
  268. private static void AddEmptySO()
  269. {
  270. SceneObject so = UndoRedo.CreateSO("SceneObject", "New scene object");
  271. Selection.SceneObject = so;
  272. EditorApplication.SetSceneDirty();
  273. }
  274. /// <summary>
  275. /// Creates a new scene object with a camera component.
  276. /// </summary>
  277. [MenuItem("Scene Objects/Camera", 8050)]
  278. [ToolbarItem("Camera", ToolbarIcon.NewCamera, "New camera", 1600, false)]
  279. private static void AddCameraSO()
  280. {
  281. SceneObject so = UndoRedo.CreateSO("Camera", "Created a Camera");
  282. Camera cam = so.AddComponent<Camera>();
  283. cam.Main = true;
  284. Selection.SceneObject = so;
  285. EditorApplication.SetSceneDirty();
  286. }
  287. /// <summary>
  288. /// Creates a new scene object with a renderable component.
  289. /// </summary>
  290. [MenuItem("Scene Objects/Renderable", 8049)]
  291. [ToolbarItem("Renderable", ToolbarIcon.NewRenderable, "New renderable", 1599)]
  292. private static void AddRenderableSO()
  293. {
  294. SceneObject so = UndoRedo.CreateSO("Renderable", "Created a Renderable");
  295. so.AddComponent<Renderable>();
  296. Selection.SceneObject = so;
  297. EditorApplication.SetSceneDirty();
  298. }
  299. /// <summary>
  300. /// Creates a new scene object with a point light component.
  301. /// </summary>
  302. [MenuItem("Scene Objects/Point light", 8048)]
  303. [ToolbarItem("Point light", ToolbarIcon.NewPointLight, "New point light", 1598)]
  304. private static void AddPointLightSO()
  305. {
  306. SceneObject so = UndoRedo.CreateSO("Point light", "Created a Light");
  307. Light light = so.AddComponent<Light>();
  308. light.Type = LightType.Point;
  309. Selection.SceneObject = so;
  310. EditorApplication.SetSceneDirty();
  311. }
  312. /// <summary>
  313. /// Creates a new scene object with a spot light component.
  314. /// </summary>
  315. [MenuItem("Scene Objects/Spot light", 8047)]
  316. [ToolbarItem("Spot light", ToolbarIcon.NewSpotLight, "New spot light", 1597)]
  317. private static void AddSpotLightSO()
  318. {
  319. SceneObject so = UndoRedo.CreateSO("Spot light", "Created a Light");
  320. Light light = so.AddComponent<Light>();
  321. light.Type = LightType.Spot;
  322. Selection.SceneObject = so;
  323. EditorApplication.SetSceneDirty();
  324. }
  325. /// <summary>
  326. /// Creates a new scene object with a directional light component.
  327. /// </summary>
  328. [MenuItem("Scene Objects/Directional light", 8046)]
  329. [ToolbarItem("Directional light", ToolbarIcon.NewDirLight, "New directional light", 1596)]
  330. private static void AddDirectionalLightSO()
  331. {
  332. SceneObject so = UndoRedo.CreateSO("Directional light", "Created a Light");
  333. Light light = so.AddComponent<Light>();
  334. light.Type = LightType.Directional;
  335. Selection.SceneObject = so;
  336. EditorApplication.SetSceneDirty();
  337. }
  338. /// <summary>
  339. /// Creates a new scene object with a GUI widget component.
  340. /// </summary>
  341. [MenuItem("Scene Objects/GUI widget", 8045)]
  342. private static void AddGUIWidgetSO()
  343. {
  344. SceneObject so = UndoRedo.CreateSO("GUIWidget", "Created a GUIWidget");
  345. so.AddComponent<GUIWidget>();
  346. Selection.SceneObject = so;
  347. EditorApplication.SetSceneDirty();
  348. }
  349. /// <summary>
  350. /// Creates a new scene object with a box primitive.
  351. /// </summary>
  352. [MenuItem("Scene Objects/3D primitives/Box", 8100)]
  353. [ToolbarItem("Cube", ToolbarIcon.NewCube, "Creates a scene object with a box primitive", 1700, true)]
  354. private static void Add3DBox()
  355. {
  356. SceneObject so = UndoRedo.CreateSO("Box", "Created a box");
  357. Renderable renderable = so.AddComponent<Renderable>();
  358. renderable.Mesh = Builtin.Box;
  359. Selection.SceneObject = so;
  360. EditorApplication.SetSceneDirty();
  361. }
  362. /// <summary>
  363. /// Creates a new scene object with a sphere primitive.
  364. /// </summary>
  365. [MenuItem("Scene Objects/3D primitives/Sphere", 8099)]
  366. [ToolbarItem("Sphere", ToolbarIcon.NewSphere, "Creates a scene object with a sphere primitive", 1699)]
  367. private static void Add3DSphere()
  368. {
  369. SceneObject so = UndoRedo.CreateSO("Sphere", "Created a sphere");
  370. Renderable renderable = so.AddComponent<Renderable>();
  371. renderable.Mesh = Builtin.Sphere;
  372. Selection.SceneObject = so;
  373. EditorApplication.SetSceneDirty();
  374. }
  375. /// <summary>
  376. /// Creates a new scene object with a cone primitive.
  377. /// </summary>
  378. [MenuItem("Scene Objects/3D primitives/Cone", 8098)]
  379. [ToolbarItem("Cone", ToolbarIcon.NewCone, "Creates a scene object with a cone primitive", 1698)]
  380. private static void Add3DCone()
  381. {
  382. SceneObject so = UndoRedo.CreateSO("Cone", "Created a cone");
  383. Renderable renderable = so.AddComponent<Renderable>();
  384. renderable.Mesh = Builtin.Cone;
  385. Selection.SceneObject = so;
  386. EditorApplication.SetSceneDirty();
  387. }
  388. /// <summary>
  389. /// Creates a new scene object with a quad primitive.
  390. /// </summary>
  391. [MenuItem("Scene Objects/3D primitives/Quad", 8097)]
  392. [ToolbarItem("Quad", ToolbarIcon.NewQuad, "Creates a scene object with a quad primitive", 1697)]
  393. private static void Add3DQuad()
  394. {
  395. SceneObject so = UndoRedo.CreateSO("Quad", "Created a quad");
  396. Renderable renderable = so.AddComponent<Renderable>();
  397. renderable.Mesh = Builtin.Quad;
  398. Selection.SceneObject = so;
  399. EditorApplication.SetSceneDirty();
  400. }
  401. /// <summary>
  402. /// Creates a new scene object with a disc primitive.
  403. /// </summary>
  404. [MenuItem("Scene Objects/3D primitives/Disc", 8096)]
  405. private static void Add3DDisc()
  406. {
  407. SceneObject so = UndoRedo.CreateSO("Disc", "Created a disc");
  408. Renderable renderable = so.AddComponent<Renderable>();
  409. renderable.Mesh = Builtin.Disc;
  410. Selection.SceneObject = so;
  411. EditorApplication.SetSceneDirty();
  412. }
  413. /// <summary>
  414. /// Applies changes from the prefab instance to the prefab resource.
  415. /// </summary>
  416. [MenuItem("Scene Objects/Apply prefab", 8025, true)]
  417. private static void ApplyPrefab()
  418. {
  419. SceneObject so = Selection.SceneObject;
  420. if (so == null)
  421. return;
  422. PrefabUtility.ApplyPrefab(so);
  423. }
  424. /// <summary>
  425. /// Reverts a prefab instance to the original state of its prefab.
  426. /// </summary>
  427. [MenuItem("Scene Objects/Revert to prefab", 8024)]
  428. private static void RevertToPrefab()
  429. {
  430. SceneObject so = Selection.SceneObject;
  431. if (so == null)
  432. return;
  433. UndoRedo.RecordSO(so, true, "Reverting \"" + so.Name + "\" to prefab.");
  434. PrefabUtility.RevertPrefab(so);
  435. EditorApplication.SetSceneDirty();
  436. }
  437. /// <summary>
  438. /// Breaks a link between a prefab and its instance.
  439. /// </summary>
  440. [MenuItem("Scene Objects/Break prefab link", 8023)]
  441. private static void BreakPrefabLink()
  442. {
  443. SceneObject so = Selection.SceneObject;
  444. if (so == null)
  445. return;
  446. UndoRedo.BreakPrefab(so, "Breaking prefab link for " + so.Name);
  447. EditorApplication.SetSceneDirty();
  448. }
  449. /// <summary>
  450. /// Cuts the currently selected scene object or resource.
  451. /// </summary>
  452. [MenuItem("Edit/Cut", 9450, true)]
  453. public static void Cut()
  454. {
  455. if (Selection.SceneObjects != null && Selection.SceneObjects.Length > 0)
  456. {
  457. HierarchyWindow win = EditorWindow.GetWindow<HierarchyWindow>();
  458. if (win != null)
  459. win.CutSelection();
  460. }
  461. else if (Selection.ResourcePaths != null && Selection.ResourcePaths.Length > 0)
  462. {
  463. LibraryWindow win = EditorWindow.GetWindow<LibraryWindow>();
  464. if (win != null)
  465. win.CutSelection();
  466. }
  467. }
  468. /// <summary>
  469. /// Copies the currently selected scene object or resource.
  470. /// </summary>
  471. [MenuItem("Edit/Copy", 9449)]
  472. public static void Copy()
  473. {
  474. if (Selection.SceneObjects != null && Selection.SceneObjects.Length > 0)
  475. {
  476. HierarchyWindow win = EditorWindow.GetWindow<HierarchyWindow>();
  477. if (win != null)
  478. win.CopySelection();
  479. }
  480. else if (Selection.ResourcePaths != null && Selection.ResourcePaths.Length > 0)
  481. {
  482. LibraryWindow win = EditorWindow.GetWindow<LibraryWindow>();
  483. if (win != null)
  484. win.CopySelection();
  485. }
  486. }
  487. /// <summary>
  488. /// Pastes the scene objects or resources that were previously cut or copied.
  489. /// </summary>
  490. [MenuItem("Edit/Paste", 9448)]
  491. public static void Paste()
  492. {
  493. // TODO - This is slightly wrong in case both windows have something in their paste buffer (unify them?)
  494. {
  495. HierarchyWindow win = EditorWindow.GetWindow<HierarchyWindow>();
  496. if (win != null)
  497. win.PasteToSelection();
  498. }
  499. {
  500. LibraryWindow win = EditorWindow.GetWindow<LibraryWindow>();
  501. if (win != null)
  502. win.PasteToSelection();
  503. }
  504. }
  505. /// <summary>
  506. /// Deletes currently selected scene objects or resources.
  507. /// </summary>
  508. [MenuItem("Edit/Delete", 9447)]
  509. public static void Delete()
  510. {
  511. if (Selection.SceneObjects != null && Selection.SceneObjects.Length > 0)
  512. {
  513. HierarchyWindow win = EditorWindow.GetWindow<HierarchyWindow>();
  514. if (win != null)
  515. win.DeleteSelection();
  516. }
  517. else if (Selection.ResourcePaths != null && Selection.ResourcePaths.Length > 0)
  518. {
  519. LibraryWindow win = EditorWindow.GetWindow<LibraryWindow>();
  520. if (win != null)
  521. win.DeleteSelection();
  522. }
  523. }
  524. /// <summary>
  525. /// Duplicates currently selected scene objects or resources.
  526. /// </summary>
  527. [MenuItem("Edit/Duplicate", 9446)]
  528. public static void Duplicate()
  529. {
  530. if (Selection.SceneObjects != null && Selection.SceneObjects.Length > 0)
  531. {
  532. HierarchyWindow win = EditorWindow.GetWindow<HierarchyWindow>();
  533. if (win != null)
  534. win.DuplicateSelection();
  535. }
  536. else if (Selection.ResourcePaths != null && Selection.ResourcePaths.Length > 0)
  537. {
  538. LibraryWindow win = EditorWindow.GetWindow<LibraryWindow>();
  539. if (win != null)
  540. win.DuplicateSelection();
  541. }
  542. }
  543. }
  544. }