private BindingVector3 Raycast(FRay ray, WCamera camera) { BindingVector3 selected_vec = null; List <BindingVector3> vecs_to_raycast = GetCameraVectorProperties(); List <Tuple <float, BindingVector3> > results = new List <Tuple <float, BindingVector3> >(); foreach (BindingVector3 bv in vecs_to_raycast) { FPlane plane = new FPlane(ray.Direction.Normalized(), bv.BackingVector); float dist = float.MaxValue; plane.RayIntersectsPlane(ray, out dist); Vector3 plane_intersect_point = camera.Transform.Position + (plane.Normal * dist); float distance_from_billboard_center = (plane_intersect_point - bv.BackingVector).Length; if (distance_from_billboard_center < 50.0f) { float point_dist = (camera.Transform.Position - bv.BackingVector).Length; results.Add(new Tuple <float, BindingVector3>(point_dist, bv)); } } results.Sort(delegate(Tuple <float, BindingVector3> x, Tuple <float, BindingVector3> y) { return(x.Item1.CompareTo(y.Item1)); }); if (results.Count > 0) { selected_vec = results[0].Item2; } return(selected_vec); }
public EventMode(WWorld world) { World = world; EventDetailsViewModel = new WDetailsViewViewModel(); ActorDetailsViewModel = new WDetailsViewViewModel(); m_StaffNodeViews = new List <NetworkView>(); TransformGizmo = new WTransformGizmo(world); ModeControlsDock = CreateUI(); m_NodeWindow = new EventNodeWindow(); m_NodeWindow.ActorPropertiesView.DataContext = ActorDetailsViewModel; m_NodeWindow.ActorTabControl.SelectionChanged += OnSelectedActorChanged; m_NodeWindow.Closing += M_NodeWindow_Closing; m_NodeWindow.EditMenu.Items.Add(new MenuItem() { Header = "Add Actor", Command = AddStaffCommand }); EditorSelection = new Selection <BindingVector3>(this); EditorSelection.OnSelectionChanged += OnSelectionChanged; m_SceneCameraOverride = new WCamera(); m_SceneCameraOverride.bEnableUpdates = false; m_SceneCameraOverride.AspectRatio = 1.28f; }
private void OverrideSceneCamera(WSceneView view) { if (m_bOverrideSceneCamera) { return; } m_bOverrideSceneCamera = true; m_OriginalSceneCamera = view.ViewCamera; }
public void GoToEntity() { if (EditorSelection.PrimarySelectedObject != null) { var entity = EditorSelection.PrimarySelectedObject; Vector3 entityPos = entity.Transform.Position; WCamera camera = World.GetFocusedSceneView().ViewCamera; Vector3 newCameraPos = entityPos + Vector3.Transform(new Vector3(0.0f, 0.0f, 1000.0f), camera.Transform.Rotation); camera.Transform.Position = newCameraPos; } }
private Vector3 GetNewEntityPositionFromCamera() { float distance = GetCollisionDistanceFromCamera(); if (distance < 0) { // If the camera is not looking at any collision triangle, use a sane default distance from the camera to spawn the actor at. distance = 2000.0f; } WCamera camera = World.GetFocusedSceneView().ViewCamera; Vector3 spawnPos = camera.Transform.Position + Vector3.Transform(new Vector3(0.0f, 0.0f, -distance), camera.Transform.Rotation); return(spawnPos); }
public MainWindowViewModel() { // Override the Current Directory with one we calculate ourself. This solves the problem of assigning the application as the // default application for a filetype and it having its CurrentDirectory be System32. Environment.CurrentDirectory = ApplicationExtensions.GetBasePath(); m_highresScreenshot = new HighresScreenshotViewModel(); m_modelRenderOptions = new ModelRenderOptionsViewModel(); m_renderCamera = new WCamera(); m_loadedModels = new List <J3D>(); m_sceneGraphs = new List <SceneGraphViewModel>(); m_renderCamera.Transform.Position = new Vector3(500, 75, 500); m_renderCamera.Transform.Rotation = Quaternion.FromAxisAngle(Vector3.UnitY, WMath.DegreesToRadians(45f)); m_dtStopwatch = new System.Diagnostics.Stopwatch(); Application.Current.MainWindow.Closing += OnMainWindowClosing; Random rnd = new Random((int)DateTime.Now.ToBinary()); m_glControlClearColor = ColorUtils.HSVtoRGB(new Vector3(rnd.Next(255) / 255f, 0.7f, 0.85f)); }
public void CopySettingsFromCamera(WCamera Camera, bool IsStart) { string EyeName = IsStart ? "StartEye" : "Eye"; string CenterName = IsStart ? "StartCenter" : "Center"; string FovyName = IsStart ? "StartFovy" : "Fovy"; List <NodeInputViewModel> ViewModelList = Inputs.Items.ToList(); ViewModelList.RemoveAt(0); // First input is always the execution input, so skip it because it doesn't matter for properties. NodeInputViewModel EyeNodeInput = ViewModelList.Find(x => x.Connections.Items.First().Output.Parent.Name.ToLower() == EyeName.ToLower()); SubstanceNodeViewModel EyeNode = EyeNodeInput != null?EyeNodeInput.Connections.Items.First().Output.Parent as SubstanceNodeViewModel : null; NodeInputViewModel CenterNodeInput = ViewModelList.Find(x => x.Connections.Items.First().Output.Parent.Name.ToLower() == CenterName.ToLower()); SubstanceNodeViewModel CenterNode = CenterNodeInput != null?CenterNodeInput.Connections.Items.First().Output.Parent as SubstanceNodeViewModel : null; NodeInputViewModel FovyNodeInput = ViewModelList.Find(x => x.Connections.Items.First().Output.Parent.Name.ToLower() == FovyName.ToLower()); SubstanceNodeViewModel FovyNode = FovyNodeInput != null?FovyNodeInput.Connections.Items.First().Output.Parent as SubstanceNodeViewModel : null; System.Windows.Point Offset = new System.Windows.Point(Position.X - 375, Position.Y + 50); // EyeNode was already attached to this cut if (EyeNode != null) { Substance <ObservableCollection <BindingVector3> > EyeSub = EyeNode.Substance as Substance <ObservableCollection <BindingVector3> >; EyeSub.Data = new ObservableCollection <BindingVector3>() { new BindingVector3(Camera.Transform.Position) }; } // EyeNode needs to be added else { Substance <ObservableCollection <BindingVector3> > EyeSub = new Substance <ObservableCollection <BindingVector3> >(EyeName, SubstanceType.Vec3); EyeSub.Data = new ObservableCollection <BindingVector3>() { new BindingVector3(Camera.Transform.Position) }; AddProperty(EyeSub, Offset); } Offset.Y += 125; // CenterNode was already attached to this cut if (CenterNode != null) { Substance <ObservableCollection <BindingVector3> > CenterSub = CenterNode.Substance as Substance <ObservableCollection <BindingVector3> >; Vector3 CenterPos = Camera.Transform.Position + (Camera.Transform.Forward * -1000.0f); CenterSub.Data = new ObservableCollection <BindingVector3>() { new BindingVector3(CenterPos) }; } // CenterNode needs to be added else { Substance <ObservableCollection <BindingVector3> > CenterSub = new Substance <ObservableCollection <BindingVector3> >(CenterName, SubstanceType.Vec3); Vector3 CenterPos = Camera.Transform.Position + (Camera.Transform.Forward * -1000.0f); CenterSub.Data = new ObservableCollection <BindingVector3>() { new BindingVector3(CenterPos) }; AddProperty(CenterSub, Offset); } Offset.Y += 125; // FovyNode was already attached to this cut if (FovyNode != null) { Substance <ObservableCollection <PrimitiveBinding <float> > > FovySub = FovyNode.Substance as Substance <ObservableCollection <PrimitiveBinding <float> > >; FovySub.Data = new ObservableCollection <PrimitiveBinding <float> >() { new PrimitiveBinding <float>(Camera.FieldOfView) }; } // FovyNode needs to be added else { Substance <ObservableCollection <PrimitiveBinding <float> > > FovySub = new Substance <ObservableCollection <PrimitiveBinding <float> > >(FovyName, SubstanceType.Float); FovySub.Data = new ObservableCollection <PrimitiveBinding <float> >() { new PrimitiveBinding <float>(Camera.FieldOfView) }; AddProperty(FovySub, Offset); } }
private float GetCollisionDistanceFromCamera() { if (World.Map == null) { return(-1); } List <WCollisionMesh> meshes; if (World.Map.FocusedScene is WStage) { // If a stage is selected, raycast against the collision meshes for all rooms that are loaded. meshes = new List <WCollisionMesh>(); foreach (var scene in World.Map.SceneList) { meshes.AddRange(scene.GetChildrenOfType <WCollisionMesh>()); } } else { // If a room is selected, raycast against the collision mesh for only that room. meshes = World.Map.FocusedScene.GetChildrenOfType <WCollisionMesh>(); } if (meshes.Count == 0) { return(-1); } WCamera camera = World.GetFocusedSceneView().ViewCamera; Vector3 dir = Vector3.Transform(new Vector3(0.0f, 0.0f, -1.0f), camera.Transform.Rotation); dir.Normalize(); FRay ray = new FRay(camera.Transform.Position, dir); CollisionTriangle closestResult = null; float closestDistance = float.MaxValue; foreach (var mesh in meshes) { foreach (var tri in mesh.Triangles) { float dist = float.MaxValue; if (WMath.RayIntersectsTriangle(ray, tri.Vertices[1], tri.Vertices[0], tri.Vertices[2], true, out dist)) { if (dist < closestDistance) { closestDistance = dist; closestResult = tri; } } } } if (closestResult == null) { return(-1.0f); } return(closestDistance); }