Exemple #1
0
        public override void Update(Timer timer)
        {
            SingletonFrameScene frameScene = WorldRef.GetSingletonComponent <SingletonFrameScene>();

            Transform transform;
            Renderer  renderer;

            //TODO: faster ordering optimization

            /*Entity[] entities = GetEntities();
             * entities = entities.OrderBy(a => a.GetComponent<Renderer>().materialInfo.Queue)
             *      .ThenBy(a => a.GetComponent<Renderer>().materialInfo.Name)
             *      .ThenBy(a => a.GetComponent<Renderer>().meshInfo.Name).ToArray();*/

            int  index = 0;
            bool culled;

            foreach (Entity entity in SortedByRendererEntities)
            {
                culled = true;

                transform = entity.GetComponent <Transform>();
                renderer  = entity.GetComponent <Renderer>();

                renderer.Bounds = BoundsBox.TransformAABBFast(renderer.meshInfo.Bounds, transform.TransformMatrix);

                foreach (var camera in frameScene.FrameData.CamerasList)
                {
                    if (camera.Frustrum.Intersects(ref renderer.Bounds.boundingBox))
                    {
                        culled = false;
                        frameScene.FrameData.AddRendererDataToCamera(camera.index, index);
                    }
                }

                foreach (var light in frameScene.FrameData.LightsList)
                {
                    if (!light.IsCastShadows)
                    {
                        continue;
                    }
                    if (light.Frustrum.Intersects(ref renderer.Bounds.boundingBox))
                    {
                        culled = false;
                        frameScene.FrameData.AddRendererDataToLight(light.index, index);
                    }
                }

                if (culled)
                {
                    continue;
                }

                frameScene.FrameData.AddRendererData(new StandardFrameData.RendererData()
                {
                    EntityId = entity.ID,
                    PreviousTransformMatrix = transform.PreviousTransformMatrix,
                    TransformMatrix         = transform.TransformMatrix,
                    MeshName      = renderer.meshInfo.Name,
                    MaterialName  = renderer.materialInfo.Name,
                    MaterialQueue = renderer.materialInfo.Queue,
                    IsDynamic     = renderer.IsDynamic,
                });
                index++;
            }
        }