public bool Remove(Visual visual) { bool found = false; if (OpaqueVisuals.TryGetValue(visual.Material, out List <Visual> list)) { found = list.Remove(visual); } if (!found) { found = TransparentVisuals.Remove(visual); } return(found); }
public void Draw() { Batch.SetWorldToDevice(Camera.WorldToDevice); foreach (var visualList in OpaqueVisuals.Values) { if (visualList.Count != 0) { visualList.Sort((x, y) => Comparer <float> .Default.Compare(x.ZCoord, y.ZCoord)); Batch.Begin(visualList.First().Material); foreach (Visual visual in visualList) { if (IntersectRects(visual.WorldBoundingRect, Camera.WorldBoundingRect)) { Batch.AddGeom(visual, visual.Material, visual.Transform, visual.UseTransform); } } Batch.End(); } } TransparentVisuals.Sort((x, y) => - Comparer <float> .Default.Compare(x.ZCoord, y.ZCoord)); Material currentMaterial = TransparentVisuals.FirstOrDefault()?.Material; if (currentMaterial != null) { Batch.Begin(currentMaterial); foreach (Visual visual in TransparentVisuals) { if (IntersectRects(visual.WorldBoundingRect, Camera.WorldBoundingRect)) { if (!visual.Material.CanBatchWith(currentMaterial)) { Batch.End(); currentMaterial = visual.Material; Batch.Begin(visual.Material); } Batch.AddGeom(visual, visual.Material, visual.Transform, visual.UseTransform); } } Batch.End(); } Batch.DrawDebugLines(); }
public void Add(Visual visual) { if (visual.Color.A > 0.1f && visual.Color.A < 0.99f) { TransparentVisuals.Add(visual); } else if (OpaqueVisuals.TryGetValue(visual.Material, out List <Visual> list)) { list.Add(visual); } else { OpaqueVisuals.Add(visual.Material, new List <Visual> { visual }); } }