// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #if USE_LARGE_WORLDS using Real = System.Double; #else using Real = System.Single; #endif using FlaxEditor.GUI.ContextMenu; using FlaxEditor.Windows; using FlaxEngine; namespace FlaxEditor.SceneGraph.Actors { /// /// Scene tree node for actor type. /// /// [HideInEditor] public sealed class CameraNode : ActorNode { /// public CameraNode(Actor actor) : base(actor) { } /// public override void OnContextMenu(ContextMenu contextMenu, EditorWindow window) { base.OnContextMenu(contextMenu, window); if (window is not SceneTreeWindow win) return; var button = new ContextMenuButton(contextMenu, "Move Camera to View"); button.Parent = contextMenu.ItemsContainer; contextMenu.ItemsContainer.Children.Remove(button); contextMenu.ItemsContainer.Children.Insert(4, button); button.Clicked += () => { var c = Actor as Camera; var viewport = Editor.Instance.Windows.EditWin.Viewport; c.Position = viewport.ViewPosition; c.Orientation = viewport.ViewOrientation; }; } /// public override bool RayCastSelf(ref RayCastData ray, out Real distance, out Vector3 normal) { normal = Vector3.Up; // Check if skip raycasts if ((ray.Flags & RayCastData.FlagTypes.SkipEditorPrimitives) == RayCastData.FlagTypes.SkipEditorPrimitives) { distance = 0; return false; } return Camera.Internal_IntersectsItselfEditor(FlaxEngine.Object.GetUnmanagedPtr(_actor), ref ray.Ray, out distance); } } }