Exemplo n.º 1
0
        public DebugRenderPrimitive GetPrimitive(long primitive_id)
        {
            DebugRenderPrimitive result = null;

            primitiveIdMap.TryGetValue(primitive_id, out result);
            return(result);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
            }
        }
Exemplo n.º 4
0
        // 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;
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
 public PrimitiveSelectionInfo(DebugRenderPrimitive selectedPrimitive, int triangleIndex, bool isSelectedTriangleOpaque)
 {
     Primitive                = selectedPrimitive;
     TriangleIndex            = triangleIndex;
     IsSelectedTriangleOpaque = isSelectedTriangleOpaque;
 }
Exemplo n.º 7
0
        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);
                    }
                }
            }
        }
Exemplo n.º 8
0
 public Selection(DebugRenderPrimitive primitive, int selectedTriangleIndex, bool selectedTriangleIsOpaque)
 {
     Primitive                = primitive;
     SelectedTriangleIndex    = selectedTriangleIndex;
     SelectedTriangleIsOpaque = selectedTriangleIsOpaque;
 }