Merge branch 'NDK-Refactor' into NDK
Conflicts: examples/HardwareInfo/main.cpp include/Nazara/Renderer/Enums.hpp include/Nazara/Renderer/GpuQuery.hpp include/Nazara/Renderer/OpenGL.hpp include/Nazara/Renderer/RenderBuffer.hpp include/Nazara/Renderer/RenderTexture.hpp include/Nazara/Renderer/Texture.hpp src/Nazara/Graphics/AbstractRenderTechnique.cpp src/Nazara/Graphics/DeferredRenderTechnique.cpp src/Nazara/Graphics/Material.cpp src/Nazara/Graphics/SkyboxBackground.cpp src/Nazara/Renderer/GpuQuery.cpp src/Nazara/Renderer/OpenGL.cpp src/Nazara/Renderer/RenderBuffer.cpp src/Nazara/Renderer/RenderTexture.cpp src/Nazara/Renderer/Renderer.cpp src/Nazara/Renderer/Shader.cpp src/Nazara/Renderer/ShaderStage.cpp src/Nazara/Renderer/Texture.cpp Former-commit-id: 2f1c7e9f9766f59ab83d9405856a1898ac4ab48f
This commit is contained in:
@@ -11,113 +11,119 @@
|
||||
#include <memory>
|
||||
#include <Nazara/Utility/Debug.hpp>
|
||||
|
||||
namespace
|
||||
namespace Nz
|
||||
{
|
||||
bool IsSupported(const NzString& extension)
|
||||
namespace
|
||||
{
|
||||
return (extension == "dds");
|
||||
}
|
||||
|
||||
nzTernary Check(NzInputStream& stream, const NzImageParams& parameters)
|
||||
{
|
||||
NazaraUnused(parameters);
|
||||
|
||||
nzUInt32 magic;
|
||||
if (stream.Read(&magic, sizeof(nzUInt32)) == sizeof(nzUInt32))
|
||||
bool IsSupported(const String& extension)
|
||||
{
|
||||
#ifdef NAZARA_BIG_ENDIAN
|
||||
NzByteSwap(&magic, sizeof(nzUInt32));
|
||||
#endif
|
||||
|
||||
if (magic == DDS_MAGIC)
|
||||
return nzTernary_True;
|
||||
return (extension == "dds");
|
||||
}
|
||||
|
||||
return nzTernary_False;
|
||||
}
|
||||
|
||||
bool Load(NzImage* image, NzInputStream& stream, const NzImageParams& parameters)
|
||||
{
|
||||
NazaraUnused(parameters);
|
||||
|
||||
DDSHeader header;
|
||||
if (stream.Read(&header, sizeof(DDSHeader)) != sizeof(DDSHeader))
|
||||
Ternary Check(InputStream& stream, const ImageParams& parameters)
|
||||
{
|
||||
NazaraError("Failed to read DDS header");
|
||||
return false;
|
||||
}
|
||||
NazaraUnused(parameters);
|
||||
|
||||
DDSHeaderDX10Ext headerDX10;
|
||||
if (header.format.flags & DDPF_FOURCC && header.format.fourCC == D3DFMT_DX10)
|
||||
{
|
||||
if (stream.Read(&headerDX10, sizeof(DDSHeaderDX10Ext)) != sizeof(DDSHeaderDX10Ext))
|
||||
UInt32 magic;
|
||||
if (stream.Read(&magic, sizeof(UInt32)) == sizeof(UInt32))
|
||||
{
|
||||
NazaraError("Failed to read DDS DX10 extension header");
|
||||
#ifdef NAZARA_BIG_ENDIAN
|
||||
ByteSwap(&magic, sizeof(UInt32));
|
||||
#endif
|
||||
|
||||
if (magic == DDS_MAGIC)
|
||||
return Ternary_True;
|
||||
}
|
||||
|
||||
return Ternary_False;
|
||||
}
|
||||
|
||||
bool Load(Image* image, InputStream& stream, const ImageParams& parameters)
|
||||
{
|
||||
NazaraUnused(parameters);
|
||||
|
||||
DDSHeader header;
|
||||
if (stream.Read(&header, sizeof(DDSHeader)) != sizeof(DDSHeader))
|
||||
{
|
||||
NazaraError("Failed to read DDS header");
|
||||
return false;
|
||||
}
|
||||
|
||||
DDSHeaderDX10Ext headerDX10;
|
||||
if (header.format.flags & DDPF_FOURCC && header.format.fourCC == D3DFMT_DX10)
|
||||
{
|
||||
if (stream.Read(&headerDX10, sizeof(DDSHeaderDX10Ext)) != sizeof(DDSHeaderDX10Ext))
|
||||
{
|
||||
NazaraError("Failed to read DDS DX10 extension header");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
headerDX10.arraySize = 1;
|
||||
headerDX10.dxgiFormat = DXGI_FORMAT_UNKNOWN;
|
||||
headerDX10.miscFlag = 0;
|
||||
headerDX10.resourceDimension = D3D10_RESOURCE_DIMENSION_UNKNOWN;
|
||||
}
|
||||
|
||||
#ifdef NAZARA_BIG_ENDIAN
|
||||
// Les fichiers DDS sont en little endian
|
||||
ByteSwap(&header.size, sizeof(UInt32));
|
||||
ByteSwap(&header.flags, sizeof(UInt32));
|
||||
ByteSwap(&header.height, sizeof(UInt32));
|
||||
ByteSwap(&header.width, sizeof(UInt32));
|
||||
ByteSwap(&header.pitch, sizeof(UInt32));
|
||||
ByteSwap(&header.depth, sizeof(UInt32));
|
||||
ByteSwap(&header.levelCount, sizeof(UInt32));
|
||||
|
||||
// DDS_PixelFormat
|
||||
ByteSwap(&header.format.size, sizeof(UInt32));
|
||||
ByteSwap(&header.format.flags, sizeof(UInt32));
|
||||
ByteSwap(&header.format.fourCC, sizeof(UInt32));
|
||||
ByteSwap(&header.format.bpp, sizeof(UInt32));
|
||||
ByteSwap(&header.format.redMask, sizeof(UInt32));
|
||||
ByteSwap(&header.format.greenMask, sizeof(UInt32));
|
||||
ByteSwap(&header.format.blueMask, sizeof(UInt32));
|
||||
ByteSwap(&header.format.alphaMask, sizeof(UInt32));
|
||||
|
||||
ByteSwap(&header.ddsCaps1, sizeof(UInt32));
|
||||
ByteSwap(&header.ddsCaps2, sizeof(UInt32));
|
||||
ByteSwap(&header.ddsCaps3, sizeof(UInt32));
|
||||
ByteSwap(&header.ddsCaps4, sizeof(UInt32));
|
||||
#endif
|
||||
|
||||
unsigned int width = header.width;
|
||||
unsigned int height = header.height;
|
||||
unsigned int depth = std::max(header.depth, 1U);
|
||||
unsigned int levelCount = (parameters.levelCount > 0) ? std::min(parameters.levelCount, static_cast<UInt8>(header.levelCount)) : header.levelCount;
|
||||
|
||||
// Détermination du type
|
||||
ImageType type;
|
||||
if (header.ddsCaps2 & DDSCAPS2_CUBEMAP)
|
||||
type = ImageType_Cubemap;
|
||||
else if (header.ddsCaps2 & DDSCAPS2_VOLUME)
|
||||
type = ImageType_3D;
|
||||
|
||||
// Détermination du format
|
||||
PixelFormatType format;
|
||||
|
||||
if (parameters.loadFormat != PixelFormatType_Undefined)
|
||||
image->Convert(parameters.loadFormat);
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
}
|
||||
|
||||
namespace Loaders
|
||||
{
|
||||
void RegisterDDS()
|
||||
{
|
||||
headerDX10.arraySize = 1;
|
||||
headerDX10.dxgiFormat = DXGI_FORMAT_UNKNOWN;
|
||||
headerDX10.miscFlag = 0;
|
||||
headerDX10.resourceDimension = D3D10_RESOURCE_DIMENSION_UNKNOWN;
|
||||
ImageLoader::RegisterLoader(IsSupported, Check, Load);
|
||||
}
|
||||
|
||||
#ifdef NAZARA_BIG_ENDIAN
|
||||
// Les fichiers DDS sont en little endian
|
||||
NzByteSwap(&header.size, sizeof(nzUInt32));
|
||||
NzByteSwap(&header.flags, sizeof(nzUInt32));
|
||||
NzByteSwap(&header.height, sizeof(nzUInt32));
|
||||
NzByteSwap(&header.width, sizeof(nzUInt32));
|
||||
NzByteSwap(&header.pitch, sizeof(nzUInt32));
|
||||
NzByteSwap(&header.depth, sizeof(nzUInt32));
|
||||
NzByteSwap(&header.levelCount, sizeof(nzUInt32));
|
||||
|
||||
// DDS_PixelFormat
|
||||
NzByteSwap(&header.format.size, sizeof(nzUInt32));
|
||||
NzByteSwap(&header.format.flags, sizeof(nzUInt32));
|
||||
NzByteSwap(&header.format.fourCC, sizeof(nzUInt32));
|
||||
NzByteSwap(&header.format.bpp, sizeof(nzUInt32));
|
||||
NzByteSwap(&header.format.redMask, sizeof(nzUInt32));
|
||||
NzByteSwap(&header.format.greenMask, sizeof(nzUInt32));
|
||||
NzByteSwap(&header.format.blueMask, sizeof(nzUInt32));
|
||||
NzByteSwap(&header.format.alphaMask, sizeof(nzUInt32));
|
||||
|
||||
NzByteSwap(&header.ddsCaps1, sizeof(nzUInt32));
|
||||
NzByteSwap(&header.ddsCaps2, sizeof(nzUInt32));
|
||||
NzByteSwap(&header.ddsCaps3, sizeof(nzUInt32));
|
||||
NzByteSwap(&header.ddsCaps4, sizeof(nzUInt32));
|
||||
#endif
|
||||
|
||||
unsigned int width = header.width;
|
||||
unsigned int height = header.height;
|
||||
unsigned int depth = std::max(header.depth, 1U);
|
||||
unsigned int levelCount = (parameters.levelCount > 0) ? std::min(parameters.levelCount, static_cast<nzUInt8>(header.levelCount)) : header.levelCount;
|
||||
|
||||
// Détermination du type
|
||||
nzImageType type;
|
||||
if (header.ddsCaps2 & DDSCAPS2_CUBEMAP)
|
||||
type = nzImageType_Cubemap;
|
||||
else if (header.ddsCaps2 & DDSCAPS2_VOLUME)
|
||||
type = nzImageType_3D;
|
||||
|
||||
// Détermination du format
|
||||
nzPixelFormat format;
|
||||
|
||||
if (parameters.loadFormat != nzPixelFormat_Undefined)
|
||||
image->Convert(parameters.loadFormat);
|
||||
|
||||
return true;
|
||||
void UnregisterDDS()
|
||||
{
|
||||
ImageLoader::UnregisterLoader(IsSupported, Check, Load);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void NzLoaders_DDS_Register()
|
||||
{
|
||||
NzImageLoader::RegisterLoader(IsSupported, Check, Load);
|
||||
}
|
||||
|
||||
void NzLoaders_DDS_Unregister()
|
||||
{
|
||||
NzImageLoader::UnregisterLoader(IsSupported, Check, Load);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user