From 42357658567a32c5070934e4afde6dee2935611a Mon Sep 17 00:00:00 2001 From: Axel Wefers Date: Mon, 8 Jan 2018 14:19:30 -0800 Subject: [PATCH 01/10] glTF 2.0: Set camera "look at" to (0.0, 0.0, -1.0). --- code/glTF2Importer.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/glTF2Importer.cpp b/code/glTF2Importer.cpp index 94e5ca3f1..c85fdbdee 100644 --- a/code/glTF2Importer.cpp +++ b/code/glTF2Importer.cpp @@ -499,6 +499,9 @@ void glTF2Importer::ImportCameras(glTF2::Asset& r) 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) { aicam->mAspect = cam.cameraProperties.perspective.aspectRatio; From dc79b572cf8a8e5d5f2a76b261bf9d95803c1377 Mon Sep 17 00:00:00 2001 From: Axel Wefers Date: Mon, 8 Jan 2018 14:57:55 -0800 Subject: [PATCH 02/10] glTF 2.0: Assign default material to meshes with no material reference. fixes #1691 --- code/glTF2Importer.cpp | 119 +++++++++++++++++++++++------------------ 1 file changed, 66 insertions(+), 53 deletions(-) diff --git a/code/glTF2Importer.cpp b/code/glTF2Importer.cpp index 94e5ca3f1..299612bb3 100644 --- a/code/glTF2Importer.cpp +++ b/code/glTF2Importer.cpp @@ -211,63 +211,72 @@ inline void SetMaterialTextureProperty(std::vector& embeddedTexIdxs, Asset& } } +static aiMaterial* ImportMaterial(std::vector& 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) { - 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[numImportedMaterials] = ImportMaterial(embeddedTexIdxs, r, defaultMaterial); - for (unsigned int i = 0; i < mScene->mNumMaterials; ++i) { - aiMaterial* aimat = mScene->mMaterials[i] = new aiMaterial(); - - 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); - } + for (unsigned int i = 0; i < numImportedMaterials; ++i) { + mScene->mMaterials[i] = ImportMaterial(embeddedTexIdxs, r, r.materials[i]); } } @@ -479,6 +488,10 @@ void glTF2Importer::ImportMeshes(glTF2::Asset& r) if (prim.material) { aim->mMaterialIndex = prim.material.GetIndex(); } + else { + aim->mMaterialIndex = mScene->mNumMaterials - 1; + } + } } From 0eacddc5bf49b1341a231f2bd4c1a74612bebbb3 Mon Sep 17 00:00:00 2001 From: Axel Wefers Date: Mon, 8 Jan 2018 15:19:27 -0800 Subject: [PATCH 03/10] glTF 2.0: Import scale for normal textures and strength for occlusion textures resolves #1693 --- code/glTF2Asset.h | 6 +++++- code/glTF2Importer.cpp | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/code/glTF2Asset.h b/code/glTF2Asset.h index cece307d9..4aa56e9ef 100644 --- a/code/glTF2Asset.h +++ b/code/glTF2Asset.h @@ -181,13 +181,17 @@ namespace glTF2 #define _AI_MATKEY_GLTF_MAPPINGID_BASE "$tex.mappingid" #define _AI_MATKEY_GLTF_MAPPINGFILTER_MAG_BASE "$tex.mappingfiltermag" #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_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_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_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 #include "./../include/assimp/Compiler/pushpack1.h" #endif diff --git a/code/glTF2Importer.cpp b/code/glTF2Importer.cpp index 94e5ca3f1..650fd700e 100644 --- a/code/glTF2Importer.cpp +++ b/code/glTF2Importer.cpp @@ -211,6 +211,24 @@ inline void SetMaterialTextureProperty(std::vector& embeddedTexIdxs, Asset& } } +inline void SetMaterialTextureProperty(std::vector& 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& 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)); + } +} + void glTF2Importer::ImportMaterials(glTF2::Asset& r) { mScene->mNumMaterials = unsigned(r.materials.Size()); From 901b98126032562065e5261f5682e3db6d768c9b Mon Sep 17 00:00:00 2001 From: Axel Wefers Date: Tue, 9 Jan 2018 09:37:57 -0800 Subject: [PATCH 04/10] glTF: Always check signature Always check signature for glTF 1.0 and glTF 2.0 files to select the correct importer. Fixes #1605 --- code/glTF2Importer.cpp | 4 ++-- code/glTFImporter.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/glTF2Importer.cpp b/code/glTF2Importer.cpp index 94e5ca3f1..008f251ae 100644 --- a/code/glTF2Importer.cpp +++ b/code/glTF2Importer.cpp @@ -99,14 +99,14 @@ const aiImporterDesc* glTF2Importer::GetInfo() const 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); if (extension != "gltf" && extension != "glb") return false; - if (checkSig && pIOHandler) { + if (pIOHandler) { glTF2::Asset asset(pIOHandler); try { asset.Load(pFile, extension == "glb"); diff --git a/code/glTFImporter.cpp b/code/glTFImporter.cpp index 381e459fd..e5a1ae883 100644 --- a/code/glTFImporter.cpp +++ b/code/glTFImporter.cpp @@ -98,14 +98,14 @@ const aiImporterDesc* glTFImporter::GetInfo() const 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); if (extension != "gltf" && extension != "glb") return false; - if (checkSig && pIOHandler) { + if (pIOHandler) { glTF::Asset asset(pIOHandler); try { asset.Load(pFile, extension == "glb"); From 8fe2ba31a9b10fca319d954c3af0744f2c077e69 Mon Sep 17 00:00:00 2001 From: Manuel Freiberger Date: Tue, 9 Jan 2018 23:46:36 +0100 Subject: [PATCH 05/10] Clarify the matrix layout The columns of the matrix are the images of the standard base vectors rather than the base vectors themselves. Added some description of the row-major storage format. --- doc/dox.h | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/doc/dox.h b/doc/dox.h index afd6e487a..710807ae3 100644 --- a/doc/dox.h +++ b/doc/dox.h @@ -561,17 +561,24 @@ The output UV coordinate system has its origin in the lower-left corner: @endcode 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, -which is similar to the OpenGL matrix layout. A typical 4x4 matrix including a translational part looks like this: +A typical 4x4 matrix including a translational part looks like this: @code X1 Y1 Z1 T1 X2 Y2 Z2 T2 X3 Y3 Z3 T3 0 0 0 1 @endcode -with (X1, X2, X3) being the X base vector, (Y1, Y2, Y3) being the Y base vector, (Z1, Z2, Z3) -being the Z base vector and (T1, T2, T3) being the translation part. If you want to use these matrices -in DirectX functions, you have to transpose them. +with (X1, X2, X3) being the image of the X base vector, (Y1, Y2, Y3) being the image of the +Y base vector, (Z1, Z2, Z3) being the image of the Z base vector and (T1, T2, T3) being the +translation part. +All matrices in the library are row-major. That means that the matrix elements are stored row by row in memory, +which is identical to the OpenGL matrix layout. So the above matrix is stored in memory as +[X1, Y1, Z1, T1, X2, Y2, Z2, T2, X3, Y3, Z3, T3, 0, 0, 0, 1]. If you want to use these matrices +in a framework, which expects the matrix layout to be column-major (stored along the columns), such as +DirectX or Matlab, you will have to transpose the matrix first. + +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.
From 4a033e97671182ad3307b138e955ff85f65800ce Mon Sep 17 00:00:00 2001 From: Manuel Freiberger Date: Tue, 9 Jan 2018 23:48:08 +0100 Subject: [PATCH 06/10] Removed a stray semicolon --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index 1f6c4118f..ca6c9ba4d 100644 --- a/Readme.md +++ b/Readme.md @@ -43,7 +43,7 @@ __Importers__: - AMJ - ASE - ASK -- B3D; +- B3D - BLEND (Blender) - BVH - COB From c036a3b8407f70bc6cf0451d8a243a2f5f83baab Mon Sep 17 00:00:00 2001 From: Robert Spencer Date: Wed, 10 Jan 2018 12:33:44 +0200 Subject: [PATCH 07/10] Add pyassimp code generation script for materials In the style of gen/structsgen.py, we construct a similar method for keeping the constants in materials.py up to date. --- port/PyAssimp/gen/materialgen.py | 96 ++++++++++++++++++++++++++++++ port/PyAssimp/pyassimp/material.py | 84 +++++++++++++------------- 2 files changed, 138 insertions(+), 42 deletions(-) create mode 100644 port/PyAssimp/gen/materialgen.py diff --git a/port/PyAssimp/gen/materialgen.py b/port/PyAssimp/gen/materialgen.py new file mode 100644 index 000000000..d60bf4bc2 --- /dev/null +++ b/port/PyAssimp/gen/materialgen.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python +# -*- Coding: UTF-8 -*- + +# --------------------------------------------------------------------------- +# Open Asset Import Library (ASSIMP) +# --------------------------------------------------------------------------- +# +# Copyright (c) 2006-2010, ASSIMP Development Team +# +# All rights reserved. +# +# Redistribution and use of this software in source and binary forms, +# with or without modification, are permitted provided that the following +# conditions are met: +# +# * Redistributions of source code must retain the above +# copyright notice, this list of conditions and the +# following disclaimer. +# +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the +# following disclaimer in the documentation and/or other +# materials provided with the distribution. +# +# * Neither the name of the ASSIMP team, nor the names of its +# contributors may be used to endorse or promote products +# derived from this software without specific prior +# written permission of the ASSIMP Development Team. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# --------------------------------------------------------------------------- + +"""Update PyAssimp's texture type constants C/C++ headers. + +This script is meant to be executed in the source tree, directly from +port/PyAssimp/gen +""" + +import os +import re + +REenumTextureType = re.compile(r'' + r'enum\saiTextureType' # enum aiTextureType + r'[^{]*?\{' # { + r'(?P.*?)' # code + r'\};' # }; + , re.IGNORECASE + re.DOTALL + re.MULTILINE) + +# Replace comments +RErpcom = re.compile(r'' + r'\s*(/\*+\s|\*+/|\B\*\s?|///?!?)' # /** + r'(?P.*?)' # * line + , re.IGNORECASE + re.DOTALL) + +# Remove trailing commas +RErmtrailcom = re.compile(r',$', re.IGNORECASE + re.DOTALL) + +# Remove #ifdef __cplusplus +RErmifdef = re.compile(r'' + r'#ifndef SWIG' # #ifndef SWIG + r'(?P.*)' # code + r'#endif(\s*//\s*!?\s*SWIG)*' # #endif + , re.IGNORECASE + re.DOTALL) + +path = '../../../include/assimp' + +files = os.listdir (path) +enumText = '' +for fileName in files: + if fileName.endswith('.h'): + text = open(os.path.join(path, fileName)).read() + for enum in REenumTextureType.findall(text): + enumText = enum + +text = '' +for line in enumText.split('\n'): + line = line.lstrip().rstrip() + line = RErmtrailcom.sub('', line) + text += RErpcom.sub('# \g', line) + '\n' +text = RErmifdef.sub('', text) + +file = open('material.py', 'w') +file.write(text) +file.close() + +print("Generation done. You can now review the file 'material.py' and merge it.") diff --git a/port/PyAssimp/pyassimp/material.py b/port/PyAssimp/pyassimp/material.py index 97b143a62..a36e50a17 100644 --- a/port/PyAssimp/pyassimp/material.py +++ b/port/PyAssimp/pyassimp/material.py @@ -1,89 +1,89 @@ -##
Dummy value. +# Dummy value. # -# No texture, but the value to be used as 'texture semantic' -# (#aiMaterialProperty::mSemantic) for all material properties -# *not* related to textures. +# No texture, but the value to be used as 'texture semantic' +# (#aiMaterialProperty::mSemantic) for all material properties +# # not* related to textures. # aiTextureType_NONE = 0x0 -##
The texture is combined with the result of the diffuse -# lighting equation. +# The texture is combined with the result of the diffuse +# lighting equation. # aiTextureType_DIFFUSE = 0x1 -##
The texture is combined with the result of the specular -# lighting equation. +# The texture is combined with the result of the specular +# lighting equation. # aiTextureType_SPECULAR = 0x2 -##
The texture is combined with the result of the ambient -# lighting equation. +# The texture is combined with the result of the ambient +# lighting equation. # aiTextureType_AMBIENT = 0x3 -##
The texture is added to the result of the lighting -# calculation. It isn't influenced by incoming light. +# The texture is added to the result of the lighting +# calculation. It isn't influenced by incoming light. # aiTextureType_EMISSIVE = 0x4 -##
The texture is a height map. +# The texture is a height map. # -# By convention, higher gray-scale values stand for -# higher elevations from the base height. +# By convention, higher gray-scale values stand for +# higher elevations from the base height. # aiTextureType_HEIGHT = 0x5 -##
The texture is a (tangent space) normal-map. +# The texture is a (tangent space) normal-map. # -# Again, there are several conventions for tangent-space -# normal maps. Assimp does (intentionally) not -# distinguish here. +# Again, there are several conventions for tangent-space +# normal maps. Assimp does (intentionally) not +# distinguish here. # aiTextureType_NORMALS = 0x6 -##
The texture defines the glossiness of the material. +# The texture defines the glossiness of the material. # -# The glossiness is in fact the exponent of the specular -# (phong) lighting equation. Usually there is a conversion -# function defined to map the linear color values in the -# texture to a suitable exponent. Have fun. +# The glossiness is in fact the exponent of the specular +# (phong) lighting equation. Usually there is a conversion +# function defined to map the linear color values in the +# texture to a suitable exponent. Have fun. # aiTextureType_SHININESS = 0x7 -##
The texture defines per-pixel opacity. +# The texture defines per-pixel opacity. # -# Usually 'white' means opaque and 'black' means -# 'transparency'. Or quite the opposite. Have fun. +# Usually 'white' means opaque and 'black' means +# 'transparency'. Or quite the opposite. Have fun. # aiTextureType_OPACITY = 0x8 -##
Displacement texture +# Displacement texture # -# The exact purpose and format is application-dependent. -# Higher color values stand for higher vertex displacements. +# The exact purpose and format is application-dependent. +# Higher color values stand for higher vertex displacements. # aiTextureType_DISPLACEMENT = 0x9 -##
Lightmap texture (aka Ambient Occlusion) +# Lightmap texture (aka Ambient Occlusion) # -# Both 'Lightmaps' and dedicated 'ambient occlusion maps' are -# covered by this material property. The texture contains a -# scaling value for the final color value of a pixel. Its -# intensity is not affected by incoming light. +# Both 'Lightmaps' and dedicated 'ambient occlusion maps' are +# covered by this material property. The texture contains a +# scaling value for the final color value of a pixel. Its +# intensity is not affected by incoming light. # aiTextureType_LIGHTMAP = 0xA -##
Reflection texture +# Reflection texture # -#Contains the color of a perfect mirror reflection. -#Rarely used, almost never for real-time applications. +# Contains the color of a perfect mirror reflection. +# Rarely used, almost never for real-time applications. # aiTextureType_REFLECTION = 0xB -##
Unknown texture +# Unknown texture # -# A texture reference that does not match any of the definitions -# above is considered to be 'unknown'. It is still imported -# but is excluded from any further postprocessing. +# A texture reference that does not match any of the definitions +# above is considered to be 'unknown'. It is still imported +# but is excluded from any further postprocessing. # aiTextureType_UNKNOWN = 0xC From 3e127bebffd24740adc4003ff49c05c9259dcf8e Mon Sep 17 00:00:00 2001 From: Axel Wefers Date: Mon, 8 Jan 2018 15:19:27 -0800 Subject: [PATCH 08/10] glTF 2.0: Import scale for normal textures and strength for occlusion textures resolves #1693 --- code/glTF2Asset.h | 6 +++++- code/glTF2Importer.cpp | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/code/glTF2Asset.h b/code/glTF2Asset.h index cece307d9..4aa56e9ef 100644 --- a/code/glTF2Asset.h +++ b/code/glTF2Asset.h @@ -181,13 +181,17 @@ namespace glTF2 #define _AI_MATKEY_GLTF_MAPPINGID_BASE "$tex.mappingid" #define _AI_MATKEY_GLTF_MAPPINGFILTER_MAG_BASE "$tex.mappingfiltermag" #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_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_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_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 #include "./../include/assimp/Compiler/pushpack1.h" #endif diff --git a/code/glTF2Importer.cpp b/code/glTF2Importer.cpp index b9a4c5005..1bb678aec 100644 --- a/code/glTF2Importer.cpp +++ b/code/glTF2Importer.cpp @@ -211,6 +211,24 @@ inline void SetMaterialTextureProperty(std::vector& embeddedTexIdxs, Asset& } } +inline void SetMaterialTextureProperty(std::vector& 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& 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& embeddedTexIdxs, Asset& r, Material& mat) { aiMaterial* aimat = new aiMaterial(); From 0e99f1f5876a58ccea88ef2a645e4446b3dc1f5c Mon Sep 17 00:00:00 2001 From: Axel Wefers Date: Thu, 11 Jan 2018 10:15:05 -0800 Subject: [PATCH 09/10] Build fix for 1684 Requires cast from size_t to uint64 like in other places, otherwise the call to the constructor for GenericValue() is ambiguous. Fixes #1684 --- code/glTF2AssetWriter.inl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/glTF2AssetWriter.inl b/code/glTF2AssetWriter.inl index fa406fc71..3c465d2d2 100644 --- a/code/glTF2AssetWriter.inl +++ b/code/glTF2AssetWriter.inl @@ -584,7 +584,7 @@ namespace glTF2 { if (bodyBuffer->byteLength > 0) { rapidjson::Value glbBodyBuffer; glbBodyBuffer.SetObject(); - glbBodyBuffer.AddMember("byteLength", bodyBuffer->byteLength, mAl); + glbBodyBuffer.AddMember("byteLength", static_cast(bodyBuffer->byteLength), mAl); mDoc["buffers"].PushBack(glbBodyBuffer, mAl); } From 33ddbf9aa08297ad057d3b5e7cf3f815a1319559 Mon Sep 17 00:00:00 2001 From: Manuel Freiberger Date: Thu, 11 Jan 2018 20:58:47 +0100 Subject: [PATCH 10/10] Correct matrix layout documentation Actually, both OpenGL and DirectX specify a matrix layout where the base vectors and the translational part is consecutive in memory. OpenGL uses post-multiplication of column-vectors and stores the matrix in column-major storage format: | X1 Y1 Z1 T1 | | a | | X2 Y2 Z2 T2 | | b | | X3 Y3 Z3 T3 | | c | | 0 0 0 1 | | 1 | DirectX on the other hand uses row-major storage format but also pre-multiplication of row-vectors | a b c 1 | | X1 X2 X3 0 | | Y1 Y2 Y3 0 | | Z1 Z2 Z3 0 | | T1 T2 T3 1 | So a matrix is stored the same way in both frameworks and both times the translational part is consecutive, which is not the format that Assimp uses. --- doc/dox.h | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/doc/dox.h b/doc/dox.h index 710807ae3..3215016ab 100644 --- a/doc/dox.h +++ b/doc/dox.h @@ -566,19 +566,22 @@ A typical 4x4 matrix including a translational part looks like this: X1 Y1 Z1 T1 X2 Y2 Z2 T2 X3 Y3 Z3 T3 -0 0 0 1 + 0 0 0 1 @endcode -with (X1, X2, X3) being the image of the X base vector, (Y1, Y2, Y3) being the image of the -Y base vector, (Z1, Z2, Z3) being the image of the Z base vector and (T1, T2, T3) being the -translation part. -All matrices in the library are row-major. That means that the matrix elements are stored row by row in memory, -which is identical to the OpenGL matrix layout. So the above matrix is stored in memory as -[X1, Y1, Z1, T1, X2, Y2, Z2, T2, X3, Y3, Z3, T3, 0, 0, 0, 1]. If you want to use these matrices -in a framework, which expects the matrix layout to be column-major (stored along the columns), such as -DirectX or Matlab, you will have to transpose the matrix first. +with (X1, X2, X3) being the local X base vector, (Y1, Y2, Y3) being the local +Y base vector, (Z1, Z2, Z3) being the local Z base vector and (T1, T2, T3) being the +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: +[X1, Y1, Z1, T1, X2, Y2, Z2, T2, X3, Y3, Z3, T3, 0, 0, 0, 1]. -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. +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 [..., T1, T2, T3, 1]), 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.