Пример #1
0
        public void AddProxy(BaseRenderProxy proxy)
        {
            if (PerformDepthSorting == false)
            {
                proxies.Add(proxy);
                return;
            }

            int insertLoc = GetInsertIndex(proxy);

            proxies.Insert(insertLoc, proxy);
        }
Пример #2
0
        /// <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);
        }
Пример #3
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();
        }