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();
}
}