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++; } }