public void AddProxy(BaseRenderProxy proxy) { if (PerformDepthSorting == false) { proxies.Add(proxy); return; } int insertLoc = GetInsertIndex(proxy); proxies.Insert(insertLoc, proxy); }
/// <summary> /// Returns the index in the proxies List for sorted inserting based /// on distance. /// /// Note: Assumes a sorted list. /// </summary> private int GetInsertIndex(BaseRenderProxy proxy) { float distanceSqr = Vector3.DistanceSquared(proxy.WorldMatrix.Translation, WorldOriginForDepthSorting); for (int i = 0; i < proxies.Count; i++) { float distance2Sqr = Vector3.DistanceSquared(proxies[i].WorldMatrix.Translation, WorldOriginForDepthSorting); if (distanceSqr > distance2Sqr) { return(i); } } return(0); }
/// <summary> /// Must only be called from inside ApplyPreFrame() or otherwise secured with /// lock (lockObj). /// </summary> private void ApplyRenderProxyStagingArea() { // Apply stage to current process Dictionary<IMaterial, RenderPass> renderPassDict = new Dictionary<IMaterial, RenderPass>(); for (int p = 0; p < renderProxyStagingArea.Count; p++) { BaseRenderProxy proxy = renderProxyStagingArea[p]; IMaterial materialToUse = proxy.Material; if (proxy.Material == null) { materialToUse = AlkaronCoreGame.Core.AssetManager.Load<Material>( "EngineMaterials.BasicEffect.material"); } RenderPass passToUse = null; if (renderPassDict.ContainsKey(materialToUse) == false) { passToUse = CreateAndAddRenderPassForMaterial(materialToUse); renderPassDict.Add(materialToUse, passToUse); } else { passToUse = renderPassDict[materialToUse]; } passToUse.WorldOriginForDepthSorting = ViewTarget?.CameraLocation ?? Vector3.Zero; passToUse.AddProxy(proxy); } renderProxyStagingArea.Clear(); }