BsD3D9BuiltinMaterialFactory.cpp 18 KB

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