diff options
Diffstat (limited to 'xbmc/guilib/GUITextureD3D.cpp')
-rw-r--r-- | xbmc/guilib/GUITextureD3D.cpp | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/xbmc/guilib/GUITextureD3D.cpp b/xbmc/guilib/GUITextureD3D.cpp new file mode 100644 index 0000000..d031cac --- /dev/null +++ b/xbmc/guilib/GUITextureD3D.cpp @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2005-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "GUITextureD3D.h" + +#include "D3DResource.h" +#include "GUIShaderDX.h" +#include "TextureDX.h" +#include "rendering/dx/RenderContext.h" + +#include <DirectXMath.h> + +using namespace DirectX; + +void CGUITextureD3D::Register() +{ + CGUITexture::Register(CGUITextureD3D::CreateTexture, CGUITextureD3D::DrawQuad); +} + +CGUITexture* CGUITextureD3D::CreateTexture( + float posX, float posY, float width, float height, const CTextureInfo& texture) +{ + return new CGUITextureD3D(posX, posY, width, height, texture); +} + +CGUITextureD3D::CGUITextureD3D( + float posX, float posY, float width, float height, const CTextureInfo& texture) + : CGUITexture(posX, posY, width, height, texture) +{ +} + +CGUITextureD3D* CGUITextureD3D::Clone() const +{ + return new CGUITextureD3D(*this); +} + +void CGUITextureD3D::Begin(UTILS::COLOR::Color color) +{ + CTexture* texture = m_texture.m_textures[m_currentFrame].get(); + texture->LoadToGPU(); + + if (m_diffuse.size()) + m_diffuse.m_textures[0]->LoadToGPU(); + + m_col = color; + + DX::Windowing()->SetAlphaBlendEnable(true); +} + +void CGUITextureD3D::End() +{ +} + +void CGUITextureD3D::Draw(float *x, float *y, float *z, const CRect &texture, const CRect &diffuse, int orientation) +{ + XMFLOAT4 xcolor; + CD3DHelper::XMStoreColor(&xcolor, m_col); + + Vertex verts[4]; + verts[0].pos.x = x[0]; verts[0].pos.y = y[0]; verts[0].pos.z = z[0]; + verts[0].texCoord.x = texture.x1; verts[0].texCoord.y = texture.y1; + verts[0].texCoord2.x = diffuse.x1; verts[0].texCoord2.y = diffuse.y1; + verts[0].color = xcolor; + + verts[1].pos.x = x[1]; verts[1].pos.y = y[1]; verts[1].pos.z = z[1]; + if (orientation & 4) + { + verts[1].texCoord.x = texture.x1; + verts[1].texCoord.y = texture.y2; + } + else + { + verts[1].texCoord.x = texture.x2; + verts[1].texCoord.y = texture.y1; + } + if (m_info.orientation & 4) + { + verts[1].texCoord2.x = diffuse.x1; + verts[1].texCoord2.y = diffuse.y2; + } + else + { + verts[1].texCoord2.x = diffuse.x2; + verts[1].texCoord2.y = diffuse.y1; + } + verts[1].color = xcolor; + + verts[2].pos.x = x[2]; verts[2].pos.y = y[2]; verts[2].pos.z = z[2]; + verts[2].texCoord.x = texture.x2; verts[2].texCoord.y = texture.y2; + verts[2].texCoord2.x = diffuse.x2; verts[2].texCoord2.y = diffuse.y2; + verts[2].color = xcolor; + + verts[3].pos.x = x[3]; verts[3].pos.y = y[3]; verts[3].pos.z = z[3]; + if (orientation & 4) + { + verts[3].texCoord.x = texture.x2; + verts[3].texCoord.y = texture.y1; + } + else + { + verts[3].texCoord.x = texture.x1; + verts[3].texCoord.y = texture.y2; + } + if (m_info.orientation & 4) + { + verts[3].texCoord2.x = diffuse.x2; + verts[3].texCoord2.y = diffuse.y1; + } + else + { + verts[3].texCoord2.x = diffuse.x1; + verts[3].texCoord2.y = diffuse.y2; + } + verts[3].color = xcolor; + + CDXTexture* tex = static_cast<CDXTexture*>(m_texture.m_textures[m_currentFrame].get()); + CGUIShaderDX* pGUIShader = DX::Windowing()->GetGUIShader(); + + pGUIShader->Begin(m_diffuse.size() ? SHADER_METHOD_RENDER_MULTI_TEXTURE_BLEND : SHADER_METHOD_RENDER_TEXTURE_BLEND); + + if (m_diffuse.size()) + { + CDXTexture* diff = static_cast<CDXTexture*>(m_diffuse.m_textures[0].get()); + ID3D11ShaderResourceView* resource[] = { tex->GetShaderResource(), diff->GetShaderResource() }; + pGUIShader->SetShaderViews(ARRAYSIZE(resource), resource); + } + else + { + ID3D11ShaderResourceView* resource = tex->GetShaderResource(); + pGUIShader->SetShaderViews(1, &resource); + } + pGUIShader->DrawQuad(verts[0], verts[1], verts[2], verts[3]); +} + +void CGUITextureD3D::DrawQuad(const CRect& rect, + UTILS::COLOR::Color color, + CTexture* texture, + const CRect* texCoords) +{ + unsigned numViews = 0; + ID3D11ShaderResourceView* views = nullptr; + + if (texture) + { + texture->LoadToGPU(); + numViews = 1; + views = ((CDXTexture *)texture)->GetShaderResource(); + } + + CD3DTexture::DrawQuad(rect, color, numViews, &views, texCoords, texture ? SHADER_METHOD_RENDER_TEXTURE_BLEND : SHADER_METHOD_RENDER_DEFAULT); +} |