Advertisement
Guest User

Untitled

a guest
Jul 5th, 2011
256
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.00 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using Microsoft.Xna.Framework;
  4. using Microsoft.Xna.Framework.Graphics;
  5.  
  6.  
  7. namespace PlanetTutorial
  8. {
  9.  
  10.     public class RenderTargetState
  11.     {
  12.         public RenderTarget2D RenderTarget;
  13.         //public DepthStencilBuffer DepthBuffer;
  14.         GraphicsDevice GraphicsDevice;
  15.         RenderTargetState oldState;
  16.  
  17.         bool CreatedBuffers;
  18.  
  19.         int renderTargetWidth, renderTargetHeight;
  20.         int depthBufferWidth, depthBufferHeight;
  21.  
  22.         public RenderTargetState(GraphicsDevice GraphicsDevice,
  23.                                  int renderTargetIndex)
  24.         {
  25.             this.GraphicsDevice = GraphicsDevice;
  26.             RenderTarget =
  27.                 (RenderTarget2D)GraphicsDevice.GetRenderTarget(renderTargetIndex);
  28.             //DepthBuffer = GraphicsDevice.DepthStencilBuffer;
  29.             CreatedBuffers = false;
  30.         }
  31.  
  32.         public RenderTargetState(GraphicsDevice GraphicsDevice)
  33.             :
  34.                     this(GraphicsDevice, 0)
  35.         {
  36.  
  37.         }
  38.  
  39.         public RenderTargetState(GraphicsDevice GraphicsDevice,
  40.                                  int renderTargetWidth,
  41.                                  int renderTargetHeight)
  42.             : this(GraphicsDevice,
  43.                    renderTargetWidth,
  44.                    renderTargetHeight,
  45.                    renderTargetWidth,
  46.                    renderTargetHeight)
  47.         {
  48.         }
  49.  
  50.         public RenderTargetState(GraphicsDevice GraphicsDevice,
  51.                                  int renderTargetWidth,
  52.                                  int renderTargetHeight,
  53.                                  int depthBufferWidth,
  54.                                  int depthBufferHeight)
  55.         {
  56.             this.GraphicsDevice = GraphicsDevice;
  57.  
  58.             this.renderTargetWidth = renderTargetWidth;
  59.             this.renderTargetHeight = renderTargetHeight;
  60.             this.depthBufferWidth = depthBufferWidth;
  61.             this.depthBufferHeight = depthBufferHeight;
  62.  
  63.             CreateBuffers();
  64.  
  65.             CreatedBuffers = true;
  66.  
  67.             GraphicsDevice.DeviceReset +=
  68.                 new EventHandler(GraphicsDevice_DeviceReset);
  69.  
  70.             GraphicsDevice.DeviceResetting +=
  71.                 new EventHandler(GraphicsDevice_DeviceResetting);
  72.         }
  73.  
  74.         private void CreateBuffers()
  75.         {
  76.             RenderTarget =
  77.                 new RenderTarget2D(
  78.                     GraphicsDevice,
  79.                     renderTargetWidth,
  80.                     renderTargetHeight,
  81.                     1,
  82.                     RenderTargetHelper.SelectRenderTargetMode(false));
  83.  
  84.             //DepthBuffer =
  85.                 //new DepthStencilBuffer(
  86.                 //    GraphicsDevice,
  87.                 //    depthBufferWidth,
  88.                 //    depthBufferHeight,
  89.                 //    GraphicsDevice.DepthStencilBuffer.Format);
  90.         }
  91.  
  92.         void GraphicsDevice_DeviceReset(object sender, EventArgs e)
  93.         {
  94.             if (CreatedBuffers)
  95.                 CreateBuffers();
  96.         }
  97.  
  98.         void GraphicsDevice_DeviceResetting(object sender, EventArgs e)
  99.         {
  100.             DestroyBuffers();
  101.         }
  102.  
  103.         public RenderTargetState SetToDevice()
  104.         {
  105.             return SetToDevice(0);
  106.         }
  107.  
  108.         public RenderTargetState SetToDevice(int renderTargetIndex)
  109.         {
  110.             oldState = new RenderTargetState(GraphicsDevice,
  111.                                              renderTargetIndex);
  112.  
  113.             GraphicsDevice.SetRenderTarget(//renderTargetIndex,
  114.                                            RenderTarget);
  115.             //GraphicsDevice.DepthStencilBuffer = DepthBuffer;
  116.  
  117.             return oldState;
  118.         }
  119.  
  120.         public void DestroyBuffers()
  121.         {
  122.             oldState = null;
  123.  
  124.             if (CreatedBuffers)
  125.             {
  126.                 if (RenderTarget != null)
  127.                 {
  128.                     RenderTarget.Dispose();
  129.                     RenderTarget = null;
  130.                 }
  131.                 //if (DepthBuffer != null)
  132.                 //{
  133.                 //    DepthBuffer.Dispose();
  134.                 //    DepthBuffer = null;
  135.                 //}
  136.             }
  137.         }
  138.  
  139.         public RenderTargetState BeginRenderToTexture()
  140.         {
  141.             oldState = SetToDevice();
  142.  
  143.             return oldState;
  144.         }
  145.  
  146.         public RenderTargetState BeginRenderToTexture(int renderTargetIndex)
  147.         {
  148.             oldState = SetToDevice(renderTargetIndex);
  149.  
  150.             return oldState;
  151.         }
  152.  
  153.         public RenderTargetState EndRenderToTexture()
  154.         {
  155.             return EndRenderToTexture(0);
  156.         }
  157.  
  158.         public RenderTargetState EndRenderToTexture(int renderTargetIndex)
  159.         {
  160.             RenderTargetState renderBuffer =
  161.                     oldState.SetToDevice(renderTargetIndex);
  162.  
  163.             oldState = null;
  164.  
  165.             return renderBuffer;
  166.         }
  167.  
  168.         public Texture2D EndRenderGetTexture()
  169.         {
  170.             return EndRenderGetTexture(0);
  171.         }
  172.  
  173.         public Texture2D EndRenderGetTexture(int renderTargetIndex)
  174.         {
  175.             RenderTargetState renderBuffer =
  176.                     oldState.SetToDevice(renderTargetIndex);
  177.  
  178.             oldState = null;
  179.  
  180.             return renderBuffer.RenderTarget;
  181.         }
  182.     }
  183.  
  184.     public class RenderTargetHelper
  185.     {
  186.         public static DepthFormat SelectStencilMode(
  187.                                         SurfaceFormat renderTargetFormat)
  188.         {
  189.             // Check stencil formats
  190.             GraphicsAdapter adapter = GraphicsAdapter.DefaultAdapter;
  191.             SurfaceFormat format = adapter.CurrentDisplayMode.Format;
  192.  
  193.             DepthFormat depthFormat = DepthFormat.Unknown;
  194.  
  195.  
  196.             if (adapter.CheckDepthStencilMatch(
  197.                         DeviceType.Hardware,
  198.                         format,
  199.                         renderTargetFormat,
  200.                         DepthFormat.Depth24Stencil8))
  201.             {
  202.                 depthFormat = DepthFormat.Depth24Stencil8;
  203.             }
  204.             else if (adapter.CheckDepthStencilMatch(
  205.                         DeviceType.Hardware,
  206.                         format,
  207.                         renderTargetFormat,
  208.                         DepthFormat.Depth24Stencil8Single))
  209.             {
  210.                 depthFormat = DepthFormat.Depth24Stencil8Single;
  211.             }
  212.             else if (adapter.CheckDepthStencilMatch(
  213.                         DeviceType.Hardware,
  214.                         format,
  215.                         renderTargetFormat,
  216.                         DepthFormat.Depth24Stencil4))
  217.             {
  218.                 depthFormat = DepthFormat.Depth24Stencil4;
  219.             }
  220.             else if (adapter.CheckDepthStencilMatch(
  221.                         DeviceType.Hardware,
  222.                         format,
  223.                         renderTargetFormat,
  224.                         DepthFormat.Depth15Stencil1))
  225.             {
  226.                 depthFormat = DepthFormat.Depth15Stencil1;
  227.             }
  228.             else if (adapter.CheckDepthStencilMatch(
  229.                         DeviceType.Reference,
  230.                         format,
  231.                         renderTargetFormat,
  232.                         DepthFormat.Depth24Stencil8))
  233.             {
  234.                 depthFormat = DepthFormat.Depth24Stencil8;
  235.             }
  236.             else if (adapter.CheckDepthStencilMatch(
  237.                         DeviceType.Reference,
  238.                         format,
  239.                         renderTargetFormat,
  240.                         DepthFormat.Depth24Stencil8Single))
  241.             {
  242.                 depthFormat = DepthFormat.Depth24Stencil8Single;
  243.             }
  244.             else if (adapter.CheckDepthStencilMatch(
  245.                         DeviceType.Reference,
  246.                         format,
  247.                         renderTargetFormat,
  248.                         DepthFormat.Depth24Stencil4))
  249.             {
  250.                 depthFormat = DepthFormat.Depth24Stencil4;
  251.             }
  252.             else if (adapter.CheckDepthStencilMatch(
  253.                         DeviceType.Reference,
  254.                         format,
  255.                         renderTargetFormat,
  256.                         DepthFormat.Depth15Stencil1))
  257.             {
  258.                 depthFormat = DepthFormat.Depth15Stencil1;
  259.             }
  260.  
  261.             return depthFormat;
  262.         }
  263.  
  264.  
  265.         public static SurfaceFormat SelectRenderTargetMode(bool preferFloat)
  266.         {
  267.             // Check stencil formats
  268.             GraphicsAdapter adapter = GraphicsAdapter.DefaultAdapter;
  269.             SurfaceFormat displayFormat = adapter.CurrentDisplayMode.Format;
  270.  
  271.             DepthFormat depthFormat = SelectStencilMode(displayFormat);
  272.  
  273.             SurfaceFormat surfaceFormat = SurfaceFormat.Color;
  274.  
  275.             if (preferFloat)
  276.             {
  277.                 if (adapter.CheckDepthStencilMatch(
  278.                             DeviceType.Hardware,
  279.                             displayFormat,
  280.                             SurfaceFormat.Single,
  281.                             depthFormat))
  282.                 {
  283.                     surfaceFormat = SurfaceFormat.Single;
  284.                 }
  285.                 else if (adapter.CheckDepthStencilMatch(
  286.                             DeviceType.Hardware,
  287.                             displayFormat,
  288.                             SurfaceFormat.HalfSingle,
  289.                             depthFormat))
  290.                 {
  291.                     surfaceFormat = SurfaceFormat.HalfSingle;
  292.                 }
  293.                 else if (adapter.CheckDepthStencilMatch(
  294.                             DeviceType.Hardware,
  295.                             displayFormat,
  296.                             SurfaceFormat.Color,
  297.                             depthFormat))
  298.                 {
  299.                     surfaceFormat = SurfaceFormat.Color;
  300.                 }
  301.                 else if (adapter.CheckDepthStencilMatch(
  302.                             DeviceType.Reference,
  303.                             displayFormat,
  304.                             SurfaceFormat.Single,
  305.                             depthFormat))
  306.                 {
  307.                     surfaceFormat = SurfaceFormat.Single;
  308.                 }
  309.                 else if (adapter.CheckDepthStencilMatch(
  310.                             DeviceType.Reference,
  311.                             displayFormat,
  312.                             SurfaceFormat.HalfSingle,
  313.                             depthFormat))
  314.                 {
  315.                     surfaceFormat = SurfaceFormat.HalfSingle;
  316.                 }
  317.                 else if (adapter.CheckDepthStencilMatch(
  318.                             DeviceType.Reference,
  319.                             displayFormat,
  320.                             SurfaceFormat.Color,
  321.                             depthFormat))
  322.                 {
  323.                     surfaceFormat = SurfaceFormat.Color;
  324.                 }
  325.                 else
  326.                 {
  327.                     surfaceFormat = SurfaceFormat.Unknown;
  328.                 }
  329.             }
  330.  
  331.             return surfaceFormat;
  332.         }
  333.     }
  334. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement