private CollisionTriangle Raycast(FRay ray) { if (World.Map == null || ActiveCollisionMesh == null) { return(null); } CollisionTriangle closestResult = null; float closestDistance = float.MaxValue; foreach (var tri in ActiveCollisionMesh.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; } } } return(closestResult); }
private void AddTriangleToSelection(CollisionTriangle tri) { tri.Select(); int prev_count = EditorSelection.SelectedObjects.Count; EditorSelection.AddToSelection(tri); if (prev_count == 1) { EditorSelection.SelectedObjects[0].Properties.PropertyChanged += OnTriPropertyChanged; } OnSelectionChanged(); }
private void RemoveTriangleFromSelection(CollisionTriangle tri) { tri.Deselect(); if (tri == EditorSelection.SelectedObjects[0]) { EditorSelection.SelectedObjects[0].Properties.PropertyChanged -= OnTriPropertyChanged; } EditorSelection.SelectedObjects.Remove(tri); if (EditorSelection.SelectedObjects.Count > 1) { EditorSelection.SelectedObjects[0].Properties.PropertyChanged += OnTriPropertyChanged; } OnSelectionChanged(); }
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); }