private void drawSceneToRenderTarget(Microsoft.DirectX.Direct3D.Device d3dDevice, float elapsedTime) { //Arrancamos el renderizado. Esto lo tenemos que hacer nosotros a mano porque estamos en modo CustomRenderEnabled = true d3dDevice.BeginScene(); //Como estamos en modo CustomRenderEnabled, tenemos que dibujar todo nosotros, incluso el contador de FPS GuiController.Instance.Text3d.drawText("FPS: " + HighResolutionTimer.Instance.FramesPerSecond, 0, 60, Color.Yellow); //GuiController.Instance.Text3d.drawText(GuiController.Instance.Shaders.getTgcMeshTechnique(barcoPrincipal.Mesh.RenderType), 200, 200, Color.Black); //GuiController.Instance.Text3d.drawText("Posicion Z:" + barcoPrincipal.Mesh.Position.Z, 250, 250, Color.Black); //Tambien hay que dibujar el indicador de los ejes cartesianos GuiController.Instance.AxisLines.render(); GuiController.Instance.Drawer2D.beginDrawSprite(); if (terminoJuego) { spriteTermino.render(); } if (barcoPrincipal.Vida > 0) { sprVidaLLena.Scaling = new Vector2(barcoPrincipal.Vida/150f, 1); sprVidaLLena.render(); } Size screenSize = GuiController.Instance.Panel3d.Size; spriteMinimapa.RotationCenter = new Vector2(103f , 103f ); spriteMinimapa.Rotation += elapsedTime * 3.14159f; spriteMinimapa.render(); //spritesBarcosBot = new List<TgcSprite>(); float centroMapaX = spriteMinimapa.Position.X+105f; float centroMapaY = spriteMinimapa.Position.Y+95f; foreach (Barco barco in enemigos) { if (barco.Vida > 0) { TgcSprite spritebarco = new TgcSprite(); spritebarco.Texture = TgcTexture.createTexture(GuiController.Instance.AlumnoEjemplosMediaDir + "quicksort\\buttonred.png"); spritebarco.Position = new Vector2(centroMapaX + barco.Mesh.Position.X / 35, centroMapaY + barco.Mesh.Position.Z / 35); spritebarco.Scaling = new Vector2(0.08f, 0.08f); spritebarco.render(); } //spritesBarcosBot.Add(spritebarco); } float ratioW = spriteMinimapa.Texture.Size.Width / screenSize.Width; float ratioH = spriteMinimapa.Texture.Size.Height / screenSize.Height; spriteBarcoPrincipal.Position = new Vector2(centroMapaX + barcoPrincipal.Mesh.Position.X / 35, centroMapaY + barcoPrincipal.Mesh.Position.Z / 35); spriteBarcoPrincipal.render(); sprBarraVida.render(); GuiController.Instance.Drawer2D.endDrawSprite(); //Viejo render aqui /// /* //Obtener valor de UserVar (hay que castear) int valor = (int)GuiController.Instance.UserVars.getValue("variablePrueba"); //Obtener valores de Modifiers float valorFloat = (float)GuiController.Instance.Modifiers["valorFloat"]; string opcionElegida = (string)GuiController.Instance.Modifiers["valorIntervalo"]; Vector3 valorVertice = (Vector3)GuiController.Instance.Modifiers["valorVertice"]; */ alfa_sol = 1.5f; g_LightPos = new Vector3(2000f * (float)Math.Cos(alfa_sol), 2000f * (float)Math.Sin(alfa_sol), 0f); g_LightDir = -g_LightPos; g_LightDir.Normalize(); //Actualzar posición de la luz Vector3 lightPos = new Vector3(-300, 1500, 3000); //sol.Position = lightPos; Vector3 eyePosition = GuiController.Instance.ThirdPersonCamera.getPosition(); if (g_pCubeMapAgua != null) { //CrearEnvMapAgua(); efectosAguaIluminacion.SetValue("g_txCubeMapAgua", g_pCubeMapAgua); efectosAguaIluminacion.SetValue("texCubeMap", g_pCubeMapAgua); } efectosAguaIluminacion.SetValue("g_vLightPos", new Vector4(g_LightPos.X, g_LightPos.Y, g_LightPos.Z, 1)); efectosAguaIluminacion.SetValue("g_vLightDir", new Vector4(g_LightDir.X, g_LightDir.Y, g_LightDir.Z, 1)); g_LightView = Matrix.LookAtLH(g_LightPos, g_LightPos + g_LightDir, new Vector3(0, 0, 1)); efectosAguaIluminacion.SetValue("g_mViewLightProj", g_LightView); efectosAguaIluminacion.SetValue("time", time); efectosAguaIluminacion.SetValue("aux_Tex", textura); efectosAguaIluminacion.SetValue("texDiffuseMap", diffuseMapTexture); efectosAguaIluminacion.SetValue("lightColor", ColorValue.FromColor((Color)GuiController.Instance.Modifiers["lightColor"])); efectosAguaIluminacion.SetValue("lightPosition", TgcParserUtils.vector3ToFloat4Array(lightPos)); if (!activar_efecto) { efectosAguaIluminacion.SetValue("lightIntensity", (float)GuiController.Instance.Modifiers["lightIntensity"]); } else { efectosAguaIluminacion.SetValue("lightIntensity", 75f); } efectosAguaIluminacion.SetValue("eyePosition", TgcParserUtils.vector3ToFloat4Array(eyePosition)); //barcoPrincipal.Mesh.Effect.SetValue("bumpiness", (float)GuiController.Instance.Modifiers["bumpiness"]); efectosAguaIluminacion.SetValue("lightAttenuation", (float)GuiController.Instance.Modifiers["lightAttenuation"]); //barcoPrincipal.Mesh.Effect.SetValue("reflection", (float)GuiController.Instance.Modifiers["reflection"]); efectosAguaIluminacion.SetValue("eyePosition", TgcParserUtils.vector3ToFloat4Array(GuiController.Instance.ThirdPersonCamera.getPosition())); efectosAguaIluminacion.SetValue("lightPosition", TgcParserUtils.vector3ToFloat4Array(lightPos)); //cd relampago + Xf es var rnd = new Random(); if (!relampagoOn) { if (cooldownRelampago + rnd.Next(2, 4) < time) { effectlluvia.SetValue("relampagoOn", true); cooldownRelampago = time; relampagoOn = true; } else { effectlluvia.SetValue("relampagoOn", false); } } else { if (cooldownRelampago + ((float)rnd.Next(4, 7))/20 < time) { effectlluvia.SetValue("relampagoOn", true); relampagoOn = false; } else { effectlluvia.SetValue("relampagoOn", false); } } efectosAguaIluminacion.SetValue("materialEmissiveColor", ColorValue.FromColor((Color)GuiController.Instance.Modifiers["mEmissive"])); efectosAguaIluminacion.SetValue("materialAmbientColor", ColorValue.FromColor((Color)GuiController.Instance.Modifiers["mAmbient"])); efectosAguaIluminacion.SetValue("materialDiffuseColor", ColorValue.FromColor((Color)GuiController.Instance.Modifiers["mDiffuse"])); efectosAguaIluminacion.SetValue("materialSpecularColor", ColorValue.FromColor((Color)GuiController.Instance.Modifiers["mSpecular"])); efectosAguaIluminacion.SetValue("materialSpecularExp", (float)GuiController.Instance.Modifiers["specularEx"]); //Hacer que la camara siga al personaje en su nueva posicion GuiController.Instance.ThirdPersonCamera.Target = barcoPrincipal.Mesh.Position; oceano.render(); //Dibujar objeto principal //Siempre primero hacer todos los cálculos de lógica e input y luego al final dibujar todo (ciclo update-render) barcoPrincipal.colocarAltura(time); foreach (BarcoBot barcoEnem in enemigos) { barcoEnem.colocarAltura(time); } if (barcoPrincipal.Vida > 0) { barcoPrincipal.Movimiento(elapsedTime); } else { barcoPrincipal.hundir(elapsedTime); terminoJuego = true; } foreach (BarcoBot barcoenem in enemigos) { if (barcoenem.Vida > 0) { barcoenem.Movimiento(elapsedTime); } else { barcoenem.hundir(elapsedTime); } } barcoPrincipal.Mesh.Effect.SetValue("lightColor", ColorValue.FromColor((Color)GuiController.Instance.Modifiers["lightColor"])); barcoPrincipal.Mesh.Effect.SetValue("lightPosition", TgcParserUtils.vector3ToFloat4Array(lightPos)); barcoPrincipal.Mesh.Effect.SetValue("eyePosition", TgcParserUtils.vector3ToFloat4Array(eyePosition)); barcoPrincipal.Mesh.Effect.SetValue("lightIntensity", (float)GuiController.Instance.Modifiers["lightIntensity"]); //barcoPrincipal.Mesh.Effect.SetValue("bumpiness", (float)GuiController.Instance.Modifiers["bumpiness"]); barcoPrincipal.Mesh.Effect.SetValue("lightAttenuation", (float)GuiController.Instance.Modifiers["lightAttenuation"]); //barcoPrincipal.Mesh.Effect.SetValue("reflection", (float)GuiController.Instance.Modifiers["reflection"]); barcoPrincipal.Mesh.Effect.SetValue("eyePosition", TgcParserUtils.vector3ToFloat4Array(GuiController.Instance.ThirdPersonCamera.getPosition())); barcoPrincipal.Mesh.Effect.SetValue("lightPosition", TgcParserUtils.vector3ToFloat4Array(lightPos)); barcoPrincipal.Mesh.Effect.SetValue("materialEmissiveColor", ColorValue.FromColor((Color)GuiController.Instance.Modifiers["mEmissive"])); barcoPrincipal.Mesh.Effect.SetValue("materialAmbientColor", ColorValue.FromColor((Color)GuiController.Instance.Modifiers["mAmbient"])); barcoPrincipal.Mesh.Effect.SetValue("materialDiffuseColor", ColorValue.FromColor((Color)GuiController.Instance.Modifiers["mDiffuse"])); barcoPrincipal.Mesh.Effect.SetValue("materialSpecularColor", ColorValue.FromColor((Color)GuiController.Instance.Modifiers["mSpecular"])); barcoPrincipal.Mesh.Effect.SetValue("materialSpecularExp", (float)GuiController.Instance.Modifiers["specularEx"]); barcoPrincipal.Mesh.Effect.SetValue("daniado", barcoPrincipal.daniado ? 1 : 0); barcoPrincipal.Mesh.Effect.SetValue("time", time); barcoPrincipal.Mesh.Effect.SetValue("terminoJuego", terminoJuego); barcoPrincipal.Mesh.render(); if (barcoPrincipal.timerDaniado != null) { if (barcoPrincipal.timerDaniado.ElapsedMilliseconds >= 2000) { barcoPrincipal.daniado = false; } } foreach (BarcoBot barcoEnem in enemigos) { barcoEnem.Mesh.Effect.SetValue("lightColor", ColorValue.FromColor((Color)GuiController.Instance.Modifiers["lightColor"])); barcoEnem.Mesh.Effect.SetValue("lightPosition", TgcParserUtils.vector3ToFloat4Array(lightPos)); barcoEnem.Mesh.Effect.SetValue("eyePosition", TgcParserUtils.vector3ToFloat4Array(eyePosition)); barcoEnem.Mesh.Effect.SetValue("lightIntensity", (float)GuiController.Instance.Modifiers["lightIntensity"]); barcoEnem.Mesh.Effect.SetValue("lightAttenuation", (float)GuiController.Instance.Modifiers["lightAttenuation"]); barcoEnem.Mesh.Effect.SetValue("eyePosition", TgcParserUtils.vector3ToFloat4Array(GuiController.Instance.ThirdPersonCamera.getPosition())); barcoEnem.Mesh.Effect.SetValue("lightPosition", TgcParserUtils.vector3ToFloat4Array(lightPos)); barcoEnem.Mesh.Effect.SetValue("materialEmissiveColor", ColorValue.FromColor((Color)GuiController.Instance.Modifiers["mEmissive"])); barcoEnem.Mesh.Effect.SetValue("materialAmbientColor", ColorValue.FromColor((Color)GuiController.Instance.Modifiers["mAmbient"])); barcoEnem.Mesh.Effect.SetValue("materialDiffuseColor", ColorValue.FromColor((Color)GuiController.Instance.Modifiers["mDiffuse"])); barcoEnem.Mesh.Effect.SetValue("materialSpecularColor", ColorValue.FromColor((Color)GuiController.Instance.Modifiers["mSpecular"])); barcoEnem.Mesh.Effect.SetValue("materialSpecularExp", (float)GuiController.Instance.Modifiers["specularEx"]); barcoEnem.Mesh.Effect.SetValue("time", time); barcoEnem.Mesh.Effect.SetValue("terminoJuego", false); if (barcoEnem.daniado) { barcoEnem.Mesh.Effect.SetValue("daniado", 1); } else { barcoEnem.Mesh.Effect.SetValue("daniado", 0); } barcoEnem.Mesh.render(); barcoEnem.volverAltura(time); if (barcoEnem.timerDaniado != null) { if (barcoEnem.timerDaniado.ElapsedMilliseconds >= 2000) { barcoEnem.daniado = false; } } } barcoPrincipal.volverAltura(time); foreach (var bala in barcoPrincipal.balas) { if (bala.Mesh.Position.Y > 0) { bala.Mover(elapsedTime); bala.Mesh.render(); } } foreach (BarcoBot barco in enemigos) { foreach (var bala in barco.balas) { if (bala.Mesh.Position.Y > 0) { if (!bala.col) { bala.Mover(elapsedTime); bala.Mesh.render(); } } } } //sol.render(); skyBox.render(); //Terminamos manualmente el renderizado de esta escena. Esto manda todo a dibujar al GPU al Render Target que cargamos antes d3dDevice.EndScene(); }
private void drawPostProcess(Microsoft.DirectX.Direct3D.Device d3dDevice) { //Arrancamos la escena d3dDevice.BeginScene(); //Cargamos para renderizar el unico modelo que tenemos, un Quad que ocupa toda la pantalla, con la textura de todo lo dibujado antes d3dDevice.VertexFormat = CustomVertex.PositionTextured.Format; d3dDevice.SetStreamSource(0, screenQuadVB, 0); //Ver si el efecto de alarma esta activado, configurar Technique del shader segun corresponda if (activar_efecto) { effectlluvia.Technique = "AlarmaTechnique"; //sol.Position = new Vector3(0f, 1950f, 3000f); } else { effectlluvia.Technique = "DefaultTechnique"; } //Cargamos parametros en el shader de Post-Procesado effectlluvia.SetValue("render_target2D", renderTarget2D); effectlluvia.SetValue("textura_alarma", alarmTexture.D3dTexture); effectlluvia.SetValue("alarmaScaleFactor", intVaivenAlarm.update()); effectlluvia.SetValue("time", time); //Limiamos la pantalla y ejecutamos el render del shader d3dDevice.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); effectlluvia.Begin(FX.None); effectlluvia.BeginPass(0); d3dDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2); effectlluvia.EndPass(); effectlluvia.End(); //Terminamos el renderizado de la escena d3dDevice.EndScene(); }