protected override void SetupScene()
        {
            Board = new MarbleBoard
            {
                OnMatch      = OnMatch,
                OnNewMarbles = OnNewMarbles,
            };

            //RenderContext.WorldPositionMatrix = Matrix4.CreateScale(1, -1, 1);
            //RenderContext.PrimaryRenderPipeline = RenderContext.GetPipeline<ForwardRenderPipeline>();
            DefaultKeyBindings = false;

            SceneContext.AddActor(BoardActor = new Actor(BoardComponent = new SceneComponent()
            {
                //RelativeRotation = new Vector3(0, 0, 0.02f).ToQuaternion(),
                RelativeTranslation = new Vector3(0, 0, 0.05f),
            }));

            BoardComponent.AddComponent(NextMarbleComponent = new SceneComponent()
            {
                RelativeTranslation = new Vector3(10, -3, 0),
                RelativeScale       = new Vector3(0.5f),
            });

            BoardComponent.AddComponent(NextMarbleBoardComponent = new SceneComponent()
            {
                RelativeTranslation = new Vector3(0, 0, -0.2f),
                // RelativeScale = new Vector3(0.5f),
                // TranslationMatrix = Matrix4.CreateScale(2),
                // IsAbsoluteRotation = true,
                // IsAbsoluteScale = true,
                // IsAbsoluteTranslation = true,
            });

            var camSize = new Vector2(9 * RenderContext.ScreenAspectRatio, 9);

            RenderContext.Camera = new OrthographicCamera(new Vector3(4.5f + ((camSize.X - camSize.Y) / 2f) - 0.5f, -4.5f + 0.5f, 25))
            {
                Size      = camSize,
                NearPlane = 1f,
                FarPlane  = 100.0f,
                Facing    = (float)Math.PI / 2,
                Pitch     = -((float)(Math.PI / 2) - 0.00001f),
            };

            SceneContext.AddActor(new Actor(new CubeComponent()
            {
                Name     = "Ground",
                Material = new Material
                {
                    Color     = new Vector4(0.4f, 0.6f, 0.6f, 1),
                    Shininess = 1.0f,
                },
                RelativeScale       = new Vector3(50, 50, 1),
                RelativeTranslation = new Vector3(0f, 0f, -0.5f),
            }));

            BoardComponent.AddComponent(new CubeComponent()
            {
                Name     = "Board",
                Material = new Material
                {
                    Color     = new Vector4(0.4f, 0.6f, 0.6f, 1) * 1.1f,
                    Shininess = 1.0f,
                },
                RelativeScale       = new Vector3(Board.Width, Board.Height, 1),
                RelativeTranslation = new Vector3((Board.Width / 2f) - 0.5f, (Board.Height / 2f) - 0.5f, -0.5f),
                TranslationMatrix   = BoardTranslationMatrix,
            });

            BoardComponent.AddComponent(new GridPlaneComponent(9, false)
            {
                Name = "Grid",
                RelativeTranslation = new Vector3(-0.5f, -0.5f + 9, 0.01f),
                TranslationMatrix   = BoardTranslationMatrix,
            });
            SceneContext.AddActor(new Actor(new CrossLineComponent(10, true)
            {
                Name = "CenterCross",
                RelativeTranslation = new Vector3(0f, 0f, 0.02f),
                RelativeScale       = new Vector3(1.0f),
            }));

            var alchemyCircleOptions = new Generators.AlchemyCircle.AlchemyCircleOptions
            {
                Seed      = 1919654508,
                Size      = 256,
                Thickness = 4,
            };
            var decalMaterial = new Material()
            {
                DiffuseTexture   = Texture.CreateFromFile(AssetManager.GetAssetsPath("Textures/AlchemyCircle/.png", alchemyCircleOptions)),
                Color            = new Vector4(57f / 255f, 1, 20f / 255f, 1),
                Ambient          = 0.3f,
                Shininess        = 32.0f,
                SpecularStrength = 0.5f,
                CastShadow       = false,
                PipelineType     = PipelineType.Forward,
                UseTransparency  = true,
            };

            BoardComponent.AddComponent(new QuadComponent()
            {
                Material            = decalMaterial,
                Name                = "GroundCursor",
                RelativeTranslation = new Vector3(0, 1, 0.051f),
                RelativeScale       = new Vector3(2f, 2f, 0.1f),
                DrawPriority        = 101,
            });

            BoardComponent.AddComponent(new QuadComponent()
            {
                Name              = "MarbleSelector",
                Material          = decalMaterial,
                TranslationMatrix = BoardTranslationMatrix,
                //Material = material,
                RelativeTranslation = new Vector3(0, 1, 0.05f),
                RelativeScale       = new Vector3(2f, 2f, 0.1f),
                Visible             = false,
                DrawPriority        = 100,
            });

            SceneContext.AddActor(new Actor(new PointLightComponent()
            {
                RelativeTranslation = new Vector3(0, 2, 3.5f),
                Name = "MovingLight",
                //Enabled = false,
            }));

            SceneContext.AddActor(new Actor(new PointLightComponent()
            {
                RelativeTranslation = new Vector3(2f, 0.5f, 4.25f),
                Name = "StaticLight",
            }));

            var flowContainer = new UIFlowContainer()
            {
                Name = "UI",
                DefaultChildSizes = new Vector2(0, 50),
                ExtraChildMargin  = new UIAnchors(10, 10, 10, 0),
                Location          = new Vector2(1000, 0),
                Size = new Vector2(200, 0),
            };

            SceneContext.AddActor(new Actor(flowContainer));

            // flowContainer.AddComponent(new UIMarbles()
            // {
            //     Name = "UI",
            // });

            flowContainer.AddComponent(new UILabelComponent()
            {
                Name  = "LastScore",
                Color = Color.White,
            });
            flowContainer.AddComponent(new UILabelComponent()
            {
                Name  = "TotalScore",
                Color = Color.White,
            });

            SceneContext.AddActor(new Actor(new StatsComponent()
            {
                Name = "Stats",
            }));

            UIButton bt;

            flowContainer.AddComponent(bt = new UIButton()
            {
                Name           = "Exit",
                Text           = "Exit",
                Color          = Color.White,
                BackColor      = new Color(new Rgba32(0, 0, 0, 0.5f)),
                BackColorHover = new Color(new Rgba32(0, 0, 0, 0.8f)),
                BorderColor    = new Color(new Rgba32(0, 0, 0, 0.8f)),
                // Location = new Vector2(620, 200),
                // Size = new Vector2(100, 100),
            });
            bt.Click += (e) =>
            {
                Stop();
            };

            SelectorTween = new Tween1
            {
                Duration  = TimeSpan.FromSeconds(10),
                ScaleFunc = ScaleFuncs.Linear(MathF.PI * 2),
                Repeat    = true,
            };
            SelectorTween.Start();

            RemoveTween = new Tween1
            {
                Duration  = TimeSpan.FromSeconds(0.75),
                ScaleFunc = ScaleFuncs.LinearReverse(MarbleScale),
            };
            RemoveTween.TweenComplete += OnAnimFinshed_MarbleRemoved;

            CreateTween = new Tween1
            {
                Duration  = TimeSpan.FromSeconds(0.75),
                ScaleFunc = ScaleFuncs.Linear(MarbleScale),
            };
            CreateTween.TweenComplete += OnAnimationFinished_MarbleCreated;

            MoveTween = new Tween1()
            {
                ScaleFunc = ScaleFuncs.Power10EaseInOut,
            };
            MoveTween.TweenComplete += OnAnimFinished_MarbleMoved;
        }
        protected override void SetupScene()
        {
            // GameMaterial material = new GameMaterial
            // {
            //     DiffuseTexture = GameTexture.GetFromFile("Textures/woodenbox.png"),
            //     SpecularTexture = GameTexture.GetFromFile("Textures/woodenbox_specular.png"),
            //     Ambient = 0.2f,
            //     Shininess = 32f,
            //     PipelineType = PipelineType.Forward,
            //     CastShadow = true,
            // };

            // GameContext.AddActor(new Actor(new DebugCubeComponent()
            // {
            //     Name = "Box1",
            //     Transform = new Transform
            //     {
            //         Scale = new Vector3(1),
            //         Rotation = new Vector3(0, 0, 0.5f).ToQuaternion(),
            //         Translation = new Vector3(0f, 0, 0.5f),
            //     },
            //     Material = material,
            // }));

            // GameMaterial material2 = new GameMaterial
            // {
            //     DiffuseTexture = GameTexture.GetFromFile("Textures/woodenbox.png"),
            //     SpecularTexture = GameTexture.GetFromFile("Textures/woodenbox_specular.png"),
            //     Shininess = 32f,
            //     Ambient = 0.2f,
            //     PipelineType = PipelineType.Deferred,
            //     CastShadow = true,
            // };

            // GameContext.AddActor(new Actor(new DebugCubeComponent()
            // {
            //     Name = "Box2",
            //     Transform = new Transform
            //     {
            //         Scale = new Vector3(1),
            //         Rotation = new Vector3(0, 0, 0.5f).ToQuaternion(),
            //         Translation = new Vector3(1.0f, 0, 0.5f),
            //     },
            //     Material = material2,
            // }));

            // GameContext.AddActor(new Actor(new PointLightComponent()
            // {
            //     RelativeTranslation = new Vector3(-0.2f, -2.1f, 1.85f),
            //     Name = "StaticLight",
            // }));

            // GameContext.AddActor(new Actor(new CubeComponent()
            // {
            //     Name = "Ground",
            //     RelativeScale = new Vector3(50, 50, 1),
            //     RelativeTranslation = new Vector3(0f, 0f, -0.5f),
            //     Material = material,
            // }));

            // return;
            //---

            //RenderContext.PrimaryRenderPipeline = RenderContext.GetPipeline<ForwardRenderPipeline>();

            var materialWood1 = new Material()
            {
                DiffuseTexture   = Texture.GetFromFile("Textures/woodenbox.png"),
                SpecularTexture  = Texture.GetFromFile("Textures/woodenbox_specular.png"),
                Ambient          = 0.3f,
                Shininess        = 32.0f,
                SpecularStrength = 0.5f,
                CastShadow       = true,
            };

            var materialWood2 = new Material()
            {
                DiffuseTexture   = Texture.GetFromFile("Textures/wood.png"),
                SpecularTexture  = Texture.GetFromFile("Textures/woodenbox_specular.png"),
                Ambient          = 0.3f,
                Shininess        = 32.0f,
                SpecularStrength = 0.5f,
                CastShadow       = true,
            };

            SceneContext.AddActor(new Actor(new SphereComponent()
            {
                Name = "CompSphere",
                RelativeTranslation = new Vector3(-3, 0, 0),
                RelativeScale       = new Vector3(1.5f),
                Material            = materialWood2,
            }));

            SceneContext.AddActor(new Actor(new CubeComponent()
            {
                Name                = "Ground",
                RelativeScale       = new Vector3(50, 50, 1),
                RelativeTranslation = new Vector3(0f, 0f, -0.5f),
                Material            = materialWood1,
            }));

            SceneContext.AddActor(new Actor(new GridPlaneComponent(10, true)
            {
                Name = "GridPlaneXY",
                RelativeTranslation = new Vector3(0f, 0f, 0.01f),
            }));
            SceneContext.AddActor(new Actor(new GridPlaneComponent(10, true)
            {
                Name = "GridPlaneYZ",
                RelativeTranslation = new Vector3(-10f, 0f, 0.01f),
                RelativeRotation    = new Vector3(0, 0.25f, 0).ToQuaternion(),
            }));
            SceneContext.AddActor(new Actor(new GridPlaneComponent(10, true)
            {
                Name = "GridPlaneXZ",
                RelativeTranslation = new Vector3(0f, 10f, 0.01f),
                RelativeRotation    = new Vector3(0.25f, 0, 0).ToQuaternion(),
            }));
            SceneContext.AddActor(new Actor(new CrossLineComponent(10, true)
            {
                Name = "CenterCross",
                RelativeTranslation = new Vector3(0f, 0f, 0.02f),
                RelativeScale       = new Vector3(2.0f),
            }));
            // GameContext.AddActor(new Actor(new UIImage("Textures/wood.png")
            // {
            //     Name = "UI-Image-Alone",
            //     RectanglePixels = new RectangleF(0, 0, 30f, 30f),
            // }));

            // -- UI

            var flowContainer = new UIFlowContainer()
            {
                DefaultChildSizes = new Vector2(0, 50),
                ExtraChildMargin  = new UIAnchors(10, 10, 10, 0),
            };

            SceneContext.AddActor(new Actor(flowContainer));

            //flowContainer.AddComponent(new UIImage("Textures/woodenbox_specular.png")
            //{
            //    Name = "ScreenTexture1.1",
            //    //Size = new Vector2(100, 100),
            //    //Margin = new UIAnchors(20, 20, 20, 20),
            //});

            //flowContainer.AddComponent(new UIImage("Textures/woodenbox_specular.png")
            //{
            //    Name = "ScreenTexture1.1",
            //    //Size = new Vector2(100, 100),
            //    //Margin = new UIAnchors(20, 20, 20, 20),
            //});

            //flowContainer.AddComponent(new UIButton()
            //{
            //    Name = "bt1",
            //    //Size = new Vector2(100, 100),
            //    //Margin = new UIAnchors(20, 20, 20, 20),
            //});

            flowContainer.AddComponent(new UISlider()
            {
                Name     = "bt1",
                MinValue = 20,
                MaxValue = 40,
                Value    = 25,
                //Size = new Vector2(100, 100),
                //Margin = new UIAnchors(20, 20, 20, 20),
            });

            // --

            SceneContext.AddActor(new Actor(new StatsComponent()
            {
                Name        = "Stats",
                CustomOrder = 10,
            }));

            SceneContext.AddActor(new Actor(new LineComponent(new Vector3(0, 0, 0), new Vector3(2, 2, 2))
            {
                Name = "DebugLine",
            }));

            SceneContext.AddActor(new Actor(new DirectionalLightComponent()
            {
                RelativeTranslation = new Vector3(0, 2, 2.5f),
                Name = "MovingLight",
            }));
            SceneContext.AddActor(new Actor(new DirectionalLightComponent()
            {
                RelativeTranslation = new Vector3(2f, 0.5f, 3.25f),
                Name = "StaticLight",
            }));

            SceneContext.AddActor(new Actor(new CubeComponent()
            {
                Name = "GroundCursor",
                RelativeTranslation = new Vector3(0, 1, 0.05f),
                RelativeScale       = new Vector3(1.0f, 1.0f, 0.1f),
                Material            = materialWood1,
            }));

            SceneContext.AddActor(new Actor(new DebugCubeComponent()
            {
                Name                = "Box1",
                RelativeRotation    = new Vector3(0, 0, 0.5f).ToQuaternion(),
                RelativeScale       = new Vector3(1),
                RelativeTranslation = new Vector3(0, 0, 0.5f),
                Material            = materialWood1,
            }));

            SceneContext.AddActor(new Actor(new CubeComponent()
            {
                Name                = "Box2",
                RelativeScale       = new Vector3(1),
                RelativeTranslation = new Vector3(1.5f, 1.5f, 0.5f),
                Material            = materialWood1,
            }));

            SceneContext.AddActor(new Actor(new SphereComponent()
            {
                Name = "Sphere1",
                RelativeTranslation = new Vector3(3f, 3f, 0.5f),
                Material            = materialWood1,
            }));
            SceneContext.AddActor(new Actor(new CubeComponent()
            {
                Name                = "Box4",
                RelativeScale       = new Vector3(1),
                RelativeTranslation = new Vector3(4f, 3f, 0.5f),
                Material            = materialWood1,
            }));

            SceneContext.AddActor(new Actor(
                                      new SceneComponent(
                                          new CubeComponent
            {
                RelativeTranslation = new Vector3(-1, 0, 0),
                Material            = materialWood1,
            },
                                          new SphereComponent
            {
                RelativeTranslation = new Vector3(1f, 0, 0),
                Material            = materialWood1,
            })
            {
                Name = "CompGroup1",
                RelativeTranslation = new Vector3(0, 18, 1f),
                RelativeRotation    = new Quaternion(0, 0, MathF.PI / 4),
                RelativeScale       = new Vector3(2f),
            })
            {
                Name = "GroupActor1",
            });

            SceneContext.AddActor(new Actor(new DebugCubeComponent()
            {
                Name                = "BoxFar1",
                RelativeScale       = new Vector3(1),
                RelativeTranslation = new Vector3(18, 0, 0.5f),
                Material            = materialWood1,
            }));
            SceneContext.AddActor(new Actor(new DebugCubeComponent()
            {
                Name                = "BoxFar2",
                RelativeScale       = new Vector3(1),
                RelativeTranslation = new Vector3(16, 1, 0.5f),
                Material            = materialWood1,
                // Enabled = false,
            }));

            // For performance reasons, skybox should rendered as last
            SceneContext.AddActor(new Actor(new SkyBoxComponent()
            {
                Name = "Sky",
            }));

            var materialWoodRemoveTest = new Material()
            {
                DiffuseTexture   = Texture.GetFromFile("Textures/woodenbox.png"),
                SpecularTexture  = Texture.GetFromFile("Textures/woodenbox_specular.png"),
                Ambient          = 0.3f,
                Shininess        = 32.0f,
                SpecularStrength = 0.5f,
                CastShadow       = true,
            };

            SceneContext.AddActor(new Actor(new DebugCubeComponent()
            {
                Name                = "RemoveTets",
                RelativeScale       = new Vector3(1),
                RelativeTranslation = new Vector3(18, 0, 0.5f),
                Material            = materialWoodRemoveTest,
            }));
            SceneContext.AddActor(new Actor(new DebugCubeComponent()
            {
                Name                = "RemoveTets",
                RelativeScale       = new Vector3(1),
                RelativeTranslation = new Vector3(18, 0, 0.5f),
                Material            = materialWoodRemoveTest,
            }));

            LightTween = new Tween2
            {
                LerpFunc = Tween2.Circle(),
                Duration = TimeSpan.FromSeconds(8),
                Repeat   = true,
                Enabled  = true,
            };
            BoxTween = new Tween1
            {
                ScaleFunc = ScaleFuncs.Linear(AxMath.Norm2Rad),
                Duration  = TimeSpan.FromSeconds(6),
                Repeat    = true,
                Enabled   = true,
            };
        }