new post | browse code | authors | help | about

LuaBin 2.0

Viewing file root / lua / postprocess / super_dof.lua

  1.  
  2. PANEL = {}
  3.  
  4. local Distance                  = 256
  5. local BlurSize                  = 0.5
  6. local pnlWindow                 = nil
  7.  
  8. local Window                    = nil
  9. local Status                    = "Preview"
  10.  
  11.  
  12. local sldDistance       = nil
  13. local lblDistance               = nil
  14. local lblSize                   = nil
  15. local FocusGrabber      = false
  16. local ScreenshotTimer   = 0
  17.  
  18. local strTitle          = Localize( "SuperDOF_WindowTitle", "Super DOF" )
  19. local strBlurSize       = Localize( "SuperDOF_BlurSize", "Blur Size:" )
  20. local strDistance       = Localize( "SuperDOF_Distance", "Focus Distance:" )
  21. local strRender         = Localize( "SuperDOF_Render", "Render" )
  22. local strScreenshot = Localize( "SuperDOF_Screenshot", "Save Screenshot" )
  23. local strOpenWindow = Localize( "SuperDoF_Open", "Open Window" )
  24. local strInformation =  Localize( "SuperDoF_Warning", "Warning: This is VERY experimental so it might not totally work on your graphics card. \n\nThis effect is not realtime. You render it and then save a screenshot of your render. Also, you will have low fps when previewing - that's normal.")
  25.  
  26.  
  27. function PANEL:Init()
  28.  
  29.         self:SetTitle( strTitle )
  30.         self:SetRenderInScreenshots( false )
  31.  
  32.         self.BlurSize = vgui.Create( "DNumSlider", self )
  33.                 self.BlurSize:SetMin( 0 )
  34.                 self.BlurSize:SetMax( 10 )
  35.                 self.BlurSize:SetDecimals( 3 )
  36.                 self.BlurSize:SetText( strBlurSize )
  37.                 self.BlurSize:SetValue( BlurSize )
  38.                 function self.BlurSize:OnValueChanged( val ) BlurSize = val end
  39.        
  40.         self.Distance = vgui.Create( "DNumSlider", self )
  41.                 self.Distance:SetMin( 0 )
  42.                 self.Distance:SetMax( 4096 )
  43.                 self.Distance:SetText( strDistance )
  44.                 self.Distance:SetValue( Distance )
  45.                 function self.Distance:OnValueChanged( val ) Distance = val end
  46.                
  47.  
  48.         self.Render = vgui.Create( "DButton", self )
  49.                 self.Render:SetText( strRender )
  50.                 function self.Render:DoClick() Status = "Render" end
  51.                
  52.         self.Screenshot = vgui.Create( "DButton", self )
  53.                 self.Screenshot:SetText( strScreenshot )
  54.                 function self.Screenshot:DoClick() RunConsoleCommand( "jpeg" ) end
  55.  
  56. end
  57.  
  58. function PANEL:ChangeDistanceTo( dist )
  59.  
  60.         self.Distance:SetValue( dist )
  61.  
  62. end
  63.  
  64. function PANEL:PerformLayout()
  65.  
  66.         self:SetSize( 300, 180 )
  67.        
  68.         DFrame.PerformLayout( self )
  69.        
  70.         self.BlurSize:SetPos( 5, 35 )
  71.         self.BlurSize:StretchToParent( 20, nil, 20, nil )
  72.         self.BlurSize:SetTall( 45 )
  73.        
  74.         self.Distance:StretchToParent( 20, nil, 20, nil )
  75.         self.Distance:SetTall( 45 )    
  76.         self.Distance:MoveBelow( self.BlurSize, 5 )
  77.        
  78.         self.Render:SetWide( 100 )
  79.         self.Render:MoveBelow( self.Distance, 10 )
  80.         self.Render:AlignRight( 20 )
  81.        
  82.         self.Screenshot:CopyBounds( self.Render )
  83.         self.Screenshot:MoveLeftOf( self.Render, 10 )
  84.  
  85. end
  86.  
  87. local paneltypeSuperDOF = vgui.RegisterTable( PANEL, "DFrame" )
  88.  
  89.  
  90. local texFSB = render.GetSuperFPTex()
  91. local matFSB = Material( "pp/motionblur" )
  92. local matFB      = Material( "pp/fb" )
  93.  
  94. local function RenderDoF( vOrigin, vAngle, vFocus, fAngleSize, radial_steps, passes, drawhud )
  95.  
  96.         local OldRT     = render.GetRenderTarget();
  97.         local view              = {  x = 0, y = 0, w = ScrW(), h = ScrH(), drawhud = drawhud }
  98.         local fDistance = vOrigin:Distance( vFocus )
  99.        
  100.         fAngleSize = fAngleSize * math.Clamp( 256/fDistance, 0.1, 1 ) * 0.5
  101.        
  102.         view.origin = vOrigin
  103.         view.angles = vAngle
  104.        
  105.         // Straight render (to act as a canvas)
  106.         render.RenderView( view )
  107.        
  108.         render.SetRenderTarget( texFSB )
  109.                         matFB:SetMaterialFloat( "$alpha", 1  )
  110.                         render.SetMaterial( matFB )
  111.                         render.DrawScreenQuad()
  112.        
  113.         local Radials = (math.pi*2) / radial_steps
  114.        
  115.         for mul=(1 / passes), 1, (1 / passes) do
  116.        
  117.                 for i=0,(math.pi*2), Radials do
  118.                
  119.                         local VA = vAngle * 1 // hack - this makes it copy the angles instead of the reference
  120.                        
  121.                         // Rotate around the focus point
  122.                         VA:RotateAroundAxis( vAngle:Right(),    math.sin( i + (mul) ) * fAngleSize * mul )
  123.                         VA:RotateAroundAxis( vAngle:Up(),               math.cos( i + (mul) ) * fAngleSize * mul )
  124.                        
  125.                         ViewOrigin = vFocus - VA:Forward() * fDistance
  126.                        
  127.                         view.origin = ViewOrigin
  128.                         view.angles = VA
  129.                        
  130.                         // Render to the front buffer
  131.                         render.SetRenderTarget( OldRT )
  132.                         render.Clear( 0, 0, 0, 255, true )
  133.                         render.RenderView( view )
  134.                         render.UpdateScreenEffectTexture()
  135.                        
  136.                         // Copy it to our floating point buffer at a reduced alpha
  137.                         render.SetRenderTarget( texFSB )
  138.                         local alpha = (Radials/(math.pi*2))             // Divide alpha by number of radials
  139.                         alpha = alpha * (1-mul)                                 // Reduce alpha the further away from center we are
  140.                         matFB:SetMaterialFloat( "$alpha", alpha  )
  141.                        
  142.  
  143.                                 render.SetMaterial( matFB )
  144.                                 render.DrawScreenQuad()
  145.  
  146.                
  147.                 end
  148.                
  149.         end
  150.        
  151.         // Restore RT
  152.         render.SetRenderTarget( OldRT )
  153.        
  154.         // Render our result buffer to the screen
  155.         matFSB:SetMaterialFloat( "$alpha", 1 )
  156.         matFSB:SetMaterialTexture( "$basetexture", texFSB )
  157.                
  158.         render.SetMaterial( matFSB )
  159.         render.DrawScreenQuad()
  160.  
  161. end
  162.  
  163. function RenderSuperDoF( ViewOrigin, ViewAngles )
  164.  
  165.         if ( FocusGrabber ) then
  166.        
  167.                 Distance = tr.HitPos:Distance( ViewOrigin )
  168.                 Status = "Preview"
  169.        
  170.                 pnlWindow:ChangeDistanceTo( Distance )
  171.        
  172.         end
  173.  
  174.         local FocusPoint = ViewOrigin + ViewAngles:Forward() * Distance
  175.        
  176.         if ( Status == "Preview" ) then
  177.                
  178.                 // A low quality, pretty quickly drawn rough outline
  179.                 RenderDoF( ViewOrigin, ViewAngles, FocusPoint, BlurSize, 2, 2, 1 )
  180.                
  181.         elseif ( Status == "Render" ) then
  182.                
  183.                 // A great quality render..
  184.                 RenderDoF( ViewOrigin, ViewAngles, FocusPoint, BlurSize, 16, 8, 1 )
  185.                 Status = "ViewShot"
  186.        
  187.         elseif ( Status == "ViewShot" ) then
  188.                
  189.                 matFSB:SetMaterialFloat( "$alpha", 1 )
  190.                 matFSB:SetMaterialTexture( "$basetexture", texFSB )
  191.                 render.SetMaterial( matFSB )
  192.                 render.DrawScreenQuad()
  193.                
  194.         end
  195.        
  196. end
  197.  
  198. local function RenderSceneHook( ViewOrigin, ViewAngles )
  199.  
  200.         if ( !ValidPanel( pnlWindow ) ) then return end
  201.        
  202.         // Don't render it when the console is up
  203.         if ( FrameTime() == 0 ) then return end
  204.        
  205.         RenderSuperDoF( ViewOrigin, ViewAngles );
  206.         return true;
  207.  
  208. end
  209.  
  210.  
  211. hook.Add( "RenderScene", "RenderSuperDoF", RenderSceneHook )
  212.  
  213.  
  214. local function OpenWindow()
  215.  
  216.         Status = "Preview"
  217.        
  218.         if ( ValidPanel( pnlWindow ) ) then
  219.        
  220.                 pnlWindow:MakePopup()
  221.                 pnlWindow:AlignBottom( 50 )
  222.                 pnlWindow:CenterHorizontal()
  223.                 pnlWindow:SetKeyboardInputEnabled( false )
  224.        
  225.         return end
  226.        
  227.         pnlWindow = vgui.CreateFromTable( paneltypeSuperDOF )
  228.        
  229.         pnlWindow:InvalidateLayout( true )
  230.         pnlWindow:MakePopup()
  231.         pnlWindow:AlignBottom( 50 )
  232.         pnlWindow:CenterHorizontal()
  233.         pnlWindow:SetKeyboardInputEnabled( false )
  234.  
  235. end
  236.  
  237. concommand.Add( "pp_superdof", OpenWindow )
  238.  
  239.  
  240. /*---------------------------------------------------------
  241.    Mouse button down
  242. ---------------------------------------------------------*/  
  243. local function MouseDown( mouse )
  244.  
  245.         if ( !ValidPanel(pnlWindow) ) then return end
  246.  
  247.         vgui.GetWorldPanel():MouseCapture( true )
  248.         FocusGrabber = true
  249.  
  250. end
  251.  
  252.  
  253. /*---------------------------------------------------------
  254.    Mouse button released
  255. ---------------------------------------------------------*/  
  256. local function MouseUp( mouse )
  257.  
  258.         if ( !ValidPanel(pnlWindow) ) then return end
  259.        
  260.         vgui.GetWorldPanel():MouseCapture( false )
  261.         FocusGrabber = false
  262.        
  263. end
  264.  
  265. hook.Add( "GUIMousePressed", "SuperDOFMouseDown", MouseDown )
  266. hook.Add( "GUIMouseReleased", "SuperDOFMouseUp", MouseUp )
  267.  
  268.  
  269. /*
  270. // Control Panel
  271. */
  272. local function BuildControlPanel( CPanel )
  273.  
  274.         CPanel:Help( strInformation )
  275.         CPanel:Button( strOpenWindow, "pp_superdof" )
  276.        
  277. end
  278.  
  279. /*
  280. // Tool Menu
  281. */
  282. local function AddPostProcessMenu()
  283.  
  284.         spawnmenu.AddToolMenuOption( "PostProcessing", "PPShader", "SuperDoF", "#Super DoF", "", "", BuildControlPanel )
  285.  
  286. end
  287.  
  288. hook.Add( "PopulateToolMenu", "AddPostProcessMenu_SuperDoF", AddPostProcessMenu )
  289.