Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        /// <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();
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
                }
            }
        }
Beispiel #6
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;
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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);
        }
Beispiel #11
0
        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);

        }
Beispiel #14
0
        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();
        }
Beispiel #15
0
        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);
        }
Beispiel #16
0
        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();
            //-------------------------------------------------------------
        }
Beispiel #18
0
        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;
        }
Beispiel #19
0
        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);
        }
Beispiel #20
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);
        }
Beispiel #21
0
        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();

        }
Beispiel #22
0
        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();
        }
Beispiel #25
0
        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();
        }