Add unity build support
This commit is contained in:
@@ -36,7 +36,7 @@
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
namespace
|
||||
namespace NAZARA_ANONYMOUS_NAMESPACE
|
||||
{
|
||||
class IcoSphereBuilder
|
||||
{
|
||||
@@ -667,6 +667,8 @@ namespace Nz
|
||||
|
||||
UInt64 ComputeCacheMissCount(IndexIterator indices, UInt32 indexCount)
|
||||
{
|
||||
NAZARA_USE_ANONYMOUS_NAMESPACE
|
||||
|
||||
VertexCache cache(indices, indexCount);
|
||||
return cache.GetMissCount();
|
||||
}
|
||||
@@ -731,6 +733,8 @@ namespace Nz
|
||||
|
||||
void GenerateBox(const Vector3f& lengths, const Vector3ui& subdivision, const Matrix4f& matrix, const Rectf& textureCoords, VertexPointers vertexPointers, IndexIterator indices, Boxf* aabb, unsigned int indexOffset)
|
||||
{
|
||||
NAZARA_USE_ANONYMOUS_NAMESPACE
|
||||
|
||||
std::size_t xIndexCount, yIndexCount, zIndexCount;
|
||||
std::size_t xVertexCount, yVertexCount, zVertexCount;
|
||||
|
||||
@@ -926,6 +930,8 @@ namespace Nz
|
||||
|
||||
void GenerateIcoSphere(float size, unsigned int recursionLevel, const Matrix4f& matrix, const Rectf& textureCoords, VertexPointers vertexPointers, IndexIterator indices, Boxf* aabb, unsigned int indexOffset)
|
||||
{
|
||||
NAZARA_USE_ANONYMOUS_NAMESPACE
|
||||
|
||||
IcoSphereBuilder builder(matrix);
|
||||
builder.Generate(size, recursionLevel, textureCoords, vertexPointers, indices, aabb, indexOffset);
|
||||
}
|
||||
@@ -1043,6 +1049,8 @@ namespace Nz
|
||||
|
||||
void OptimizeIndices(IndexIterator indices, unsigned int indexCount)
|
||||
{
|
||||
NAZARA_USE_ANONYMOUS_NAMESPACE
|
||||
|
||||
VertexCacheOptimizer optimizer;
|
||||
if (optimizer.Optimize(indices, indexCount) != VertexCacheOptimizer::Success)
|
||||
NazaraWarning("Indices optimizer failed");
|
||||
|
||||
@@ -26,14 +26,13 @@ namespace Nz
|
||||
{
|
||||
class FreeTypeLibrary;
|
||||
|
||||
FT_Library s_library = nullptr;
|
||||
FT_Stroker s_stroker = nullptr;
|
||||
std::shared_ptr<FreeTypeLibrary> s_libraryOwner;
|
||||
constexpr float s_scaleFactor = 1 << 6;
|
||||
constexpr float s_invScaleFactor = 1.f / s_scaleFactor;
|
||||
FT_Library s_freetypeLibrary = nullptr;
|
||||
FT_Stroker s_freetypeStroker = nullptr;
|
||||
std::shared_ptr<FreeTypeLibrary> s_freetypeLibraryOwner;
|
||||
constexpr float s_freetypeScaleFactor = 1 << 6;
|
||||
constexpr float s_freetypeInvScaleFactor = 1.f / s_freetypeScaleFactor;
|
||||
|
||||
extern "C"
|
||||
unsigned long FT_StreamRead(FT_Stream stream, unsigned long offset, unsigned char* buffer, unsigned long count)
|
||||
extern "C" unsigned long FT_StreamRead(FT_Stream stream, unsigned long offset, unsigned char* buffer, unsigned long count)
|
||||
{
|
||||
// http://www.freetype.org/freetype2/docs/reference/ft2-system_interface.html#FT_Stream_IoFunc
|
||||
Stream& inputStream = *static_cast<Stream*>(stream->descriptor.pointer);
|
||||
@@ -73,23 +72,23 @@ namespace Nz
|
||||
public:
|
||||
FreeTypeLibrary()
|
||||
{
|
||||
if (FT_Stroker_New(s_library, &s_stroker) != 0)
|
||||
if (FT_Stroker_New(s_freetypeLibrary, &s_freetypeStroker) != 0)
|
||||
{
|
||||
NazaraWarning("Failed to load FreeType stroker, outline will not be possible");
|
||||
s_stroker = nullptr; //< Just in case
|
||||
s_freetypeStroker = nullptr; //< Just in case
|
||||
}
|
||||
}
|
||||
|
||||
~FreeTypeLibrary()
|
||||
{
|
||||
if (s_stroker)
|
||||
if (s_freetypeStroker)
|
||||
{
|
||||
FT_Stroker_Done(s_stroker);
|
||||
s_stroker = nullptr;
|
||||
FT_Stroker_Done(s_freetypeStroker);
|
||||
s_freetypeStroker = nullptr;
|
||||
}
|
||||
|
||||
FT_Done_FreeType(s_library);
|
||||
s_library = nullptr;
|
||||
FT_Done_FreeType(s_freetypeLibrary);
|
||||
s_freetypeLibrary = nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -98,7 +97,7 @@ namespace Nz
|
||||
public:
|
||||
FreeTypeStream() :
|
||||
m_face(nullptr),
|
||||
m_library(s_libraryOwner),
|
||||
m_library(s_freetypeLibraryOwner),
|
||||
m_characterSize(0)
|
||||
{
|
||||
}
|
||||
@@ -112,7 +111,7 @@ namespace Nz
|
||||
bool Check()
|
||||
{
|
||||
// Test d'ouverture (http://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html#FT_Open_Face)
|
||||
return FT_Open_Face(s_library, &m_args, -1, nullptr) == 0;
|
||||
return FT_Open_Face(s_freetypeLibrary, &m_args, -1, nullptr) == 0;
|
||||
}
|
||||
|
||||
bool ExtractGlyph(unsigned int characterSize, char32_t character, TextStyleFlags style, float outlineThickness, FontGlyph* dst) override
|
||||
@@ -165,8 +164,8 @@ namespace Nz
|
||||
|
||||
if (outlineThickness > 0.f)
|
||||
{
|
||||
FT_Stroker_Set(s_stroker, static_cast<FT_Fixed>(s_scaleFactor * outlineThickness), FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, 0);
|
||||
if (FT_Glyph_Stroke(&glyph, s_stroker, 1) != 0)
|
||||
FT_Stroker_Set(s_freetypeStroker, static_cast<FT_Fixed>(s_freetypeScaleFactor * outlineThickness), FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, 0);
|
||||
if (FT_Glyph_Stroke(&glyph, s_freetypeStroker, 1) != 0)
|
||||
{
|
||||
NazaraError("Failed to outline glyph");
|
||||
return false;
|
||||
@@ -187,7 +186,7 @@ namespace Nz
|
||||
if (embolden)
|
||||
{
|
||||
// http://www.freetype.org/freetype2/docs/reference/ft2-bitmap_handling.html#FT_Bitmap_Embolden
|
||||
FT_Bitmap_Embolden(s_library, &bitmap, boldStrength, boldStrength);
|
||||
FT_Bitmap_Embolden(s_freetypeLibrary, &bitmap, boldStrength, boldStrength);
|
||||
}
|
||||
|
||||
int outlineThicknessInt = static_cast<int>(outlineThickness * 2.f + 0.5f); //< round it
|
||||
@@ -266,7 +265,7 @@ namespace Nz
|
||||
|
||||
bool Open()
|
||||
{
|
||||
return FT_Open_Face(s_library, &m_args, 0, &m_face) == 0;
|
||||
return FT_Open_Face(s_freetypeLibrary, &m_args, 0, &m_face) == 0;
|
||||
}
|
||||
|
||||
int QueryKerning(unsigned int characterSize, char32_t first, char32_t second) const override
|
||||
@@ -302,7 +301,7 @@ namespace Nz
|
||||
SetCharacterSize(characterSize);
|
||||
|
||||
// http://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html#FT_FaceRec
|
||||
return static_cast<float>(FT_MulFix(m_face->underline_position, m_face->size->metrics.y_scale)) * s_invScaleFactor;
|
||||
return static_cast<float>(FT_MulFix(m_face->underline_position, m_face->size->metrics.y_scale)) * s_freetypeInvScaleFactor;
|
||||
}
|
||||
else
|
||||
return characterSize / 10.f; // Joker ?
|
||||
@@ -315,7 +314,7 @@ namespace Nz
|
||||
SetCharacterSize(characterSize);
|
||||
|
||||
// http://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html#FT_FaceRec
|
||||
return static_cast<float>(FT_MulFix(m_face->underline_thickness, m_face->size->metrics.y_scale)) * s_invScaleFactor;
|
||||
return static_cast<float>(FT_MulFix(m_face->underline_thickness, m_face->size->metrics.y_scale)) * s_freetypeInvScaleFactor;
|
||||
}
|
||||
else
|
||||
return characterSize/15.f; // Joker ?
|
||||
@@ -357,7 +356,7 @@ namespace Nz
|
||||
|
||||
bool SupportsOutline(float /*outlineThickness*/) const override
|
||||
{
|
||||
return s_stroker != nullptr;
|
||||
return s_freetypeStroker != nullptr;
|
||||
}
|
||||
|
||||
bool SupportsStyle(TextStyleFlags style) const override
|
||||
@@ -384,7 +383,7 @@ namespace Nz
|
||||
mutable unsigned int m_characterSize;
|
||||
};
|
||||
|
||||
bool IsSupported(const std::string_view& extension)
|
||||
bool IsFreetypeSupported(const std::string_view& extension)
|
||||
{
|
||||
///FIXME: Je suppose qu'il en manque quelques unes..
|
||||
static std::set<std::string_view> supportedExtensions = {
|
||||
@@ -394,7 +393,7 @@ namespace Nz
|
||||
return supportedExtensions.find(extension) != supportedExtensions.end();
|
||||
}
|
||||
|
||||
Ternary Check(Stream& stream, const FontParams& parameters)
|
||||
Ternary CheckFreetype(Stream& stream, const FontParams& parameters)
|
||||
{
|
||||
bool skip;
|
||||
if (parameters.custom.GetBooleanParameter("SkipNativeFreeTypeLoader", &skip) && skip)
|
||||
@@ -409,7 +408,7 @@ namespace Nz
|
||||
return Ternary::False;
|
||||
}
|
||||
|
||||
std::shared_ptr<Font> LoadFile(const std::filesystem::path& filePath, const FontParams& parameters)
|
||||
std::shared_ptr<Font> LoadFreetypeFile(const std::filesystem::path& filePath, const FontParams& parameters)
|
||||
{
|
||||
NazaraUnused(parameters);
|
||||
|
||||
@@ -433,7 +432,7 @@ namespace Nz
|
||||
return font;
|
||||
}
|
||||
|
||||
std::shared_ptr<Font> LoadMemory(const void* data, std::size_t size, const FontParams& parameters)
|
||||
std::shared_ptr<Font> LoadFreetypeMemory(const void* data, std::size_t size, const FontParams& parameters)
|
||||
{
|
||||
NazaraUnused(parameters);
|
||||
|
||||
@@ -453,7 +452,7 @@ namespace Nz
|
||||
return font;
|
||||
}
|
||||
|
||||
std::shared_ptr<Font> LoadStream(Stream& stream, const FontParams& parameters)
|
||||
std::shared_ptr<Font> LoadFreetypeStream(Stream& stream, const FontParams& parameters)
|
||||
{
|
||||
NazaraUnused(parameters);
|
||||
|
||||
@@ -478,34 +477,34 @@ namespace Nz
|
||||
{
|
||||
bool InitializeFreeType()
|
||||
{
|
||||
NazaraAssert(!s_libraryOwner, "double initialization for FreeType");
|
||||
if (FT_Init_FreeType(&s_library) != 0)
|
||||
NazaraAssert(!s_freetypeLibraryOwner, "double initialization for FreeType");
|
||||
if (FT_Init_FreeType(&s_freetypeLibrary) != 0)
|
||||
{
|
||||
NazaraWarning("failed to initialize FreeType library");
|
||||
return false;
|
||||
}
|
||||
|
||||
s_libraryOwner = std::make_shared<FreeTypeLibrary>();
|
||||
s_freetypeLibraryOwner = std::make_shared<FreeTypeLibrary>();
|
||||
return true;
|
||||
}
|
||||
|
||||
FontLoader::Entry GetFontLoader_FreeType()
|
||||
{
|
||||
NazaraAssert(s_libraryOwner, "FreeType has not been initialized");
|
||||
NazaraAssert(s_freetypeLibraryOwner, "FreeType has not been initialized");
|
||||
|
||||
FontLoader::Entry entry;
|
||||
entry.extensionSupport = IsSupported;
|
||||
entry.fileLoader = LoadFile;
|
||||
entry.memoryLoader = LoadMemory;
|
||||
entry.streamChecker = Check;
|
||||
entry.streamLoader = LoadStream;
|
||||
entry.extensionSupport = IsFreetypeSupported;
|
||||
entry.fileLoader = LoadFreetypeFile;
|
||||
entry.memoryLoader = LoadFreetypeMemory;
|
||||
entry.streamChecker = CheckFreetype;
|
||||
entry.streamLoader = LoadFreetypeStream;
|
||||
|
||||
return entry;
|
||||
}
|
||||
|
||||
void UninitializeFreeType()
|
||||
{
|
||||
s_libraryOwner.reset();
|
||||
s_freetypeLibraryOwner.reset();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,12 +21,12 @@ namespace Nz
|
||||
{
|
||||
namespace
|
||||
{
|
||||
bool IsSupported(const std::string_view& extension)
|
||||
bool IsMD2Supported(const std::string_view& extension)
|
||||
{
|
||||
return (extension == "md2");
|
||||
}
|
||||
|
||||
Ternary Check(Stream& stream, const MeshParams& parameters)
|
||||
Ternary CheckMD2(Stream& stream, const MeshParams& parameters)
|
||||
{
|
||||
bool skip;
|
||||
if (parameters.custom.GetBooleanParameter("SkipNativeMD2Loader", &skip) && skip)
|
||||
@@ -47,7 +47,7 @@ namespace Nz
|
||||
return Ternary::False;
|
||||
}
|
||||
|
||||
std::shared_ptr<Mesh> Load(Stream& stream, const MeshParams& parameters)
|
||||
std::shared_ptr<Mesh> LoadMD2(Stream& stream, const MeshParams& parameters)
|
||||
{
|
||||
MD2_Header header;
|
||||
if (stream.Read(&header, sizeof(MD2_Header)) != sizeof(MD2_Header))
|
||||
@@ -269,9 +269,9 @@ namespace Nz
|
||||
MeshLoader::Entry GetMeshLoader_MD2()
|
||||
{
|
||||
MeshLoader::Entry loader;
|
||||
loader.extensionSupport = IsSupported;
|
||||
loader.streamChecker = Check;
|
||||
loader.streamLoader = Load;
|
||||
loader.extensionSupport = IsMD2Supported;
|
||||
loader.streamChecker = CheckMD2;
|
||||
loader.streamLoader = LoadMD2;
|
||||
|
||||
return loader;
|
||||
}
|
||||
|
||||
@@ -12,12 +12,12 @@ namespace Nz
|
||||
{
|
||||
namespace
|
||||
{
|
||||
bool IsSupported(const std::string_view& extension)
|
||||
bool IsMD5AnimSupported(const std::string_view& extension)
|
||||
{
|
||||
return (extension == "md5anim");
|
||||
}
|
||||
|
||||
Ternary Check(Stream& stream, const AnimationParams& parameters)
|
||||
Ternary CheckMD5Anim(Stream& stream, const AnimationParams& parameters)
|
||||
{
|
||||
bool skip;
|
||||
if (parameters.custom.GetBooleanParameter("SkipNativeMD5AnimLoader", &skip) && skip)
|
||||
@@ -27,7 +27,7 @@ namespace Nz
|
||||
return parser.Check();
|
||||
}
|
||||
|
||||
std::shared_ptr<Animation> Load(Stream& stream, const AnimationParams& /*parameters*/)
|
||||
std::shared_ptr<Animation> LoadMD5Anim(Stream& stream, const AnimationParams& /*parameters*/)
|
||||
{
|
||||
///TODO: Utiliser les paramètres
|
||||
MD5AnimParser parser(stream);
|
||||
@@ -93,9 +93,9 @@ namespace Nz
|
||||
AnimationLoader::Entry GetAnimationLoader_MD5Anim()
|
||||
{
|
||||
AnimationLoader::Entry loader;
|
||||
loader.extensionSupport = IsSupported;
|
||||
loader.streamChecker = Check;
|
||||
loader.streamLoader = Load;
|
||||
loader.extensionSupport = IsMD5AnimSupported;
|
||||
loader.streamChecker = CheckMD5Anim;
|
||||
loader.streamLoader = LoadMD5Anim;
|
||||
|
||||
return loader;
|
||||
}
|
||||
|
||||
@@ -20,12 +20,12 @@ namespace Nz
|
||||
{
|
||||
namespace
|
||||
{
|
||||
bool IsSupported(const std::string_view& extension)
|
||||
bool IsMD5MeshSupported(const std::string_view& extension)
|
||||
{
|
||||
return (extension == "md5mesh");
|
||||
}
|
||||
|
||||
Ternary Check(Stream& stream, const MeshParams& parameters)
|
||||
Ternary CheckMD5Mesh(Stream& stream, const MeshParams& parameters)
|
||||
{
|
||||
bool skip;
|
||||
if (parameters.custom.GetBooleanParameter("SkipNativeMD5MeshLoader", &skip) && skip)
|
||||
@@ -35,7 +35,7 @@ namespace Nz
|
||||
return parser.Check();
|
||||
}
|
||||
|
||||
std::shared_ptr<Mesh> Load(Stream& stream, const MeshParams& parameters)
|
||||
std::shared_ptr<Mesh> LoadMD5Mesh(Stream& stream, const MeshParams& parameters)
|
||||
{
|
||||
MD5MeshParser parser(stream);
|
||||
if (!parser.Parse())
|
||||
@@ -334,9 +334,9 @@ namespace Nz
|
||||
MeshLoader::Entry GetMeshLoader_MD5Mesh()
|
||||
{
|
||||
MeshLoader::Entry loader;
|
||||
loader.extensionSupport = IsSupported;
|
||||
loader.streamChecker = Check;
|
||||
loader.streamLoader = Load;
|
||||
loader.extensionSupport = IsMD5MeshSupported;
|
||||
loader.streamChecker = CheckMD5Mesh;
|
||||
loader.streamLoader = LoadMD5Mesh;
|
||||
|
||||
return loader;
|
||||
}
|
||||
|
||||
@@ -22,12 +22,12 @@ namespace Nz
|
||||
{
|
||||
namespace
|
||||
{
|
||||
bool IsSupported(const std::string_view& extension)
|
||||
bool IsOBJSupported(const std::string_view& extension)
|
||||
{
|
||||
return (extension == "obj");
|
||||
}
|
||||
|
||||
Ternary Check(Stream& stream, const MeshParams& parameters)
|
||||
Ternary CheckOBJ(Stream& stream, const MeshParams& parameters)
|
||||
{
|
||||
NazaraUnused(stream);
|
||||
|
||||
@@ -157,7 +157,7 @@ namespace Nz
|
||||
return true;
|
||||
}
|
||||
|
||||
std::shared_ptr<Mesh> Load(Stream& stream, const MeshParams& parameters)
|
||||
std::shared_ptr<Mesh> LoadOBJ(Stream& stream, const MeshParams& parameters)
|
||||
{
|
||||
long long reservedVertexCount;
|
||||
if (!parameters.custom.GetIntegerParameter("NativeOBJLoader_VertexCount", &reservedVertexCount))
|
||||
@@ -367,9 +367,9 @@ namespace Nz
|
||||
MeshLoader::Entry GetMeshLoader_OBJ()
|
||||
{
|
||||
MeshLoader::Entry loader;
|
||||
loader.extensionSupport = IsSupported;
|
||||
loader.streamChecker = Check;
|
||||
loader.streamLoader = Load;
|
||||
loader.extensionSupport = IsOBJSupported;
|
||||
loader.streamChecker = CheckOBJ;
|
||||
loader.streamLoader = LoadOBJ;
|
||||
|
||||
return loader;
|
||||
}
|
||||
|
||||
@@ -52,12 +52,12 @@ namespace Nz
|
||||
T* m_buffer;
|
||||
};
|
||||
|
||||
bool IsSupported(const std::string_view& extension)
|
||||
bool IsOBJSupportedSave(const std::string_view& extension)
|
||||
{
|
||||
return (extension == "obj");
|
||||
}
|
||||
|
||||
bool SaveToStream(const Mesh& mesh, const std::string& format, Stream& stream, const MeshParams& parameters)
|
||||
bool SaveOBJToStream(const Mesh& mesh, const std::string& format, Stream& stream, const MeshParams& parameters)
|
||||
{
|
||||
NazaraUnused(parameters);
|
||||
|
||||
@@ -213,8 +213,8 @@ namespace Nz
|
||||
MeshSaver::Entry GetMeshSaver_OBJ()
|
||||
{
|
||||
MeshSaver::Entry entry;
|
||||
entry.formatSupport = IsSupported;
|
||||
entry.streamSaver = SaveToStream;
|
||||
entry.formatSupport = IsOBJSupportedSave;
|
||||
entry.streamSaver = SaveOBJToStream;
|
||||
|
||||
return entry;
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ namespace Nz
|
||||
{
|
||||
namespace
|
||||
{
|
||||
struct pcx_header
|
||||
struct PCXHeader
|
||||
{
|
||||
UInt8 manufacturer;
|
||||
UInt8 version;
|
||||
@@ -38,14 +38,14 @@ namespace Nz
|
||||
UInt8 padding[54];
|
||||
};
|
||||
|
||||
static_assert(sizeof(pcx_header) == (6+48+54)*sizeof(UInt8) + 10*sizeof(UInt16), "pcx_header struct must be packed");
|
||||
static_assert(sizeof(PCXHeader) == (6+48+54)*sizeof(UInt8) + 10*sizeof(UInt16), "pcx_header struct must be packed");
|
||||
|
||||
bool IsSupported(const std::string_view& extension)
|
||||
bool IsPCXSupported(const std::string_view& extension)
|
||||
{
|
||||
return (extension == "pcx");
|
||||
}
|
||||
|
||||
Ternary Check(Stream& stream, const ImageParams& parameters)
|
||||
Ternary CheckPCX(Stream& stream, const ImageParams& parameters)
|
||||
{
|
||||
bool skip;
|
||||
if (parameters.custom.GetBooleanParameter("SkipNativePCXLoader", &skip) && skip)
|
||||
@@ -61,12 +61,12 @@ namespace Nz
|
||||
return Ternary::False;
|
||||
}
|
||||
|
||||
std::shared_ptr<Image> Load(Stream& stream, const ImageParams& parameters)
|
||||
std::shared_ptr<Image> LoadPCX(Stream& stream, const ImageParams& parameters)
|
||||
{
|
||||
NazaraUnused(parameters);
|
||||
|
||||
pcx_header header;
|
||||
if (stream.Read(&header, sizeof(pcx_header)) != sizeof(pcx_header))
|
||||
PCXHeader header;
|
||||
if (stream.Read(&header, sizeof(PCXHeader)) != sizeof(PCXHeader))
|
||||
{
|
||||
NazaraError("Failed to read header");
|
||||
return nullptr;
|
||||
@@ -345,9 +345,9 @@ namespace Nz
|
||||
ImageLoader::Entry GetImageLoader_PCX()
|
||||
{
|
||||
ImageLoader::Entry loaderEntry;
|
||||
loaderEntry.extensionSupport = IsSupported;
|
||||
loaderEntry.streamChecker = Check;
|
||||
loaderEntry.streamLoader = Load;
|
||||
loaderEntry.extensionSupport = IsPCXSupported;
|
||||
loaderEntry.streamChecker = CheckPCX;
|
||||
loaderEntry.streamLoader = LoadPCX;
|
||||
|
||||
return loaderEntry;
|
||||
}
|
||||
|
||||
@@ -17,52 +17,52 @@ namespace Nz
|
||||
{
|
||||
namespace
|
||||
{
|
||||
int Eof(void* userdata)
|
||||
int StbiEof(void* userdata)
|
||||
{
|
||||
Stream* stream = static_cast<Stream*>(userdata);
|
||||
return stream->GetCursorPos() >= stream->GetSize();
|
||||
}
|
||||
|
||||
int Read(void* userdata, char* data, int size)
|
||||
int StbiRead(void* userdata, char* data, int size)
|
||||
{
|
||||
Stream* stream = static_cast<Stream*>(userdata);
|
||||
return static_cast<int>(stream->Read(data, size));
|
||||
}
|
||||
|
||||
void Skip(void* userdata, int size)
|
||||
void StbiSkip(void* userdata, int size)
|
||||
{
|
||||
Stream* stream = static_cast<Stream*>(userdata);
|
||||
stream->SetCursorPos(static_cast<Int64>(stream->GetCursorPos()) + static_cast<Int64>(size));
|
||||
}
|
||||
|
||||
static stbi_io_callbacks callbacks = {Read, Skip, Eof};
|
||||
static stbi_io_callbacks s_stbiCallbacks = { StbiRead, StbiSkip, StbiEof };
|
||||
|
||||
bool IsSupported(const std::string_view& extension)
|
||||
bool IsSTBSupported(const std::string_view& extension)
|
||||
{
|
||||
static std::unordered_set<std::string_view> supportedExtensions = {"bmp", "gif", "hdr", "jpg", "jpeg", "pic", "png", "ppm", "pgm", "psd", "tga"};
|
||||
return supportedExtensions.find(extension) != supportedExtensions.end();
|
||||
}
|
||||
|
||||
Ternary Check(Stream& stream, const ImageParams& parameters)
|
||||
Ternary CheckSTB(Stream& stream, const ImageParams& parameters)
|
||||
{
|
||||
bool skip;
|
||||
if (parameters.custom.GetBooleanParameter("SkipNativeSTBLoader", &skip) && skip)
|
||||
return Ternary::False;
|
||||
|
||||
int width, height, bpp;
|
||||
if (stbi_info_from_callbacks(&callbacks, &stream, &width, &height, &bpp))
|
||||
if (stbi_info_from_callbacks(&s_stbiCallbacks, &stream, &width, &height, &bpp))
|
||||
return Ternary::True;
|
||||
else
|
||||
return Ternary::False;
|
||||
}
|
||||
|
||||
std::shared_ptr<Image> Load(Stream& stream, const ImageParams& parameters)
|
||||
std::shared_ptr<Image> LoadSTB(Stream& stream, const ImageParams& parameters)
|
||||
{
|
||||
// Je charge tout en RGBA8 et je converti ensuite via la méthode Convert
|
||||
// Ceci à cause d'un bug de STB lorsqu'il s'agit de charger certaines images (ex: JPG) en "default"
|
||||
|
||||
int width, height, bpp;
|
||||
UInt8* ptr = stbi_load_from_callbacks(&callbacks, &stream, &width, &height, &bpp, STBI_rgb_alpha);
|
||||
UInt8* ptr = stbi_load_from_callbacks(&s_stbiCallbacks, &stream, &width, &height, &bpp, STBI_rgb_alpha);
|
||||
if (!ptr)
|
||||
{
|
||||
NazaraError("Failed to load image: " + std::string(stbi_failure_reason()));
|
||||
@@ -103,9 +103,9 @@ namespace Nz
|
||||
ImageLoader::Entry GetImageLoader_STB()
|
||||
{
|
||||
ImageLoader::Entry loaderEntry;
|
||||
loaderEntry.extensionSupport = IsSupported;
|
||||
loaderEntry.streamChecker = Check;
|
||||
loaderEntry.streamLoader = Load;
|
||||
loaderEntry.extensionSupport = IsSTBSupported;
|
||||
loaderEntry.streamChecker = CheckSTB;
|
||||
loaderEntry.streamLoader = LoadSTB;
|
||||
|
||||
return loaderEntry;
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace Nz
|
||||
{
|
||||
namespace
|
||||
{
|
||||
const unsigned int s_atlasStartSize = 512;
|
||||
const unsigned int s_guillotineAtlasStartSize = 512;
|
||||
}
|
||||
|
||||
GuillotineImageAtlas::GuillotineImageAtlas() :
|
||||
@@ -119,7 +119,7 @@ namespace Nz
|
||||
// Dernière couche, et le glyphe ne rentre pas, peut-on agrandir la taille de l'image ?
|
||||
Vector2ui newSize = layer.binPack.GetSize()*2;
|
||||
if (newSize == Vector2ui::Zero())
|
||||
newSize.Set(s_atlasStartSize);
|
||||
newSize.Set(s_guillotineAtlasStartSize);
|
||||
|
||||
// Limit image atlas size to prevent allocating too much contiguous memory blocks
|
||||
if (newSize.x <= m_maxLayerSize && newSize.y <= m_maxLayerSize && ResizeLayer(layer, newSize))
|
||||
@@ -133,7 +133,7 @@ namespace Nz
|
||||
else
|
||||
{
|
||||
// On ne peut plus agrandir la dernière couche, il est temps d'en créer une nouvelle
|
||||
newSize.Set(s_atlasStartSize);
|
||||
newSize.Set(s_guillotineAtlasStartSize);
|
||||
|
||||
Layer newLayer;
|
||||
if (!ResizeLayer(newLayer, newSize))
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace Nz
|
||||
{
|
||||
namespace
|
||||
{
|
||||
inline unsigned int GetLevelSize(unsigned int size, UInt8 level)
|
||||
inline unsigned int GetImageLevelSize(unsigned int size, UInt8 level)
|
||||
{
|
||||
if (size == 0) // Possible dans le cas d'une image invalide
|
||||
return 0;
|
||||
@@ -576,7 +576,7 @@ namespace Nz
|
||||
}
|
||||
#endif
|
||||
|
||||
unsigned int width = GetLevelSize(m_sharedImage->width, level);
|
||||
unsigned int width = GetImageLevelSize(m_sharedImage->width, level);
|
||||
#if NAZARA_UTILITY_SAFE
|
||||
if (x >= width)
|
||||
{
|
||||
@@ -585,7 +585,7 @@ namespace Nz
|
||||
}
|
||||
#endif
|
||||
|
||||
unsigned int height = GetLevelSize(m_sharedImage->height, level);
|
||||
unsigned int height = GetImageLevelSize(m_sharedImage->height, level);
|
||||
#if NAZARA_UTILITY_SAFE
|
||||
if (y >= height)
|
||||
{
|
||||
@@ -593,7 +593,7 @@ namespace Nz
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
unsigned int depth = (m_sharedImage->type == ImageType::Cubemap) ? 6 : GetLevelSize(m_sharedImage->depth, level);
|
||||
unsigned int depth = (m_sharedImage->type == ImageType::Cubemap) ? 6 : GetImageLevelSize(m_sharedImage->depth, level);
|
||||
if (z >= depth)
|
||||
{
|
||||
NazaraError("Z value exceeds depth (" + NumberToString(z) + " >= " + NumberToString(depth) + ')');
|
||||
@@ -614,7 +614,7 @@ namespace Nz
|
||||
}
|
||||
#endif
|
||||
|
||||
return GetLevelSize(m_sharedImage->depth, level);
|
||||
return GetImageLevelSize(m_sharedImage->depth, level);
|
||||
}
|
||||
|
||||
PixelFormat Image::GetFormat() const
|
||||
@@ -632,7 +632,7 @@ namespace Nz
|
||||
}
|
||||
#endif
|
||||
|
||||
return GetLevelSize(m_sharedImage->height, level);
|
||||
return GetImageLevelSize(m_sharedImage->height, level);
|
||||
}
|
||||
|
||||
UInt8 Image::GetLevelCount() const
|
||||
@@ -674,7 +674,7 @@ namespace Nz
|
||||
|
||||
std::size_t Image::GetMemoryUsage(UInt8 level) const
|
||||
{
|
||||
return PixelFormatInfo::ComputeSize(m_sharedImage->format, GetLevelSize(m_sharedImage->width, level), GetLevelSize(m_sharedImage->height, level), ((m_sharedImage->type == ImageType::Cubemap) ? 6 : GetLevelSize(m_sharedImage->depth, level)));
|
||||
return PixelFormatInfo::ComputeSize(m_sharedImage->format, GetImageLevelSize(m_sharedImage->width, level), GetImageLevelSize(m_sharedImage->height, level), ((m_sharedImage->type == ImageType::Cubemap) ? 6 : GetImageLevelSize(m_sharedImage->depth, level)));
|
||||
}
|
||||
|
||||
Color Image::GetPixelColor(unsigned int x, unsigned int y, unsigned int z) const
|
||||
@@ -737,7 +737,7 @@ namespace Nz
|
||||
}
|
||||
#endif
|
||||
|
||||
unsigned int width = GetLevelSize(m_sharedImage->width, level);
|
||||
unsigned int width = GetImageLevelSize(m_sharedImage->width, level);
|
||||
#if NAZARA_UTILITY_SAFE
|
||||
if (x >= width)
|
||||
{
|
||||
@@ -746,7 +746,7 @@ namespace Nz
|
||||
}
|
||||
#endif
|
||||
|
||||
unsigned int height = GetLevelSize(m_sharedImage->height, level);
|
||||
unsigned int height = GetImageLevelSize(m_sharedImage->height, level);
|
||||
#if NAZARA_UTILITY_SAFE
|
||||
if (y >= height)
|
||||
{
|
||||
@@ -754,7 +754,7 @@ namespace Nz
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
unsigned int depth = (m_sharedImage->type == ImageType::Cubemap) ? 6 : GetLevelSize(m_sharedImage->depth, level);
|
||||
unsigned int depth = (m_sharedImage->type == ImageType::Cubemap) ? 6 : GetImageLevelSize(m_sharedImage->depth, level);
|
||||
if (z >= depth)
|
||||
{
|
||||
NazaraError("Z value exceeds depth (" + NumberToString(z) + " >= " + NumberToString(depth) + ')');
|
||||
@@ -783,7 +783,7 @@ namespace Nz
|
||||
}
|
||||
#endif
|
||||
|
||||
return Vector3ui(GetLevelSize(m_sharedImage->width, level), GetLevelSize(m_sharedImage->height, level), GetLevelSize(m_sharedImage->depth, level));
|
||||
return Vector3ui(GetImageLevelSize(m_sharedImage->width, level), GetImageLevelSize(m_sharedImage->height, level), GetImageLevelSize(m_sharedImage->depth, level));
|
||||
}
|
||||
|
||||
ImageType Image::GetType() const
|
||||
@@ -801,7 +801,7 @@ namespace Nz
|
||||
}
|
||||
#endif
|
||||
|
||||
return GetLevelSize(m_sharedImage->width, level);
|
||||
return GetImageLevelSize(m_sharedImage->width, level);
|
||||
}
|
||||
|
||||
bool Image::HasAlpha() const
|
||||
@@ -1270,8 +1270,8 @@ namespace Nz
|
||||
}
|
||||
#endif
|
||||
|
||||
unsigned int width = GetLevelSize(m_sharedImage->width, level);
|
||||
unsigned int height = GetLevelSize(m_sharedImage->height, level);
|
||||
unsigned int width = GetImageLevelSize(m_sharedImage->width, level);
|
||||
unsigned int height = GetImageLevelSize(m_sharedImage->height, level);
|
||||
|
||||
#if NAZARA_UTILITY_SAFE
|
||||
if (!box.IsValid())
|
||||
@@ -1280,7 +1280,7 @@ namespace Nz
|
||||
return false;
|
||||
}
|
||||
|
||||
unsigned int depth = (m_sharedImage->type == ImageType::Cubemap) ? 6 : GetLevelSize(m_sharedImage->depth, level);
|
||||
unsigned int depth = (m_sharedImage->type == ImageType::Cubemap) ? 6 : GetImageLevelSize(m_sharedImage->depth, level);
|
||||
if (box.x+box.width > width || box.y+box.height > height || box.z+box.depth > depth ||
|
||||
(m_sharedImage->type == ImageType::Cubemap && box.depth > 1)) // Nous n'autorisons pas de modifier plus d'une face du cubemap à la fois
|
||||
{
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
namespace
|
||||
namespace NAZARA_ANONYMOUS_NAMESPACE
|
||||
{
|
||||
UInt32 GetterSequential(const void* buffer, std::size_t i)
|
||||
{
|
||||
@@ -58,6 +58,8 @@ namespace Nz
|
||||
IndexMapper::IndexMapper(IndexBuffer& indexBuffer, std::size_t indexCount) :
|
||||
m_indexCount((indexCount != 0) ? indexCount : indexBuffer.GetIndexCount())
|
||||
{
|
||||
NAZARA_USE_ANONYMOUS_NAMESPACE
|
||||
|
||||
if (!m_mapper.Map(indexBuffer, 0, m_indexCount))
|
||||
NazaraError("Failed to map buffer"); ///TODO: Unexcepted
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
namespace
|
||||
namespace NAZARA_ANONYMOUS_NAMESPACE
|
||||
{
|
||||
inline UInt8 c4to5(UInt8 c)
|
||||
{
|
||||
@@ -1412,6 +1412,8 @@ namespace Nz
|
||||
|
||||
bool PixelFormatInfo::Initialize()
|
||||
{
|
||||
NAZARA_USE_ANONYMOUS_NAMESPACE
|
||||
|
||||
auto SetupPixelFormat = [](PixelFormat format, PixelFormatDescription&& desc)
|
||||
{
|
||||
s_pixelFormatInfos[UnderlyingCast(format)] = std::move(desc);
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
namespace
|
||||
namespace NAZARA_ANONYMOUS_NAMESPACE
|
||||
{
|
||||
std::size_t s_componentStride[ComponentTypeCount] =
|
||||
{
|
||||
@@ -37,6 +37,8 @@ namespace Nz
|
||||
VertexDeclaration::VertexDeclaration(VertexInputRate inputRate, std::initializer_list<ComponentEntry> components) :
|
||||
m_inputRate(inputRate)
|
||||
{
|
||||
NAZARA_USE_ANONYMOUS_NAMESPACE
|
||||
|
||||
ErrorFlags errFlags(ErrorMode::ThrowException);
|
||||
std::size_t offset = 0;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user