public DebugRenderPrimitive GetPrimitive(long primitive_id) { DebugRenderPrimitive result = null; primitiveIdMap.TryGetValue(primitive_id, out result); return(result); }
private Selection GetSelection(int screenX, int screenY) { // Try to see what can be selected Vector3 rayStart = GeometryMath.Unproject(new Vector3(screenX, Viewport.height - screenY, 0.1), ProjectionMatrix, Viewport); Vector3 rayEnd = GeometryMath.Unproject(new Vector3(screenX, Viewport.height - screenY, IsPerspective ? 1.0 : -1.0), ProjectionMatrix, Viewport); Vector3 rayDirection = (rayEnd - rayStart).GetNormalized(); bool closestHitOpaque = false; double closestDistance = Double.MaxValue; int closestPrimitiveTriangleIndex = -1; DebugRenderPrimitive closestPrimitive = null; List <DebugRenderPrimitive> debugRenderPrimitives = Session.DebugRenderStorage.GetCachedPrimitives(); foreach (DebugRenderPrimitive primitive in debugRenderPrimitives) { bool hitOpaque; int triangleIndex; Vector3 intersection = new Vector3(0, 0, 0); if (primitive.RayCheck(Session.PlaybackPosition, rayStart, rayDirection, out triangleIndex, out hitOpaque, out intersection)) { double distance = rayStart.Distance(intersection); if (distance < closestDistance) { closestPrimitiveTriangleIndex = triangleIndex; closestDistance = distance; closestPrimitive = primitive; closestHitOpaque = hitOpaque; } } } return(closestPrimitive != null ? new Selection(closestPrimitive, closestPrimitiveTriangleIndex, closestHitOpaque) : null); }
private void OnPrimitiveEndTimeChanged(DebugRenderPrimitive primitive) { if (DisablePrimitiveEndTimeSort) { return; } LinkedList <DebugRenderPrimitive> primitiveList = null; lock (primitiveTimeMap) { // Find primitive list for the given StartTime (if not found add it) if (!primitiveTimeMap.TryGetValue(primitive.StartTime, out primitiveList)) { // Primitive not in any list -> Bail out return; } } lock (primitiveList) { // Remove primitive from list primitiveList.Remove(primitive); // Re-add to new position InsertPrimitive(primitiveList, primitive); } }
// Add primitive into 'primitiveTimeMap' and 'primitiveIdMap' search structures // Uses locking for the data structures, each data structure is locked separately to reduce lock time public void AddPrimitive(DebugRenderPrimitive primitive) { LinkedList <DebugRenderPrimitive> primitiveList = null; lock (primitiveTimeMap) { // Find primitive list for the given StartTime (if not found add it) if (!primitiveTimeMap.TryGetValue(primitive.StartTime, out primitiveList)) { primitiveList = new LinkedList <DebugRenderPrimitive>(); primitiveTimeMap.Add(primitive.StartTime, primitiveList); } } InsertPrimitive(primitiveList, primitive); primitive.OnPrimitiveEndTimeChanged += OnPrimitiveEndTimeChanged; lock (primitiveIdMap) { // Add to ID map primitiveIdMap.Add(primitive.Id, primitive); } cacheDirty = true; renderCacheDirty = true; }
private List <DebugRenderPrimitive> GetPrimitives(int currentTime) { List <DebugRenderPrimitive> results = new List <DebugRenderPrimitive>(100); List <LinkedList <DebugRenderPrimitive> > primitiveLists = new List <LinkedList <DebugRenderPrimitive> >(); // Get list of primitiveLists -> Lock primitiveTimeMap only for fetching the information lock (primitiveTimeMap) { foreach (KeyValuePair <int, LinkedList <DebugRenderPrimitive> > keyValue in primitiveTimeMap.Where(kv => kv.Key <= currentTime)) { primitiveLists.Add(keyValue.Value); } } // Iterate through primitiveLists foreach (LinkedList <DebugRenderPrimitive> primitiveList in primitiveLists) { // Lock each list separately to minimize lock time lock (primitiveList) { LinkedListNode <DebugRenderPrimitive> iter = primitiveList.First; while (iter != null) { DebugRenderPrimitive primitive = iter.Value; if (primitive.InfiniteLength || primitive.EndTime > currentTime) { // Valid primitive results.Add(primitive); } else { // Found first primitive where EndTime has passed -> No more valid primitives in this list break; } iter = iter.Next; } } } return(results); }
public PrimitiveSelectionInfo(DebugRenderPrimitive selectedPrimitive, int triangleIndex, bool isSelectedTriangleOpaque) { Primitive = selectedPrimitive; TriangleIndex = triangleIndex; IsSelectedTriangleOpaque = isSelectedTriangleOpaque; }
private void InsertPrimitive(LinkedList <DebugRenderPrimitive> primitiveList, DebugRenderPrimitive primitive) { lock (primitiveList) { // Find node where to insert (EndTime descending) if (primitive.InfiniteLength) { primitiveList.AddFirst(primitive); } else { LinkedListNode <DebugRenderPrimitive> iter = primitiveList.First; while (iter != null && (iter.Value.InfiniteLength || primitive.EndTime < iter.Value.EndTime)) { iter = iter.Next; } if (iter != null) { primitiveList.AddBefore(iter, primitive); } else { primitiveList.AddLast(primitive); } } } }
public Selection(DebugRenderPrimitive primitive, int selectedTriangleIndex, bool selectedTriangleIsOpaque) { Primitive = primitive; SelectedTriangleIndex = selectedTriangleIndex; SelectedTriangleIsOpaque = selectedTriangleIsOpaque; }