| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- #include "BsD3D9BuiltinMaterialFactory.h"
- #include "CmHighLevelGpuProgram.h"
- #include "CmShader.h"
- #include "CmTechnique.h"
- #include "CmPass.h"
- #include "CmMaterial.h"
- #include "CmBlendState.h"
- #include "CmDepthStencilState.h"
- #include "CmRendererManager.h"
- using namespace CamelotFramework;
- namespace BansheeEngine
- {
- void D3D9BuiltinMaterialFactory::startUp()
- {
- initSpriteTextShader();
- initSpriteImageShader();
- initDebugDrawShader();
- SAMPLER_STATE_DESC ssDesc;
- ssDesc.magFilter = FO_POINT;
- ssDesc.minFilter = FO_POINT;
- ssDesc.mipFilter = FO_POINT;
- mGUISamplerState = SamplerState::create(ssDesc);
- }
- void D3D9BuiltinMaterialFactory::shutDown()
- {
- mSpriteTextShader = nullptr;
- mSpriteImageShader = nullptr;
- }
- const CM::String& D3D9BuiltinMaterialFactory::getSupportedRenderSystem() const
- {
- static String renderSystem = "CamelotD3D9RenderSystem";
- return renderSystem;
- }
- HMaterial D3D9BuiltinMaterialFactory::createSpriteTextMaterial() const
- {
- HMaterial newMaterial = Material::create(mSpriteTextShader);
- newMaterial->setSamplerState("mainTexSamp", mGUISamplerState);
- return newMaterial;
- }
- HMaterial D3D9BuiltinMaterialFactory::createSpriteImageMaterial() const
- {
- HMaterial newMaterial = Material::create(mSpriteImageShader);
- newMaterial->setSamplerState("mainTexSamp", mGUISamplerState);
- return newMaterial;
- }
- HMaterial D3D9BuiltinMaterialFactory::createDebugDrawMaterial() const
- {
- return Material::create(mDebugDrawShader);
- }
- void D3D9BuiltinMaterialFactory::initSpriteTextShader()
- {
- String vsCode = " \
- float invViewportWidth; \
- float invViewportHeight; \
- float4x4 worldTransform; \
- \
- void vs_main( \
- in float3 inPos : POSITION, \
- in float2 uv : TEXCOORD0, \
- out float4 oPosition : POSITION, \
- out float2 oUv : TEXCOORD0) \
- { \
- float4 tfrmdPos = mul(worldTransform, float4(inPos.xy, 0, 1)); \
- \
- float tfrmdX = -1.0f + ((tfrmdPos.x - 0.5f) * invViewportWidth); \
- float tfrmdY = 1.0f - ((tfrmdPos.y - 0.5f) * invViewportHeight); \
- \
- oPosition = float4(tfrmdX, tfrmdY, 0, 1); \
- oUv = uv; \
- } \
- ";
- String psCode = " \
- sampler2D mainTexture; \
- \
- float4 ps_main(float2 uv : TEXCOORD0) : COLOR0 \
- { \
- float4 color = float4(1.0f, 1.0f, 1.0f, tex2D(mainTexture, uv).r); \
- return color; \
- }";
- HHighLevelGpuProgram vsProgram = HighLevelGpuProgram::create(vsCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_3_0);
- HHighLevelGpuProgram psProgram = HighLevelGpuProgram::create(psCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_3_0);
- vsProgram.waitUntilLoaded();
- psProgram.waitUntilLoaded();
- mSpriteTextShader = Shader::create("TextSpriteShader");
- mSpriteTextShader->addParameter("worldTransform", "worldTransform", GPDT_MATRIX_4X4);
- mSpriteTextShader->addParameter("invViewportWidth", "invViewportWidth", GPDT_FLOAT1);
- mSpriteTextShader->addParameter("invViewportHeight", "invViewportHeight", GPDT_FLOAT1);
- mSpriteTextShader->addParameter("mainTexSamp", "mainTexture", GPOT_SAMPLER2D);
- mSpriteTextShader->addParameter("mainTexture", "mainTexture", GPOT_TEXTURE2D);
- TechniquePtr newTechnique = mSpriteTextShader->addTechnique("D3D9RenderSystem", RendererManager::getCoreRendererName());
- PassPtr newPass = newTechnique->addPass();
- newPass->setVertexProgram(vsProgram);
- newPass->setFragmentProgram(psProgram);
- BLEND_STATE_DESC desc;
- desc.renderTargetDesc[0].blendEnable = true;
- desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
- desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
- desc.renderTargetDesc[0].blendOp = BO_ADD;
- HBlendState blendState = BlendState::create(desc);
- newPass->setBlendState(blendState);
- DEPTH_STENCIL_STATE_DESC depthStateDesc;
- depthStateDesc.depthReadEnable = false;
- depthStateDesc.depthWriteEnable = false;
- HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
- newPass->setDepthStencilState(depthState);
- }
- void D3D9BuiltinMaterialFactory::initSpriteImageShader()
- {
- String vsCode = " \
- float invViewportWidth; \
- float invViewportHeight; \
- float4x4 worldTransform; \
- \
- void vs_main( \
- in float3 inPos : POSITION, \
- in float2 uv : TEXCOORD0, \
- out float4 oPosition : POSITION, \
- out float2 oUv : TEXCOORD0) \
- { \
- float4 tfrmdPos = mul(worldTransform, float4(inPos.xy, 0, 1)); \
- \
- float tfrmdX = -1.0f + ((tfrmdPos.x - 0.5f) * invViewportWidth); \
- float tfrmdY = 1.0f - ((tfrmdPos.y - 0.5f) * invViewportHeight); \
- \
- oPosition = float4(tfrmdX, tfrmdY, 0, 1); \
- oUv = uv; \
- } \
- ";
- String psCode = " \
- sampler2D mainTexture; \
- \
- float4 ps_main(float2 uv : TEXCOORD0) : COLOR0 \
- { \
- float4 color = tex2D(mainTexture, uv); \
- return color; \
- }";
- HHighLevelGpuProgram vsProgram = HighLevelGpuProgram::create(vsCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
- HHighLevelGpuProgram psProgram = HighLevelGpuProgram::create(psCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_2_0);
- vsProgram.waitUntilLoaded();
- psProgram.waitUntilLoaded();
- mSpriteImageShader = Shader::create("ImageSpriteShader");
- mSpriteImageShader->addParameter("worldTransform", "worldTransform", GPDT_MATRIX_4X4);
- mSpriteImageShader->addParameter("invViewportWidth", "invViewportWidth", GPDT_FLOAT1);
- mSpriteImageShader->addParameter("invViewportHeight", "invViewportHeight", GPDT_FLOAT1);
- mSpriteImageShader->addParameter("mainTexSamp", "mainTexture", GPOT_SAMPLER2D);
- mSpriteImageShader->addParameter("mainTexture", "mainTexture", GPOT_TEXTURE2D);
- TechniquePtr newTechnique = mSpriteImageShader->addTechnique("D3D9RenderSystem", RendererManager::getCoreRendererName());
- PassPtr newPass = newTechnique->addPass();
- newPass->setVertexProgram(vsProgram);
- newPass->setFragmentProgram(psProgram);
- BLEND_STATE_DESC desc;
- desc.renderTargetDesc[0].blendEnable = true;
- desc.renderTargetDesc[0].srcBlend = BF_SOURCE_ALPHA;
- desc.renderTargetDesc[0].dstBlend = BF_INV_SOURCE_ALPHA;
- desc.renderTargetDesc[0].blendOp = BO_ADD;
- HBlendState blendState = BlendState::create(desc);
- newPass->setBlendState(blendState);
- DEPTH_STENCIL_STATE_DESC depthStateDesc;
- depthStateDesc.depthReadEnable = false;
- depthStateDesc.depthWriteEnable = false;
- HDepthStencilState depthState = DepthStencilState::create(depthStateDesc);
- newPass->setDepthStencilState(depthState);
- }
- void D3D9BuiltinMaterialFactory::initDebugDrawShader()
- {
- // TODO - Not implemented
- }
- }
|