Example #1
0
        protected internal virtual void OnGetSizeAndIntensity(LensFlareNode node, RenderContext context, int visiblePixels, int totalPixels, out float size, out float intensity)
        {
            // Constant size.
            size = Size;

            intensity = node.Intensity * Intensity;

            // Intensity depends on the number of visible (unoccluded) pixels.
            if (context.GraphicsService.GraphicsDevice.GraphicsProfile == GraphicsProfile.HiDef)
            {
                intensity *= (float)visiblePixels / totalPixels;
            }

            // Fog decreases the intensity.
            var scene      = context.Scene;
            var cameraNode = context.CameraNode;

            if (scene != null && cameraNode != null)
            {
                var query = scene.Query <FogQuery>(cameraNode, context);
                foreach (var fogNode in query.FogNodes)
                {
                    var flarePosition = IsDirectional // For directional flares, choose a position "far" away ;-)
                              ? cameraNode.PoseWorld.Position + node.PoseWorld.Orientation.GetColumn(2) * cameraNode.Camera.Projection.Far
                              : node.PoseWorld.Position;
                    intensity *= (1 - fogNode.Fog.GetIntensity(fogNode, cameraNode, flarePosition));
                }
            }
        }
Example #2
0
        // OnLoad() is called when the GameObject is added to the IGameObjectService.
        protected override void OnLoad()
        {
            var content = _services.GetInstance <ContentManager>();

            _skyboxNode = new SkyboxNode(content.Load <TextureCube>("Sky2"))
            {
                Color = new Vector3F(SkyExposure),
            };

            // The ambient light.
            var ambientLight = new AmbientLight
            {
                Color     = new Vector3F(0.9f, 0.9f, 1f),
                HdrScale  = 0.1f,
                Intensity = 0.5f,
                HemisphericAttenuation = 0.8f,
            };

            _ambientLightNode = new LightNode(ambientLight)
            {
                Name = "Ambient",
            };

            // The main directional light.
            var sunlight = new DirectionalLight
            {
                Color             = new Vector3F(1, 0.9607844f, 0.9078432f),
                HdrScale          = 0.4f,
                DiffuseIntensity  = 1,
                SpecularIntensity = 1,
            };

            _sunlightNode = new LightNode(sunlight)
            {
                Name      = "Sunlight",
                Priority  = 10, // This is the most important light.
                PoseWorld = new Pose(QuaternionF.CreateRotationY(-1.4f) * QuaternionF.CreateRotationX(-0.6f)),

                // This light uses Cascaded Shadow Mapping.
                Shadow = new CascadedShadow
                {
#if XBOX
                    PreferredSize = 512,
#else
                    PreferredSize = 1024,
#endif
                    Prefer16Bit = true,
                }
            };

            // Add a lens flare for the key light.
            var lensFlare = new LensFlare(true)
            {
                QuerySize = 0.2f, Size = 0.2f, Name = "Sun Flare"
            };
            var lensFlareTexture = content.Load <Texture2D>("LensFlare/LensFlares");
            var circleTexture    = new PackedTexture("Circle", lensFlareTexture, new Vector2F(0, 0), new Vector2F(0.25f, 0.5f));
            var glowTexture      = new PackedTexture("Glow", lensFlareTexture, new Vector2F(0.25f, 0), new Vector2F(0.25f, 0.5f));
            var ringTexture      = new PackedTexture("Ring", lensFlareTexture, new Vector2F(0.5f, 0), new Vector2F(0.25f, 0.5f));
            var haloTexture      = new PackedTexture("Halo", lensFlareTexture, new Vector2F(0.75f, 0), new Vector2F(0.25f, 0.5f));
            var sunTexture       = new PackedTexture("Sun", lensFlareTexture, new Vector2F(0, 0.5f), new Vector2F(0.25f, 0.5f));
            var streaksTexture   = new PackedTexture("Streaks", lensFlareTexture, new Vector2F(0.25f, 0.5f), new Vector2F(0.25f, 0.5f));
            var flareTexture     = new PackedTexture("Flare", lensFlareTexture, new Vector2F(0.5f, 0.5f), new Vector2F(0.25f, 0.5f));
            lensFlare.Elements.Add(new LensFlareElement(-0.2f, 0.55f, 0.0f, new Color(175, 175, 255, 20), new Vector2F(0.5f, 0.5f), circleTexture));
            lensFlare.Elements.Add(new LensFlareElement(0.0f, 0.9f, 0.0f, new Color(255, 255, 255, 255), new Vector2F(0.5f, 0.5f), sunTexture));
            lensFlare.Elements.Add(new LensFlareElement(0.0f, 1.8f, 0.0f, new Color(255, 255, 255, 128), new Vector2F(0.5f, 0.5f), streaksTexture));
            lensFlare.Elements.Add(new LensFlareElement(0.0f, 2.6f, 0.0f, new Color(255, 255, 200, 64), new Vector2F(0.5f, 0.5f), glowTexture));
            lensFlare.Elements.Add(new LensFlareElement(0.5f, 0.12f, 0.0f, new Color(60, 60, 180, 35), new Vector2F(0.5f, 0.5f), circleTexture));
            lensFlare.Elements.Add(new LensFlareElement(0.55f, 0.46f, 0.0f, new Color(100, 100, 200, 60), new Vector2F(0.5f, 0.5f), circleTexture));
            lensFlare.Elements.Add(new LensFlareElement(0.6f, 0.17f, 0.0f, new Color(120, 120, 220, 40), new Vector2F(0.5f, 0.5f), circleTexture));
            lensFlare.Elements.Add(new LensFlareElement(0.85f, 0.2f, 0.0f, new Color(60, 60, 255, 100), new Vector2F(0.5f, 0.5f), ringTexture));
            lensFlare.Elements.Add(new LensFlareElement(1.5f, 0.2f, 0.0f, new Color(255, 60, 60, 130), new Vector2F(0.5f, 0.5f), flareTexture));
            lensFlare.Elements.Add(new LensFlareElement(0.15f, 0.15f, 0.0f, new Color(255, 60, 60, 90), new Vector2F(0.5f, 0.5f), flareTexture));
            lensFlare.Elements.Add(new LensFlareElement(1.3f, 0.6f, 0.0f, new Color(60, 60, 255, 180), new Vector2F(0.5f, 0.5f), haloTexture));
            lensFlare.Elements.Add(new LensFlareElement(1.4f, 0.2f, 0.0f, new Color(220, 80, 80, 98), new Vector2F(0.5f, 0.5f), haloTexture));
            lensFlare.Elements.Add(new LensFlareElement(1.5f, 0.1f, 0.0f, new Color(220, 80, 80, 85), new Vector2F(0.5f, 0.5f), circleTexture));
            lensFlare.Elements.Add(new LensFlareElement(1.6f, 0.5f, 0.0f, new Color(60, 60, 255, 80), new Vector2F(0.5f, 0.5f), haloTexture));
            lensFlare.Elements.Add(new LensFlareElement(1.8f, 0.3f, 0.0f, new Color(90, 60, 255, 110), new Vector2F(0.5f, 0.5f), ringTexture));
            lensFlare.Elements.Add(new LensFlareElement(1.95f, 0.5f, 0.0f, new Color(60, 60, 255, 120), new Vector2F(0.5f, 0.5f), haloTexture));
            lensFlare.Elements.Add(new LensFlareElement(2.0f, 0.15f, 0.0f, new Color(60, 60, 255, 85), new Vector2F(0.5f, 0.5f), circleTexture));

            // Add lens flare as a child of the sunlight.
            var lensFlareNode = new LensFlareNode(lensFlare);
            _sunlightNode.Children = new SceneNodeCollection();
            _sunlightNode.Children.Add(lensFlareNode);

            // Add scene nodes to scene graph.
            var scene = _services.GetInstance <IScene>();
            scene.Children.Add(_skyboxNode);
            scene.Children.Add(_ambientLightNode);
            scene.Children.Add(_sunlightNode);
        }
        private readonly LensFlareRenderer _lensFlareRenderer; // Handles LensFlareNodes.


        public LensFlareSample(Microsoft.Xna.Framework.Game game)
            : base(game)
        {
            SampleFramework.IsMouseVisible = false;
            var delegateGraphicsScreen = new DelegateGraphicsScreen(GraphicsService)
            {
                RenderCallback = Render,
            };

            GraphicsService.Screens.Insert(0, delegateGraphicsScreen);

            // Add a custom game object which controls the camera.
            _cameraObject = new CameraObject(Services);
            GameObjectService.Objects.Add(_cameraObject);

            // Create a new empty scene.
            _scene = new Scene();

            // Add the camera node to the scene.
            _scene.Children.Add(_cameraObject.CameraNode);

            // Add a few models to the scene.
            var ground = ContentManager.Load <ModelNode>("Ground/Ground").Clone();

            _scene.Children.Add(ground);

            var box = ContentManager.Load <ModelNode>("MetalGrateBox/MetalGrateBox").Clone();

            box.PoseLocal = new Pose(new Vector3(0.5f, 0.5f, 0.5f), Matrix.CreateRotationY(0.1f));
            _scene.Children.Add(box);

            // Add some lights to the scene which have the same properties as the lights
            // of BasicEffect.EnableDefaultLighting().
            SceneSample.InitializeDefaultXnaLights(_scene);

            // Add a lens flare for the sun light.
            var lensFlare = new LensFlare(true); // The sun is a directional light source.

            lensFlare.Name = "Sun Flare";

            // The Size determines the screen size of the lens flare elements. The value
            // is relative to the viewport height.
            lensFlare.Size = 0.28f; // 0.28 * viewport height

            // The QuerySize of a directional light is the estimated size relative to the
            // viewport. This value is used in the hardware occlusion query, which determines
            // whether the lens flare is visible.
            lensFlare.QuerySize = 0.18f; // 0.18 * viewport height

            // All lens flare elements are packed into one texture ("texture atlas").
            // The PackedTexture identifies an element within the texture atlas.
            // See file Media/LensFlare/LensFlares.png.
            // (Credits: The sun lens flare was copied from the XNA racing game - http://exdream.com/XnaRacingGame/.)
            var lensFlareTexture = ContentManager.Load <Texture2D>("LensFlare/LensFlares");
            var circleTexture    = new PackedTexture("Circle", lensFlareTexture, new Vector2F(0, 0), new Vector2F(0.25f, 0.5f));
            var glowTexture      = new PackedTexture("Glow", lensFlareTexture, new Vector2F(0.25f, 0), new Vector2F(0.25f, 0.5f));
            var ringTexture      = new PackedTexture("Ring", lensFlareTexture, new Vector2F(0.5f, 0), new Vector2F(0.25f, 0.5f));
            var haloTexture      = new PackedTexture("Halo", lensFlareTexture, new Vector2F(0.75f, 0), new Vector2F(0.25f, 0.5f));
            var sunTexture       = new PackedTexture("Sun", lensFlareTexture, new Vector2F(0, 0.5f), new Vector2F(0.25f, 0.5f));
            var streaksTexture   = new PackedTexture("Streaks", lensFlareTexture, new Vector2F(0.25f, 0.5f), new Vector2F(0.25f, 0.5f));
            var flareTexture     = new PackedTexture("Flare", lensFlareTexture, new Vector2F(0.5f, 0.5f), new Vector2F(0.25f, 0.5f));

            // Add a few elements (circles, glow, rings, halos, streaks, ...) to the lens flare.
            lensFlare.Elements.Add(new LensFlareElement(-0.2f, 0.55f, 0.0f, new Color(175, 175, 255, 20), new Vector2F(0.5f, 0.5f), circleTexture));
            lensFlare.Elements.Add(new LensFlareElement(0.0f, 0.9f, 0.0f, new Color(255, 255, 255, 255), new Vector2F(0.5f, 0.5f), sunTexture));
            lensFlare.Elements.Add(new LensFlareElement(0.0f, 1.8f, 0.0f, new Color(255, 255, 255, 128), new Vector2F(0.5f, 0.5f), streaksTexture));
            lensFlare.Elements.Add(new LensFlareElement(0.0f, 2.6f, 0.0f, new Color(255, 255, 200, 64), new Vector2F(0.5f, 0.5f), glowTexture));
            lensFlare.Elements.Add(new LensFlareElement(0.5f, 0.12f, 0.0f, new Color(60, 60, 180, 35), new Vector2F(0.5f, 0.5f), circleTexture));
            lensFlare.Elements.Add(new LensFlareElement(0.55f, 0.46f, 0.0f, new Color(100, 100, 200, 60), new Vector2F(0.5f, 0.5f), circleTexture));
            lensFlare.Elements.Add(new LensFlareElement(0.6f, 0.17f, 0.0f, new Color(120, 120, 220, 40), new Vector2F(0.5f, 0.5f), circleTexture));
            lensFlare.Elements.Add(new LensFlareElement(0.85f, 0.2f, 0.0f, new Color(60, 60, 255, 100), new Vector2F(0.5f, 0.5f), ringTexture));
            lensFlare.Elements.Add(new LensFlareElement(1.5f, 0.2f, 0.0f, new Color(255, 60, 60, 130), new Vector2F(0.5f, 0.5f), flareTexture));
            lensFlare.Elements.Add(new LensFlareElement(0.15f, 0.15f, 0.0f, new Color(255, 60, 60, 90), new Vector2F(0.5f, 0.5f), flareTexture));
            lensFlare.Elements.Add(new LensFlareElement(1.3f, 0.6f, 0.0f, new Color(60, 60, 255, 180), new Vector2F(0.5f, 0.5f), haloTexture));
            lensFlare.Elements.Add(new LensFlareElement(1.4f, 0.2f, 0.0f, new Color(220, 80, 80, 98), new Vector2F(0.5f, 0.5f), haloTexture));
            lensFlare.Elements.Add(new LensFlareElement(1.5f, 0.1f, 0.0f, new Color(220, 80, 80, 85), new Vector2F(0.5f, 0.5f), circleTexture));
            lensFlare.Elements.Add(new LensFlareElement(1.6f, 0.5f, 0.0f, new Color(60, 60, 255, 80), new Vector2F(0.5f, 0.5f), haloTexture));
            lensFlare.Elements.Add(new LensFlareElement(1.8f, 0.3f, 0.0f, new Color(90, 60, 255, 110), new Vector2F(0.5f, 0.5f), ringTexture));
            lensFlare.Elements.Add(new LensFlareElement(1.95f, 0.5f, 0.0f, new Color(60, 60, 255, 120), new Vector2F(0.5f, 0.5f), haloTexture));
            lensFlare.Elements.Add(new LensFlareElement(2.0f, 0.15f, 0.0f, new Color(60, 60, 255, 85), new Vector2F(0.5f, 0.5f), circleTexture));

            // The scene node "KeyLight" (defined in SceneSample.InitializeDefaultXnaLights())
            // is the main directional light source.
            var keyLightNode = _scene.GetDescendants().First(n => n.Name == "KeyLight");

            // Let's attach the lens flare to the "KeyLight" node.
            // (Note: It is not necessary to attach a lens flare to a light node. Lens flares
            // can be added anywhere within the scene. But attaching the lens flare to the
            // light node ensures that the lens flare always has the same position and direction
            // as the light source.)
            var lensFlareNode = new LensFlareNode(lensFlare);

            keyLightNode.Children = new SceneNodeCollection();
            keyLightNode.Children.Add(lensFlareNode);

            // Add a second lens flare.
            // The previous lens flare was a caused by a directional light source (distance = infinite).
            // This time we add a local lens flare.
            lensFlare      = new LensFlare(false);
            lensFlare.Name = "Anamorphic Flare";
            lensFlare.Size = 0.3f; // 0.3 * viewport height

            // The QuerySize of a local lens flare is estimated size of the light source
            // in world space.
            lensFlare.QuerySize = 0.2f; // 0.2 meters

            // Add some elements (glow, horizontal streaks, ...) to the lens flare effect.
            var anamorphicFlareTexture = ContentManager.Load <Texture2D>("LensFlare/AnamorphicFlare");

            flareTexture = new PackedTexture("AnamorphicFlare", anamorphicFlareTexture, new Vector2F(0, 0), new Vector2F(1.0f, 87f / 256f));
            var flare1Texture = new PackedTexture("Flare0", anamorphicFlareTexture, new Vector2F(227f / 512f, 88f / 256f), new Vector2F(285f / 512f, 15f / 256f));
            var flare2Texture = new PackedTexture("Flare1", anamorphicFlareTexture, new Vector2F(0, 87f / 256f), new Vector2F(226f / 512f, 168f / 256f));

            lensFlare.Elements.Add(new LensFlareElement(0.0f, 0.8f, 0.0f, new Color(255, 255, 255, 255), new Vector2F(0.5f, 0.5f), flareTexture));
            lensFlare.Elements.Add(new LensFlareElement(1.0f, new Vector2F(0.6f, 0.5f), 0.0f, new Color(172, 172, 255, 32), new Vector2F(0.5f, 0.5f), flare1Texture));
            lensFlare.Elements.Add(new LensFlareElement(1.5f, 1.2f, float.NaN, new Color(200, 200, 255, 24), new Vector2F(0.5f, 0.2f), flare2Texture));
            lensFlare.Elements.Add(new LensFlareElement(2.0f, 2.0f, float.NaN, new Color(172, 172, 255, 48), new Vector2F(0.5f, 0.2f), flare2Texture));

            // Position the lens flare near the origin.
            lensFlareNode           = new LensFlareNode(lensFlare);
            lensFlareNode.PoseWorld = new Pose(new Vector3(-0.5f, 1, 0));
            _scene.Children.Add(lensFlareNode);

            // In this example we need two renderers:
            // The MeshRenderer handles MeshNodes.
            _meshRenderer = new MeshRenderer();

            // The LensFlareRenderer handles LensFlareNodes.
            _lensFlareRenderer = new LensFlareRenderer(GraphicsService);
        }