BsD3D9BuiltinMaterialFactory.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  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. initDebugDrawShader();
  18. SAMPLER_STATE_DESC ssDesc;
  19. ssDesc.magFilter = FO_POINT;
  20. ssDesc.minFilter = FO_POINT;
  21. ssDesc.mipFilter = FO_POINT;
  22. mGUISamplerState = SamplerState::create(ssDesc);
  23. }
  24. void D3D9BuiltinMaterialFactory::shutDown()
  25. {
  26. mSpriteTextShader = nullptr;
  27. mSpriteImageShader = nullptr;
  28. }
  29. const CM::String& D3D9BuiltinMaterialFactory::getSupportedRenderSystem() const
  30. {
  31. static String renderSystem = "CamelotD3D9RenderSystem";
  32. return renderSystem;
  33. }
  34. HMaterial D3D9BuiltinMaterialFactory::createSpriteTextMaterial() const
  35. {
  36. HMaterial newMaterial = Material::create(mSpriteTextShader);
  37. newMaterial->setSamplerState("mainTexSamp", mGUISamplerState);
  38. return newMaterial;
  39. }
  40. HMaterial D3D9BuiltinMaterialFactory::createSpriteImageMaterial() const
  41. {
  42. HMaterial newMaterial = Material::create(mSpriteImageShader);
  43. newMaterial->setSamplerState("mainTexSamp", mGUISamplerState);
  44. return newMaterial;
  45. }
  46. HMaterial D3D9BuiltinMaterialFactory::createDebugDrawMaterial() const
  47. {
  48. return Material::create(mDebugDrawShader);
  49. }
  50. void D3D9BuiltinMaterialFactory::initSpriteTextShader()
  51. {
  52. String vsCode = " \
  53. float invViewportWidth; \
  54. float invViewportHeight; \
  55. float4x4 worldTransform; \
  56. \
  57. void vs_main( \
  58. in float3 inPos : POSITION, \
  59. in float2 uv : TEXCOORD0, \
  60. out float4 oPosition : POSITION, \
  61. out float2 oUv : TEXCOORD0) \
  62. { \
  63. float4 tfrmdPos = mul(worldTransform, float4(inPos.xy, 0, 1)); \
  64. \
  65. float tfrmdX = -1.0f + ((tfrmdPos.x - 0.5f) * invViewportWidth); \
  66. float tfrmdY = 1.0f - ((tfrmdPos.y - 0.5f) * invViewportHeight); \
  67. \
  68. oPosition = float4(tfrmdX, tfrmdY, 0, 1); \
  69. oUv = uv; \
  70. } \
  71. ";
  72. String psCode = " \
  73. sampler2D mainTexture; \
  74. \
  75. float4 ps_main(float2 uv : TEXCOORD0) : COLOR0 \
  76. { \
  77. float4 color = float4(1.0f, 1.0f, 1.0f, tex2D(mainTexture, uv).r); \
  78. return color; \
  79. }";
  80. HHighLevelGpuProgram vsProgram = HighLevelGpuProgram::create(vsCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_3_0);
  81. HHighLevelGpuProgram psProgram = HighLevelGpuProgram::create(psCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_3_0);
  82. vsProgram.waitUntilLoaded();
  83. psProgram.waitUntilLoaded();
  84. mSpriteTextShader = Shader::create("TextSpriteShader");
  85. mSpriteTextShader->addParameter("worldTransform", "worldTransform", GPDT_MATRIX_4X4);
  86. mSpriteTextShader->addParameter("invViewportWidth", "invViewportWidth", GPDT_FLOAT1);
  87. mSpriteTextShader->addParameter("invViewportHeight", "invViewportHeight", GPDT_FLOAT1);
  88. mSpriteTextShader->addParameter("mainTexSamp", "mainTexture", GPOT_SAMPLER2D);
  89. mSpriteTextShader->addParameter("mainTexture", "mainTexture", GPOT_TEXTURE2D);
  90. TechniquePtr newTechnique = mSpriteTextShader->addTechnique("D3D9RenderSystem", RendererManager::getCoreRendererName());
  91. PassPtr newPass = newTechnique->addPass();
  92. newPass->setVertexProgram(vsProgram);
  93. newPass->setFragmentProgram(psProgram);
  94. BLEND_STATE_DESC desc;
  95. desc.renderTargetDesc[0].blendEnable = true;
  96. desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
  97. desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
  98. desc.renderTargetDesc[0].blendOp = BO_ADD;
  99. HBlendState blendState = BlendState::create(desc);
  100. newPass->setBlendState(blendState);
  101. DEPTH_STENCIL_STATE_DESC depthStateDesc;
  102. depthStateDesc.depthReadEnable = false;
  103. depthStateDesc.depthWriteEnable = false;
  104. HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
  105. newPass->setDepthStencilState(depthState);
  106. }
  107. void D3D9BuiltinMaterialFactory::initSpriteImageShader()
  108. {
  109. String vsCode = " \
  110. float invViewportWidth; \
  111. float invViewportHeight; \
  112. float4x4 worldTransform; \
  113. \
  114. void vs_main( \
  115. in float3 inPos : POSITION, \
  116. in float2 uv : TEXCOORD0, \
  117. out float4 oPosition : POSITION, \
  118. out float2 oUv : TEXCOORD0) \
  119. { \
  120. float4 tfrmdPos = mul(worldTransform, float4(inPos.xy, 0, 1)); \
  121. \
  122. float tfrmdX = -1.0f + ((tfrmdPos.x - 0.5f) * invViewportWidth); \
  123. float tfrmdY = 1.0f - ((tfrmdPos.y - 0.5f) * invViewportHeight); \
  124. \
  125. oPosition = float4(tfrmdX, tfrmdY, 0, 1); \
  126. oUv = uv; \
  127. } \
  128. ";
  129. String psCode = " \
  130. sampler2D mainTexture; \
  131. \
  132. float4 ps_main(float2 uv : TEXCOORD0) : COLOR0 \
  133. { \
  134. float4 color = tex2D(mainTexture, uv); \
  135. return color; \
  136. }";
  137. HHighLevelGpuProgram vsProgram = HighLevelGpuProgram::create(vsCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
  138. HHighLevelGpuProgram psProgram = HighLevelGpuProgram::create(psCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_2_0);
  139. vsProgram.waitUntilLoaded();
  140. psProgram.waitUntilLoaded();
  141. mSpriteImageShader = Shader::create("ImageSpriteShader");
  142. mSpriteImageShader->addParameter("worldTransform", "worldTransform", GPDT_MATRIX_4X4);
  143. mSpriteImageShader->addParameter("invViewportWidth", "invViewportWidth", GPDT_FLOAT1);
  144. mSpriteImageShader->addParameter("invViewportHeight", "invViewportHeight", GPDT_FLOAT1);
  145. mSpriteImageShader->addParameter("mainTexSamp", "mainTexture", GPOT_SAMPLER2D);
  146. mSpriteImageShader->addParameter("mainTexture", "mainTexture", GPOT_TEXTURE2D);
  147. TechniquePtr newTechnique = mSpriteImageShader->addTechnique("D3D9RenderSystem", RendererManager::getCoreRendererName());
  148. PassPtr newPass = newTechnique->addPass();
  149. newPass->setVertexProgram(vsProgram);
  150. newPass->setFragmentProgram(psProgram);
  151. BLEND_STATE_DESC desc;
  152. desc.renderTargetDesc[0].blendEnable = true;
  153. desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
  154. desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
  155. desc.renderTargetDesc[0].blendOp = BO_ADD;
  156. HBlendState blendState = BlendState::create(desc);
  157. newPass->setBlendState(blendState);
  158. DEPTH_STENCIL_STATE_DESC depthStateDesc;
  159. depthStateDesc.depthReadEnable = false;
  160. depthStateDesc.depthWriteEnable = false;
  161. HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
  162. newPass->setDepthStencilState(depthState);
  163. }
  164. void D3D9BuiltinMaterialFactory::initDebugDrawShader()
  165. {
  166. // TODO - Not implemented
  167. }
  168. }