1
0
mirror of https://github.com/borgesdan/xn65 synced 2024-12-29 21:54:47 +01:00
xn65/framework/platform/texture-dx.cpp

97 lines
2.1 KiB
C++
Raw Normal View History

2024-03-18 15:41:46 -03:00
#include "texture-dx.hpp"
2024-04-07 14:06:12 -03:00
#include "WICTextureLoader.h"
#include "device-dx.hpp"
#include "../helpers.hpp"
2024-03-18 15:41:46 -03:00
2024-05-04 21:07:39 -03:00
namespace xna {
2024-04-26 11:35:59 -03:00
sptr<Texture2D> Texture2D::FromStream(GraphicsDevice& device, String const& fileName, xna_error_ptr_arg)
2024-04-07 14:06:12 -03:00
{
2024-05-04 21:07:39 -03:00
auto texture2d = New<Texture2D>(&device);
2024-04-14 16:11:15 -03:00
ID3D11Resource* resource = nullptr;
2024-04-14 21:23:09 -03:00
auto wstr = XnaHToWString(fileName);
2024-04-07 14:06:12 -03:00
HRESULT result = DirectX::CreateWICTextureFromFile(
2024-04-14 16:11:15 -03:00
device._device,
device._context,
wstr.c_str(),
&resource,
2024-05-04 21:07:39 -03:00
&texture2d->dxShaderResourceView,
2024-04-14 16:11:15 -03:00
0U);
2024-04-07 14:06:12 -03:00
if (FAILED(result))
{
2024-04-14 16:11:15 -03:00
xna_error_apply(err, XnaErrorCode::FAILED_OPERATION);
2024-04-07 14:06:12 -03:00
if (resource) {
resource->Release();
resource = nullptr;
}
return nullptr;
}
2024-04-14 16:11:15 -03:00
2024-05-04 21:07:39 -03:00
result = resource->QueryInterface(IID_ID3D11Texture2D, (void**)&texture2d->dxTexture2D);
2024-04-07 14:06:12 -03:00
if (FAILED(result)) {
2024-04-14 16:11:15 -03:00
xna_error_apply(err, XnaErrorCode::FAILED_OPERATION);
2024-04-07 14:06:12 -03:00
if (resource) {
resource->Release();
resource = nullptr;
}
return nullptr;
}
2024-04-14 16:11:15 -03:00
D3D11_TEXTURE2D_DESC desc;
2024-05-04 21:07:39 -03:00
texture2d->dxTexture2D->GetDesc(&desc);
texture2d->dxDescription = desc;
2024-04-07 14:06:12 -03:00
resource->Release();
resource = nullptr;
return texture2d;
}
2024-05-04 21:07:39 -03:00
bool Texture2D::Initialize(xna_error_ptr_arg)
{
if (dxTexture2D) {
xna_error_apply(err, XnaErrorCode::WARNING_INITIALIZED_RESOURCE);
return false;
}
if (!m_device || !m_device->_device) {
xna_error_apply(err, XnaErrorCode::INVALID_OPERATION);
return false;
}
auto hr = m_device->_device->CreateTexture2D(&dxDescription, nullptr, &dxTexture2D);
if (FAILED(hr)) {
xna_error_apply(err, XnaErrorCode::FAILED_OPERATION);
return false;
}
ID3D11Resource* resource = nullptr;
hr = dxTexture2D->QueryInterface(IID_ID3D11Resource, (void**)&resource);
if (FAILED(hr)) {
xna_error_apply(err, XnaErrorCode::FAILED_OPERATION);
return false;
}
hr = m_device->_device->CreateShaderResourceView(resource, &dxShaderDecription, &dxShaderResourceView);
if (resource) {
resource->Release();
resource = nullptr;
}
if (FAILED(hr)) {
xna_error_apply(err, XnaErrorCode::FAILED_OPERATION);
return false;
}
return true;
}
2024-03-18 15:41:46 -03:00
}