/xbmc/visualizations/Vortex/VortexVis/Core/Shader.cpp

http://github.com/xbmc/xbmc · C++ · 289 lines · 250 code · 20 blank · 19 comment · 14 complexity · 2c5ebb11fe282dc99a01b1bab25a3558 MD5 · raw file

  1. /*
  2. * Copyright Š 2010-2013 Team XBMC
  3. * http://xbmc.org
  4. *
  5. * This program is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, either version 2 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. *
  18. */
  19. #include "Shader.h"
  20. #include "Renderer.h"
  21. void Shader::ReleaseAllShaders()
  22. {
  23. std::vector<Shader*>& ShaderList = GetShaderList();
  24. std::vector<Shader*>::iterator ShaderIterator;
  25. for (ShaderIterator = ShaderList.begin();
  26. ShaderIterator != ShaderList.end();
  27. ShaderIterator++ )
  28. {
  29. if ( (*ShaderIterator)->m_pVShader )
  30. (*ShaderIterator)->m_pVShader->Release();
  31. if ( (*ShaderIterator)->m_pPShader )
  32. (*ShaderIterator)->m_pPShader->Release();
  33. }
  34. }
  35. bool Shader::CompileAllShaders()
  36. {
  37. std::vector<Shader*>& ShaderList = GetShaderList();
  38. std::vector<Shader*>::iterator ShaderIterator;
  39. for (ShaderIterator = ShaderList.begin();
  40. ShaderIterator != ShaderList.end();
  41. ShaderIterator++ )
  42. {
  43. if ( (*ShaderIterator)->CompileShader() == false )
  44. return false;
  45. }
  46. return true;
  47. }
  48. bool Shader::CompileShader()
  49. {
  50. DWORD dwShaderFlags = D3DXSHADER_PARTIALPRECISION;
  51. LPD3DXBUFFER pCode;
  52. LPD3DXBUFFER pErrors;
  53. int iSrcLen = strlen( m_pShaderSrc );
  54. if ( iSrcLen == 0 )
  55. return false;
  56. HRESULT hr = ( D3DXCompileShader( m_pShaderSrc,
  57. iSrcLen,
  58. NULL, // defines
  59. NULL, // include
  60. "Main", // Function name
  61. m_ShaderType == ST_PIXEL ? "ps_2_0": "vs_2_0", // profile
  62. dwShaderFlags, // Flags
  63. &pCode, // Output compiled shader
  64. &pErrors, // error messages
  65. &m_pConstantTable // constant table
  66. ) );
  67. if( FAILED( hr ) )
  68. {
  69. char* errors = (char*)pErrors->GetBufferPointer();
  70. OutputDebugStringA( errors );
  71. return false;
  72. }
  73. if ( m_ShaderType == ST_PIXEL )
  74. {
  75. m_pPShader = Renderer::CreatePixelShader( ( DWORD* )pCode->GetBufferPointer() );
  76. }
  77. else
  78. {
  79. m_pVShader = Renderer::CreateVertexShader( ( DWORD* )pCode->GetBufferPointer() );
  80. }
  81. pCode->Release();
  82. return true;
  83. }
  84. char DiffuseUVVertexShaderSrc[] =
  85. {
  86. " struct VS_INPUT \n"
  87. " { \n"
  88. " float4 vPosition : POSITION; \n"
  89. " float4 Colour : COLOR; \n"
  90. " float2 Tex0 : TEXCOORD0; \n"
  91. " }; \n"
  92. " struct VS_OUTPUT \n"
  93. " { \n"
  94. " float4 vPosition : POSITION; \n"
  95. " float4 Colour : COLOR; \n"
  96. " float2 Tex0 : TEXCOORD0; \n"
  97. " }; \n"
  98. " \n"
  99. " float4x4 WVPMat; \n"
  100. " VS_OUTPUT Main( VS_INPUT input ) \n"
  101. " { \n"
  102. " VS_OUTPUT output; \n"
  103. " // Transform coord \n"
  104. " output.vPosition = mul(WVPMat, float4(input.vPosition.xyz, 1.0f)); \n"
  105. " output.Colour = input.Colour; \n"
  106. " output.Tex0 = input.Tex0; \n"
  107. " return output; \n"
  108. " } \n"
  109. " \n"
  110. };
  111. char DiffuseUVEnvVertexShaderSrc[] =
  112. {
  113. " struct VS_INPUT \n"
  114. " { \n"
  115. " float4 vPosition : POSITION; \n"
  116. " float4 vNormal : NORMAL; \n"
  117. " float4 Colour : COLOR; \n"
  118. " float2 Tex0 : TEXCOORD0; \n"
  119. " }; \n"
  120. " struct VS_OUTPUT \n"
  121. " { \n"
  122. " float4 vPosition : POSITION; \n"
  123. " float4 Colour : COLOR; \n"
  124. " float2 Tex0 : TEXCOORD0; \n"
  125. " }; \n"
  126. " \n"
  127. " float4x4 WVMat; \n"
  128. " float4x4 WVPMat; \n"
  129. " VS_OUTPUT Main( VS_INPUT input ) \n"
  130. " { \n"
  131. " VS_OUTPUT output; \n"
  132. " // Transform coord \n"
  133. " output.vPosition = mul(WVPMat, float4(input.vPosition.xyz, 1.0f)); \n"
  134. " output.Colour = input.Colour; \n"
  135. " float4 NormalCamSpace = mul(WVMat, float4(input.vNormal.xyz, 0.0f));\n"
  136. " output.Tex0.xy = (NormalCamSpace.xy * 0.8f) + 0.5f; \n"
  137. // " output.Colour = float4(NormalCamSpace.xyz, 1); \n"
  138. " return output; \n"
  139. " } \n"
  140. " \n"
  141. };
  142. char DiffuseUVCubeVertexShaderSrc[] =
  143. {
  144. " struct VS_INPUT \n"
  145. " { \n"
  146. " float4 vPosition : POSITION; \n"
  147. " float4 Colour : COLOR; \n"
  148. " float2 Tex0 : TEXCOORD0; \n"
  149. " }; \n"
  150. " struct VS_OUTPUT \n"
  151. " { \n"
  152. " float4 vPosition : POSITION; \n"
  153. " float4 Colour : COLOR; \n"
  154. " float2 Tex0 : TEXCOORD0; \n"
  155. " }; \n"
  156. " \n"
  157. " float4 Col; \n"
  158. " float4 vScale; \n"
  159. " float4x4 WVMat; \n"
  160. " float4x4 WVPMat; \n"
  161. " VS_OUTPUT Main( VS_INPUT input ) \n"
  162. " { \n"
  163. " VS_OUTPUT output; \n"
  164. " float4 vPos = float4(input.vPosition.xyz * vScale, 1); \n"
  165. " // Transform coord \n"
  166. " output.vPosition = mul(WVPMat, vPos); \n"
  167. " output.Colour = Col; \n"
  168. " output.Tex0.xy = input.Tex0; \n"
  169. " return output; \n"
  170. " } \n"
  171. " \n"
  172. };
  173. char DiffuseUVEnvCubeVertexShaderSrc[] =
  174. {
  175. " struct VS_INPUT \n"
  176. " { \n"
  177. " float4 vPosition : POSITION; \n"
  178. " float4 vNormal : NORMAL; \n"
  179. " float4 Colour : COLOR; \n"
  180. " float2 Tex0 : TEXCOORD0; \n"
  181. " }; \n"
  182. " struct VS_OUTPUT \n"
  183. " { \n"
  184. " float4 vPosition : POSITION; \n"
  185. " float4 Colour : COLOR; \n"
  186. " float2 Tex0 : TEXCOORD0; \n"
  187. " }; \n"
  188. " \n"
  189. " float4 Col; \n"
  190. " float4 vScale; \n"
  191. " float4x4 WVMat; \n"
  192. " float4x4 WVPMat; \n"
  193. " VS_OUTPUT Main( VS_INPUT input ) \n"
  194. " { \n"
  195. " VS_OUTPUT output; \n"
  196. " float4 vPos = float4(input.vPosition.xyz * vScale, 1); \n"
  197. " // Transform coord \n"
  198. " output.vPosition = mul(WVPMat, vPos); \n"
  199. " output.Colour = Col; \n"
  200. " float4 NormalCamSpace = mul(WVMat, float4(input.vNormal.xyz, 0.0f));\n"
  201. " output.Tex0.xy = (NormalCamSpace.xy * 0.5f) + 0.5f; \n"
  202. " return output; \n"
  203. " } \n"
  204. " \n"
  205. };
  206. char DiffuseNormalEnvCubeVertexShaderSrc[] =
  207. {
  208. " struct VS_INPUT \n"
  209. " { \n"
  210. " float4 vPosition : POSITION; \n"
  211. " float4 vNormal : NORMAL; \n"
  212. " }; \n"
  213. " struct VS_OUTPUT \n"
  214. " { \n"
  215. " float4 vPosition : POSITION; \n"
  216. " float4 Colour : COLOR; \n"
  217. " float2 Tex0 : TEXCOORD0; \n"
  218. " }; \n"
  219. " \n"
  220. " float4 Col; \n"
  221. " float4x4 WVMat; \n"
  222. " float4x4 WVPMat; \n"
  223. " VS_OUTPUT Main( VS_INPUT input ) \n"
  224. " { \n"
  225. " VS_OUTPUT output; \n"
  226. " float4 vPos = float4(input.vPosition.xyz, 1); \n"
  227. " // Transform coord \n"
  228. " output.vPosition = mul(WVPMat, vPos); \n"
  229. " output.Colour = 0xffffffff; \n"
  230. " float4 NormalCamSpace = mul(WVMat, float4(input.vNormal.xyz, 0.0f));\n"
  231. " output.Tex0.xy = (NormalCamSpace.xy * 0.2f) + 0.5f; \n"
  232. " return output; \n"
  233. " } \n"
  234. " \n"
  235. };
  236. char UVNormalEnvVertexShaderSrc[] =
  237. {
  238. " struct VS_INPUT \n"
  239. " { \n"
  240. " float4 vPosition : POSITION; \n"
  241. " float4 vNormal : NORMAL; \n"
  242. " }; \n"
  243. " struct VS_OUTPUT \n"
  244. " { \n"
  245. " float4 vPosition : POSITION; \n"
  246. " float4 Colour : COLOR; \n"
  247. " float2 Tex0 : TEXCOORD0; \n"
  248. " }; \n"
  249. " \n"
  250. " float4x4 WVMat; \n"
  251. " float4x4 WVPMat; \n"
  252. " VS_OUTPUT Main( VS_INPUT input ) \n"
  253. " { \n"
  254. " VS_OUTPUT output; \n"
  255. " // Transform coord \n"
  256. " output.vPosition = mul(WVPMat, float4(input.vPosition.xyz, 1.0f)); \n"
  257. " output.Colour = 0xffffffff; \n"
  258. " float4 NormalCamSpace = mul(WVMat, float4(input.vNormal.xyz, 0.0f));\n"
  259. " output.Tex0.xy = (NormalCamSpace.xy * 0.2f) + 0.5f; \n"
  260. " return output; \n"
  261. " } \n"
  262. " \n"
  263. };
  264. IMPLEMENT_SHADER(DiffuseUVVertexShader, DiffuseUVVertexShaderSrc, ST_VERTEX);
  265. IMPLEMENT_SHADER(DiffuseUVEnvVertexShader, DiffuseUVEnvVertexShaderSrc, ST_VERTEX);
  266. IMPLEMENT_SHADER(DiffuseUVCubeVertexShader, DiffuseUVCubeVertexShaderSrc, ST_VERTEX);
  267. IMPLEMENT_SHADER(DiffuseUVEnvCubeVertexShader, DiffuseUVEnvCubeVertexShaderSrc, ST_VERTEX);
  268. IMPLEMENT_SHADER(DiffuseNormalEnvCubeVertexShader, DiffuseNormalEnvCubeVertexShaderSrc, ST_VERTEX);
  269. IMPLEMENT_SHADER(UVNormalEnvVertexShader, UVNormalEnvVertexShaderSrc, ST_VERTEX);