//*/ //*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) //*/ }); }