Outlines.scrapeh 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. //////////////////////////////////////////////////////////////////////////////
  2. // ©2007 Electronic Arts Inc
  3. //
  4. // Scrape script for the Outlines post effect
  5. //////////////////////////////////////////////////////////////////////////////
  6. #ifndef SCRAPE_SCRIPT_OUTLINES_SCRAPEH
  7. #define SCRAPE_SCRIPT_OUTLINES_SCRAPEH
  8. #define TEST_TEXTURE_SIZES 0
  9. #if TEST_TEXTURE_SIZES
  10. //#define TEXTURESIZE_X 512
  11. //#define TEXTURESIZE_Y 512
  12. //#define TEXTURESIZE_X 512
  13. //#define TEXTURESIZE_Y 384
  14. //#define TEXTURESIZE_X 1024
  15. //#define TEXTURESIZE_Y 768
  16. //#define TEXTURESIZE_X 256
  17. //#define TEXTURESIZE_Y 192
  18. //#define TEXTURESIZE_X 640
  19. //#define TEXTURESIZE_Y 360
  20. #else
  21. #define TEXTURESIZE_X $WW3D.Outline.TextureSize.x
  22. #define TEXTURESIZE_Y $WW3D.Outline.TextureSize.y
  23. #endif
  24. #if defined(EA_PLATFORM_WINDOWS)
  25. // This texture needs to be the same size as the frame buffer so the outlines
  26. // don't show up as offset.
  27. var texture OutlineTextureFill $WW3D.FrameBufferSize.x $WW3D.FrameBufferSize.y A8R8G8B8
  28. var surface OutlineRenderTargetFill edram $WW3D.FrameBufferSizeIfAntiAliasing.x $WW3D.FrameBufferSizeIfAntiAliasing.y A8R8G8B8 $WW3D.AntiAliasingMode
  29. var texture OutlineTexture TEXTURESIZE_X TEXTURESIZE_Y A8R8G8B8
  30. #define OutlineRenderTarget OutlineTexture
  31. #elif defined(EA_PLATFORM_XENON)
  32. #if defined(SCRAPE_SCRIPT_POSTFX_DISTORTION_SCRAPEH)
  33. // Save some memory (4 MB when in 720p) by using the same texture as the distortion post effect
  34. #define OutlineTexture DistortionOffsetTexture
  35. var surface OutlineRenderTarget edram $PostEffect.FrameBufferSize.x $PostEffect.FrameBufferSize.y A8R8G8B8
  36. #else
  37. var texture OutlineTexture TEXTURESIZE_X TEXTURESIZE_Y A8R8G8B8
  38. var surface OutlineRenderTarget edram TEXTURESIZE_X TEXTURESIZE_Y A8R8G8B8
  39. #endif
  40. #define OutlineTextureFill OutlineTexture
  41. #define OutlineRenderTargetFill OutlineRenderTarget
  42. #endif
  43. var shader OutlinesShader Outlines.fx
  44. proc renderOutlines
  45. if WW3D Outline.IsEnabled
  46. beginevent RenderOutlines
  47. #if defined(EA_PLATFORM_XENON)
  48. // Copy EDRAM frame buffer, as it will be overwritten by the outline processing
  49. if WW3D IsHdrEnabled
  50. resolve PostEffectFrameBufferTexture 0 0 HDR_RESOLVE_EXPONENT color0 // convert from float7e3 to fixed16, decreasing luminance by 2^3
  51. else
  52. resolve PostEffectFrameBufferTexture color0
  53. endif
  54. #endif
  55. // Since the OutlineRenderTarget can be smaller than the frame buffer to speed up
  56. // the blurring process, we can't use it as the render target for the stencil fill.
  57. #if defined(EA_PLATFORM_WINDOWS)
  58. // The render target anti-aliasing mode needs to fit to the FrameDepthBuffer, ie might be anti-aliased.
  59. // On Windows this means we have to render to an AA surface first and then to a strechrect to a non-AA texture.
  60. if WW3D IsAntiAliasingEnabled
  61. settarget 0 OutlineRenderTargetFill
  62. else
  63. settarget 0 OutlineTextureFill
  64. endif
  65. #else
  66. // On Xenon we don't use real AA on the frame/depth buffer, so a regular render target is fine
  67. settarget 0 OutlineRenderTargetFill
  68. #endif
  69. callproc setFrameDepthBuffer
  70. setclearcolor 0 0 0 0
  71. clearcolor
  72. setcamera Viewer
  73. // fill all of the outline areas
  74. if WW3D Outline.IsSelectedBinPopulated
  75. setshader OutlinesShader FillSelected
  76. renderquad
  77. endif
  78. if WW3D Outline.IsHoverSelectBinPopulated
  79. setshader OutlinesShader FillHoverSelect
  80. renderquad
  81. endif
  82. if WW3D Outline.IsHoverAttackBinPopulated
  83. setshader OutlinesShader FillHoverAttack
  84. renderquad
  85. endif
  86. #if defined(EA_PLATFORM_XENON)
  87. // resolve into a temp texture
  88. resolve OutlineTextureFill
  89. #else
  90. if WW3D IsAntiAliasingEnabled
  91. // "Resolve" the anti-aliased render target surface to non-AA texture
  92. stretchrect OutlineRenderTargetFill OutlineTextureFill
  93. endif
  94. #endif
  95. settarget 0 OutlineRenderTarget
  96. setdepth NULL
  97. settexture WW3D Outline.Texture OutlineTextureFill
  98. setshader OutlinesShader BlurBox
  99. renderquad
  100. #if defined(EA_PLATFORM_XENON)
  101. // resolve into a temp texture
  102. resolve OutlineTexture
  103. #endif
  104. // restore the frame buffer target
  105. callproc setFrameRenderTarget
  106. callproc setFrameDepthBuffer
  107. #if defined(EA_PLATFORM_XENON)
  108. // Copy back resolved textures back into EDRAM.
  109. settexture WW3D Outline.Texture PostEffectFrameBufferTexture
  110. setshader OutlinesShader Blit
  111. renderquad
  112. #endif
  113. // Draw outlines over the frame buffer, filtering out all the interior areas
  114. settexture WW3D Outline.Texture OutlineTexture
  115. setshader OutlinesShader DrawWithStencil
  116. renderquad
  117. endevent RenderOutlines
  118. endif
  119. endproc
  120. #endif // SCRAPE_SCRIPT_OUTLINES_SCRAPEH