public static void CopyToCubeSide(OpsContext context, CubeTexture newTexture, string srcArg, CubeMapFace face, Filter filter) { if (srcArg == null || srcArg.Length == 0) { return; } OpsTexture src = context.GetTexture(srcArg); if (src == null) { throw new OpsException("Could not find source texture: " + srcArg); } if (src.Texture is CubeTexture) { SurfaceLoader.FromSurface(newTexture.GetCubeMapSurface(face, 0), ((CubeTexture)src.Texture).GetCubeMapSurface(face, 0), filter | (src.SRGB?Filter.SrgbIn:0), 0); } else if (src.Texture is Texture) { SurfaceLoader.FromSurface(newTexture.GetCubeMapSurface(face, 0), ((Texture)src.Texture).GetSurfaceLevel(0), filter | (src.SRGB?Filter.SrgbIn:0), 0); } else { throw new OpsException("Source texture is not a texture2D: " + srcArg); } }
/// <summary>Set up the cube map by rendering the scene into it</summary> private void RenderSceneIntoCubeMap(Device device, double totalTime, float elapsedTime, Vector3 position) { if (invalidated) { rendering = true; CameraBase cam = Framework.Instance.CurrentCamera; cubeCamera.LookFrom = position; Framework.Instance.CurrentCamera = cubeCamera; for (int f = 0; f < 6; ++f) { CubeTexture cubeTex = cubeTexture.Texture as CubeTexture; using (Surface s = cubeTex.GetCubeMapSurface((CubeMapFace)f, 0)) { SetCubeMapCamera((CubeMapFace)f); renderHelper.BeginScene(s); cubeCamera.OnFrameMove(device, totalTime, elapsedTime); cubeCamera.OnFrameRender(device, totalTime, elapsedTime); if (OnFrameRenderMethod != null) { OnFrameRenderMethod(device, totalTime, elapsedTime); } device.Transform.World = Matrix.Identity; renderHelper.EndScene(Filter.None); } } Framework.Instance.CurrentCamera = cam; Framework.Instance.CurrentCamera.OnFrameRender(device, totalTime, elapsedTime); rendering = false; invalidated = false; } }
private void renderCubemap(TGCVector3 worldPos) { // ojo: es fundamental que el fov sea de 90 grados. // asi que re-genero la matriz de proyeccion D3DDevice.Instance.Device.Transform.Projection = TGCMatrix.PerspectiveFovLH(Geometry.DegreeToRadian(90.0f), 1f, 1f, 10000f).ToMatrix(); // En vez de renderizar todas las caras en todos los frames (Como en el codigo comentado de arriba), renderizo una cara por cada frame var nFace = (CubeMapFace)(frameNumber % 6); var pFace = g_pCubeMap.GetCubeMapSurface(nFace, 0); D3DDevice.Instance.Device.SetRenderTarget(0, pFace); TGCVector3 Dir, VUP; switch (nFace) { default: case CubeMapFace.PositiveX: Dir = new TGCVector3(1, 0, 0); VUP = TGCVector3.Up; break; case CubeMapFace.NegativeX: Dir = new TGCVector3(-1, 0, 0); VUP = TGCVector3.Up; break; case CubeMapFace.PositiveY: Dir = TGCVector3.Up; VUP = new TGCVector3(0, 0, -1); break; case CubeMapFace.NegativeY: Dir = TGCVector3.Down; VUP = new TGCVector3(0, 0, 1); break; case CubeMapFace.PositiveZ: Dir = new TGCVector3(0, 0, 1); VUP = TGCVector3.Up; break; case CubeMapFace.NegativeZ: Dir = new TGCVector3(0, 0, -1); VUP = TGCVector3.Up; break; } //como queremos usar la camara rotacional pero siguendo a un objetivo comentamos el seteo del view. D3DDevice.Instance.Device.Transform.View = TGCMatrix.LookAtLH(worldPos, Dir, VUP); D3DDevice.Instance.Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); D3DDevice.Instance.Device.BeginScene(); //Renderizar renderScene(true); D3DDevice.Instance.Device.EndScene(); }
public void Run(OpsContext context, OpsStatement statement) { Slice2dArgs args = statement.Arguments as Slice2dArgs; ArrayList containers = statement.GetContent(context); if (containers.Count != 1) { throw new OpsException("Src argument does not resolve to 1 texture. Textures found: " + containers.Count); } OpsTexture container = containers[0] as OpsTexture; OpsConsole.WriteLine("Slicing from texture:{0} and saving as {1}", container.Name, args.Dst); OpsTexture result = new OpsTexture(); result.Name = args.Dst; result.SRGB = container.SRGB; Texture newTexture = null; if (container.Texture is Texture) { Texture srcTexture = container.Texture as Texture; SurfaceDescription sd = srcTexture.GetLevelDescription(args.Mips); newTexture = new Texture(srcTexture.Device, sd.Width, sd.Height, 1, Usage.None, sd.Format, Pool.Managed); SurfaceLoader.FromSurface(newTexture.GetSurfaceLevel(0), srcTexture.GetSurfaceLevel(0), Filter.Dither | Filter.Triangle | (container.SRGB?Filter.Srgb:0), 0); } else if (container.Texture is VolumeTexture) { VolumeTexture srcTexture = container.Texture as VolumeTexture; VolumeDescription vd = srcTexture.GetLevelDescription(args.Mips); newTexture = new Texture(srcTexture.Device, vd.Width, vd.Height, 1, Usage.None, vd.Format, Pool.Managed); OpsTextureHelper.LoadSurfaceFromVolumeSlice(srcTexture, args.Mips, args.Volume, Filter.Dither | Filter.Triangle | (container.SRGB?Filter.Srgb:0), newTexture.GetSurfaceLevel(0)); } else if (container.Texture is CubeTexture) { CubeTexture srcTexture = container.Texture as CubeTexture; SurfaceDescription sd = srcTexture.GetLevelDescription(args.Mips); newTexture = new Texture(srcTexture.Device, sd.Width, sd.Height, 1, Usage.None, sd.Format, Pool.Managed); SurfaceLoader.FromSurface(newTexture.GetSurfaceLevel(0), srcTexture.GetCubeMapSurface(args.Face, 0), Filter.Dither | Filter.Triangle | (container.SRGB?Filter.Srgb:0), 0); } result.Texture = newTexture; context.AddTexture(result); }
public void Run(OpsContext context, OpsStatement statement) { Splice2dArgs args = statement.Arguments as Splice2dArgs; ArrayList srcList = statement.GetContent(context); if (srcList.Count != 1) { throw new OpsException("Could not find the source texture. 1 is require but found " + srcList.Count); } OpsTexture srcContainer = ((OpsTexture)srcList[0]); if (!(srcContainer.Texture is Texture)) { throw new OpsException("Source texture is not 2D"); } Texture srcTexture = srcContainer.Texture as Texture; OpsConsole.WriteLine("Splicing texture:{0} into one or more textures", srcContainer.Name); ArrayList dstContainers = context.FindTextures(args.Dst); foreach (OpsTexture dstContainer in dstContainers) { if (dstContainer.Texture is Texture) { Texture dstTexture = dstContainer.Texture as Texture; SurfaceLoader.FromSurface(dstTexture.GetSurfaceLevel(args.Mips), srcTexture.GetSurfaceLevel(0), Filter.Dither | Filter.Triangle | (srcContainer.SRGB?Filter.SrgbIn:0) | (dstContainer.SRGB?Filter.SrgbOut:0), 0); } else if (dstContainer.Texture is VolumeTexture) { VolumeTexture dstTexture = dstContainer.Texture as VolumeTexture; OpsTextureHelper.LoadVolumeSliceFromSurface(dstTexture, args.Mips, args.Volume, Filter.Dither | Filter.Triangle | (srcContainer.SRGB?Filter.SrgbIn:0) | (dstContainer.SRGB?Filter.SrgbOut:0), srcTexture.GetSurfaceLevel(0)); } else if (dstContainer.Texture is CubeTexture) { CubeTexture dstTexture = dstContainer.Texture as CubeTexture; SurfaceLoader.FromSurface(dstTexture.GetCubeMapSurface(args.Face, args.Mips), srcTexture.GetSurfaceLevel(0), Filter.Dither | Filter.Triangle | (srcContainer.SRGB?Filter.SrgbIn:0) | (dstContainer.SRGB?Filter.SrgbOut:0), 0); } } }
/// <summary> /// Renders the scene to each of the 6 faces of the cube map /// </summary> void RenderSceneIntoCubeMap() { // Save transformation matrices of the device Matrix matViewSave, matProjSave; matViewSave = device.Transform.View; matProjSave = device.Transform.Projection; // Set the projection matrix for a field of view of 90 degrees device.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 2, 1.0f, 0.5f, 100.0f); // Get the current view matrix, to concat it with the cubemap view vectors Matrix matViewDir = device.Transform.View; matViewDir.M41 = 0.0f; matViewDir.M42 = 0.0f; matViewDir.M43 = 0.0f; // Store the current backbuffer and zbuffer Surface ourBackBuffer = device.GetRenderTarget(0); // Render to the six faces of the cube map for (int i = 0; i < 6; i++) { // Set the view transform for this cubemap surface Matrix matView = GraphicsUtility.GetCubeMapViewMatrix((CubeMapFace)i); matView = Matrix.Multiply(matViewDir, matView); device.Transform.View = matView; // Set the rendertarget to the i'th cubemap surface Surface cubeMapFace = cubeTex.GetCubeMapSurface((CubeMapFace)i, 0); device.SetRenderTarget(0, cubeMapFace); cubeMapFace.Dispose(); // Render the scene device.BeginScene(); RenderScene(); device.EndScene(); } // Change the rendertarget back to the main backbuffer device.SetRenderTarget(0, ourBackBuffer); ourBackBuffer.Dispose(); // Restore the original transformation matrices device.Transform.Projection = matProjSave; device.Transform.View = matViewSave; }
public static CubeTexture CloneCube(CubeTexture oldTexture, int size, int mips, Format format, Usage usage, Filter filter, Pool pool) { CubeTexture newTexture = new CubeTexture(oldTexture.Device, size, mips, usage, format, pool); SurfaceLoader.FromSurface(newTexture.GetCubeMapSurface(CubeMapFace.NegativeX, 0), oldTexture.GetCubeMapSurface(CubeMapFace.NegativeX, 0), filter, 0); SurfaceLoader.FromSurface(newTexture.GetCubeMapSurface(CubeMapFace.NegativeY, 0), oldTexture.GetCubeMapSurface(CubeMapFace.NegativeY, 0), filter, 0); SurfaceLoader.FromSurface(newTexture.GetCubeMapSurface(CubeMapFace.NegativeZ, 0), oldTexture.GetCubeMapSurface(CubeMapFace.NegativeZ, 0), filter, 0); SurfaceLoader.FromSurface(newTexture.GetCubeMapSurface(CubeMapFace.PositiveX, 0), oldTexture.GetCubeMapSurface(CubeMapFace.PositiveX, 0), filter, 0); SurfaceLoader.FromSurface(newTexture.GetCubeMapSurface(CubeMapFace.PositiveY, 0), oldTexture.GetCubeMapSurface(CubeMapFace.PositiveY, 0), filter, 0); SurfaceLoader.FromSurface(newTexture.GetCubeMapSurface(CubeMapFace.PositiveZ, 0), oldTexture.GetCubeMapSurface(CubeMapFace.PositiveZ, 0), filter, 0); return(newTexture); }
private void RenderCubeMapFace(OpsContext context, CubeTexture newTexture, Surface rt, CubeMapFace face, int mip, int size, bool SRGB) { context.Device.SetRenderTarget(0, rt); ShadeVertex[] vb = new ShadeVertex[] { ShadeVertex.ForCube(-1.0f, -1.0f, size, face), ShadeVertex.ForCube(1.0f, -1.0f, size, face), ShadeVertex.ForCube(-1.0f, 1.0f, size, face), ShadeVertex.ForCube(1.0f, 1.0f, size, face), }; context.Device.BeginScene(); context.Device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 2, vb); context.Device.EndScene(); context.Device.SetRenderTarget(0, context.Device.GetBackBuffer(0, 0, BackBufferType.Mono)); SurfaceLoader.FromSurface(newTexture.GetCubeMapSurface(face, mip), rt, Filter.None | (SRGB?Filter.SrgbOut:0), 0); }
public void UpdateAmbient(int index) { CubeMapFace face = (CubeMapFace)index; Surface cubeSurface = m_ambientRT.GetCubeMapSurface(face, 0); MyRender.GraphicsDevice.SetRenderTarget(0, cubeSurface); BlendState.Opaque.Apply(); MyEffectAmbientPrecalculation precalc = MyRender.GetEffect(MyEffects.AmbientMapPrecalculation) as MyEffectAmbientPrecalculation; precalc.SetEnvironmentMap(this.m_environmentRT); precalc.SetFaceMatrix((Matrix)CreateViewMatrix(face, Vector3D.Zero)); precalc.SetRandomTexture(MyRender.GetRandomTexture()); precalc.SetIterationCount(14); precalc.SetMainVectorWeight(1.0f); precalc.SetBacklightColorAndIntensity(new Vector3(MyRender.Sun.BackColor.X, MyRender.Sun.BackColor.Y, MyRender.Sun.BackColor.Z), MyRender.Sun.BackIntensity); MyRender.GetFullscreenQuad().Draw(precalc); MyRender.SetRenderTarget(null, null); cubeSurface.Dispose(); }
public void UpdateFace(Vector3D position, int faceIndex) { //SetRenderSetup(); CubeMapFace face = (CubeMapFace)faceIndex; // New setup m_setup.CameraPosition = position; m_setup.AspectRatio = 1.0f; m_setup.Viewport = new Viewport(0, 0, (int)m_environmentRT.GetLevelDescription(0).Width, (int)m_environmentRT.GetLevelDescription(0).Width); m_setup.ViewMatrix = CreateViewMatrix(face, position); m_setup.Fov = MathHelper.PiOver2; m_setup.ProjectionMatrix = Matrix.CreatePerspectiveFieldOfView(m_setup.Fov.Value, m_setup.AspectRatio.Value, NearClip, m_setup.LodTransitionBackgroundEnd.Value); m_setup.DepthToAlpha = true; MyRender.GetRenderProfiler().StartProfilingBlock("Draw environmental maps"); MyRender.PushRenderSetupAndApply(m_setup, ref m_backup); MyRender.Draw3D(false); MyRender.GetRenderProfiler().EndProfilingBlock(); Surface cubeSurface = m_environmentRT.GetCubeMapSurface(face, 0); MyRender.GraphicsDevice.SetRenderTarget(0, cubeSurface); var screenEffect = MyRender.GetEffect(MyEffects.Screenshot) as MyEffectScreenshot; screenEffect.SetTechnique(MyEffectScreenshot.ScreenshotTechniqueEnum.Default); screenEffect.SetSourceTexture(m_fullSizeRT); screenEffect.SetScale(new Vector2(m_environmentRT.GetLevelDescription(0).Width / (float)m_fullSizeRT.GetLevelDescription(0).Width, m_environmentRT.GetLevelDescription(0).Height / (float)m_fullSizeRT.GetLevelDescription(0).Height)); MyRender.GetFullscreenQuad().Draw(screenEffect); screenEffect.SetScale(new Vector2(1, 1)); //Texture.ToFile(m_fullSizeRT, "C:\\fullSizeRT.dds", ImageFileFormat.Dds); cubeSurface.Dispose(); MyRender.PopRenderSetupAndRevert(m_backup); }
private void RenderToCubeMapFace(CubeMapFace face, TGCVector3 position) { var cubeMapFace = cubeMap.GetCubeMapSurface(face, 0); D3DDevice.Instance.Device.SetRenderTarget(0, cubeMapFace); D3DDevice.Instance.Device.DepthStencilSurface = depthStencils[(int)face]; TGCMatrix lookAt = LookAtFromCubeMapFace(face, position); D3DDevice.Instance.Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); D3DDevice.Instance.Device.Transform.View = lookAt; D3DDevice.Instance.Device.BeginScene(); RenderBaseScene(); D3DDevice.Instance.Device.EndScene(); if (save) { SurfaceLoader.Save(ShadersDir + "cubemap_" + face.ToString() + ".bmp", ImageFileFormat.Bmp, cubeMapFace); } }
public static CubeTexture CloneCube( CubeTexture oldTexture, int size, int mips, Format format, Usage usage, Filter filter , Pool pool) { CubeTexture newTexture = new CubeTexture(oldTexture.Device, size, mips, usage, format, pool); SurfaceLoader.FromSurface(newTexture.GetCubeMapSurface(CubeMapFace.NegativeX,0), oldTexture.GetCubeMapSurface(CubeMapFace.NegativeX,0), filter, 0); SurfaceLoader.FromSurface(newTexture.GetCubeMapSurface(CubeMapFace.NegativeY,0), oldTexture.GetCubeMapSurface(CubeMapFace.NegativeY,0), filter, 0); SurfaceLoader.FromSurface(newTexture.GetCubeMapSurface(CubeMapFace.NegativeZ,0), oldTexture.GetCubeMapSurface(CubeMapFace.NegativeZ,0), filter, 0); SurfaceLoader.FromSurface(newTexture.GetCubeMapSurface(CubeMapFace.PositiveX,0), oldTexture.GetCubeMapSurface(CubeMapFace.PositiveX,0), filter, 0); SurfaceLoader.FromSurface(newTexture.GetCubeMapSurface(CubeMapFace.PositiveY,0), oldTexture.GetCubeMapSurface(CubeMapFace.PositiveY,0), filter, 0); SurfaceLoader.FromSurface(newTexture.GetCubeMapSurface(CubeMapFace.PositiveZ,0), oldTexture.GetCubeMapSurface(CubeMapFace.PositiveZ,0), filter, 0); return newTexture; }
public static void CopyToCubeSide(OpsContext context, CubeTexture newTexture, string srcArg, CubeMapFace face, Filter filter) { if(srcArg == null || srcArg.Length == 0) return; OpsTexture src = context.GetTexture(srcArg); if(src == null) throw new OpsException("Could not find source texture: "+srcArg ); if(src.Texture is CubeTexture) { SurfaceLoader.FromSurface(newTexture.GetCubeMapSurface(face, 0), ((CubeTexture)src.Texture).GetCubeMapSurface(face,0), filter| (src.SRGB?Filter.SrgbIn:0), 0); } else if (src.Texture is Texture) { SurfaceLoader.FromSurface(newTexture.GetCubeMapSurface(face, 0), ((Texture)src.Texture).GetSurfaceLevel(0), filter| (src.SRGB?Filter.SrgbIn:0), 0); } else throw new OpsException("Source texture is not a texture2D: "+srcArg); }
public override void Render() { PreRender(); var aspectRatio = D3DDevice.Instance.AspectRatio; if (TgcD3dInput.Instance.keyPressed(Key.Space)) { vel_tanque++; if (vel_tanque > 10) { vel_tanque = 0; } } if (TgcD3dInput.Instance.keyPressed(Key.X)) { volar = !volar; } if (TgcD3dInput.Instance.keyPressed(Key.S)) { // swap mesh var mesh_aux = mesh; mesh = meshX; meshX = mesh; } //Cargar variables de shader effect.SetValue("fvLightPosition", new Vector4(0, 400, 0, 0)); effect.SetValue("fvEyePosition", TgcParserUtils.vector3ToFloat3Array(Camara.Position)); effect.SetValue("kx", (float)Modifiers["Reflexion"]); effect.SetValue("kc", (float)Modifiers["Refraccion"]); effect.SetValue("usar_fresnel", (bool)Modifiers["Fresnel"]); time += ElapsedTime; // animar tanque var alfa = -time *Geometry.DegreeToRadian(vel_tanque); var x0 = 2000f * (float)Math.Cos(alfa); var z0 = 2000f * (float)Math.Sin(alfa); float offset_rueda = 13; var H = CalcularAltura(x0, z0) + alto_tanque / 2 - offset_rueda; if (volar) { H += 300; } mesh.Position = new Vector3(x0, H, z0); // direccion tangente sobre el piso: var dir_tanque = new Vector2(-(float)Math.Sin(alfa), (float)Math.Cos(alfa)); dir_tanque.Normalize(); // Posicion de la parte de adelante del tanque var pos2d = new Vector2(x0, z0); pos2d = pos2d + dir_tanque * (largo_tanque / 2); var H_frente = CalcularAltura(pos2d.X, pos2d.Y) + alto_tanque / 2 - offset_rueda; if (volar) { H_frente += 300; } var pos_frente = new Vector3(pos2d.X, H_frente, pos2d.Y); var Vel = pos_frente - mesh.Position; Vel.Normalize(); mesh.Transform = CalcularMatriz(mesh.Position, mesh.Scale, Vel); var beta = -time *Geometry.DegreeToRadian(120.0f); avion.Position = new Vector3(x0 + 300f * (float)Math.Cos(beta), 400 + H, z0 + 300f * (float)Math.Sin(alfa)); dir_avion = new Vector3(-(float)Math.Sin(beta), 0, (float)Math.Cos(beta)); avion.Transform = CalcularMatriz(avion.Position, avion.Scale, dir_avion); CamaraRot.CameraCenter = mesh.BoundingBox.calculateBoxCenter(); // -------------------------------------------------------------------- D3DDevice.Instance.Device.EndScene(); var g_pCubeMap = new CubeTexture(D3DDevice.Instance.Device, 256, 1, Usage.RenderTarget, Format.A16B16G16R16F, Pool.Default); var pOldRT = D3DDevice.Instance.Device.GetRenderTarget(0); // ojo: es fundamental que el fov sea de 90 grados. // asi que re-genero la matriz de proyeccion D3DDevice.Instance.Device.Transform.Projection = Matrix.PerspectiveFovLH(Geometry.DegreeToRadian(90.0f), 1f, 1f, 10000f); // Genero las caras del enviroment map for (var nFace = CubeMapFace.PositiveX; nFace <= CubeMapFace.NegativeZ; ++nFace) { var pFace = g_pCubeMap.GetCubeMapSurface(nFace, 0); D3DDevice.Instance.Device.SetRenderTarget(0, pFace); Vector3 Dir, VUP; Color color; switch (nFace) { default: case CubeMapFace.PositiveX: // Left Dir = new Vector3(1, 0, 0); VUP = new Vector3(0, 1, 0); color = Color.Black; break; case CubeMapFace.NegativeX: // Right Dir = new Vector3(-1, 0, 0); VUP = new Vector3(0, 1, 0); color = Color.Red; break; case CubeMapFace.PositiveY: // Up Dir = new Vector3(0, 1, 0); VUP = new Vector3(0, 0, -1); color = Color.Gray; break; case CubeMapFace.NegativeY: // Down Dir = new Vector3(0, -1, 0); VUP = new Vector3(0, 0, 1); color = Color.Yellow; break; case CubeMapFace.PositiveZ: // Front Dir = new Vector3(0, 0, 1); VUP = new Vector3(0, 1, 0); color = Color.Green; break; case CubeMapFace.NegativeZ: // Back Dir = new Vector3(0, 0, -1); VUP = new Vector3(0, 1, 0); color = Color.Blue; break; } //Obtener ViewMatrix haciendo un LookAt desde la posicion final anterior al centro de la camara var Pos = mesh.Position; D3DDevice.Instance.Device.Transform.View = Matrix.LookAtLH(Pos, Pos + Dir, VUP); D3DDevice.Instance.Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, color, 1.0f, 0); D3DDevice.Instance.Device.BeginScene(); //Renderizar renderScene(ElapsedTime, true); D3DDevice.Instance.Device.EndScene(); //string fname = string.Format("face{0:D}.bmp", nFace); //SurfaceLoader.Save(fname, ImageFileFormat.Bmp, pFace); } // restuaro el render target D3DDevice.Instance.Device.SetRenderTarget(0, pOldRT); //TextureLoader.Save("test.bmp", ImageFileFormat.Bmp, g_pCubeMap); // Restauro el estado de las transformaciones D3DDevice.Instance.Device.Transform.View = Camara.getViewMatrix(); D3DDevice.Instance.Device.Transform.Projection = Matrix.PerspectiveFovLH(Geometry.DegreeToRadian(45.0f), aspectRatio, 1f, 10000f); // dibujo pp dicho D3DDevice.Instance.Device.BeginScene(); D3DDevice.Instance.Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); effect.SetValue("g_txCubeMap", g_pCubeMap); renderScene(ElapsedTime, false); g_pCubeMap.Dispose(); D3DDevice.Instance.Device.EndScene(); D3DDevice.Instance.Device.Present(); }
public void CrearEnvMapAgua() { // creo el enviroment map para el agua g_pCubeMapAgua = new CubeTexture(D3DDevice.Instance.Device, 256, 1, Usage.RenderTarget, Format.A16B16G16R16F, Pool.Default); var pOldRT = D3DDevice.Instance.Device.GetRenderTarget(0); // ojo: es fundamental que el fov sea de 90 grados. // asi que re-genero la matriz de proyeccion D3DDevice.Instance.Device.Transform.Projection = Matrix.PerspectiveFovLH(Geometry.DegreeToRadian(90.0f), 1f, near_plane, far_plane); // Genero las caras del enviroment map for (var nFace = CubeMapFace.PositiveX; nFace <= CubeMapFace.NegativeZ; ++nFace) { var pFace = g_pCubeMapAgua.GetCubeMapSurface(nFace, 0); D3DDevice.Instance.Device.SetRenderTarget(0, pFace); Vector3 Dir, VUP; Color color; switch (nFace) { default: case CubeMapFace.PositiveX: // Left Dir = new Vector3(1, 0, 0); VUP = new Vector3(0, 1, 0); color = Color.Black; break; case CubeMapFace.NegativeX: // Right Dir = new Vector3(-1, 0, 0); VUP = new Vector3(0, 1, 0); color = Color.Red; break; case CubeMapFace.PositiveY: // Up Dir = new Vector3(0, 1, 0); VUP = new Vector3(0, 0, -1); color = Color.Gray; break; case CubeMapFace.NegativeY: // Down Dir = new Vector3(0, -1, 0); VUP = new Vector3(0, 0, 1); color = Color.Yellow; break; case CubeMapFace.PositiveZ: // Front Dir = new Vector3(0, 0, 1); VUP = new Vector3(0, 1, 0); color = Color.Green; break; case CubeMapFace.NegativeZ: // Back Dir = new Vector3(0, 0, -1); VUP = new Vector3(0, 1, 0); color = Color.Blue; break; } var Pos = piso.Position; if (nFace == CubeMapFace.NegativeY) { Pos.Y += 2000; } D3DDevice.Instance.Device.Transform.View = Matrix.LookAtLH(Pos, Pos + Dir, VUP); D3DDevice.Instance.Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, color, 1.0f, 0); D3DDevice.Instance.Device.BeginScene(); //Renderizar: solo algunas cosas: if (nFace == CubeMapFace.NegativeY) { //Renderizar terreno terrain.render(); } else { //Renderizar SkyBox skyBox.render(); // dibujo el bosque foreach (var instance in bosque) { instance.render(); } } var fname = string.Format("face{0:D}.bmp", nFace); //SurfaceLoader.Save(fname, ImageFileFormat.Bmp, pFace); D3DDevice.Instance.Device.EndScene(); } // restuaro el render target D3DDevice.Instance.Device.SetRenderTarget(0, pOldRT); }
public override void Render() { ClearTextures(); D3DDevice.Instance.Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); D3DDevice.Instance.Device.BeginScene(); var aspectRatio = D3DDevice.Instance.AspectRatio; time += ElapsedTime; if (TgcD3dInput.Instance.keyPressed(Key.C)) { timer_preview = 0; camara_rot = !camara_rot; } if (TgcD3dInput.Instance.keyPressed(Key.F)) { if (tipo_vista == 1) { tipo_vista = 0; } else { tipo_vista = 1; } ant_vista = tipo_vista; } if (TgcD3dInput.Instance.keyPressed(Key.D)) { if (tipo_vista == 2) { tipo_vista = ant_vista; } else { tipo_vista = 2; } } if (TgcD3dInput.Instance.keyPressed(Key.Space)) { if (vel_tanque <= 1) { vel_tanque = 10; } else { vel_tanque = 1; } } if (timer_preview > 0) { timer_preview -= ElapsedTime; if (timer_preview < 0) { timer_preview = 0; } } // animar tanque an_tanque -= ElapsedTime * Geometry.DegreeToRadian(vel_tanque); var alfa = an_tanque; var x0 = 2000f * (float)Math.Cos(alfa); var z0 = 2000f * (float)Math.Sin(alfa); float offset_rueda = 10; var H = terrain.CalcularAltura(x0, z0) + alto_tanque / 2 - offset_rueda; if (H < nivel_mar) { H = nivel_mar; } mesh.Position = new Vector3(x0, H, z0); // direccion tangente sobre el piso: var dir_tanque = new Vector2(-(float)Math.Sin(alfa), (float)Math.Cos(alfa)); dir_tanque.Normalize(); // Posicion de la parte de adelante del tanque var pos2d = new Vector2(x0, z0); pos2d = pos2d + dir_tanque * (largo_tanque / 2); var H_frente = terrain.CalcularAltura(pos2d.X, pos2d.Y) + alto_tanque / 2 - offset_rueda; if (H_frente < nivel_mar - 15) { H_frente = nivel_mar - 15; } var pos_frente = new Vector3(pos2d.X, H_frente, pos2d.Y); var Vel = pos_frente - mesh.Position; Vel.Normalize(); mesh.Transform = CalcularMatriz(mesh.Position, mesh.Scale, Vel); // animo la canoa en circulos: alfa = -time *Geometry.DegreeToRadian(10.0f); x0 = 400f * (float)Math.Cos(alfa); z0 = 400f * (float)Math.Sin(alfa); canoa.Position = new Vector3(x0, 150, z0); dir_canoa = new Vector3(-(float)Math.Sin(alfa), 0, (float)Math.Cos(alfa)); canoa.Transform = CalcularMatriz(canoa.Position, canoa.Scale, dir_canoa); alfa_sol += ElapsedTime * Geometry.DegreeToRadian(1.0f); if (alfa_sol > 2.5) { alfa_sol = 1.5f; } // animo la posicion del sol //g_LightPos = new Vector3(1500f * (float)Math.Cos(alfa_sol), 1500f * (float)Math.Sin(alfa_sol), 0f); g_LightPos = new Vector3(2000f * (float)Math.Cos(alfa_sol), 2000f * (float)Math.Sin(alfa_sol), 0f); g_LightDir = -g_LightPos; g_LightDir.Normalize(); if (timer_preview > 0) { var an = -time *Geometry.DegreeToRadian(10.0f); LookFrom.X = 1500f * (float)Math.Sin(an); LookFrom.Z = 1500f * (float)Math.Cos(an); } else { if (camara_rot) { CamaraRot.CameraCenter = mesh.BoundingBox.calculateBoxCenter(); CamaraRot.updateCamera(ElapsedTime); //FIXME, puede que no haga falta esto. Camara = CamaraRot; } else { Camara = DefaultCamera; } } // -------------------------------------------------------------------- D3DDevice.Instance.Device.EndScene(); if (g_pCubeMapAgua == null) { // solo la primera vez crea el env map del agua CrearEnvMapAgua(); // ya que esta creado, se lo asigno al effecto: effect.SetValue("g_txCubeMapAgua", g_pCubeMapAgua); } // Creo el env map del tanque: var g_pCubeMap = new CubeTexture(D3DDevice.Instance.Device, 256, 1, Usage.RenderTarget, Format.A16B16G16R16F, Pool.Default); var pOldRT = D3DDevice.Instance.Device.GetRenderTarget(0); // ojo: es fundamental que el fov sea de 90 grados. // asi que re-genero la matriz de proyeccion D3DDevice.Instance.Device.Transform.Projection = Matrix.PerspectiveFovLH(Geometry.DegreeToRadian(90.0f), 1f, near_plane, far_plane); // Genero las caras del enviroment map for (var nFace = CubeMapFace.PositiveX; nFace <= CubeMapFace.NegativeZ; ++nFace) { var pFace = g_pCubeMap.GetCubeMapSurface(nFace, 0); D3DDevice.Instance.Device.SetRenderTarget(0, pFace); Vector3 Dir, VUP; Color color; switch (nFace) { default: case CubeMapFace.PositiveX: // Left Dir = new Vector3(1, 0, 0); VUP = new Vector3(0, 1, 0); color = Color.Black; break; case CubeMapFace.NegativeX: // Right Dir = new Vector3(-1, 0, 0); VUP = new Vector3(0, 1, 0); color = Color.Red; break; case CubeMapFace.PositiveY: // Up Dir = new Vector3(0, 1, 0); VUP = new Vector3(0, 0, -1); color = Color.Gray; break; case CubeMapFace.NegativeY: // Down Dir = new Vector3(0, -1, 0); VUP = new Vector3(0, 0, 1); color = Color.Yellow; break; case CubeMapFace.PositiveZ: // Front Dir = new Vector3(0, 0, 1); VUP = new Vector3(0, 1, 0); color = Color.Green; break; case CubeMapFace.NegativeZ: // Back Dir = new Vector3(0, 0, -1); VUP = new Vector3(0, 1, 0); color = Color.Blue; break; } //Obtener ViewMatrix haciendo un LookAt desde la posicion final anterior al centro de la camara var Pos = mesh.Position; D3DDevice.Instance.Device.Transform.View = Matrix.LookAtLH(Pos, Pos + Dir, VUP); D3DDevice.Instance.Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, color, 1.0f, 0); D3DDevice.Instance.Device.BeginScene(); //Renderizar renderScene(ElapsedTime, true); D3DDevice.Instance.Device.EndScene(); //string fname = string.Format("face{0:D}.bmp", nFace); //SurfaceLoader.Save(fname, ImageFileFormat.Bmp, pFace); } // restuaro el render target D3DDevice.Instance.Device.SetRenderTarget(0, pOldRT); //TextureLoader.Save("test.bmp", ImageFileFormat.Bmp, g_pCubeMap); //Genero el shadow map RenderShadowMap(); // Restauro el estado de las transformaciones if (timer_preview > 0) { D3DDevice.Instance.Device.Transform.View = Matrix.LookAtLH(LookFrom, LookAt, new Vector3(0, 1, 0)); } else { D3DDevice.Instance.Device.Transform.View = Camara.getViewMatrix(); } // TODO FIX IT! esto no se bien para que lo hace aca. D3DDevice.Instance.Device.Transform.Projection = Matrix.PerspectiveFovLH(Geometry.DegreeToRadian(45.0f), aspectRatio, near_plane, far_plane); // Cargo las var. del shader: effect.SetValue("g_txCubeMap", g_pCubeMap); effect.SetValue("fvLightPosition", new Vector4(0, 400, 0, 0)); effect.SetValue("fvEyePosition", TgcParserUtils.vector3ToFloat3Array(timer_preview > 0 ? LookFrom : Camara.Position)); effect.SetValue("time", time); // ----------------------------------------------------- // dibujo la escena pp dicha: D3DDevice.Instance.Device.BeginScene(); if (tipo_vista != 1) { // con shaders : if (tipo_vista == 2) { // dibujo en una vista: D3DDevice.Instance.Device.Viewport = View1; } else { // dibujo en la pantalla completa D3DDevice.Instance.Device.Viewport = ViewF; } D3DDevice.Instance.Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); // 1ero sin el agua renderScene(ElapsedTime, false); // Ahora dibujo el agua D3DDevice.Instance.Device.RenderState.AlphaBlendEnable = true; effect.SetValue("aux_Tex", terrain.terrainTexture); // posicion de la canoa (divido por la escala) effect.SetValue("canoa_x", x0 / 10.0f); effect.SetValue("canoa_y", z0 / 10.0f); piso.Technique = "RenderAgua"; piso.render(); } if (tipo_vista != 0) { // sin shaders if (tipo_vista == 2) { // dibujo en una vista: D3DDevice.Instance.Device.Viewport = View2; } else { // dibujo en la pantalla completa D3DDevice.Instance.Device.Viewport = ViewF; } D3DDevice.Instance.Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); //Renderizar terreno terrain.render(); //Renderizar SkyBox skyBox.render(); // dibujo el bosque foreach (var instance in bosque) { instance.render(); } // canoa canoa.render(); // tanque mesh.render(); // agua var ant_src = D3DDevice.Instance.Device.RenderState.SourceBlend; var ant_dest = D3DDevice.Instance.Device.RenderState.DestinationBlend; var ant_alpha = D3DDevice.Instance.Device.RenderState.AlphaBlendEnable; D3DDevice.Instance.Device.RenderState.AlphaBlendEnable = true; D3DDevice.Instance.Device.RenderState.SourceBlend = Blend.SourceColor; D3DDevice.Instance.Device.RenderState.DestinationBlend = Blend.InvSourceColor; piso.render(); D3DDevice.Instance.Device.RenderState.SourceBlend = ant_src; D3DDevice.Instance.Device.RenderState.DestinationBlend = ant_dest; D3DDevice.Instance.Device.RenderState.AlphaBlendEnable = ant_alpha; } g_pCubeMap.Dispose(); RenderFPS(); RenderAxis(); D3DDevice.Instance.Device.EndScene(); D3DDevice.Instance.Device.Present(); }
public void Render(AutoManejable AutoFisico1, AutoManejable AutoFisico2, PoliciasIA GrupoPolicias, Core.Camara.TgcCamera Camara, bool juegoDoble) { // Shader Enviroment Map -------------------------------- //D3DDevice.Instance.Device.EndScene(); var g_pCubeMap = new CubeTexture(D3DDevice.Instance.Device, 256, 1, Usage.RenderTarget, Format.A16B16G16R16F, Pool.Default); var pOldRT2 = D3DDevice.Instance.Device.GetRenderTarget(0); D3DDevice.Instance.Device.Transform.Projection = TGCMatrix.PerspectiveFovLH(Geometry.DegreeToRadian(90.0f), 1f, 1f, 10000f).ToMatrix(); // Genero las caras del enviroment map for (var nFace = CubeMapFace.PositiveX; nFace <= CubeMapFace.NegativeZ; ++nFace) { var pFace = g_pCubeMap.GetCubeMapSurface(nFace, 0); D3DDevice.Instance.Device.SetRenderTarget(0, pFace); TGCVector3 Dir, VUP; Color color; switch (nFace) { default: case CubeMapFace.PositiveX: // Left Dir = new TGCVector3(1, 0, 0); VUP = TGCVector3.Up; color = Color.Black; break; case CubeMapFace.NegativeX: // Right Dir = new TGCVector3(-1, 0, 0); VUP = TGCVector3.Up; color = Color.Red; break; case CubeMapFace.PositiveY: // Up Dir = TGCVector3.Up; VUP = new TGCVector3(0, 0, -1); color = Color.Gray; break; case CubeMapFace.NegativeY: // Down Dir = TGCVector3.Down; VUP = new TGCVector3(0, 0, 1); color = Color.Yellow; break; case CubeMapFace.PositiveZ: // Front Dir = new TGCVector3(0, 0, 1); VUP = TGCVector3.Up; color = Color.Green; break; case CubeMapFace.NegativeZ: // Back Dir = new TGCVector3(0, 0, -1); VUP = TGCVector3.Up; color = Color.Blue; break; } D3DDevice.Instance.Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, color, 1.0f, 0); //Renderizar foreach (var mesh in AutoFisico1.Mayas) { mesh.Effect = EnvMap; mesh.Technique = "RenderScene"; mesh.Render(); } if (juegoDoble) { foreach (var mesh in AutoFisico2.Mayas) { mesh.Effect = EnvMap; mesh.Technique = "RenderScene"; mesh.Render(); } } } D3DDevice.Instance.Device.SetRenderTarget(0, pOldRT2); D3DDevice.Instance.Device.Transform.View = Camara.GetViewMatrix().ToMatrix(); D3DDevice.Instance.Device.Transform.Projection = TGCMatrix.PerspectiveFovLH(Geometry.DegreeToRadian(45.0f), D3DDevice.Instance.AspectRatio, 1f, 10000f).ToMatrix(); //D3DDevice.Instance.Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); EnvMap.SetValue("g_txCubeMap", g_pCubeMap); foreach (var mesh in AutoFisico1.Mayas) { mesh.Effect = EnvMap; mesh.Technique = "RenderScene"; mesh.Render(); } foreach (var rueda in AutoFisico1.Ruedas) { rueda.Effect = EnvMap; rueda.Technique = "RenderScene"; rueda.Render(); } foreach (var mesh in GrupoPolicias.Todos[0].Mayas) { mesh.Effect = EnvMap; mesh.Technique = "RenderScene"; mesh.Render(); } if (juegoDoble) { foreach (var mesh in AutoFisico2.Mayas) { mesh.Effect = EnvMap; mesh.Technique = "RenderScene"; mesh.Render(); } foreach (var rueda in AutoFisico2.Ruedas) { rueda.Effect = EnvMap; rueda.Technique = "RenderScene"; rueda.Render(); } } g_pCubeMap.Dispose(); //------------------------------------------------------------- }
void renderEnvMap() { Device d3dDevice = GuiController.Instance.D3dDevice; //////////////////////////////////////////////////////////RENDER DEL ENIVROMENTAL MAPPING Matrix old_proy = d3dDevice.Transform.Projection; d3dDevice.Transform.Projection = Matrix.PerspectiveFovLH(Geometry.DegreeToRadian(90.0f), 1f, 1f, 10000f); for (CubeMapFace nFace = CubeMapFace.PositiveX; nFace <= CubeMapFace.NegativeZ; ++nFace) { Surface pFace = g_pCubeMap.GetCubeMapSurface(nFace, 0); d3dDevice.SetRenderTarget(0, pFace); Vector3 Dir, VUP; Color color; switch (nFace) { default: case CubeMapFace.PositiveX: // Left Dir = new Vector3(1, 0, 0); VUP = new Vector3(0, 1, 0); color = Color.Black; break; case CubeMapFace.NegativeX: // Right Dir = new Vector3(-1, 0, 0); VUP = new Vector3(0, 1, 0); color = Color.Red; break; case CubeMapFace.PositiveY: // Up Dir = new Vector3(0, 1, 0); VUP = new Vector3(0, 0, -1); color = Color.Gray; break; case CubeMapFace.NegativeY: // Down Dir = new Vector3(0, -1, 0); VUP = new Vector3(0, 0, 1); color = Color.Yellow; break; case CubeMapFace.PositiveZ: // Front Dir = new Vector3(0, 0, 1); VUP = new Vector3(0, 1, 0); color = Color.Green; break; case CubeMapFace.NegativeZ: // Back Dir = new Vector3(0, 0, -1); VUP = new Vector3(0, 1, 0); color = Color.Blue; break; } //Obtener ViewMatrix haciendo un LookAt desde la posicion final anterior al centro de la camara Vector3 Pos = ball.pos; d3dDevice.Transform.View = Matrix.LookAtLH(Pos, Pos + Dir, VUP); d3dDevice.Clear(ClearFlags.Target | ClearFlags.ZBuffer, color, 1.0f, 0); d3dDevice.BeginScene(); //Renderizar earth.ex_render(false); earth2.ex_render(false); foreach (C_Hoja x in hojas) { x.ex_render(false); } foreach (TgcMesh face in skyBox.Faces) { face.render(); //.executeRender(); } water.ex_render(false); d3dDevice.EndScene(); } d3dDevice.Transform.Projection = old_proy; }
private void RenderCubeMapFace(OpsContext context, CubeTexture newTexture, Surface rt, CubeMapFace face, int mip, int size, bool SRGB) { context.Device.SetRenderTarget(0, rt); ShadeVertex[] vb = new ShadeVertex[] { ShadeVertex.ForCube(-1.0f, -1.0f, size, face), ShadeVertex.ForCube( 1.0f, -1.0f, size, face), ShadeVertex.ForCube(-1.0f, 1.0f, size, face), ShadeVertex.ForCube( 1.0f, 1.0f, size, face), }; context.Device.BeginScene(); context.Device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 2, vb); context.Device.EndScene(); context.Device.SetRenderTarget(0, context.Device.GetBackBuffer(0, 0, BackBufferType.Mono) ); SurfaceLoader.FromSurface(newTexture.GetCubeMapSurface(face, mip), rt, Filter.None| (SRGB?Filter.SrgbOut:0), 0); }
private void crearEnvMapShip() { g_pCubeMap = new CubeTexture(device, 256, 1, Usage.RenderTarget, Format.A16B16G16R16F, Pool.Default); Surface pOldRT = device.GetRenderTarget(0); //Re-genero la matriz de proyeccion device.Transform.Projection = Matrix.PerspectiveFovLH(Geometry.DegreeToRadian(90.0f), 1f, near_plane, far_plane); // Genero las caras del enviroment map for (CubeMapFace nFace = CubeMapFace.PositiveX; nFace <= CubeMapFace.NegativeZ; ++nFace) { Surface pFace = g_pCubeMap.GetCubeMapSurface(nFace, 0); device.SetRenderTarget(0, pFace); Vector3 Dir, VUP; Color color; switch (nFace) { default: case CubeMapFace.PositiveX: // Left Dir = new Vector3(1, 0, 0); VUP = new Vector3(0, 1, 0); color = Color.Black; break; case CubeMapFace.NegativeX: // Right Dir = new Vector3(-1, 0, 0); VUP = new Vector3(0, 1, 0); color = Color.Red; break; case CubeMapFace.PositiveY: // Up Dir = new Vector3(0, 1, 0); VUP = new Vector3(0, 0, -1); color = Color.Gray; break; case CubeMapFace.NegativeY: // Down Dir = new Vector3(0, -1, 0); VUP = new Vector3(0, 0, 1); color = Color.Yellow; break; case CubeMapFace.PositiveZ: // Front Dir = new Vector3(0, 0, 1); VUP = new Vector3(0, 1, 0); color = Color.Green; break; case CubeMapFace.NegativeZ: // Back Dir = new Vector3(0, 0, -1); VUP = new Vector3(0, 1, 0); color = Color.Blue; break; } //Obtener ViewMatrix haciendo un LookAt desde la posicion final anterior al centro de la camara Vector3 Pos = ship.Position; device.Transform.View = Matrix.LookAtLH(Pos, Pos + Dir, VUP); device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, color, 1.0f, 0); device.BeginScene(); //Renderizar renderScene(GuiController.Instance.ElapsedTime, true); device.EndScene(); //string fname = string.Format("face{0:D}.bmp", nFace); //SurfaceLoader.Save(fname, ImageFileFormat.Bmp, pFace); } // restuaro el render target device.SetRenderTarget(0, pOldRT); }
public override void render(float elapsedTime) { Device device = GuiController.Instance.D3dDevice; Control panel3d = GuiController.Instance.Panel3d; float aspectRatio = (float)panel3d.Width / (float)panel3d.Height; time += elapsedTime; if (GuiController.Instance.D3dInput.keyPressed(Microsoft.DirectX.DirectInput.Key.C)) { timer_preview = 0; camara_rot = !camara_rot; } if (GuiController.Instance.D3dInput.keyPressed(Microsoft.DirectX.DirectInput.Key.F)) { if (tipo_vista == 1) tipo_vista = 0; else tipo_vista = 1; ant_vista = tipo_vista; } if (GuiController.Instance.D3dInput.keyPressed(Microsoft.DirectX.DirectInput.Key.D)) { if (tipo_vista == 2) tipo_vista = ant_vista; else tipo_vista = 2; } if (GuiController.Instance.D3dInput.keyPressed(Microsoft.DirectX.DirectInput.Key.Space)) { if (vel_tanque <= 1) vel_tanque = 10; else vel_tanque = 1; } if (timer_preview>0) { timer_preview -= elapsedTime; if (timer_preview < 0) timer_preview = 0; } // animar tanque an_tanque -= elapsedTime * Geometry.DegreeToRadian(vel_tanque); float alfa = an_tanque; float x0 = 2000f * (float)Math.Cos(alfa); float z0 = 2000f * (float)Math.Sin(alfa); float offset_rueda = 10; float H = terrain.CalcularAltura(x0, z0) + alto_tanque / 2 - offset_rueda; if (H < nivel_mar) H = nivel_mar; mesh.Position = new Vector3(x0, H, z0); // direccion tangente sobre el piso: Vector2 dir_tanque = new Vector2(-(float)Math.Sin(alfa), (float)Math.Cos(alfa)); dir_tanque.Normalize(); // Posicion de la parte de adelante del tanque Vector2 pos2d = new Vector2(x0, z0); pos2d = pos2d + dir_tanque * (largo_tanque / 2); float H_frente = terrain.CalcularAltura(pos2d.X, pos2d.Y) + alto_tanque / 2 - offset_rueda; if (H_frente < nivel_mar-15) H_frente = nivel_mar-15; Vector3 pos_frente = new Vector3(pos2d.X, H_frente, pos2d.Y); Vector3 Vel = pos_frente - mesh.Position; Vel.Normalize(); mesh.Transform = CalcularMatriz(mesh.Position, mesh.Scale, Vel); // animo la canoa en circulos: alfa = -time * Geometry.DegreeToRadian(10.0f); x0 = 400f * (float)Math.Cos(alfa); z0 = 400f * (float)Math.Sin(alfa); canoa.Position = new Vector3(x0, 150, z0); dir_canoa = new Vector3(-(float)Math.Sin(alfa), 0, (float)Math.Cos(alfa)); canoa.Transform = CalcularMatriz(canoa.Position, canoa.Scale, dir_canoa); alfa_sol += elapsedTime* Geometry.DegreeToRadian(1.0f); if (alfa_sol > 2.5) alfa_sol = 1.5f; // animo la posicion del sol //g_LightPos = new Vector3(1500f * (float)Math.Cos(alfa_sol), 1500f * (float)Math.Sin(alfa_sol), 0f); g_LightPos = new Vector3(2000f * (float)Math.Cos(alfa_sol), 2000f * (float)Math.Sin(alfa_sol), 0f); g_LightDir = -g_LightPos; g_LightDir.Normalize(); if (timer_preview > 0) { float an = -time * Geometry.DegreeToRadian(10.0f); LookFrom.X = 1500f * (float)Math.Sin(an); LookFrom.Z = 1500f * (float)Math.Cos(an); } else { if (camara_rot) { GuiController.Instance.RotCamera.targetObject(mesh.BoundingBox); GuiController.Instance.CurrentCamera.updateCamera(); } else { GuiController.Instance.RotCamera.CameraCenter = new Vector3(0, 200, 0); GuiController.Instance.RotCamera.CameraDistance = 2000; GuiController.Instance.RotCamera.RotationSpeed = 1f; GuiController.Instance.RotCamera.ZoomFactor = 0.1f; } } // -------------------------------------------------------------------- device.EndScene(); if (g_pCubeMapAgua == null) { // solo la primera vez crea el env map del agua CrearEnvMapAgua(); // ya que esta creado, se lo asigno al effecto: effect.SetValue("g_txCubeMapAgua", g_pCubeMapAgua); } // Creo el env map del tanque: CubeTexture g_pCubeMap = new CubeTexture(device, 256, 1, Usage.RenderTarget, Format.A16B16G16R16F, Pool.Default); Surface pOldRT = device.GetRenderTarget(0); // ojo: es fundamental que el fov sea de 90 grados. // asi que re-genero la matriz de proyeccion device.Transform.Projection = Matrix.PerspectiveFovLH(Geometry.DegreeToRadian(90.0f),1f, near_plane,far_plane); // Genero las caras del enviroment map for (CubeMapFace nFace = CubeMapFace.PositiveX; nFace <= CubeMapFace.NegativeZ; ++nFace) { Surface pFace = g_pCubeMap.GetCubeMapSurface(nFace, 0); device.SetRenderTarget(0, pFace); Vector3 Dir, VUP; Color color; switch (nFace) { default: case CubeMapFace.PositiveX: // Left Dir = new Vector3(1, 0, 0); VUP = new Vector3(0, 1, 0); color = Color.Black; break; case CubeMapFace.NegativeX: // Right Dir = new Vector3(-1, 0, 0); VUP = new Vector3(0, 1, 0); color = Color.Red; break; case CubeMapFace.PositiveY: // Up Dir = new Vector3(0, 1, 0); VUP = new Vector3(0, 0, -1); color = Color.Gray; break; case CubeMapFace.NegativeY: // Down Dir = new Vector3(0, -1, 0); VUP = new Vector3(0, 0, 1); color = Color.Yellow; break; case CubeMapFace.PositiveZ: // Front Dir = new Vector3(0, 0, 1); VUP = new Vector3(0, 1, 0); color = Color.Green; break; case CubeMapFace.NegativeZ: // Back Dir = new Vector3(0, 0, -1); VUP = new Vector3(0, 1, 0); color = Color.Blue; break; } //Obtener ViewMatrix haciendo un LookAt desde la posicion final anterior al centro de la camara Vector3 Pos = mesh.Position; device.Transform.View = Matrix.LookAtLH(Pos, Pos + Dir, VUP); device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, color, 1.0f, 0); device.BeginScene(); //Renderizar renderScene(elapsedTime, true); device.EndScene(); //string fname = string.Format("face{0:D}.bmp", nFace); //SurfaceLoader.Save(fname, ImageFileFormat.Bmp, pFace); } // restuaro el render target device.SetRenderTarget(0, pOldRT); //TextureLoader.Save("test.bmp", ImageFileFormat.Bmp, g_pCubeMap); //Genero el shadow map RenderShadowMap(); // Restauro el estado de las transformaciones if (timer_preview > 0) device.Transform.View = Matrix.LookAtLH(LookFrom,LookAt,new Vector3(0,1,0)); else GuiController.Instance.CurrentCamera.updateViewMatrix(device); device.Transform.Projection = Matrix.PerspectiveFovLH(Geometry.DegreeToRadian(45.0f), aspectRatio, near_plane, far_plane); // Cargo las var. del shader: effect.SetValue("g_txCubeMap", g_pCubeMap); effect.SetValue("fvLightPosition", new Vector4(0, 400, 0, 0)); effect.SetValue("fvEyePosition", TgcParserUtils.vector3ToFloat3Array(timer_preview > 0 ? LookFrom : GuiController.Instance.RotCamera.getPosition())); effect.SetValue("time", time); // ----------------------------------------------------- // dibujo la escena pp dicha: device.BeginScene(); if (tipo_vista != 1) { // con shaders : if (tipo_vista == 2) // dibujo en una vista: device.Viewport = View1; else // dibujo en la pantalla completa device.Viewport = ViewF; device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); // 1ero sin el agua renderScene(elapsedTime, false); // Ahora dibujo el agua device.RenderState.AlphaBlendEnable = true; effect.SetValue("aux_Tex", terrain.terrainTexture); // posicion de la canoa (divido por la escala) effect.SetValue("canoa_x", x0 / 10.0f); effect.SetValue("canoa_y", z0 / 10.0f); piso.Technique = "RenderAgua"; piso.render(); } if (tipo_vista != 0) { // sin shaders if (tipo_vista == 2) // dibujo en una vista: device.Viewport = View2; else // dibujo en la pantalla completa device.Viewport = ViewF; device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); //Renderizar terreno terrain.render(); //Renderizar SkyBox skyBox.render(); // dibujo el bosque foreach (TgcMesh instance in bosque) instance.render(); // canoa ((TgcMesh)canoa).render(); // tanque ((TgcMesh)mesh).render(); // agua Blend ant_src = device.RenderState.SourceBlend; Blend ant_dest = device.RenderState.DestinationBlend; bool ant_alpha = device.RenderState.AlphaBlendEnable; device.RenderState.AlphaBlendEnable = true; device.RenderState.SourceBlend = Blend.SourceColor; device.RenderState.DestinationBlend = Blend.InvSourceColor; ((TgcMesh)piso).render(); device.RenderState.SourceBlend = ant_src; device.RenderState.DestinationBlend = ant_dest; device.RenderState.AlphaBlendEnable = ant_alpha; } g_pCubeMap.Dispose(); }
public void CrearEnvMapAgua() { // creo el enviroment map para el agua Device device = GuiController.Instance.D3dDevice; g_pCubeMapAgua = new CubeTexture(device, 256, 1, Usage.RenderTarget, Format.A16B16G16R16F, Pool.Default); Surface pOldRT = device.GetRenderTarget(0); // ojo: es fundamental que el fov sea de 90 grados. // asi que re-genero la matriz de proyeccion device.Transform.Projection = Matrix.PerspectiveFovLH(Geometry.DegreeToRadian(90.0f), 1f, near_plane, far_plane); // Genero las caras del enviroment map for (CubeMapFace nFace = CubeMapFace.PositiveX; nFace <= CubeMapFace.NegativeZ; ++nFace) { Surface pFace = g_pCubeMapAgua.GetCubeMapSurface(nFace, 0); device.SetRenderTarget(0, pFace); Vector3 Dir, VUP; Color color; switch (nFace) { default: case CubeMapFace.PositiveX: // Left Dir = new Vector3(1, 0, 0); VUP = new Vector3(0, 1, 0); color = Color.Black; break; case CubeMapFace.NegativeX: // Right Dir = new Vector3(-1, 0, 0); VUP = new Vector3(0, 1, 0); color = Color.Red; break; case CubeMapFace.PositiveY: // Up Dir = new Vector3(0, 1, 0); VUP = new Vector3(0, 0, -1); color = Color.Gray; break; case CubeMapFace.NegativeY: // Down Dir = new Vector3(0, -1, 0); VUP = new Vector3(0, 0, 1); color = Color.Yellow; break; case CubeMapFace.PositiveZ: // Front Dir = new Vector3(0, 0, 1); VUP = new Vector3(0, 1, 0); color = Color.Green; break; case CubeMapFace.NegativeZ: // Back Dir = new Vector3(0, 0, -1); VUP = new Vector3(0, 1, 0); color = Color.Blue; break; } Vector3 Pos = piso.Position; if (nFace == CubeMapFace.NegativeY) Pos.Y += 2000; device.Transform.View = Matrix.LookAtLH(Pos, Pos + Dir, VUP); device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, color, 1.0f, 0); device.BeginScene(); //Renderizar: solo algunas cosas: if (nFace == CubeMapFace.NegativeY) { //Renderizar terreno terrain.render(); } else { //Renderizar SkyBox skyBox.render(); // dibujo el bosque foreach (TgcMesh instance in bosque) instance.render(); } string fname = string.Format("face{0:D}.bmp", nFace); //SurfaceLoader.Save(fname, ImageFileFormat.Bmp, pFace); device.EndScene(); } // restuaro el render target device.SetRenderTarget(0, pOldRT); }
private void AplicarShaderEnvironment() { this.autoPrincipal.getMesh().Effect = efectoShaderEnvironmentMap; var aspectRatio = D3DDevice.Instance.AspectRatio; efectoShaderEnvironmentMap.SetValue("fvLightPosition", new Vector4(0, 100, 0, 0)); efectoShaderEnvironmentMap.SetValue("fvEyePosition", TgcParserUtils.vector3ToFloat3Array(this.autoPrincipal.getCamara().Position)); efectoShaderEnvironmentMap.SetValue("kx", (float)0.1); efectoShaderEnvironmentMap.SetValue("kc", (float)0.25); efectoShaderEnvironmentMap.SetValue("usar_fresnel", false); D3DDevice.Instance.Device.EndScene(); var g_pCubeMap = new CubeTexture(D3DDevice.Instance.Device, 256, 1, Usage.RenderTarget, Format.A16B16G16R16F, Pool.Default); var pOldRT = D3DDevice.Instance.Device.GetRenderTarget(0); // ojo: es fundamental que el fov sea de 90 grados. // asi que re-genero la matriz de proyeccion D3DDevice.Instance.Device.Transform.Projection = Matrix.PerspectiveFovLH(Geometry.DegreeToRadian(90.0f), 1f, 1f, 10000f); // Genero las caras del enviroment map for (var nFace = CubeMapFace.PositiveX; nFace <= CubeMapFace.NegativeZ; ++nFace) { var pFace = g_pCubeMap.GetCubeMapSurface(nFace, 0); D3DDevice.Instance.Device.SetRenderTarget(0, pFace); Vector3 Dir, VUP; Color color; switch (nFace) { default: case CubeMapFace.PositiveX: // Left Dir = new Vector3(1, 0, 0); VUP = new Vector3(0, 1, 0); color = Color.Black; break; case CubeMapFace.NegativeX: // Right Dir = new Vector3(-1, 0, 0); VUP = new Vector3(0, 1, 0); color = Color.Red; break; case CubeMapFace.PositiveY: // Up Dir = new Vector3(0, 1, 0); VUP = new Vector3(0, 0, -1); color = Color.Gray; break; case CubeMapFace.NegativeY: // Down Dir = new Vector3(0, -1, 0); VUP = new Vector3(0, 0, 1); color = Color.Yellow; break; case CubeMapFace.PositiveZ: // Front Dir = new Vector3(0, 0, 1); VUP = new Vector3(0, 1, 0); color = Color.Green; break; case CubeMapFace.NegativeZ: // Back Dir = new Vector3(0, 0, -1); VUP = new Vector3(0, 1, 0); color = Color.Blue; break; } D3DDevice.Instance.Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, color, 1.0f, 0); D3DDevice.Instance.Device.BeginScene(); //Renderizar // renderScene(ElapsedTime, true); renderScene(1, true); D3DDevice.Instance.Device.EndScene(); //string fname = string.Format("face{0:D}.bmp", nFace); //SurfaceLoader.Save(fname, ImageFileFormat.Bmp, pFace); } // restuaro el render target D3DDevice.Instance.Device.SetRenderTarget(0, pOldRT); //TextureLoader.Save("test.bmp", ImageFileFormat.Bmp, g_pCubeMap); // Restauro el estado de las transformaciones D3DDevice.Instance.Device.Transform.View = this.autoPrincipal.getCamara().GetViewMatrix(); D3DDevice.Instance.Device.Transform.Projection = Matrix.PerspectiveFovLH(Geometry.DegreeToRadian(45.0f), aspectRatio, 1f, 10000f); // dibujo pp dicho D3DDevice.Instance.Device.BeginScene(); D3DDevice.Instance.Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); efectoShaderEnvironmentMap.SetValue("g_txCubeMap", g_pCubeMap); // renderScene(ElapsedTime, false); renderScene(1, false); g_pCubeMap.Dispose(); D3DDevice.Instance.Device.EndScene(); D3DDevice.Instance.Device.Present(); }
public override void Render() { PreRender(); ClearTextures(); bool invisibilidadActivada = (SwitchInvisibilidadJ1 - 1 == SwitchCamara) || (SwitchInvisibilidadJ2 == SwitchCamara); //Permito las particulas D3DDevice.Instance.ParticlesEnabled = true; D3DDevice.Instance.EnableParticles(); switch (SwitchInicio) { case 1: { Hud.PantallaInicio(); if (Input.keyPressed(Key.C)) { SwitchInicio = 2; } if (Input.keyPressed(Key.D1)) { Jugadores[1] = null; SwitchInicio = 3; SwitchMusica = true; SwitchFX = true; AutoFisico1.Encendido(); inGame = true; } if (Input.keyPressed(Key.D2)) { juegoDoble = true; SwitchInicio = 4; SwitchMusica = true; SwitchFX = true; SwitchCamara = 3; AutoFisico1.Encendido(); AutoFisico2.Encendido(); inGame = true; } break; } case 2: { Hud.PantallaControles(); if (Input.keyPressed(Key.V)) { SwitchInicio = 1; } break; } case 3: { var device = D3DDevice.Instance.Device; Tiempo += ElapsedTime; AutoFisico1.ElapsedTime = ElapsedTime; AutoFisico1.FXActivado = SwitchFX; // ShaderInvisibilidad ----- Invisibilidad.Technique = "DefaultTechnique"; var pOldRT = device.GetRenderTarget(0); var pSurf = g_pRenderTarget.GetSurfaceLevel(0); if (invisibilidadActivada) { device.SetRenderTarget(0, pSurf); } var pOldDS = device.DepthStencilSurface; if (invisibilidadActivada) { device.DepthStencilSurface = g_pDepthStencil; } device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); //--------------------------- Plaza.RenderAll(); AutoFisico1.Render(ElapsedTime); GrupoPolicias.Render(ElapsedTime); Cielo.Render(); pSurf.Dispose(); if (invisibilidadActivada) { device.DepthStencilSurface = pOldDS; device.SetRenderTarget(0, pOldRT); Invisibilidad.Technique = "PostProcess"; Invisibilidad.SetValue("time", Tiempo); device.VertexFormat = CustomVertex.PositionTextured.Format; device.SetStreamSource(0, g_pVBV3D, 0); Invisibilidad.SetValue("g_RenderTarget", g_pRenderTarget); device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); Invisibilidad.Begin(FX.None); Invisibilidad.BeginPass(0); device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2); Invisibilidad.EndPass(); Invisibilidad.End(); } Hud.Juego(invisibilidadActivada, JugadorActivo, juegoDoble, pantallaDoble, AutoFisico1, AutoFisico2); if (AutoFisico1.Vida < 0) { TiempoFinal = Tiempo; Sonidos.SuenaGameOver(); SwitchInicio = 5; } if (Input.keyDown(Key.F10)) { Hud.Pausar(); } // Shader Enviroment Map -------------------------------- //D3DDevice.Instance.Device.EndScene(); var g_pCubeMap = new CubeTexture(D3DDevice.Instance.Device, 256, 1, Usage.RenderTarget, Format.A16B16G16R16F, Pool.Default); var pOldRT2 = D3DDevice.Instance.Device.GetRenderTarget(0); D3DDevice.Instance.Device.Transform.Projection = TGCMatrix.PerspectiveFovLH(Geometry.DegreeToRadian(90.0f), 1f, 1f, 10000f).ToMatrix(); // Genero las caras del enviroment map for (var nFace = CubeMapFace.PositiveX; nFace <= CubeMapFace.NegativeZ; ++nFace) { var pFace = g_pCubeMap.GetCubeMapSurface(nFace, 0); D3DDevice.Instance.Device.SetRenderTarget(0, pFace); TGCVector3 Dir, VUP; Color color; switch (nFace) { default: case CubeMapFace.PositiveX: // Left Dir = new TGCVector3(1, 0, 0); VUP = TGCVector3.Up; color = Color.Black; break; case CubeMapFace.NegativeX: // Right Dir = new TGCVector3(-1, 0, 0); VUP = TGCVector3.Up; color = Color.Red; break; case CubeMapFace.PositiveY: // Up Dir = TGCVector3.Up; VUP = new TGCVector3(0, 0, -1); color = Color.Gray; break; case CubeMapFace.NegativeY: // Down Dir = TGCVector3.Down; VUP = new TGCVector3(0, 0, 1); color = Color.Yellow; break; case CubeMapFace.PositiveZ: // Front Dir = new TGCVector3(0, 0, 1); VUP = TGCVector3.Up; color = Color.Green; break; case CubeMapFace.NegativeZ: // Back Dir = new TGCVector3(0, 0, -1); VUP = TGCVector3.Up; color = Color.Blue; break; } D3DDevice.Instance.Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, color, 1.0f, 0); //Renderizar foreach (var mesh in AutoFisico1.Mayas) { mesh.Effect = EnvMap; mesh.Technique = "RenderScene"; mesh.Render(); } } D3DDevice.Instance.Device.SetRenderTarget(0, pOldRT2); D3DDevice.Instance.Device.Transform.View = Camara.GetViewMatrix().ToMatrix(); D3DDevice.Instance.Device.Transform.Projection = TGCMatrix.PerspectiveFovLH(Geometry.DegreeToRadian(45.0f), D3DDevice.Instance.AspectRatio, 1f, 10000f).ToMatrix(); //D3DDevice.Instance.Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); EnvMap.SetValue("g_txCubeMap", g_pCubeMap); foreach (var mesh in AutoFisico1.Mayas) { mesh.Effect = EnvMap; mesh.Technique = "RenderScene"; mesh.Render(); } foreach (var rueda in AutoFisico1.Ruedas) { rueda.Effect = EnvMap; rueda.Technique = "RenderScene"; rueda.Render(); } foreach (var mesh in GrupoPolicias.Todos[0].Mayas) { mesh.Effect = EnvMap; mesh.Technique = "RenderScene"; mesh.Render(); } g_pCubeMap.Dispose(); //------------------------------------------------------------- Hud.Tiempo(FastMath.Floor(Tiempo)); break; } case 4: { var device = D3DDevice.Instance.Device; Tiempo += ElapsedTime; AutoFisico1.ElapsedTime = ElapsedTime; AutoFisico2.ElapsedTime = ElapsedTime; AutoFisico1.FXActivado = SwitchFX; AutoFisico2.FXActivado = SwitchFX; // ShaderInvisibilidad ----- Invisibilidad.Technique = "DefaultTechnique"; var pOldRT = device.GetRenderTarget(0); var pSurf = g_pRenderTarget.GetSurfaceLevel(0); if (invisibilidadActivada) { device.SetRenderTarget(0, pSurf); } var pOldDS = device.DepthStencilSurface; if (invisibilidadActivada) { device.DepthStencilSurface = g_pDepthStencil; } device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); //-------------------------- DrawText.drawText("Velocidad P1:" + AutoFisico1.Velocidad, 0, 90, Color.Green); Plaza.RenderAll(); AutoFisico1.Render(ElapsedTime); AutoFisico2.Render(ElapsedTime); GrupoPolicias.Render(ElapsedTime); Cielo.Render(); pSurf.Dispose(); if (invisibilidadActivada) { device.DepthStencilSurface = pOldDS; device.SetRenderTarget(0, pOldRT); Invisibilidad.Technique = "PostProcess"; Invisibilidad.SetValue("time", Tiempo); device.VertexFormat = CustomVertex.PositionTextured.Format; device.SetStreamSource(0, g_pVBV3D, 0); Invisibilidad.SetValue("g_RenderTarget", g_pRenderTarget); device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); Invisibilidad.Begin(FX.None); Invisibilidad.BeginPass(0); device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2); Invisibilidad.EndPass(); Invisibilidad.End(); } Hud.Juego(invisibilidadActivada, JugadorActivo, juegoDoble, pantallaDoble, AutoFisico1, AutoFisico2); if (AutoFisico1.Vida < 0) { Hud.GanoJ2(); SwitchCamara = 2; Jugadores[1] = null; Sonidos.SuenaAplausos(); inGame = false; } if (AutoFisico2.Vida < 0) { Hud.GanoJ1(); SwitchCamara = 1; Jugadores[0] = null; Sonidos.SuenaAplausos(); inGame = false; } if (Input.keyDown(Key.F10)) { Hud.Pausar(); } if (Input.keyDown(Key.F10)) { Hud.Pausar(); } // Shader Enviroment Map -------------------------------- //D3DDevice.Instance.Device.EndScene(); var g_pCubeMap = new CubeTexture(D3DDevice.Instance.Device, 256, 1, Usage.RenderTarget, Format.A16B16G16R16F, Pool.Default); var pOldRT2 = D3DDevice.Instance.Device.GetRenderTarget(0); D3DDevice.Instance.Device.Transform.Projection = TGCMatrix.PerspectiveFovLH(Geometry.DegreeToRadian(90.0f), 1f, 1f, 10000f).ToMatrix(); // Genero las caras del enviroment map for (var nFace = CubeMapFace.PositiveX; nFace <= CubeMapFace.NegativeZ; ++nFace) { var pFace = g_pCubeMap.GetCubeMapSurface(nFace, 0); D3DDevice.Instance.Device.SetRenderTarget(0, pFace); TGCVector3 Dir, VUP; Color color; switch (nFace) { default: case CubeMapFace.PositiveX: // Left Dir = new TGCVector3(1, 0, 0); VUP = TGCVector3.Up; color = Color.Black; break; case CubeMapFace.NegativeX: // Right Dir = new TGCVector3(-1, 0, 0); VUP = TGCVector3.Up; color = Color.Red; break; case CubeMapFace.PositiveY: // Up Dir = TGCVector3.Up; VUP = new TGCVector3(0, 0, -1); color = Color.Gray; break; case CubeMapFace.NegativeY: // Down Dir = TGCVector3.Down; VUP = new TGCVector3(0, 0, 1); color = Color.Yellow; break; case CubeMapFace.PositiveZ: // Front Dir = new TGCVector3(0, 0, 1); VUP = TGCVector3.Up; color = Color.Green; break; case CubeMapFace.NegativeZ: // Back Dir = new TGCVector3(0, 0, -1); VUP = TGCVector3.Up; color = Color.Blue; break; } D3DDevice.Instance.Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, color, 1.0f, 0); //Renderizar foreach (var mesh in AutoFisico1.Mayas) { mesh.Effect = EnvMap; mesh.Technique = "RenderScene"; mesh.Render(); } foreach (var mesh in AutoFisico2.Mayas) { mesh.Effect = EnvMap; mesh.Technique = "RenderScene"; mesh.Render(); } } D3DDevice.Instance.Device.SetRenderTarget(0, pOldRT2); D3DDevice.Instance.Device.Transform.View = Camara.GetViewMatrix().ToMatrix(); D3DDevice.Instance.Device.Transform.Projection = TGCMatrix.PerspectiveFovLH(Geometry.DegreeToRadian(45.0f), D3DDevice.Instance.AspectRatio, 1f, 10000f).ToMatrix(); //D3DDevice.Instance.Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); EnvMap.SetValue("g_txCubeMap", g_pCubeMap); foreach (var mesh in AutoFisico1.Mayas) { mesh.Effect = EnvMap; mesh.Technique = "RenderScene"; mesh.Render(); } foreach (var mesh in AutoFisico2.Mayas) { mesh.Effect = EnvMap; mesh.Technique = "RenderScene"; mesh.Render(); } foreach (var rueda in AutoFisico1.Ruedas) { rueda.Effect = EnvMap; rueda.Technique = "RenderScene"; rueda.Render(); } foreach (var mesh in GrupoPolicias.Todos[0].Mayas) { mesh.Effect = EnvMap; mesh.Technique = "RenderScene"; mesh.Render(); } g_pCubeMap.Dispose(); //------------------------------------------------------------- Hud.Tiempo(FastMath.Floor(Tiempo)); break; } case 5: { SwitchFX = false; SwitchMusica = false; inGame = false; Hud.JuegoTerminado(); Hud.TiempoFinal(FastMath.Floor(TiempoFinal)); if (Input.keyPressed(Key.M)) { SwitchInicio = 1; } break; } } PostRender(); }
public override void render(float elapsedTime) { Device device = GuiController.Instance.D3dDevice; Control panel3d = GuiController.Instance.Panel3d; float aspectRatio = (float)panel3d.Width / (float)panel3d.Height; if (GuiController.Instance.D3dInput.keyPressed(Microsoft.DirectX.DirectInput.Key.Space)) { vel_tanque++; if (vel_tanque > 10) vel_tanque = 0; } if (GuiController.Instance.D3dInput.keyPressed(Microsoft.DirectX.DirectInput.Key.X)) volar = !volar; if (GuiController.Instance.D3dInput.keyPressed(Microsoft.DirectX.DirectInput.Key.S)) { // swap mesh TgcMesh mesh_aux = mesh; mesh = meshX; meshX = mesh; } //Cargar variables de shader effect.SetValue("fvLightPosition", new Vector4(0,400,0,0)); effect.SetValue("fvEyePosition", TgcParserUtils.vector3ToFloat3Array(GuiController.Instance.RotCamera.getPosition())); effect.SetValue("kx", (float)GuiController.Instance.Modifiers["Reflexion"]); effect.SetValue("kc", (float)GuiController.Instance.Modifiers["Refraccion"]); effect.SetValue("usar_fresnel", (bool)GuiController.Instance.Modifiers["Fresnel"]); time += elapsedTime; // animar tanque float alfa = -time * Geometry.DegreeToRadian(vel_tanque); float x0 = 2000f * (float)Math.Cos(alfa); float z0 = 2000f * (float)Math.Sin(alfa); float offset_rueda = 13; float H = CalcularAltura(x0, z0) + alto_tanque / 2 - offset_rueda; if (volar) H += 300; mesh.Position = new Vector3(x0, H, z0); // direccion tangente sobre el piso: Vector2 dir_tanque = new Vector2(-(float)Math.Sin(alfa), (float)Math.Cos(alfa)); dir_tanque.Normalize(); // Posicion de la parte de adelante del tanque Vector2 pos2d = new Vector2(x0, z0); pos2d = pos2d + dir_tanque * (largo_tanque / 2); float H_frente = CalcularAltura(pos2d.X, pos2d.Y) + alto_tanque / 2 - offset_rueda; if (volar) H_frente += 300; Vector3 pos_frente = new Vector3(pos2d.X, H_frente, pos2d.Y); Vector3 Vel = pos_frente - mesh.Position; Vel.Normalize(); mesh.Transform = CalcularMatriz(mesh.Position, mesh.Scale, Vel); float beta = -time * Geometry.DegreeToRadian(120.0f); avion.Position = new Vector3(x0 + 300f * (float)Math.Cos(beta), 400 + H, z0 + 300f * (float)Math.Sin(alfa)); dir_avion = new Vector3(-(float)Math.Sin(beta), 0, (float)Math.Cos(beta)); avion.Transform = CalcularMatriz(avion.Position, avion.Scale, dir_avion); GuiController.Instance.RotCamera.targetObject(mesh.BoundingBox); GuiController.Instance.CurrentCamera.updateCamera(); // -------------------------------------------------------------------- device.EndScene(); CubeTexture g_pCubeMap = new CubeTexture(device, 256, 1, Usage.RenderTarget, Format.A16B16G16R16F, Pool.Default); Surface pOldRT = device.GetRenderTarget(0); // ojo: es fundamental que el fov sea de 90 grados. // asi que re-genero la matriz de proyeccion device.Transform.Projection = Matrix.PerspectiveFovLH(Geometry.DegreeToRadian(90.0f), 1f, 1f, 10000f); // Genero las caras del enviroment map for (CubeMapFace nFace = CubeMapFace.PositiveX; nFace <= CubeMapFace.NegativeZ; ++nFace) { Surface pFace = g_pCubeMap.GetCubeMapSurface(nFace, 0); device.SetRenderTarget(0, pFace); Vector3 Dir, VUP; Color color; switch (nFace) { default: case CubeMapFace.PositiveX: // Left Dir = new Vector3(1, 0, 0); VUP = new Vector3(0, 1, 0); color = Color.Black; break; case CubeMapFace.NegativeX: // Right Dir = new Vector3(-1, 0, 0); VUP = new Vector3(0, 1, 0); color = Color.Red; break; case CubeMapFace.PositiveY: // Up Dir = new Vector3(0, 1, 0); VUP = new Vector3(0, 0, -1); color = Color.Gray; break; case CubeMapFace.NegativeY: // Down Dir = new Vector3(0, -1, 0); VUP = new Vector3(0, 0, 1); color = Color.Yellow; break; case CubeMapFace.PositiveZ: // Front Dir = new Vector3(0, 0, 1); VUP = new Vector3(0, 1, 0); color = Color.Green; break; case CubeMapFace.NegativeZ: // Back Dir = new Vector3(0, 0, -1); VUP = new Vector3(0, 1, 0); color = Color.Blue; break; } //Obtener ViewMatrix haciendo un LookAt desde la posicion final anterior al centro de la camara Vector3 Pos = mesh.Position; device.Transform.View = Matrix.LookAtLH(Pos, Pos + Dir, VUP); device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, color, 1.0f, 0); device.BeginScene(); //Renderizar renderScene(elapsedTime, true); device.EndScene(); //string fname = string.Format("face{0:D}.bmp", nFace); //SurfaceLoader.Save(fname, ImageFileFormat.Bmp, pFace); } // restuaro el render target device.SetRenderTarget(0, pOldRT); //TextureLoader.Save("test.bmp", ImageFileFormat.Bmp, g_pCubeMap); // Restauro el estado de las transformaciones GuiController.Instance.CurrentCamera.updateViewMatrix(device); device.Transform.Projection = Matrix.PerspectiveFovLH(Geometry.DegreeToRadian(45.0f), aspectRatio, 1f, 10000f); // dibujo pp dicho device.BeginScene(); device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); effect.SetValue("g_txCubeMap", g_pCubeMap); renderScene(elapsedTime, false); g_pCubeMap.Dispose(); }