public SceneRenderer(IApplicationWindow window, IContentContainer content, ISceneAsset scene = null)
 {
     _content = content;
     _scene   = scene ?? _content.Scenes.First();
     Window   = window;
     Window.GraphicsDeviceCreated   += OnGraphicsDeviceCreated;
     Window.GraphicsDeviceDestroyed += OnGraphicsDeviceDestroyed;
     Window.Rendering += PreDraw;
     Window.Rendering += Draw;
 }
        public virtual IEnumerable <ISceneAsset> Apply(ISceneAsset scene)
        {
            var transformedScene = new SceneAsset(scene.Id);

            foreach (var node in scene.ChildNodes)
            {
                NodeAsset parent = null;
                foreach (var transformedNode in Apply(null, node))
                {
                    transformedScene.Add(transformedNode);
                    parent = transformedNode;
                }

                if (parent != null)
                {
                    foreach (var childNode in node.ChildNodes)
                    {
                        ApplyOnSubtree(parent, childNode);
                    }
                }
            }

            yield return(transformedScene);
        }
        public static IContentContainer ToContentContainer(this ISceneAsset scene)
        {
            var content = new ContentContainer();

            content.Scenes.Add(scene);
            var visitedCameras   = new HashSet <ICameraAsset>();
            var visitedLights    = new HashSet <ILightAsset>();
            var visitedMeshes    = new HashSet <IMesh>();
            var visitedMaterials = new HashSet <IMaterialAsset>();
            var visitedImages    = new HashSet <IImageAsset>();

            foreach (var nodeAsset in scene.EnumerateNodesBreadthFirst())
            {
                content.Nodes.Add(nodeAsset);
                if (nodeAsset.Camera != null)
                {
                    if (visitedCameras.Add(nodeAsset.Camera))
                    {
                        content.Cameras.Add(nodeAsset.Camera);
                    }
                }
                if (nodeAsset.Light != null)
                {
                    if (visitedLights.Add(nodeAsset.Light))
                    {
                        content.Lights.Add(nodeAsset.Light);
                    }
                }
                if (nodeAsset.Mesh != null)
                {
                    if (nodeAsset.Mesh.Mesh != null)
                    {
                        if (visitedMeshes.Add(nodeAsset.Mesh.Mesh))
                        {
                            content.Meshes.Add(nodeAsset.Mesh.Mesh);
                        }
                    }

                    if (nodeAsset.Mesh.Materials != null)
                    {
                        foreach (var materialAsset in nodeAsset.Mesh.Materials)
                        {
                            if (visitedMaterials.Add(materialAsset))
                            {
                                content.Materials.Add(materialAsset);
                                if (materialAsset.Shader != null)
                                {
                                    foreach (var parameter in materialAsset.Shader.Parameters)
                                    {
                                        if (parameter.ValueType == typeof(SamplerParameters))
                                        {
                                            var samper = parameter as IShaderParameter <SamplerParameters>;
                                            if (samper?.Value.Image != null)
                                            {
                                                if (visitedImages.Add(samper.Value.Image))
                                                {
                                                    content.Images.Add(samper.Value.Image);
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            return(content);
        }