コード例 #1
0
ファイル: EventMode.cs プロジェクト: LordNed/Winditor
        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);
        }
コード例 #2
0
ファイル: EventMode.cs プロジェクト: LordNed/Winditor
        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;
        }
コード例 #3
0
ファイル: EventMode.cs プロジェクト: LordNed/Winditor
        private void OverrideSceneCamera(WSceneView view)
        {
            if (m_bOverrideSceneCamera)
            {
                return;
            }

            m_bOverrideSceneCamera = true;
            m_OriginalSceneCamera  = view.ViewCamera;
        }
コード例 #4
0
ファイル: ActorMode.cs プロジェクト: FrasseFreak/Winditor
 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;
     }
 }
コード例 #5
0
ファイル: ActorMode.cs プロジェクト: FrasseFreak/Winditor
        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);
        }
コード例 #6
0
        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));
        }
コード例 #7
0
ファイル: CutNodeViewModel.cs プロジェクト: LordNed/Winditor
        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);
            }
        }
コード例 #8
0
ファイル: ActorMode.cs プロジェクト: FrasseFreak/Winditor
        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);
        }