private void GetCameraOffsetForCenterAlignmentUsingVertices_ProcessObject(Kn5RenderableObject obj, Matrix matrix, ref Vector3 min, ref Vector3 max) { if (min.Z != 0f && obj.BoundingBox.HasValue) { var corners = obj.BoundingBox.Value.GetCorners(); foreach (var c in corners) { var sp = Vector3.TransformCoordinate(c, matrix); if (sp.X < min.X || sp.Y < min.Y || sp.Z < min.Z || sp.X > max.X || sp.Y > max.Y || sp.Z > max.Z) { goto NextStep; } } return; } NextStep: var wm = obj.ParentMatrix * matrix; var vertices = obj.Vertices; for (var i = 0; i < vertices.Length; i++) { var sp = Vector3.TransformCoordinate(vertices[i].Position, wm); if (min.Z == 0f) { min = sp; max = sp; } else { if (sp.X < min.X) { min.X = sp.X; } if (sp.Y < min.Y) { min.Y = sp.Y; } if (sp.Z < min.Z) { min.Z = sp.Z; } if (sp.X > max.X) { max.X = sp.X; } if (sp.Y > max.Y) { max.Y = sp.Y; } if (sp.Z > max.Z) { max.Z = sp.Z; } } } }
public void OnClick(Vector2 mousePosition) { var ray = Camera.GetPickingRay(mousePosition, new Vector2(Width, Height)); var nodes = Scene.SelectManyRecursive(x => x as RenderableList) .OfType<Kn5RenderableObject>() .Where(node => { float d; return node.BoundingBox.HasValue && Ray.Intersects(ray, node.BoundingBox.Value, out d); }) .Select(node => { var min = float.MaxValue; var found = false; var indices = node.Indices; var vertices = node.Vertices; var matrix = node.ParentMatrix; for (int i = 0, n = indices.Length / 3; i < n; i++) { var v0 = Vector3.TransformCoordinate(vertices[indices[i * 3]].Position, matrix); var v1 = Vector3.TransformCoordinate(vertices[indices[i * 3 + 1]].Position, matrix); var v2 = Vector3.TransformCoordinate(vertices[indices[i * 3 + 2]].Position, matrix); float distance; if (!Ray.Intersects(ray, v0, v1, v2, out distance) || distance >= min) continue; min = distance; found = true; } return found ? new { Node = node, Distance = min } : null; }) .Where(x => x != null) .OrderBy(x => x.Distance) .Select(x => x.Node) .ToList(); if (nodes.Any()) { var first = nodes[0]; if (first != _previousSelectedFirstObject) { _previousSelectedObjects.Clear(); _previousSelectedObjects.Add(first); _previousSelectedFirstObject = first; SelectedObject = first; } else { var filtered = nodes.Where(x => !_previousSelectedObjects.Contains(x)).ToList(); if (filtered.Any()) { _previousSelectedObjects.Add(filtered[0]); SelectedObject = filtered[0]; } else { _previousSelectedObjects.Clear(); _previousSelectedObjects.Add(first); SelectedObject = first; } } } else { Deselect(); } }
public void Deselect() { SelectedObject = null; _previousSelectedObjects.Clear(); _previousSelectedFirstObject = null; }
public virtual void Initialize(CarLightType type, Kn5RenderableList main, IniFileSection section) { Type = type; Name = section.GetNonEmpty("NAME"); Emissive = section.GetVector3("COLOR").Select(y => (float)y).ToArray().ToVector3(); Node = main.GetByName(Name); }