protected override void LoadContent(ContentState state) { //load the default font. SpriteFont arial = state.Load<SpriteFont>("Arial"); drawStats.Font = arial; //load the character model model.ModelData = state.Load<Xen.Ex.Graphics.Content.ModelData>(@"xna_dude/dude"); //set the shader on the model model.ShaderProvider = new CharacterShaderProvider(characterRenderShader, model.ModelData, state.ContentRegister, "xna_dude"); //setup the render configuration this.renderConfig = new RenderConfiguration(this); renderConfig.UseGammaCorrection = true; renderConfig.UseExposureTonemapping = true; renderConfig.AmbientSphericalHarmonicScale = 1; renderConfig.DiffuseLightingScale = 1; renderConfig.SpecularLightingScale = 1; renderConfig.AlbedoTextureScale = 1; renderConfig.AmbientOcclusionTextureScale = 1; renderConfig.ShadowMapTermScale = 1; renderConfig.SkinLightScatteringScale = 1; renderConfig.ShowBloomRenderTarget = false; renderConfig.ShowEncodedRgbmRenderTarget = false; renderConfig.PauseModelAnimation = false; renderConfig.PauseModelRotation = false; renderConfig.TargetLensExposure = 0.3f; //setup common defaults for the scene configs. SceneConfiguration defaultSC = new SceneConfiguration(); defaultSC.RgbmImageScale = 20.0f; defaultSC.BloomThreshold = 1.5f; defaultSC.BloomScale = 1.0f; defaultSC.SunSpecularPower = 32.0f; defaultSC.SunSpecularIntensity = 30.0f; defaultSC.RgbmRenderScale = 200.0f; defaultSC.SkinLightScattering = new Vector3(0.15f, 0.02f, 0.002f); // 15% of the red channel is transferred under the skin //Load the source cubemap scene textures. //Note: To make it easier to view the source images, the RGBM images have been split into two images, //One store the RGB portion, one stores the M portion. This makes it much easier to view the textures //and see how they are stored - but it is also extremely wasteful, using 2x the texture data. //Ideally, the images would be loaded directly as a PNG, however this cannot easily be done on the Xbox. //Because these textures are only uses locally as an image data source, they are loaded in a temporary //content manager, which is disposed at the end of this method. ContentManager localManager = new ContentManager(this.Services, state.ContentRegister.RootDirectory); Texture2D textureDirtroad = localManager.Load<Texture2D>("LightProbes/DirtRoadHDR.rgb"); Texture2D textureWaterfront = localManager.Load<Texture2D>("LightProbes/WaterfrontHDR.rgb"); Texture2D textureArches = localManager.Load<Texture2D>("LightProbes/ArchesHDR.rgb"); Texture2D textureMill = localManager.Load<Texture2D>("LightProbes/MillHDR.rgb"); Texture2D textureDirtroadAlpha = localManager.Load<Texture2D>("LightProbes/DirtRoadHDR.m"); Texture2D textureWaterfrontAlpha = localManager.Load<Texture2D>("LightProbes/WaterfrontHDR.m"); Texture2D textureArchesAlpha = localManager.Load<Texture2D>("LightProbes/ArchesHDR.m"); Texture2D textureMillAlpha = localManager.Load<Texture2D>("LightProbes/MillHDR.m"); //setup DirtRoadHDR specifics this.DirtRoadConfig = defaultSC.Clone(); this.DirtRoadConfig.BackgroundScene = new RgbmCubeMap(textureDirtroad, textureDirtroadAlpha, this.DirtRoadConfig.RgbmImageScale); this.DirtRoadConfig.SunColour = new Vector3(1, 0.9f, 0.75f); this.DirtRoadConfig.SunDirection = Vector3.Normalize(new Vector3(0, 0.1f, 1)); this.DirtRoadConfig.SunIntensity = 20.0f; this.DirtRoadConfig.DefaultLensExposure = 0.15f; this.DirtRoadConfig.DefaultCamPos = new Vector3(6.062489f, 105.9959f, -0.6131198f); this.DirtRoadConfig.DefaultCamViewPos = new Vector3(5.147717f, 105.02338f, -0.2100832f); //setup Arches specifics this.ArchesConfig = defaultSC.Clone(); this.ArchesConfig.BackgroundScene = new RgbmCubeMap(textureArches, textureArchesAlpha, this.ArchesConfig.RgbmImageScale); this.ArchesConfig.SunColour = new Vector3(1, 1, 1); this.ArchesConfig.SunDirection = Vector3.Normalize(new Vector3(-0.4f, 0.4f, 0.5f)); this.ArchesConfig.SunIntensity = 15.0f; this.ArchesConfig.DefaultLensExposure = 0.15f; this.ArchesConfig.DefaultCamPos = new Vector3(-2.667145f, 105.280345f, 4.98485f); this.ArchesConfig.DefaultCamViewPos = new Vector3(-2.470318f, 105.176862f, 4.009888f); //this.ArchesConfig.BloomScale = 0f; // temporary bloom disable for wireframe //setup WaterfrontHDR specifics this.WaterfrontConfig = defaultSC.Clone(); this.WaterfrontConfig.BackgroundScene = new RgbmCubeMap(textureWaterfront, textureWaterfrontAlpha, this.WaterfrontConfig.RgbmImageScale); this.WaterfrontConfig.SunColour = new Vector3(0.9f, 0.95f, 1); this.WaterfrontConfig.SunDirection = Vector3.Normalize(new Vector3(-0.2f, 1, 0)); this.WaterfrontConfig.SunIntensity = 15.0f; this.WaterfrontConfig.DefaultLensExposure = 0.35f; this.WaterfrontConfig.DefaultCamPos = new Vector3(5.251021f, 105.877438f, -2.74239f); this.WaterfrontConfig.DefaultCamViewPos = new Vector3(4.579107f, 105.783906f, -2.007691f); //setup MillHDR specifics this.MillConfig = defaultSC.Clone(); this.MillConfig.BackgroundScene = new RgbmCubeMap(textureMill, textureMillAlpha, this.MillConfig.RgbmImageScale); this.MillConfig.SunColour = new Vector3(1, 0.975f, 0.95f); this.MillConfig.SunDirection = Vector3.Normalize(new Vector3(-1, 1, -1)); this.MillConfig.SunIntensity = 25.0f; this.MillConfig.DefaultLensExposure = 0.5f; this.MillConfig.BloomScale = 0.5f; this.MillConfig.BloomThreshold = 1.0f; this.MillConfig.DefaultCamPos = new Vector3(6.087461f, 105.132507f, -0.8147218f); this.MillConfig.DefaultCamViewPos = new Vector3(5.203656f, 104.989332f, -0.3693113f); this.sceneConfig = this.ArchesConfig; this.viewCamera.LookAt(this.sceneConfig.DefaultCamViewPos, this.sceneConfig.DefaultCamPos, new Vector3(0, 1, 0)); //Textures are no longer needed. localManager.Dispose(); localManager = new ContentManager(this.Services, state.ContentRegister.RootDirectory); // Generate terrain /* const int terrainSeed = 70; GenerateTerrain(terrainSeed); terrainManager.SideColor = localManager.Load<Texture2D>("TerrainTextures/cliffs2"); terrainManager.BottomColor = localManager.Load<Texture2D>("TerrainTextures/rock1"); terrainManager.TopColor = localManager.Load<Texture2D>("TerrainTextures/grassyrock2"); terrainManager.SideNormal = localManager.Load<Texture2D>("TerrainTextures/rock_normal"); terrainManager.TopNormal = terrainManager.SideNormal; terrainManager.BottomNormal = terrainManager.SideNormal; terrainManager.terrainShader.SideColor = terrainManager.SideColor; terrainManager.terrainShader.SideNormal = terrainManager.SideNormal; terrainManager.terrainShader.BottomColor = terrainManager.BottomColor; terrainManager.terrainShader.BottomNormal = terrainManager.BottomNormal; terrainManager.terrainShader.TopColor = terrainManager.TopColor; terrainManager.terrainShader.TopNormal = terrainManager.TopNormal; terrainManager.terrainShader.TextureScale = 0.1f + ((1 / terrainManager.cellDimensions.X) / 2.5f); SetupTerrainShader(); */ // xpf gui initialisation /* Microsoft.Xna.Framework.Game g = (Microsoft.Xna.Framework.Game)this; this.spriteBatchAdapter = new SpriteBatchAdapter(new SpriteBatch(g.GraphicsDevice)); var primitivesService = new PrimitivesService(g.GraphicsDevice); var renderer = new Renderer(this.spriteBatchAdapter, primitivesService); this.rootElement = new RootElement(g.GraphicsDevice.Viewport.ToRect(), renderer); var spriteFontAdapter = new SpriteFontAdapter(arial); var textBlock = new TextBlock(spriteFontAdapter) { Text = "Hello from XPF!", Foreground = new RedBadger.Xpf.Media.SolidColorBrush(RedBadger.Xpf.Media.Colors.White), //Background = new RedBadger.Xpf.Media.SolidColorBrush(RedBadger.Xpf.Media.Colors.Red), HorizontalAlignment = RedBadger.Xpf.HorizontalAlignment.Left, VerticalAlignment = RedBadger.Xpf.VerticalAlignment.Top }; this.rootElement.Content = textBlock;*/ // calculate physics for terrain and add it simpleTerrain.CalculatePhysicsHull(); world.AddBody(simpleTerrain.RigidBody); // add player model to physics sim float height = model.ModelData.StaticBounds.Maximum.Y - model.ModelData.StaticBounds.Minimum.Y; float width = model.ModelData.StaticBounds.Maximum.X - model.ModelData.StaticBounds.Minimum.X; RigidBody playerBody = new RigidBody(new CapsuleShape(0.16f, 0.08f)); playerBody.Position = new JVector(0, 100, 0); playerBody.UseUserMassProperties(JMatrix.Zero, 1.0f, true); playerBody.Restitution = 0.0f; //playerBody.Orientation = Matrix.CreateRotationZ(MathHelper.Pi).ToJitterMatrix(); characterController = new CharacterController(world, playerBody); world.AddBody(playerBody); world.AddConstraint(characterController); }
//callback from the render config public void ChangeScene() { //cycle the render config if (this.sceneConfig == this.DirtRoadConfig) this.sceneConfig = this.WaterfrontConfig; else if (this.sceneConfig == this.WaterfrontConfig) this.sceneConfig = this.ArchesConfig; else if (this.sceneConfig == this.ArchesConfig) this.sceneConfig = this.MillConfig; else if (this.sceneConfig == this.MillConfig) this.sceneConfig = this.DirtRoadConfig; //set the default camera for the scene. this.viewCamera.LookAt(this.sceneConfig.DefaultCamViewPos, this.sceneConfig.DefaultCamPos, new Vector3(0, 1, 0)); //rotate the model a bit, to provide a cleaer transition this.modelRotation.RotationAngle += 1; this.renderConfig.TargetLensExposure = this.sceneConfig.DefaultLensExposure; SetupTerrainShader(); }