//********************************** Banshee Engine (www.banshee3d.com) **************************************************// //**************** Copyright (c) 2016 Marko Pintera (marko.pintera@gmail.com). All rights reserved. **********************// using System; using bs; namespace bs.Editor { /** @addtogroup Window * @{ */ /// /// Contains various menu item callbacks for the main editor menu bar. /// static class MenuItems { /// /// Adds a camera component to the currently selected scene object. /// [MenuItem("Components/Camera", 7950)] private static void AddCamera() { SceneObject so = Selection.SceneObject; if (so == null) return; GameObjectUndo.RecordSceneObject(so, false, "Added a Camera component"); Camera cam = so.AddComponent(); cam.Main = true; GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a renderable component to the currently selected scene object. /// [MenuItem("Components/Renderable", 7949)] private static void AddRenderable() { SceneObject so = Selection.SceneObject; if (so == null) return; GameObjectUndo.RecordSceneObject(so, false, "Added a Renderable component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a ParticleSystem component to the currently selected scene object. /// [MenuItem("Components/Particle system", 7948)] private static void AddParticleSystem() { SceneObject so = Selection.SceneObject; if (so == null) return; GameObjectUndo.RecordSceneObject(so, false, "Added a Particle System component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a Decal component to the currently selected scene object. /// [MenuItem("Components/Decal", 7947)] private static void AddDecal() { SceneObject so = Selection.SceneObject; if (so == null) return; GameObjectUndo.RecordSceneObject(so, false, "Added a Decal component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a point light component to the currently selected scene object. /// [MenuItem("Components/Radial light", 7900, true)] private static void AddPointLight() { SceneObject so = Selection.SceneObject; if (so == null) return; GameObjectUndo.RecordSceneObject(so, false, "Added a Light component"); Light light = so.AddComponent(); light.Type = LightType.Radial; GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a spot light component to the currently selected scene object. /// [MenuItem("Components/Spot light", 7899)] private static void AddSpotLight() { SceneObject so = Selection.SceneObject; if (so == null) return; GameObjectUndo.RecordSceneObject(so, false, "Added a Light component"); Light light = so.AddComponent(); light.Type = LightType.Spot; GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a directional light component to the currently selected scene object. /// [MenuItem("Components/Directional light", 7898)] private static void AddDirectionalLight() { SceneObject so = Selection.SceneObject; if (so == null) return; GameObjectUndo.RecordSceneObject(so, false, "Added a Light component"); Light light = so.AddComponent(); light.Type = LightType.Directional; GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a Skybox component to the currently selected scene object. /// [MenuItem("Components/Skybox", 7897)] private static void AddSkybox() { SceneObject so = Selection.SceneObject; if (so == null) return; GameObjectUndo.RecordSceneObject(so, false, "Added an Skybox component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a ReflectionProbe component to the currently selected scene object. /// [MenuItem("Components/Reflection probe", 7896)] private static void AddReflectionProbe() { SceneObject so = Selection.SceneObject; if (so == null) return; GameObjectUndo.RecordSceneObject(so, false, "Added an ReflectionProbe component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a LightProbeVolume component to the currently selected scene object. /// [MenuItem("Components/Light probe volume", 7895)] private static void AddLightProbeVolume() { SceneObject so = Selection.SceneObject; if (so == null) return; GameObjectUndo.RecordSceneObject(so, false, "Added a Light Probe Volume component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a GUI widget component to the currently selected scene object. /// [MenuItem("Components/GUI widget", 7850, true)] private static void AddGUIWidget() { SceneObject so = Selection.SceneObject; if (so == null) return; GameObjectUndo.RecordSceneObject(so, false, "Added a GUIWidget component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a BoxCollider component to the currently selected scene object. /// [MenuItem("Components/Physics/Box collider", 7800, true)] private static void AddBoxCollider() { SceneObject so = Selection.SceneObject; if (so == null) { so = UndoRedo.CreateSO("BoxCollider", "New scene object"); Selection.SceneObject = so; FocusOnHierarchyOrScene(); } GameObjectUndo.RecordSceneObject(so, false, "Added a BoxCollider component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a SphereCollider component to the currently selected scene object. /// [MenuItem("Components/Physics/Sphere collider", 7799)] private static void AddSphereCollider() { SceneObject so = Selection.SceneObject; if (so == null) { so = UndoRedo.CreateSO("SphereCollider", "New scene object"); Selection.SceneObject = so; FocusOnHierarchyOrScene(); } GameObjectUndo.RecordSceneObject(so, false, "Added a SphereCollider component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a CapsuleCollider component to the currently selected scene object. /// [MenuItem("Components/Physics/Capsule collider", 7798)] private static void AddCapsuleCollider() { SceneObject so = Selection.SceneObject; if (so == null) { so = UndoRedo.CreateSO("CapsuleCollider", "New scene object"); Selection.SceneObject = so; FocusOnHierarchyOrScene(); } GameObjectUndo.RecordSceneObject(so, false, "Added a CapsuleCollider component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a MeshCollider component to the currently selected scene object. /// [MenuItem("Components/Physics/Mesh collider", 7797)] private static void AddMeshCollider() { SceneObject so = Selection.SceneObject; if (so == null) { so = UndoRedo.CreateSO("MeshCollider", "New scene object"); Selection.SceneObject = so; FocusOnHierarchyOrScene(); } GameObjectUndo.RecordSceneObject(so, false, "Added a MeshCollider component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a PlaneCollider component to the currently selected scene object. /// [MenuItem("Components/Physics/Plane collider", 7796)] private static void AddPlaneCollider() { SceneObject so = Selection.SceneObject; if (so == null) { so = UndoRedo.CreateSO("PlaneCollider", "New scene object"); Selection.SceneObject = so; FocusOnHierarchyOrScene(); } GameObjectUndo.RecordSceneObject(so, false, "Added a PlaneCollider component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a Rigidbody component to the currently selected scene object. /// [MenuItem("Components/Physics/Rigidbody", 7750, true)] private static void AddRigidbody() { SceneObject so = Selection.SceneObject; if (so == null) { so = UndoRedo.CreateSO("Rigidbody", "New scene object"); Selection.SceneObject = so; FocusOnHierarchyOrScene(); } GameObjectUndo.RecordSceneObject(so, false, "Added a Rigidbody component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a CharacterController component to the currently selected scene object. /// [MenuItem("Components/Physics/Character controller", 7749)] private static void AddCharacterController() { SceneObject so = Selection.SceneObject; if (so == null) { so = UndoRedo.CreateSO("CharacterController", "New scene object"); Selection.SceneObject = so; FocusOnHierarchyOrScene(); } GameObjectUndo.RecordSceneObject(so, false, "Added a CharacterController component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a FixedJoint component to the currently selected scene object. /// [MenuItem("Components/Physics/Fixed joint", 7600, true)] private static void AddFixedJoint() { SceneObject so = Selection.SceneObject; if (so == null) { so = UndoRedo.CreateSO("FixedJoint", "New scene object"); Selection.SceneObject = so; FocusOnHierarchyOrScene(); } GameObjectUndo.RecordSceneObject(so, false, "Added a FixedJoint component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a DistanceJoint component to the currently selected scene object. /// [MenuItem("Components/Physics/Distance joint", 7599)] private static void AddDistanceJoint() { SceneObject so = Selection.SceneObject; if (so == null) { so = UndoRedo.CreateSO("DistanceJoint", "New scene object"); Selection.SceneObject = so; FocusOnHierarchyOrScene(); } GameObjectUndo.RecordSceneObject(so, false, "Added a DistanceJoint component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a HingeJoint component to the currently selected scene object. /// [MenuItem("Components/Physics/Hinge joint", 7598)] private static void AddHingeJoint() { SceneObject so = Selection.SceneObject; if (so == null) { so = UndoRedo.CreateSO("HingeJoint", "New scene object"); Selection.SceneObject = so; FocusOnHierarchyOrScene(); } GameObjectUndo.RecordSceneObject(so, false, "Added a HingeJoint component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a SphericalJoint component to the currently selected scene object. /// [MenuItem("Components/Physics/Spherical joint", 7597)] private static void AddSphericalJoint() { SceneObject so = Selection.SceneObject; if (so == null) { so = UndoRedo.CreateSO("SphericalJoint", "New scene object"); Selection.SceneObject = so; FocusOnHierarchyOrScene(); } GameObjectUndo.RecordSceneObject(so, false, "Added a SphericalJoint component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a SliderJoint component to the currently selected scene object. /// [MenuItem("Components/Physics/Slider joint", 7596)] private static void AddSliderJoint() { SceneObject so = Selection.SceneObject; if (so == null) { so = UndoRedo.CreateSO("SliderJoint", "New scene object"); Selection.SceneObject = so; FocusOnHierarchyOrScene(); } GameObjectUndo.RecordSceneObject(so, false, "Added a SliderJoint component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a D6Joint component to the currently selected scene object. /// [MenuItem("Components/Physics/D6 joint", 7595)] private static void AddD6Joint() { SceneObject so = Selection.SceneObject; if (so == null) { so = UndoRedo.CreateSO("D6Joint", "New scene object"); Selection.SceneObject = so; FocusOnHierarchyOrScene(); } GameObjectUndo.RecordSceneObject(so, false, "Added a D6Joint component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds an AudioListener component to the currently selected scene object. /// [MenuItem("Components/Audio/Listener", 7550, true)] private static void AddAudioListener() { SceneObject so = Selection.SceneObject; if (so == null) { so = UndoRedo.CreateSO("AudioListener", "New scene object"); Selection.SceneObject = so; FocusOnHierarchyOrScene(); } GameObjectUndo.RecordSceneObject(so, false, "Added a AudioListener component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds an AudioSource component to the currently selected scene object. /// [MenuItem("Components/Audio/Source", 7549)] private static void AddAudioSource() { SceneObject so = Selection.SceneObject; if (so == null) { so = UndoRedo.CreateSO("AudioSource", "New scene object"); Selection.SceneObject = so; FocusOnHierarchyOrScene(); } GameObjectUndo.RecordSceneObject(so, false, "Added a AudioSource component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds an Animation component to the currently selected scene object. /// [MenuItem("Components/Animation", 7500, true)] private static void AddAnimation() { SceneObject so = Selection.SceneObject; if (so == null) return; GameObjectUndo.RecordSceneObject(so, false, "Added an Animation component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Adds a Bone component to the currently selected scene object. /// [MenuItem("Components/Bone", 7499)] private static void AddBone() { SceneObject so = Selection.SceneObject; if (so == null) return; GameObjectUndo.RecordSceneObject(so, false, "Added an Bone component"); so.AddComponent(); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Creates a new empty scene object. /// [MenuItem("Scene Objects/Scene Object", 9000)] [ToolbarItem("SceneObject", ToolbarIcon.NewSceneObject, "Creates a new empty scene object", 1601, true)] private static void AddEmptySO() { SceneObject so = UndoRedo.CreateSO("SceneObject", "New scene object"); Selection.SceneObject = so; FocusOnHierarchyOrScene(); EditorApplication.SetSceneDirty(); } /// /// Creates a new scene object with a Camera component. /// [MenuItem("Scene Objects/Camera", 8950, true)] [ToolbarItem("Camera", ToolbarIcon.NewCamera, "New camera", 1600, false)] private static void AddCameraSO() { SceneObject so = UndoRedo.CreateSO("Camera", "Created a Camera"); Camera cam = so.AddComponent(); cam.Main = true; Selection.SceneObject = so; FocusOnHierarchyOrScene(); EditorApplication.SetSceneDirty(); } /// /// Creates a new scene object with a Renderable component. /// [MenuItem("Scene Objects/Renderable", 8949)] [ToolbarItem("Renderable", ToolbarIcon.NewRenderable, "New renderable", 1599)] private static void AddRenderableSO() { SceneObject so = UndoRedo.CreateSO("Renderable", "Created a Renderable"); so.AddComponent(); Selection.SceneObject = so; FocusOnHierarchyOrScene(); EditorApplication.SetSceneDirty(); } /// /// Creates a new scene object with a Particle System component. /// [MenuItem("Scene Objects/Particle system", 8948)] private static void AddParticleSystemSO() { SceneObject so = UndoRedo.CreateSO("Particle system", "Created a ParticleSystem"); so.AddComponent(); Selection.SceneObject = so; FocusOnHierarchyOrScene(); EditorApplication.SetSceneDirty(); } /// /// Creates a new scene object with a Decal component. /// [MenuItem("Scene Objects/Decal", 8947)] private static void AddDecalSO() { SceneObject so = UndoRedo.CreateSO("Decal", "Created a Decal"); so.AddComponent(); Selection.SceneObject = so; FocusOnHierarchyOrScene(); EditorApplication.SetSceneDirty(); } /// /// Creates a new scene object with a radial light component. /// [MenuItem("Scene Objects/Radial light", 8900, true)] [ToolbarItem("Point light", ToolbarIcon.NewPointLight, "New radial light", 1598)] private static void AddPointLightSO() { SceneObject so = UndoRedo.CreateSO("Radial light", "Created a Light"); Light light = so.AddComponent(); light.Type = LightType.Radial; Selection.SceneObject = so; FocusOnHierarchyOrScene(); EditorApplication.SetSceneDirty(); } /// /// Creates a new scene object with a spot light component. /// [MenuItem("Scene Objects/Spot light", 8899)] [ToolbarItem("Spot light", ToolbarIcon.NewSpotLight, "New spot light", 1597)] private static void AddSpotLightSO() { SceneObject so = UndoRedo.CreateSO("Spot light", "Created a Light"); Light light = so.AddComponent(); light.Type = LightType.Spot; Selection.SceneObject = so; FocusOnHierarchyOrScene(); EditorApplication.SetSceneDirty(); } /// /// Creates a new scene object with a directional light component. /// [MenuItem("Scene Objects/Directional light", 8898)] [ToolbarItem("Directional light", ToolbarIcon.NewDirLight, "New directional light", 1596)] private static void AddDirectionalLightSO() { SceneObject so = UndoRedo.CreateSO("Directional light", "Created a Light"); Light light = so.AddComponent(); light.Type = LightType.Directional; Selection.SceneObject = so; FocusOnHierarchyOrScene(); EditorApplication.SetSceneDirty(); } /// /// Creates a new scene object with a GUI widget component. /// [MenuItem("Scene Objects/GUI widget", 8850, true)] private static void AddGUIWidgetSO() { SceneObject so = UndoRedo.CreateSO("GUIWidget", "Created a GUIWidget"); so.AddComponent(); Selection.SceneObject = so; FocusOnHierarchyOrScene(); EditorApplication.SetSceneDirty(); } /// /// Creates a new scene object with a box primitive. /// [MenuItem("Scene Objects/3D primitives/Box", 8100, true)] [ToolbarItem("Cube", ToolbarIcon.NewCube, "Creates a scene object with a box primitive", 1700, true)] private static void Add3DBox() { SceneObject so = UndoRedo.CreateSO("Box", "Created a box"); Renderable renderable = so.AddComponent(); renderable.Mesh = Builtin.Box; Selection.SceneObject = so; FocusOnHierarchyOrScene(); EditorApplication.SetSceneDirty(); } /// /// Creates a new scene object with a sphere primitive. /// [MenuItem("Scene Objects/3D primitives/Sphere", 8099)] [ToolbarItem("Sphere", ToolbarIcon.NewSphere, "Creates a scene object with a sphere primitive", 1699)] private static void Add3DSphere() { SceneObject so = UndoRedo.CreateSO("Sphere", "Created a sphere"); Renderable renderable = so.AddComponent(); renderable.Mesh = Builtin.Sphere; Selection.SceneObject = so; FocusOnHierarchyOrScene(); EditorApplication.SetSceneDirty(); } /// /// Creates a new scene object with a cone primitive. /// [MenuItem("Scene Objects/3D primitives/Cone", 8098)] [ToolbarItem("Cone", ToolbarIcon.NewCone, "Creates a scene object with a cone primitive", 1698)] private static void Add3DCone() { SceneObject so = UndoRedo.CreateSO("Cone", "Created a cone"); Renderable renderable = so.AddComponent(); renderable.Mesh = Builtin.Cone; Selection.SceneObject = so; FocusOnHierarchyOrScene(); EditorApplication.SetSceneDirty(); } /// /// Creates a new scene object with a quad primitive. /// [MenuItem("Scene Objects/3D primitives/Quad", 8097)] [ToolbarItem("Quad", ToolbarIcon.NewQuad, "Creates a scene object with a quad primitive", 1697)] private static void Add3DQuad() { SceneObject so = UndoRedo.CreateSO("Quad", "Created a quad"); Renderable renderable = so.AddComponent(); renderable.Mesh = Builtin.Quad; Selection.SceneObject = so; FocusOnHierarchyOrScene(); EditorApplication.SetSceneDirty(); } /// /// Creates a new scene object with a disc primitive. /// [MenuItem("Scene Objects/3D primitives/Disc", 8096)] private static void Add3DDisc() { SceneObject so = UndoRedo.CreateSO("Disc", "Created a disc"); Renderable renderable = so.AddComponent(); renderable.Mesh = Builtin.Disc; Selection.SceneObject = so; FocusOnHierarchyOrScene(); EditorApplication.SetSceneDirty(); } /// /// Applies changes from the prefab instance to the prefab resource. /// [MenuItem("Scene Objects/Apply prefab", 8025, true)] private static void ApplyPrefab() { SceneObject so = Selection.SceneObject; if (so == null) return; PrefabUtility.ApplyPrefab(so); } /// /// Reverts a prefab instance to the original state of its prefab. /// [MenuItem("Scene Objects/Revert to prefab", 8024)] private static void RevertToPrefab() { SceneObject so = Selection.SceneObject; if (so == null) return; GameObjectUndo.RecordSceneObject(so, true, "Reverting \"" + so.Name + "\" to prefab."); PrefabUtility.RevertPrefab(so); GameObjectUndo.ResolveDiffs(); EditorApplication.SetSceneDirty(); } /// /// Breaks a link between a prefab and its instance. /// [MenuItem("Scene Objects/Break prefab link", 8023)] private static void BreakPrefabLink() { SceneObject so = Selection.SceneObject; if (so == null) return; UndoRedo.BreakPrefab(so, "Breaking prefab link for " + so.Name); EditorApplication.SetSceneDirty(); } /// /// Cuts the currently selected scene object or resource. /// [MenuItem("Edit/Cut", 9450, true)] public static void Cut() { EditorApplication.TriggerGlobalShortcut(EditorApplication.CutKey); } /// /// Copies the currently selected scene object or resource. /// [MenuItem("Edit/Copy", 9449)] public static void Copy() { EditorApplication.TriggerGlobalShortcut(EditorApplication.CopyKey); } /// /// Pastes the scene objects or resources that were previously cut or copied. /// [MenuItem("Edit/Paste", 9448)] public static void Paste() { EditorApplication.TriggerGlobalShortcut(EditorApplication.PasteKey); } /// /// Deletes currently selected scene objects or resources. /// [MenuItem("Edit/Delete", 9447)] public static void Delete() { EditorApplication.TriggerGlobalShortcut(EditorApplication.DeleteKey); } /// /// Duplicates currently selected scene objects or resources. /// [MenuItem("Edit/Duplicate", 9446)] public static void Duplicate() { EditorApplication.TriggerGlobalShortcut(EditorApplication.DuplicateKey); } /// /// Executes the last command on the undo stack, undoing its operations. /// [MenuItem("Edit/Undo", ButtonModifier.Ctrl, ButtonCode.Z, 9500, true)] [ToolbarItem("Undo", ToolbarIcon.Undo, "Undo (Ctrl + Z)", 1900, true)] public static void Undo() { EditorWindow[] allWindows = EditorWindow.AllWindows; foreach (var window in allWindows) { if (!window.HasFocus) continue; UndoRedo localStack = window.UndoRedo; if (localStack == null) continue; localStack.Undo(); return; } GameObjectUndo.ResolveDiffs(); UndoRedo.Global.Undo(); } /// /// Executes the last command on the redo stack (last command we called undo on), re-applying its operation. /// [MenuItem("Edit/Redo", ButtonModifier.Ctrl, ButtonCode.Y, 9499)] [ToolbarItem("Redo", ToolbarIcon.Redo, "Redo (Ctrl + Y)", 1899)] public static void Redo() { EditorWindow[] allWindows = EditorWindow.AllWindows; foreach (var window in allWindows) { if (!window.HasFocus) continue; UndoRedo localStack = window.UndoRedo; if (localStack == null) continue; localStack.Redo(); return; } UndoRedo.Global.Redo(); } /// /// Sets keyboard focus to the Hierarchy or Scene windows if open. /// private static void FocusOnHierarchyOrScene() { SceneWindow sceneWindow = EditorWindow.GetWindow(); if (sceneWindow != null) { sceneWindow.HasFocus = true; return; } HierarchyWindow hierarchyWindow = EditorWindow.GetWindow(); if (hierarchyWindow != null) hierarchyWindow.HasFocus = true; } } /** @} */ }