Merge branch 'master' into master
commit
e53fdf365e
|
@ -43,7 +43,7 @@ __Importers__:
|
||||||
- AMJ
|
- AMJ
|
||||||
- ASE
|
- ASE
|
||||||
- ASK
|
- ASK
|
||||||
- B3D;
|
- B3D
|
||||||
- BLEND (Blender)
|
- BLEND (Blender)
|
||||||
- BVH
|
- BVH
|
||||||
- COB
|
- COB
|
||||||
|
|
|
@ -181,12 +181,16 @@ namespace glTF2
|
||||||
#define _AI_MATKEY_GLTF_MAPPINGID_BASE "$tex.mappingid"
|
#define _AI_MATKEY_GLTF_MAPPINGID_BASE "$tex.mappingid"
|
||||||
#define _AI_MATKEY_GLTF_MAPPINGFILTER_MAG_BASE "$tex.mappingfiltermag"
|
#define _AI_MATKEY_GLTF_MAPPINGFILTER_MAG_BASE "$tex.mappingfiltermag"
|
||||||
#define _AI_MATKEY_GLTF_MAPPINGFILTER_MIN_BASE "$tex.mappingfiltermin"
|
#define _AI_MATKEY_GLTF_MAPPINGFILTER_MIN_BASE "$tex.mappingfiltermin"
|
||||||
|
#define _AI_MATKEY_GLTF_SCALE_BASE "$tex.scale"
|
||||||
|
#define _AI_MATKEY_GLTF_STRENGTH_BASE "$tex.strength"
|
||||||
|
|
||||||
#define AI_MATKEY_GLTF_TEXTURE_TEXCOORD _AI_MATKEY_GLTF_TEXTURE_TEXCOORD_BASE, type, N
|
#define AI_MATKEY_GLTF_TEXTURE_TEXCOORD _AI_MATKEY_GLTF_TEXTURE_TEXCOORD_BASE, type, N
|
||||||
#define AI_MATKEY_GLTF_MAPPINGNAME(type, N) _AI_MATKEY_GLTF_MAPPINGNAME_BASE, type, N
|
#define AI_MATKEY_GLTF_MAPPINGNAME(type, N) _AI_MATKEY_GLTF_MAPPINGNAME_BASE, type, N
|
||||||
#define AI_MATKEY_GLTF_MAPPINGID(type, N) _AI_MATKEY_GLTF_MAPPINGID_BASE, type, N
|
#define AI_MATKEY_GLTF_MAPPINGID(type, N) _AI_MATKEY_GLTF_MAPPINGID_BASE, type, N
|
||||||
#define AI_MATKEY_GLTF_MAPPINGFILTER_MAG(type, N) _AI_MATKEY_GLTF_MAPPINGFILTER_MAG_BASE, type, N
|
#define AI_MATKEY_GLTF_MAPPINGFILTER_MAG(type, N) _AI_MATKEY_GLTF_MAPPINGFILTER_MAG_BASE, type, N
|
||||||
#define AI_MATKEY_GLTF_MAPPINGFILTER_MIN(type, N) _AI_MATKEY_GLTF_MAPPINGFILTER_MIN_BASE, type, N
|
#define AI_MATKEY_GLTF_MAPPINGFILTER_MIN(type, N) _AI_MATKEY_GLTF_MAPPINGFILTER_MIN_BASE, type, N
|
||||||
|
#define AI_MATKEY_GLTF_TEXTURE_SCALE(type, N) _AI_MATKEY_GLTF_SCALE_BASE, type, N
|
||||||
|
#define AI_MATKEY_GLTF_TEXTURE_STRENGTH(type, N) _AI_MATKEY_GLTF_STRENGTH_BASE, type, N
|
||||||
|
|
||||||
#ifdef ASSIMP_API
|
#ifdef ASSIMP_API
|
||||||
#include "./../include/assimp/Compiler/pushpack1.h"
|
#include "./../include/assimp/Compiler/pushpack1.h"
|
||||||
|
|
|
@ -584,7 +584,7 @@ namespace glTF2 {
|
||||||
if (bodyBuffer->byteLength > 0) {
|
if (bodyBuffer->byteLength > 0) {
|
||||||
rapidjson::Value glbBodyBuffer;
|
rapidjson::Value glbBodyBuffer;
|
||||||
glbBodyBuffer.SetObject();
|
glbBodyBuffer.SetObject();
|
||||||
glbBodyBuffer.AddMember("byteLength", bodyBuffer->byteLength, mAl);
|
glbBodyBuffer.AddMember("byteLength", static_cast<uint64_t>(bodyBuffer->byteLength), mAl);
|
||||||
mDoc["buffers"].PushBack(glbBodyBuffer, mAl);
|
mDoc["buffers"].PushBack(glbBodyBuffer, mAl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -99,14 +99,14 @@ const aiImporterDesc* glTF2Importer::GetInfo() const
|
||||||
return &desc;
|
return &desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool glTF2Importer::CanRead(const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const
|
bool glTF2Importer::CanRead(const std::string& pFile, IOSystem* pIOHandler, bool /* checkSig */) const
|
||||||
{
|
{
|
||||||
const std::string &extension = GetExtension(pFile);
|
const std::string &extension = GetExtension(pFile);
|
||||||
|
|
||||||
if (extension != "gltf" && extension != "glb")
|
if (extension != "gltf" && extension != "glb")
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (checkSig && pIOHandler) {
|
if (pIOHandler) {
|
||||||
glTF2::Asset asset(pIOHandler);
|
glTF2::Asset asset(pIOHandler);
|
||||||
try {
|
try {
|
||||||
asset.Load(pFile, extension == "glb");
|
asset.Load(pFile, extension == "glb");
|
||||||
|
@ -211,63 +211,90 @@ inline void SetMaterialTextureProperty(std::vector<int>& embeddedTexIdxs, Asset&
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void SetMaterialTextureProperty(std::vector<int>& embeddedTexIdxs, Asset& r, glTF2::NormalTextureInfo& prop, aiMaterial* mat, aiTextureType texType, unsigned int texSlot = 0)
|
||||||
|
{
|
||||||
|
SetMaterialTextureProperty( embeddedTexIdxs, r, (glTF2::TextureInfo) prop, mat, texType, texSlot );
|
||||||
|
|
||||||
|
if (prop.texture && prop.texture->source) {
|
||||||
|
mat->AddProperty(&prop.scale, 1, AI_MATKEY_GLTF_TEXTURE_SCALE(texType, texSlot));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void SetMaterialTextureProperty(std::vector<int>& embeddedTexIdxs, Asset& r, glTF2::OcclusionTextureInfo& prop, aiMaterial* mat, aiTextureType texType, unsigned int texSlot = 0)
|
||||||
|
{
|
||||||
|
SetMaterialTextureProperty( embeddedTexIdxs, r, (glTF2::TextureInfo) prop, mat, texType, texSlot );
|
||||||
|
|
||||||
|
if (prop.texture && prop.texture->source) {
|
||||||
|
mat->AddProperty(&prop.strength, 1, AI_MATKEY_GLTF_TEXTURE_STRENGTH(texType, texSlot));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static aiMaterial* ImportMaterial(std::vector<int>& embeddedTexIdxs, Asset& r, Material& mat)
|
||||||
|
{
|
||||||
|
aiMaterial* aimat = new aiMaterial();
|
||||||
|
|
||||||
|
if (!mat.name.empty()) {
|
||||||
|
aiString str(mat.name);
|
||||||
|
|
||||||
|
aimat->AddProperty(&str, AI_MATKEY_NAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
SetMaterialColorProperty(r, mat.pbrMetallicRoughness.baseColorFactor, aimat, AI_MATKEY_COLOR_DIFFUSE);
|
||||||
|
SetMaterialColorProperty(r, mat.pbrMetallicRoughness.baseColorFactor, aimat, AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_BASE_COLOR_FACTOR);
|
||||||
|
|
||||||
|
SetMaterialTextureProperty(embeddedTexIdxs, r, mat.pbrMetallicRoughness.baseColorTexture, aimat, aiTextureType_DIFFUSE);
|
||||||
|
SetMaterialTextureProperty(embeddedTexIdxs, r, mat.pbrMetallicRoughness.baseColorTexture, aimat, AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_BASE_COLOR_TEXTURE);
|
||||||
|
|
||||||
|
SetMaterialTextureProperty(embeddedTexIdxs, r, mat.pbrMetallicRoughness.metallicRoughnessTexture, aimat, AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_METALLICROUGHNESS_TEXTURE);
|
||||||
|
|
||||||
|
aimat->AddProperty(&mat.pbrMetallicRoughness.metallicFactor, 1, AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_METALLIC_FACTOR);
|
||||||
|
aimat->AddProperty(&mat.pbrMetallicRoughness.roughnessFactor, 1, AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_ROUGHNESS_FACTOR);
|
||||||
|
|
||||||
|
float roughnessAsShininess = (1 - mat.pbrMetallicRoughness.roughnessFactor) * 1000;
|
||||||
|
aimat->AddProperty(&roughnessAsShininess, 1, AI_MATKEY_SHININESS);
|
||||||
|
|
||||||
|
SetMaterialTextureProperty(embeddedTexIdxs, r, mat.normalTexture, aimat, aiTextureType_NORMALS);
|
||||||
|
SetMaterialTextureProperty(embeddedTexIdxs, r, mat.occlusionTexture, aimat, aiTextureType_LIGHTMAP);
|
||||||
|
SetMaterialTextureProperty(embeddedTexIdxs, r, mat.emissiveTexture, aimat, aiTextureType_EMISSIVE);
|
||||||
|
SetMaterialColorProperty(r, mat.emissiveFactor, aimat, AI_MATKEY_COLOR_EMISSIVE);
|
||||||
|
|
||||||
|
aimat->AddProperty(&mat.doubleSided, 1, AI_MATKEY_TWOSIDED);
|
||||||
|
|
||||||
|
aiString alphaMode(mat.alphaMode);
|
||||||
|
aimat->AddProperty(&alphaMode, AI_MATKEY_GLTF_ALPHAMODE);
|
||||||
|
aimat->AddProperty(&mat.alphaCutoff, 1, AI_MATKEY_GLTF_ALPHACUTOFF);
|
||||||
|
|
||||||
|
//pbrSpecularGlossiness
|
||||||
|
if (mat.pbrSpecularGlossiness.isPresent) {
|
||||||
|
PbrSpecularGlossiness &pbrSG = mat.pbrSpecularGlossiness.value;
|
||||||
|
|
||||||
|
aimat->AddProperty(&mat.pbrSpecularGlossiness.isPresent, 1, AI_MATKEY_GLTF_PBRSPECULARGLOSSINESS);
|
||||||
|
SetMaterialColorProperty(r, pbrSG.diffuseFactor, aimat, AI_MATKEY_COLOR_DIFFUSE);
|
||||||
|
SetMaterialColorProperty(r, pbrSG.specularFactor, aimat, AI_MATKEY_COLOR_SPECULAR);
|
||||||
|
|
||||||
|
float glossinessAsShininess = pbrSG.glossinessFactor * 1000.0f;
|
||||||
|
aimat->AddProperty(&glossinessAsShininess, 1, AI_MATKEY_SHININESS);
|
||||||
|
aimat->AddProperty(&pbrSG.glossinessFactor, 1, AI_MATKEY_GLTF_PBRSPECULARGLOSSINESS_GLOSSINESS_FACTOR);
|
||||||
|
|
||||||
|
SetMaterialTextureProperty(embeddedTexIdxs, r, pbrSG.diffuseTexture, aimat, aiTextureType_DIFFUSE);
|
||||||
|
|
||||||
|
SetMaterialTextureProperty(embeddedTexIdxs, r, pbrSG.specularGlossinessTexture, aimat, aiTextureType_SPECULAR);
|
||||||
|
}
|
||||||
|
|
||||||
|
return aimat;
|
||||||
|
}
|
||||||
|
|
||||||
void glTF2Importer::ImportMaterials(glTF2::Asset& r)
|
void glTF2Importer::ImportMaterials(glTF2::Asset& r)
|
||||||
{
|
{
|
||||||
mScene->mNumMaterials = unsigned(r.materials.Size());
|
const unsigned int numImportedMaterials = unsigned(r.materials.Size());
|
||||||
|
Material defaultMaterial;
|
||||||
|
|
||||||
|
mScene->mNumMaterials = numImportedMaterials + 1;
|
||||||
mScene->mMaterials = new aiMaterial*[mScene->mNumMaterials];
|
mScene->mMaterials = new aiMaterial*[mScene->mNumMaterials];
|
||||||
|
mScene->mMaterials[numImportedMaterials] = ImportMaterial(embeddedTexIdxs, r, defaultMaterial);
|
||||||
|
|
||||||
for (unsigned int i = 0; i < mScene->mNumMaterials; ++i) {
|
for (unsigned int i = 0; i < numImportedMaterials; ++i) {
|
||||||
aiMaterial* aimat = mScene->mMaterials[i] = new aiMaterial();
|
mScene->mMaterials[i] = ImportMaterial(embeddedTexIdxs, r, r.materials[i]);
|
||||||
|
|
||||||
Material& mat = r.materials[i];
|
|
||||||
|
|
||||||
if (!mat.name.empty()) {
|
|
||||||
aiString str(mat.name);
|
|
||||||
|
|
||||||
aimat->AddProperty(&str, AI_MATKEY_NAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
SetMaterialColorProperty(r, mat.pbrMetallicRoughness.baseColorFactor, aimat, AI_MATKEY_COLOR_DIFFUSE);
|
|
||||||
SetMaterialColorProperty(r, mat.pbrMetallicRoughness.baseColorFactor, aimat, AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_BASE_COLOR_FACTOR);
|
|
||||||
|
|
||||||
SetMaterialTextureProperty(embeddedTexIdxs, r, mat.pbrMetallicRoughness.baseColorTexture, aimat, aiTextureType_DIFFUSE);
|
|
||||||
SetMaterialTextureProperty(embeddedTexIdxs, r, mat.pbrMetallicRoughness.baseColorTexture, aimat, AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_BASE_COLOR_TEXTURE);
|
|
||||||
|
|
||||||
SetMaterialTextureProperty(embeddedTexIdxs, r, mat.pbrMetallicRoughness.metallicRoughnessTexture, aimat, AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_METALLICROUGHNESS_TEXTURE);
|
|
||||||
|
|
||||||
aimat->AddProperty(&mat.pbrMetallicRoughness.metallicFactor, 1, AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_METALLIC_FACTOR);
|
|
||||||
aimat->AddProperty(&mat.pbrMetallicRoughness.roughnessFactor, 1, AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_ROUGHNESS_FACTOR);
|
|
||||||
|
|
||||||
float roughnessAsShininess = (1 - mat.pbrMetallicRoughness.roughnessFactor) * 1000;
|
|
||||||
aimat->AddProperty(&roughnessAsShininess, 1, AI_MATKEY_SHININESS);
|
|
||||||
|
|
||||||
SetMaterialTextureProperty(embeddedTexIdxs, r, mat.normalTexture, aimat, aiTextureType_NORMALS);
|
|
||||||
SetMaterialTextureProperty(embeddedTexIdxs, r, mat.occlusionTexture, aimat, aiTextureType_LIGHTMAP);
|
|
||||||
SetMaterialTextureProperty(embeddedTexIdxs, r, mat.emissiveTexture, aimat, aiTextureType_EMISSIVE);
|
|
||||||
SetMaterialColorProperty(r, mat.emissiveFactor, aimat, AI_MATKEY_COLOR_EMISSIVE);
|
|
||||||
|
|
||||||
aimat->AddProperty(&mat.doubleSided, 1, AI_MATKEY_TWOSIDED);
|
|
||||||
|
|
||||||
aiString alphaMode(mat.alphaMode);
|
|
||||||
aimat->AddProperty(&alphaMode, AI_MATKEY_GLTF_ALPHAMODE);
|
|
||||||
aimat->AddProperty(&mat.alphaCutoff, 1, AI_MATKEY_GLTF_ALPHACUTOFF);
|
|
||||||
|
|
||||||
//pbrSpecularGlossiness
|
|
||||||
if (mat.pbrSpecularGlossiness.isPresent) {
|
|
||||||
PbrSpecularGlossiness &pbrSG = mat.pbrSpecularGlossiness.value;
|
|
||||||
|
|
||||||
aimat->AddProperty(&mat.pbrSpecularGlossiness.isPresent, 1, AI_MATKEY_GLTF_PBRSPECULARGLOSSINESS);
|
|
||||||
SetMaterialColorProperty(r, pbrSG.diffuseFactor, aimat, AI_MATKEY_COLOR_DIFFUSE);
|
|
||||||
SetMaterialColorProperty(r, pbrSG.specularFactor, aimat, AI_MATKEY_COLOR_SPECULAR);
|
|
||||||
|
|
||||||
float glossinessAsShininess = pbrSG.glossinessFactor * 1000.0f;
|
|
||||||
aimat->AddProperty(&glossinessAsShininess, 1, AI_MATKEY_SHININESS);
|
|
||||||
aimat->AddProperty(&pbrSG.glossinessFactor, 1, AI_MATKEY_GLTF_PBRSPECULARGLOSSINESS_GLOSSINESS_FACTOR);
|
|
||||||
|
|
||||||
SetMaterialTextureProperty(embeddedTexIdxs, r, pbrSG.diffuseTexture, aimat, aiTextureType_DIFFUSE);
|
|
||||||
|
|
||||||
SetMaterialTextureProperty(embeddedTexIdxs, r, pbrSG.specularGlossinessTexture, aimat, aiTextureType_SPECULAR);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -479,6 +506,10 @@ void glTF2Importer::ImportMeshes(glTF2::Asset& r)
|
||||||
if (prim.material) {
|
if (prim.material) {
|
||||||
aim->mMaterialIndex = prim.material.GetIndex();
|
aim->mMaterialIndex = prim.material.GetIndex();
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
aim->mMaterialIndex = mScene->mNumMaterials - 1;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -499,6 +530,9 @@ void glTF2Importer::ImportCameras(glTF2::Asset& r)
|
||||||
|
|
||||||
aiCamera* aicam = mScene->mCameras[i] = new aiCamera();
|
aiCamera* aicam = mScene->mCameras[i] = new aiCamera();
|
||||||
|
|
||||||
|
// cameras point in -Z by default, rest is specified in node transform
|
||||||
|
aicam->mLookAt = aiVector3D(0.f,0.f,-1.f);
|
||||||
|
|
||||||
if (cam.type == Camera::Perspective) {
|
if (cam.type == Camera::Perspective) {
|
||||||
|
|
||||||
aicam->mAspect = cam.cameraProperties.perspective.aspectRatio;
|
aicam->mAspect = cam.cameraProperties.perspective.aspectRatio;
|
||||||
|
|
|
@ -98,14 +98,14 @@ const aiImporterDesc* glTFImporter::GetInfo() const
|
||||||
return &desc;
|
return &desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool glTFImporter::CanRead(const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const
|
bool glTFImporter::CanRead(const std::string& pFile, IOSystem* pIOHandler, bool /* checkSig */) const
|
||||||
{
|
{
|
||||||
const std::string &extension = GetExtension(pFile);
|
const std::string &extension = GetExtension(pFile);
|
||||||
|
|
||||||
if (extension != "gltf" && extension != "glb")
|
if (extension != "gltf" && extension != "glb")
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (checkSig && pIOHandler) {
|
if (pIOHandler) {
|
||||||
glTF::Asset asset(pIOHandler);
|
glTF::Asset asset(pIOHandler);
|
||||||
try {
|
try {
|
||||||
asset.Load(pFile, extension == "glb");
|
asset.Load(pFile, extension == "glb");
|
||||||
|
|
22
doc/dox.h
22
doc/dox.h
|
@ -561,17 +561,27 @@ The output UV coordinate system has its origin in the lower-left corner:
|
||||||
@endcode
|
@endcode
|
||||||
Use the #aiProcess_FlipUVs flag to get UV coordinates with the upper-left corner als origin.
|
Use the #aiProcess_FlipUVs flag to get UV coordinates with the upper-left corner als origin.
|
||||||
|
|
||||||
All matrices in the library are row-major. That means that the matrices are stored row by row in memory,
|
A typical 4x4 matrix including a translational part looks like this:
|
||||||
which is similar to the OpenGL matrix layout. A typical 4x4 matrix including a translational part looks like this:
|
|
||||||
@code
|
@code
|
||||||
X1 Y1 Z1 T1
|
X1 Y1 Z1 T1
|
||||||
X2 Y2 Z2 T2
|
X2 Y2 Z2 T2
|
||||||
X3 Y3 Z3 T3
|
X3 Y3 Z3 T3
|
||||||
0 0 0 1
|
0 0 0 1
|
||||||
@endcode
|
@endcode
|
||||||
with (X1, X2, X3) being the X base vector, (Y1, Y2, Y3) being the Y base vector, (Z1, Z2, Z3)
|
with <tt>(X1, X2, X3)</tt> being the local X base vector, <tt>(Y1, Y2, Y3)</tt> being the local
|
||||||
being the Z base vector and (T1, T2, T3) being the translation part. If you want to use these matrices
|
Y base vector, <tt>(Z1, Z2, Z3)</tt> being the local Z base vector and <tt>(T1, T2, T3)</tt> being the
|
||||||
in DirectX functions, you have to transpose them.
|
offset of the local origin (the translational part).
|
||||||
|
All matrices in the library use row-major storage order. That means that the matrix elements are
|
||||||
|
stored row-by-row, i.e. they end up like this in memory:
|
||||||
|
<tt>[X1, Y1, Z1, T1, X2, Y2, Z2, T2, X3, Y3, Z3, T3, 0, 0, 0, 1]</tt>.
|
||||||
|
|
||||||
|
Note that this is neither the OpenGL format nor the DirectX format, because both of them specify the
|
||||||
|
matrix layout such that the translational part occupies three consecutive addresses in memory (so those
|
||||||
|
matrices end with <tt>[..., T1, T2, T3, 1]</tt>), whereas the translation in an Assimp matrix is found at
|
||||||
|
the offsets 3, 7 and 11 (spread across the matrix). You can transpose an Assimp matrix to end up with
|
||||||
|
the format that OpenGL and DirectX mandate. To be very precise: The transposition has nothing
|
||||||
|
to do with a left-handed or right-handed coordinate system but 'converts' between row-major and
|
||||||
|
column-major storage format.
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue