BsD3D9BuiltinMaterialFactory.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. #include "BsD3D9BuiltinMaterialFactory.h"
  2. #include "CmHighLevelGpuProgram.h"
  3. #include "CmShader.h"
  4. #include "CmTechnique.h"
  5. #include "CmPass.h"
  6. #include "CmMaterial.h"
  7. #include "CmBlendState.h"
  8. #include "CmDepthStencilState.h"
  9. #include "CmRendererManager.h"
  10. using namespace CamelotFramework;
  11. namespace BansheeEngine
  12. {
  13. void D3D9BuiltinMaterialFactory::startUp()
  14. {
  15. initSpriteTextShader();
  16. initSpriteImageShader();
  17. initDebugDraw2DClipSpaceShader();
  18. initDebugDraw2DScreenSpaceShader();
  19. initDebugDraw3DShader();
  20. initDockDropOverlayShader();
  21. SAMPLER_STATE_DESC ssDesc;
  22. ssDesc.magFilter = FO_POINT;
  23. ssDesc.minFilter = FO_POINT;
  24. ssDesc.mipFilter = FO_POINT;
  25. mGUISamplerState = SamplerState::create(ssDesc);
  26. }
  27. void D3D9BuiltinMaterialFactory::shutDown()
  28. {
  29. mSpriteTextShader = nullptr;
  30. mSpriteImageShader = nullptr;
  31. mDebugDraw2DClipSpaceShader = nullptr;
  32. mDebugDraw2DScreenSpaceShader = nullptr;
  33. mDebugDraw3DShader = nullptr;
  34. mDockDropOverlayShader = nullptr;
  35. }
  36. const CM::String& D3D9BuiltinMaterialFactory::getSupportedRenderSystem() const
  37. {
  38. static String renderSystem = "CamelotD3D9RenderSystem";
  39. return renderSystem;
  40. }
  41. HMaterial D3D9BuiltinMaterialFactory::createSpriteTextMaterial() const
  42. {
  43. HMaterial newMaterial = Material::create(mSpriteTextShader);
  44. newMaterial->setSamplerState("mainTexSamp", mGUISamplerState);
  45. return newMaterial;
  46. }
  47. HMaterial D3D9BuiltinMaterialFactory::createSpriteImageMaterial() const
  48. {
  49. HMaterial newMaterial = Material::create(mSpriteImageShader);
  50. newMaterial->setSamplerState("mainTexSamp", mGUISamplerState);
  51. return newMaterial;
  52. }
  53. HMaterial D3D9BuiltinMaterialFactory::createDebugDraw2DClipSpaceMaterial() const
  54. {
  55. return Material::create(mDebugDraw2DClipSpaceShader);
  56. }
  57. HMaterial D3D9BuiltinMaterialFactory::createDebugDraw2DScreenSpaceMaterial() const
  58. {
  59. return Material::create(mDebugDraw2DScreenSpaceShader);
  60. }
  61. HMaterial D3D9BuiltinMaterialFactory::createDebugDraw3DMaterial() const
  62. {
  63. return Material::create(mDebugDraw3DShader);
  64. }
  65. HMaterial D3D9BuiltinMaterialFactory::createDockDropOverlayMaterial() const
  66. {
  67. return Material::create(mDockDropOverlayShader);
  68. }
  69. void D3D9BuiltinMaterialFactory::initSpriteTextShader()
  70. {
  71. String vsCode = " \
  72. float invViewportWidth; \
  73. float invViewportHeight; \
  74. float4x4 worldTransform; \
  75. \
  76. void vs_main( \
  77. in float3 inPos : POSITION, \
  78. in float2 uv : TEXCOORD0, \
  79. out float4 oPosition : POSITION, \
  80. out float2 oUv : TEXCOORD0) \
  81. { \
  82. float4 tfrmdPos = mul(worldTransform, float4(inPos.xy, 0, 1)); \
  83. \
  84. float tfrmdX = -1.0f + ((tfrmdPos.x - 0.5f) * invViewportWidth); \
  85. float tfrmdY = 1.0f - ((tfrmdPos.y - 0.5f) * invViewportHeight); \
  86. \
  87. oPosition = float4(tfrmdX, tfrmdY, 0, 1); \
  88. oUv = uv; \
  89. } \
  90. ";
  91. String psCode = " \
  92. sampler2D mainTexture; \
  93. \
  94. float4 ps_main(float2 uv : TEXCOORD0) : COLOR0 \
  95. { \
  96. float4 color = float4(1.0f, 1.0f, 1.0f, tex2D(mainTexture, uv).r); \
  97. return color; \
  98. }";
  99. HHighLevelGpuProgram vsProgram = HighLevelGpuProgram::create(vsCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_3_0);
  100. HHighLevelGpuProgram psProgram = HighLevelGpuProgram::create(psCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_3_0);
  101. vsProgram.synchronize();
  102. psProgram.synchronize();
  103. mSpriteTextShader = Shader::create("TextSpriteShader");
  104. mSpriteTextShader->addParameter("worldTransform", "worldTransform", GPDT_MATRIX_4X4);
  105. mSpriteTextShader->addParameter("invViewportWidth", "invViewportWidth", GPDT_FLOAT1);
  106. mSpriteTextShader->addParameter("invViewportHeight", "invViewportHeight", GPDT_FLOAT1);
  107. mSpriteTextShader->addParameter("mainTexSamp", "mainTexture", GPOT_SAMPLER2D);
  108. mSpriteTextShader->addParameter("mainTexture", "mainTexture", GPOT_TEXTURE2D);
  109. TechniquePtr newTechnique = mSpriteTextShader->addTechnique("D3D9RenderSystem", RendererManager::getCoreRendererName());
  110. PassPtr newPass = newTechnique->addPass();
  111. newPass->setVertexProgram(vsProgram);
  112. newPass->setFragmentProgram(psProgram);
  113. BLEND_STATE_DESC desc;
  114. desc.renderTargetDesc[0].blendEnable = true;
  115. desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
  116. desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
  117. desc.renderTargetDesc[0].blendOp = BO_ADD;
  118. HBlendState blendState = BlendState::create(desc);
  119. newPass->setBlendState(blendState);
  120. DEPTH_STENCIL_STATE_DESC depthStateDesc;
  121. depthStateDesc.depthReadEnable = false;
  122. depthStateDesc.depthWriteEnable = false;
  123. HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
  124. newPass->setDepthStencilState(depthState);
  125. }
  126. void D3D9BuiltinMaterialFactory::initSpriteImageShader()
  127. {
  128. String vsCode = " \
  129. float invViewportWidth; \
  130. float invViewportHeight; \
  131. float4x4 worldTransform; \
  132. \
  133. void vs_main( \
  134. in float3 inPos : POSITION, \
  135. in float2 uv : TEXCOORD0, \
  136. out float4 oPosition : POSITION, \
  137. out float2 oUv : TEXCOORD0) \
  138. { \
  139. float4 tfrmdPos = mul(worldTransform, float4(inPos.xy, 0, 1)); \
  140. \
  141. float tfrmdX = -1.0f + ((tfrmdPos.x - 0.5f) * invViewportWidth); \
  142. float tfrmdY = 1.0f - ((tfrmdPos.y - 0.5f) * invViewportHeight); \
  143. \
  144. oPosition = float4(tfrmdX, tfrmdY, 0, 1); \
  145. oUv = uv; \
  146. } \
  147. ";
  148. String psCode = " \
  149. sampler2D mainTexture; \
  150. \
  151. float4 ps_main(float2 uv : TEXCOORD0) : COLOR0 \
  152. { \
  153. float4 color = tex2D(mainTexture, uv); \
  154. return color; \
  155. }";
  156. HHighLevelGpuProgram vsProgram = HighLevelGpuProgram::create(vsCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
  157. HHighLevelGpuProgram psProgram = HighLevelGpuProgram::create(psCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_2_0);
  158. vsProgram.synchronize();
  159. psProgram.synchronize();
  160. mSpriteImageShader = Shader::create("ImageSpriteShader");
  161. mSpriteImageShader->addParameter("worldTransform", "worldTransform", GPDT_MATRIX_4X4);
  162. mSpriteImageShader->addParameter("invViewportWidth", "invViewportWidth", GPDT_FLOAT1);
  163. mSpriteImageShader->addParameter("invViewportHeight", "invViewportHeight", GPDT_FLOAT1);
  164. mSpriteImageShader->addParameter("mainTexSamp", "mainTexture", GPOT_SAMPLER2D);
  165. mSpriteImageShader->addParameter("mainTexture", "mainTexture", GPOT_TEXTURE2D);
  166. TechniquePtr newTechnique = mSpriteImageShader->addTechnique("D3D9RenderSystem", RendererManager::getCoreRendererName());
  167. PassPtr newPass = newTechnique->addPass();
  168. newPass->setVertexProgram(vsProgram);
  169. newPass->setFragmentProgram(psProgram);
  170. BLEND_STATE_DESC desc;
  171. desc.renderTargetDesc[0].blendEnable = true;
  172. desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
  173. desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
  174. desc.renderTargetDesc[0].blendOp = BO_ADD;
  175. HBlendState blendState = BlendState::create(desc);
  176. newPass->setBlendState(blendState);
  177. DEPTH_STENCIL_STATE_DESC depthStateDesc;
  178. depthStateDesc.depthReadEnable = false;
  179. depthStateDesc.depthWriteEnable = false;
  180. HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
  181. newPass->setDepthStencilState(depthState);
  182. }
  183. void D3D9BuiltinMaterialFactory::initDebugDraw2DClipSpaceShader()
  184. {
  185. String vsCode = " \
  186. void vs_main( \
  187. in float2 inPos : POSITION, \
  188. in float4 inColor : COLOR0, \
  189. out float4 oPosition : POSITION, \
  190. out float4 oColor : COLOR0) \
  191. { \
  192. oPosition = float4(inPos.xy, 0, 1); \
  193. oColor = inColor; \
  194. } \
  195. ";
  196. String psCode = " \
  197. float4 ps_main(float4 color : COLOR0) : COLOR0 \
  198. { \
  199. return color; \
  200. }";
  201. HHighLevelGpuProgram vsProgram = HighLevelGpuProgram::create(vsCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
  202. HHighLevelGpuProgram psProgram = HighLevelGpuProgram::create(psCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_2_0);
  203. vsProgram.synchronize();
  204. psProgram.synchronize();
  205. mDebugDraw2DClipSpaceShader = Shader::create("DebugDraw2DClipSpaceShader");
  206. TechniquePtr newTechnique = mDebugDraw2DClipSpaceShader->addTechnique("D3D9RenderSystem", RendererManager::getCoreRendererName());
  207. PassPtr newPass = newTechnique->addPass();
  208. newPass->setVertexProgram(vsProgram);
  209. newPass->setFragmentProgram(psProgram);
  210. BLEND_STATE_DESC desc;
  211. desc.renderTargetDesc[0].blendEnable = true;
  212. desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
  213. desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
  214. desc.renderTargetDesc[0].blendOp = BO_ADD;
  215. HBlendState blendState = BlendState::create(desc);
  216. newPass->setBlendState(blendState);
  217. DEPTH_STENCIL_STATE_DESC depthStateDesc;
  218. depthStateDesc.depthReadEnable = false;
  219. depthStateDesc.depthWriteEnable = false;
  220. HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
  221. newPass->setDepthStencilState(depthState);
  222. }
  223. void D3D9BuiltinMaterialFactory::initDebugDraw2DScreenSpaceShader()
  224. {
  225. String vsCode = " \
  226. float invViewportWidth; \
  227. float invViewportHeight; \
  228. \
  229. void vs_main( \
  230. in float2 inPos : POSITION, \
  231. in float4 inColor : COLOR0, \
  232. out float4 oPosition : POSITION, \
  233. out float4 oColor : COLOR0) \
  234. { \
  235. float tfrmdX = -1.0f + ((inPos.x - 0.5f) * invViewportWidth); \
  236. float tfrmdY = 1.0f - ((inPos.y - 0.5f) * invViewportHeight); \
  237. \
  238. oPosition = float4(tfrmdX, tfrmdY, 0, 1); \
  239. oColor = inColor; \
  240. } \
  241. ";
  242. String psCode = " \
  243. float4 ps_main(float4 color : COLOR0) : COLOR0 \
  244. { \
  245. return color; \
  246. }";
  247. HHighLevelGpuProgram vsProgram = HighLevelGpuProgram::create(vsCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
  248. HHighLevelGpuProgram psProgram = HighLevelGpuProgram::create(psCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_2_0);
  249. vsProgram.synchronize();
  250. psProgram.synchronize();
  251. mDebugDraw2DScreenSpaceShader = Shader::create("DebugDraw2DScreenSpaceShader");
  252. mDebugDraw2DScreenSpaceShader->addParameter("invViewportWidth", "invViewportWidth", GPDT_FLOAT1);
  253. mDebugDraw2DScreenSpaceShader->addParameter("invViewportHeight", "invViewportHeight", GPDT_FLOAT1);
  254. TechniquePtr newTechnique = mDebugDraw2DScreenSpaceShader->addTechnique("D3D9RenderSystem", RendererManager::getCoreRendererName());
  255. PassPtr newPass = newTechnique->addPass();
  256. newPass->setVertexProgram(vsProgram);
  257. newPass->setFragmentProgram(psProgram);
  258. BLEND_STATE_DESC desc;
  259. desc.renderTargetDesc[0].blendEnable = true;
  260. desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
  261. desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
  262. desc.renderTargetDesc[0].blendOp = BO_ADD;
  263. HBlendState blendState = BlendState::create(desc);
  264. newPass->setBlendState(blendState);
  265. DEPTH_STENCIL_STATE_DESC depthStateDesc;
  266. depthStateDesc.depthReadEnable = false;
  267. depthStateDesc.depthWriteEnable = false;
  268. HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
  269. newPass->setDepthStencilState(depthState);
  270. }
  271. void D3D9BuiltinMaterialFactory::initDebugDraw3DShader()
  272. {
  273. String vsCode = "float4x4 matViewProj; \
  274. \
  275. void vs_main( \
  276. in float3 inPos : POSITION, \
  277. in float4 inColor : COLOR0, \
  278. out float4 oPosition : POSITION, \
  279. out float4 oColor : COLOR0) \
  280. { \
  281. oPosition = mul(matViewProj, float4(inPos.xyz, 1)); \
  282. oColor = inColor; \
  283. } \
  284. ";
  285. String psCode = " \
  286. float4 ps_main(float4 color : COLOR0) : COLOR0 \
  287. { \
  288. return color; \
  289. }";
  290. HHighLevelGpuProgram vsProgram = HighLevelGpuProgram::create(vsCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
  291. HHighLevelGpuProgram psProgram = HighLevelGpuProgram::create(psCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_2_0);
  292. vsProgram.synchronize();
  293. psProgram.synchronize();
  294. mDebugDraw3DShader = Shader::create("DebugDraw3DShader");
  295. mDebugDraw3DShader->addParameter("matViewProj", "matViewProj", GPDT_MATRIX_4X4);
  296. TechniquePtr newTechnique = mDebugDraw3DShader->addTechnique("D3D9RenderSystem", RendererManager::getCoreRendererName());
  297. PassPtr newPass = newTechnique->addPass();
  298. newPass->setVertexProgram(vsProgram);
  299. newPass->setFragmentProgram(psProgram);
  300. BLEND_STATE_DESC desc;
  301. desc.renderTargetDesc[0].blendEnable = true;
  302. desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
  303. desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
  304. desc.renderTargetDesc[0].blendOp = BO_ADD;
  305. HBlendState blendState = BlendState::create(desc);
  306. newPass->setBlendState(blendState);
  307. }
  308. void D3D9BuiltinMaterialFactory::initDockDropOverlayShader()
  309. {
  310. String vsCode = " \
  311. float invViewportWidth; \
  312. float invViewportHeight; \
  313. \
  314. float4 tintColor; \
  315. float4 highlightColor; \
  316. float4 highlightActive; \
  317. \
  318. void vs_main( \
  319. in float2 inPos : POSITION, \
  320. in float4 inColor : COLOR0, \
  321. out float4 oPosition : POSITION, \
  322. out float4 oColor : COLOR0) \
  323. { \
  324. float tfrmdX = -1.0f + ((inPos.x - 0.5f) * invViewportWidth); \
  325. float tfrmdY = 1.0f - ((inPos.y - 0.5f) * invViewportHeight); \
  326. \
  327. oPosition = float4(tfrmdX, tfrmdY, 0, 1); \
  328. \
  329. float4 highlight = highlightActive * inColor; \
  330. float highlightSum = highlight.x + highlight.y + \
  331. highlight.z + highlight.a; \
  332. \
  333. oColor = (1.0f - highlightSum) * tintColor + \
  334. highlightSum * highlightColor; \
  335. } \
  336. ";
  337. String psCode = " \
  338. float4 ps_main(float4 color : COLOR0) : COLOR0 \
  339. { \
  340. return color; \
  341. }";
  342. HHighLevelGpuProgram vsProgram = HighLevelGpuProgram::create(vsCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
  343. HHighLevelGpuProgram psProgram = HighLevelGpuProgram::create(psCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_2_0);
  344. vsProgram.synchronize();
  345. psProgram.synchronize();
  346. mDockDropOverlayShader = Shader::create("DockDropOverlayShader");
  347. mDockDropOverlayShader->addParameter("invViewportWidth", "invViewportWidth", GPDT_FLOAT1);
  348. mDockDropOverlayShader->addParameter("invViewportHeight", "invViewportHeight", GPDT_FLOAT1);
  349. mDockDropOverlayShader->addParameter("tintColor", "tintColor", GPDT_FLOAT4);
  350. mDockDropOverlayShader->addParameter("highlightColor", "highlightColor", GPDT_FLOAT4);
  351. mDockDropOverlayShader->addParameter("highlightActive", "highlightActive", GPDT_FLOAT4);
  352. TechniquePtr newTechnique = mDockDropOverlayShader->addTechnique("D3D9RenderSystem", RendererManager::getCoreRendererName());
  353. PassPtr newPass = newTechnique->addPass();
  354. newPass->setVertexProgram(vsProgram);
  355. newPass->setFragmentProgram(psProgram);
  356. BLEND_STATE_DESC desc;
  357. desc.renderTargetDesc[0].blendEnable = true;
  358. desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
  359. desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
  360. desc.renderTargetDesc[0].blendOp = BO_ADD;
  361. HBlendState blendState = BlendState::create(desc);
  362. newPass->setBlendState(blendState);
  363. DEPTH_STENCIL_STATE_DESC depthStateDesc;
  364. depthStateDesc.depthReadEnable = false;
  365. depthStateDesc.depthWriteEnable = false;
  366. HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
  367. newPass->setDepthStencilState(depthState);
  368. }
  369. }