Merge branch 'master' into fix_memory_leak_in_gltf2_on_exception
This commit is contained in:
@@ -1034,6 +1034,12 @@ namespace glTF2
|
||||
bool KHR_texture_transform;
|
||||
} extensionsUsed;
|
||||
|
||||
//! Keeps info about the required extensions
|
||||
struct RequiredExtensions
|
||||
{
|
||||
bool KHR_draco_mesh_compression;
|
||||
} extensionsRequired;
|
||||
|
||||
AssetMetadata asset;
|
||||
|
||||
|
||||
@@ -1076,6 +1082,7 @@ namespace glTF2
|
||||
, textures (*this, "textures")
|
||||
{
|
||||
memset(&extensionsUsed, 0, sizeof(extensionsUsed));
|
||||
memset(&extensionsRequired, 0, sizeof(extensionsRequired));
|
||||
}
|
||||
|
||||
//! Main function
|
||||
@@ -1094,6 +1101,7 @@ namespace glTF2
|
||||
void ReadBinaryHeader(IOStream& stream, std::vector<char>& sceneData);
|
||||
|
||||
void ReadExtensionsUsed(Document& doc);
|
||||
void ReadExtensionsRequired(Document& doc);
|
||||
|
||||
IOStream* OpenFile(std::string path, const char* mode, bool absolute = false);
|
||||
};
|
||||
|
||||
@@ -1433,6 +1433,12 @@ inline void Asset::Load(const std::string& pFile, bool isBinary)
|
||||
// Load the metadata
|
||||
asset.Read(doc);
|
||||
ReadExtensionsUsed(doc);
|
||||
ReadExtensionsRequired(doc);
|
||||
|
||||
// Currently Draco is not supported
|
||||
if (extensionsRequired.KHR_draco_mesh_compression) {
|
||||
throw DeadlyImportError("GLTF: Draco mesh compression not currently supported.");
|
||||
}
|
||||
|
||||
// Prepare the dictionaries
|
||||
for (size_t i = 0; i < mDicts.size(); ++i) {
|
||||
@@ -1479,6 +1485,29 @@ inline void Asset::SetAsBinary()
|
||||
}
|
||||
}
|
||||
|
||||
// As required extensions are only a concept in glTF 2.0, this is here
|
||||
// instead of glTFCommon.h
|
||||
#define CHECK_REQUIRED_EXT(EXT) \
|
||||
if (exts.find(#EXT) != exts.end()) extensionsRequired.EXT = true;
|
||||
|
||||
inline void Asset::ReadExtensionsRequired(Document& doc)
|
||||
{
|
||||
Value* extsRequired = FindArray(doc, "extensionsRequired");
|
||||
if (nullptr == extsRequired) {
|
||||
return;
|
||||
}
|
||||
|
||||
std::gltf_unordered_map<std::string, bool> exts;
|
||||
for (unsigned int i = 0; i < extsRequired->Size(); ++i) {
|
||||
if ((*extsRequired)[i].IsString()) {
|
||||
exts[(*extsRequired)[i].GetString()] = true;
|
||||
}
|
||||
}
|
||||
|
||||
CHECK_REQUIRED_EXT(KHR_draco_mesh_compression);
|
||||
|
||||
#undef CHECK_REQUIRED_EXT
|
||||
}
|
||||
|
||||
inline void Asset::ReadExtensionsUsed(Document& doc)
|
||||
{
|
||||
|
||||
@@ -204,11 +204,21 @@ inline void SetMaterialTextureProperty(std::vector<int> &embeddedTexIdxs, Asset
|
||||
|
||||
if (prop.textureTransformSupported) {
|
||||
aiUVTransform transform;
|
||||
transform.mTranslation.x = prop.TextureTransformExt_t.offset[0];
|
||||
transform.mTranslation.y = prop.TextureTransformExt_t.offset[0];
|
||||
transform.mRotation = prop.TextureTransformExt_t.rotation;
|
||||
transform.mScaling.x = prop.TextureTransformExt_t.scale[0];
|
||||
transform.mScaling.y = prop.TextureTransformExt_t.scale[1];
|
||||
transform.mRotation = -prop.TextureTransformExt_t.rotation; // must be negated
|
||||
|
||||
// A change of coordinates is required to map glTF UV transformations into the space used by
|
||||
// Assimp. In glTF all UV origins are at 0,1 (top left of texture) in Assimp space. In Assimp
|
||||
// rotation occurs around the image center (0.5,0.5) where as in glTF rotation is around the
|
||||
// texture origin. All three can be corrected for solely by a change of the translation since
|
||||
// the transformations available are shape preserving. Note the importer already flips the V
|
||||
// coordinate of the actual meshes during import.
|
||||
const ai_real rcos(cos(-transform.mRotation));
|
||||
const ai_real rsin(sin(-transform.mRotation));
|
||||
transform.mTranslation.x = (0.5 * transform.mScaling.x) * (-rcos + rsin + 1) + prop.TextureTransformExt_t.offset[0];
|
||||
transform.mTranslation.y = ((0.5 * transform.mScaling.y) * (rsin + rcos - 1)) + 1 - transform.mScaling.y - prop.TextureTransformExt_t.offset[1];;
|
||||
|
||||
mat->AddProperty(&transform, 1, _AI_MATKEY_UVTRANSFORM_BASE, texType, texSlot);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user