Esempio n. 1
0
        //*/

        //*TODO
        /// <summary>
        /// Test shadow mapping
        /// </summary>
        public static void TestShadowMapping()
        {
            PlaneRenderer plane = null;
            //ColladaModel testModel = null;
            // We need a dummy animated model to set the right bones once.
            AnimatedColladaModel dummyAniModel = null;

            TestGame.Start("TestShadowMapping",
                delegate
                {
                    plane = new PlaneRenderer(
                        Vector3.Zero, new Plane(new Vector3(0, 0, 1), 0),
                        new Material(
                        Color.White, Color.White, Color.Black,
                        "CaveDetailGround", "CaveDetailGroundNormal", "", ""),
                        10.0f);
                    //testModel = new ColladaModel(
                        //"Door");
                        //"Hero");
                        //"Sword");
                    dummyAniModel = new AnimatedColladaModel("Hero");
                    //dummy:
                    dummyAniModel.Render(Matrix.Identity);

                    ShaderEffect.shadowMapping.SetVirtualLightPos(
                        new Vector3(0, 0, 2));
                },
                delegate
                {
                    // Start glow shader
                    BaseGame.GlowShader.Start();

                    // Clear background with white color, looks much cooler for the
                    // post screen glow effect.
                    BaseGame.Device.Clear(Color.Black);

                    if (Input.Keyboard.IsKeyDown(Keys.Tab))
                        BaseGame.ViewMatrix = Matrix.CreateLookAt(
                            //Mission.LookAtPosition +
                            BaseGame.LightDirection * ThirdPersonCamera.CameraDistance,
                            Vector3.Zero,//Mission.LookAtPosition,
                            new Vector3(0, 1, 0));

                    Matrix renderMatrix = Matrix.Identity;
                    Matrix groundMatrix = Matrix.Identity;

                    if (Input.Keyboard.IsKeyUp(Keys.LeftAlt) &&
                        Input.GamePadXPressed == false)
                    {
                        // Generate shadows
                        ShaderEffect.shadowMapping.GenerateShadows(
                            delegate
                            {
                                //testModel.GenerateShadow(renderMatrix);
                                dummyAniModel.GenerateShadow(renderMatrix);
                                //dummyAniModel.Render(renderMatrix);
                            });

                        // Render shadows
                        ShaderEffect.shadowMapping.RenderShadows(
                            delegate
                            {
                                //testModel.UseShadow(renderMatrix);
                                dummyAniModel.UseShadow(renderMatrix);
                                plane.UseShadow();
                            });
                    } // if

                    // Restore z buffer state
                    BaseGame.Device.RenderState.DepthBufferEnable = true;
                    BaseGame.Device.RenderState.DepthBufferWriteEnable = true;

                    // Update game time
                    Player.SetGameTimeMs(BaseGame.TotalTimeMs);

                    plane.Render();
                    //testModel.Render(renderMatrix);
                    dummyAniModel.Render(renderMatrix);
                    //unused: BaseGame.MeshRenderManager.Render();

                    Matrix weaponMatrix = dummyAniModel.HandlePlayerFlareAndWeapon();
                    ShaderEffect.shadowMapping.SetVirtualLightPos(
                        AnimatedColladaModel.finalPlayerFlarePos);

                    EffectManager.AddEffect(
                        AnimatedColladaModel.finalPlayerFlarePos,
                        EffectManager.EffectType.Flare, 0.3f, 0);
                    EffectManager.AddEffect(
                        AnimatedColladaModel.finalPlayerFlarePos,
                        EffectManager.EffectType.LightInstant, 0.3f * 2.5f, 0);

                    BaseGame.effectManager.HandleAllEffects();

                    if (Input.Keyboard.IsKeyUp(Keys.LeftAlt) &&
                        Input.GamePadXPressed == false)
                    {
                        ShaderEffect.shadowMapping.ShowShadows();
                    } // if

                    if (Input.Keyboard.IsKeyDown(Keys.LeftShift) ||
                        Input.GamePadAPressed)
                    {
                        //if (Input.KeyboardRightPressed)// == false)
                        ShaderEffect.shadowMapping.shadowMapTexture.RenderOnScreen(
                            new Rectangle(10, 10, 256, 256));
                        //if (Input.KeyboardLeftPressed)// == false)
                        ShaderEffect.shadowMapping.shadowMapBlur.SceneMapTexture.
                            RenderOnScreen(
                            new Rectangle(10 + 256 + 10, 10, 256, 256));
                        // Unused on xbox360
            //#if !XBOX360
                        //ShaderEffect.shadowMapping.shadowMapBlur.BlurMapTexture.
                        //	RenderOnScreen(
                        //	new Rectangle(10 + 256 + 10+256+10, 10, 256, 256));
            //#endif
                    } // if (Input.Keyboard.IsKeyDown)

                    DungeonQuestGame.GlowShader.Show();

                    TextureFont.WriteText(2, 510,
                        "Press left Shift or A to show all shadow pass textures.");
                    TextureFont.WriteText(2, 540,
                        "Press Alt or X to skip shadow map rendering.");
                    TextureFont.WriteText(2, 570,
                        "Camera pos="+BaseGame.CameraPos);//+
                        //", "+ShaderEffect.shadowMapping.shadowMapTexture.ZBufferSurface);
                });
        }
        /// <summary>
        /// TestPlayerColladaModelScene
        /// </summary>
        public static void TestPlayerColladaModelScene()
        {
            AnimatedGameObject player = null;
            AnimatedColladaModel playerModel = null;
            //obs: PlaneRenderer groundPlane = null;

            TestGame.Start("TestPlayerColladaModelScene",
                delegate
                {
                    // Load Player
                    player = new AnimatedGameObject(
                        GameManager.AnimatedTypes.Hero,
                        Matrix.Identity);
                    playerModel = new AnimatedColladaModel(
                        //"Hero");
                        //"Goblin");
                        //"GoblinMaster");
                        "GoblinWizard");
                        //"Ogre");
                        //"BigOgre");

                    // Play background music :)
                    //Sound.StartMusic();

              /*obs
                    // Create ground plane
                    groundPlane = new PlaneRenderer(
                        new Vector3(0, 0, -0.001f),
                        new Plane(new Vector3(0, 0, 1), 0),
                        new Material(
                            "CaveDetailGround", "CaveDetailGroundNormal",
                            "CaveDetailGroundHeight"),
                        28);
              */

                    // Set light direction (light is coming from the front right pos).
                    BaseGame.LightDirection = new Vector3(-18, -20, 16);
                },
                delegate
                {
                    // Start glow shader
                    //BaseGame.GlowShader.Start();

                    // Clear background with white color, looks much cooler for the
                    // post screen glow effect.
                    //BaseGame.Device.Clear(Color.White);

                    // Render goblin always in center, but he is really big, bring him
                    // down to a more normal size that fits better in our test scene.
                    Matrix renderMatrix =
                        Input.Keyboard.IsKeyDown(Keys.LeftControl) ?
                        Matrix.CreateScale(0.8f) *
                        Matrix.CreateRotationZ(1.4f) *
                        Matrix.CreateTranslation(1, 1, 0) :
                        Input.Keyboard.IsKeyDown(Keys.LeftAlt) ?
                        Matrix.CreateTranslation(1, 1, 0) :
                        Matrix.CreateTranslation(0, 0, -1);
                        //Matrix.Identity; // should work!
                        //Matrix.CreateScale(0.01f);

                    // Restore z buffer state
                    BaseGame.Device.RenderState.DepthBufferEnable = true;
                    BaseGame.Device.RenderState.DepthBufferWriteEnable = true;
            //TODO: when we got more time to test
                    /*
                    // Make sure we use skinned tangent vertex format for shadow mapping
                    BaseGame.Device.VertexDeclaration =
                        SkinnedTangentVertex.VertexDeclaration;

                    // Generate shadows
                    ShaderEffect.shadowMapping.GenerateShadows(
                        delegate
                        {
                            playerModel.GenerateShadow(renderMatrix);
                        });

                    // Render shadows
                    ShaderEffect.shadowMapping.RenderShadows(
                        delegate
                        {
                            playerModel.UseShadow(renderMatrix);
                            groundPlane.UseShadow();
                        });
                    //*/

                    /*obs
                    // Show ground with DiffuseSpecular material and use parallax mapping!
                    groundPlane.Render(
                        //ShaderEffect.normalMapping, "DiffuseSpecular30");
                        );//just used for testing, looks good: ShaderEffect.parallaxMapping);
                     */

                    // Update game time
                    Player.SetGameTimeMs(BaseGame.TotalTimeMs);

                    // Cycle around with Z/X
                    if (Input.KeyboardKeyJustPressed(Keys.Z))
                        player.state = (AnimatedGameObject.States)
                            (((int)player.state + 1) % NumberOfAnimationTypes);
                    else if (Input.KeyboardKeyJustPressed(Keys.X))
                        player.state = (AnimatedGameObject.States)
                            (((int)player.state + NumberOfAnimationTypes - 1) %
                            NumberOfAnimationTypes);
                    // And update all blend states
                    player.UpdateState();

                    // Render the model with the current animation
                    playerModel.Render(
                        renderMatrix,
                        //Matrix.Identity,
                        player.blendedStates);
                        //new float[] { 1, 0, 0, 0, 0 });

                    TextureFont.WriteText(2, 30, "Press Z/X to change the animation");

                    TextureFont.WriteText(2, 60, "Blended states: " +
                        StringHelper.WriteArrayData(player.blendedStates));

                    // show fire flare at weapon for testing, use wizard!
                    Vector3 weaponPos = playerModel.GetWeaponPos(renderMatrix);
                    EffectManager.AddFireBallEffect(weaponPos, 0, 0.25f);
                    BaseGame.effectManager.HandleAllEffects();

                    /*obs
                    // And show all goblins
                    for (int x = 0; x < 2; x++)
                        for (int y = 0; y < 3; y++)
                            playerModel.Render(
                                renderMatrix *
                                Matrix.CreateTranslation(-5 + 10 * x, -10 + 10 * y, 0));
                     */

                    // And show shadows on top of the scene (with shadow blur effect).
                    //TODO: ShaderEffect.shadowMapping.ShowShadows();

                    // And finally show glow shader on top of everything
                    /*BaseGame.GlowShader.Show();
                     */

                    // If you press the right mouse button or B you can see all
                    // shadow map and post screen render targets (for testing/debugging)
                    if (Input.MouseRightButtonPressed ||
                        Input.GamePadBPressed)
                    {
                        BaseGame.AlphaBlending = false;
                        BaseGame.Device.RenderState.AlphaTestEnable = false;
                        // Line 1 (3 render targets, 2 shadow mapping, 1 post screen)
                        ShaderEffect.shadowMapping.shadowMapTexture.RenderOnScreen(
                            new Rectangle(10, 10, 256, 256));
                        ShaderEffect.shadowMapping.shadowMapBlur.SceneMapTexture.
                            RenderOnScreen(
                            new Rectangle(10 + 256 + 10, 10, 256, 256));
                        PostScreenGlow.sceneMapTexture.RenderOnScreenNoAlpha(
                            new Rectangle(10 + 256 + 10 + 256 + 10, 10, 256, 256));
                        // Line 2 (3 render targets, 2 post screen blurs, 1 final scene)
                        PostScreenGlow.downsampleMapTexture.RenderOnScreenNoAlpha(
                            new Rectangle(10, 10 + 256 + 10, 256, 256));
                        PostScreenGlow.blurMap1Texture.RenderOnScreenNoAlpha(
                            new Rectangle(10 + 256 + 10, 10 + 256 + 10, 256, 256));
                        PostScreenGlow.blurMap2Texture.RenderOnScreenNoAlpha(
                            new Rectangle(10 + 256 + 10 + 256 + 10, 10 + 256 + 10, 256, 256));
                    } // if (Input.MouseRightButtonPressed)
                    //*/
                });
        }