Merge branch '3mf_basematerial_support' of https://github.com/assimp/assimp into 3mf_basematerial_support
This commit is contained in:
@@ -349,7 +349,7 @@ void Discreet3DSImporter::ParseObjectChunk()
|
||||
case Discreet3DS::CHUNK_MAT_MATERIAL:
|
||||
|
||||
// Add a new material to the list
|
||||
mScene->mMaterials.push_back(D3DS::Material(std::string("UNNAMED_" + std::to_string(mScene->mMaterials.size()))));
|
||||
mScene->mMaterials.push_back(D3DS::Material(std::string("UNNAMED_" + to_string(mScene->mMaterials.size()))));
|
||||
ParseMaterialChunk();
|
||||
break;
|
||||
|
||||
|
||||
@@ -72,6 +72,7 @@ SET( PUBLIC_HEADERS
|
||||
${HEADER_PATH}/matrix4x4.h
|
||||
${HEADER_PATH}/matrix4x4.inl
|
||||
${HEADER_PATH}/mesh.h
|
||||
${HEADER_PATH}/pbrmaterial.h
|
||||
${HEADER_PATH}/postprocess.h
|
||||
${HEADER_PATH}/quaternion.h
|
||||
${HEADER_PATH}/quaternion.inl
|
||||
|
||||
@@ -131,6 +131,7 @@ void ColladaLoader::SetupProperties(const Importer* pImp)
|
||||
{
|
||||
noSkeletonMesh = pImp->GetPropertyInteger(AI_CONFIG_IMPORT_NO_SKELETON_MESHES,0) != 0;
|
||||
ignoreUpDirection = pImp->GetPropertyInteger(AI_CONFIG_IMPORT_COLLADA_IGNORE_UP_DIRECTION,0) != 0;
|
||||
useColladaName = pImp->GetPropertyInteger(AI_CONFIG_IMPORT_COLLADA_USE_COLLADA_NAMES,0) != 0;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
@@ -1913,6 +1914,11 @@ const Collada::Node* ColladaLoader::FindNodeBySID( const Collada::Node* pNode, c
|
||||
// The name must be unique for proper node-bone association.
|
||||
std::string ColladaLoader::FindNameForNode( const Collada::Node* pNode)
|
||||
{
|
||||
// If explicitly requested, just use the collada name.
|
||||
if (useColladaName) {
|
||||
return pNode->mName;
|
||||
}
|
||||
|
||||
// Now setup the name of the assimp node. The collada name might not be
|
||||
// unique, so we use the collada ID.
|
||||
if (!pNode->mID.empty())
|
||||
|
||||
@@ -248,6 +248,7 @@ protected:
|
||||
|
||||
bool noSkeletonMesh;
|
||||
bool ignoreUpDirection;
|
||||
bool useColladaName;
|
||||
|
||||
/** Used by FindNameForNode() to generate unique node names */
|
||||
unsigned int mNodeNameCounter;
|
||||
|
||||
@@ -235,9 +235,6 @@ void FBXExporter::WriteBinaryFooter()
|
||||
outfile->Write(NULL_RECORD.c_str(), NULL_RECORD.size(), 1);
|
||||
|
||||
outfile->Write(GENERIC_FOOTID.c_str(), GENERIC_FOOTID.size(), 1);
|
||||
for (size_t i = 0; i < 4; ++i) {
|
||||
outfile->Write("\x00", 1, 1);
|
||||
}
|
||||
|
||||
// here some padding is added for alignment to 16 bytes.
|
||||
// if already aligned, the full 16 bytes is added.
|
||||
@@ -247,6 +244,11 @@ void FBXExporter::WriteBinaryFooter()
|
||||
outfile->Write("\x00", 1, 1);
|
||||
}
|
||||
|
||||
// not sure what this is, but it seems to always be 0 in modern files
|
||||
for (size_t i = 0; i < 4; ++i) {
|
||||
outfile->Write("\x00", 1, 1);
|
||||
}
|
||||
|
||||
// now the file version again
|
||||
{
|
||||
StreamWriterLE outstream(outfile);
|
||||
|
||||
@@ -54,6 +54,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#include "FBXProperties.h"
|
||||
#include <assimp/ByteSwapper.h>
|
||||
|
||||
#include <algorithm> // std::transform
|
||||
|
||||
namespace Assimp {
|
||||
namespace FBX {
|
||||
|
||||
@@ -82,11 +84,12 @@ Material::Material(uint64_t id, const Element& element, const Document& doc, con
|
||||
|
||||
std::string templateName;
|
||||
|
||||
const char* const sh = shading.c_str();
|
||||
if(!strcmp(sh,"phong")) {
|
||||
// lower-case shading because Blender (for example) writes "Phong"
|
||||
std::transform(shading.begin(), shading.end(), shading.begin(), ::tolower);
|
||||
if(shading == "phong") {
|
||||
templateName = "Material.FbxSurfacePhong";
|
||||
}
|
||||
else if(!strcmp(sh,"lambert")) {
|
||||
else if(shading == "lambert") {
|
||||
templateName = "Material.FbxSurfaceLambert";
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -303,11 +303,12 @@ void ObjFileMtlImporter::createMaterial()
|
||||
// New Material created
|
||||
m_pModel->m_pCurrentMaterial = new ObjFile::Material();
|
||||
m_pModel->m_pCurrentMaterial->MaterialName.Set( name );
|
||||
m_pModel->m_MaterialLib.push_back( name );
|
||||
m_pModel->m_MaterialMap[ name ] = m_pModel->m_pCurrentMaterial;
|
||||
|
||||
if (m_pModel->m_pCurrentMesh) {
|
||||
m_pModel->m_pCurrentMesh->m_uiMaterialIndex = static_cast<unsigned int>(m_pModel->m_MaterialLib.size() - 1);
|
||||
}
|
||||
m_pModel->m_MaterialLib.push_back( name );
|
||||
m_pModel->m_MaterialMap[ name ] = m_pModel->m_pCurrentMaterial;
|
||||
} else {
|
||||
// Use older material
|
||||
m_pModel->m_pCurrentMaterial = (*it).second;
|
||||
|
||||
@@ -245,28 +245,7 @@ void PLYImporter::InternReadFile(const std::string& pFile, aiScene* pScene, IOSy
|
||||
// list is containing a list of points
|
||||
bool pointsOnly = mGeneratedMesh->mFaces == NULL ? true : false;
|
||||
if (pointsOnly) {
|
||||
if (mGeneratedMesh->mNumVertices < 3) {
|
||||
if (mGeneratedMesh != NULL) {
|
||||
delete(mGeneratedMesh);
|
||||
mGeneratedMesh = nullptr;
|
||||
}
|
||||
|
||||
streamedBuffer.close();
|
||||
throw DeadlyImportError("Invalid .ply file: Not enough "
|
||||
"vertices to build a proper face list. ");
|
||||
}
|
||||
|
||||
const unsigned int iNum = (unsigned int)mGeneratedMesh->mNumVertices / 3;
|
||||
mGeneratedMesh->mNumFaces = iNum;
|
||||
mGeneratedMesh->mFaces = new aiFace[mGeneratedMesh->mNumFaces];
|
||||
|
||||
for (unsigned int i = 0; i < iNum; ++i) {
|
||||
mGeneratedMesh->mFaces[i].mNumIndices = 3;
|
||||
mGeneratedMesh->mFaces[i].mIndices = new unsigned int[3];
|
||||
mGeneratedMesh->mFaces[i].mIndices[0] = (i * 3);
|
||||
mGeneratedMesh->mFaces[i].mIndices[1] = (i * 3) + 1;
|
||||
mGeneratedMesh->mFaces[i].mIndices[2] = (i * 3) + 2;
|
||||
}
|
||||
mGeneratedMesh->mPrimitiveTypes = aiPrimitiveType::aiPrimitiveType_POINT;
|
||||
}
|
||||
|
||||
// now load a list of all materials
|
||||
|
||||
@@ -1043,71 +1043,91 @@ bool PLY::PropertyInstance::ParseValueBinary(IOStreamBuffer<char> &streamBuffer,
|
||||
switch (eType)
|
||||
{
|
||||
case EDT_UInt:
|
||||
out->iUInt = (uint32_t)*((uint32_t*)pCur);
|
||||
pCur += 4;
|
||||
{
|
||||
uint32_t t;
|
||||
memcpy(&t, pCur, sizeof(uint32_t));
|
||||
pCur += sizeof(uint32_t);
|
||||
|
||||
// Swap endianness
|
||||
if (p_bBE)ByteSwap::Swap((int32_t*)&out->iUInt);
|
||||
if (p_bBE)ByteSwap::Swap(&t);
|
||||
out->iUInt = t;
|
||||
break;
|
||||
}
|
||||
|
||||
case EDT_UShort:
|
||||
{
|
||||
uint16_t i = *((uint16_t*)pCur);
|
||||
uint16_t t;
|
||||
memcpy(&t, pCur, sizeof(uint16_t));
|
||||
pCur += sizeof(uint16_t);
|
||||
|
||||
// Swap endianness
|
||||
if (p_bBE)ByteSwap::Swap(&i);
|
||||
out->iUInt = (uint32_t)i;
|
||||
pCur += 2;
|
||||
if (p_bBE)ByteSwap::Swap(&t);
|
||||
out->iUInt = t;
|
||||
break;
|
||||
}
|
||||
|
||||
case EDT_UChar:
|
||||
{
|
||||
out->iUInt = (uint32_t)(*((uint8_t*)pCur));
|
||||
pCur++;
|
||||
uint8_t t;
|
||||
memcpy(&t, pCur, sizeof(uint8_t));
|
||||
pCur += sizeof(uint8_t);
|
||||
out->iUInt = t;
|
||||
break;
|
||||
}
|
||||
|
||||
case EDT_Int:
|
||||
out->iInt = *((int32_t*)pCur);
|
||||
pCur += 4;
|
||||
{
|
||||
int32_t t;
|
||||
memcpy(&t, pCur, sizeof(int32_t));
|
||||
pCur += sizeof(int32_t);
|
||||
|
||||
// Swap endianness
|
||||
if (p_bBE)ByteSwap::Swap(&out->iInt);
|
||||
if (p_bBE)ByteSwap::Swap(&t);
|
||||
out->iInt = t;
|
||||
break;
|
||||
}
|
||||
|
||||
case EDT_Short:
|
||||
{
|
||||
int16_t i = *((int16_t*)pCur);
|
||||
int16_t t;
|
||||
memcpy(&t, pCur, sizeof(int16_t));
|
||||
pCur += sizeof(int16_t);
|
||||
|
||||
// Swap endianness
|
||||
if (p_bBE)ByteSwap::Swap(&i);
|
||||
out->iInt = (int32_t)i;
|
||||
pCur += 2;
|
||||
if (p_bBE)ByteSwap::Swap(&t);
|
||||
out->iInt = t;
|
||||
break;
|
||||
}
|
||||
|
||||
case EDT_Char:
|
||||
out->iInt = (int32_t)*((int8_t*)pCur);
|
||||
pCur++;
|
||||
{
|
||||
int8_t t;
|
||||
memcpy(&t, pCur, sizeof(int8_t));
|
||||
pCur += sizeof(int8_t);
|
||||
out->iInt = t;
|
||||
break;
|
||||
}
|
||||
|
||||
case EDT_Float:
|
||||
{
|
||||
out->fFloat = *((float*)pCur);
|
||||
float t;
|
||||
memcpy(&t, pCur, sizeof(float));
|
||||
pCur += sizeof(float);
|
||||
|
||||
// Swap endianness
|
||||
if (p_bBE)ByteSwap::Swap((int32_t*)&out->fFloat);
|
||||
pCur += 4;
|
||||
if (p_bBE)ByteSwap::Swap(&t);
|
||||
out->fFloat = t;
|
||||
break;
|
||||
}
|
||||
case EDT_Double:
|
||||
{
|
||||
out->fDouble = *((double*)pCur);
|
||||
double t;
|
||||
memcpy(&t, pCur, sizeof(double));
|
||||
pCur += sizeof(double);
|
||||
|
||||
// Swap endianness
|
||||
if (p_bBE)ByteSwap::Swap((int64_t*)&out->fDouble);
|
||||
pCur += 8;
|
||||
if (p_bBE)ByteSwap::Swap(&t);
|
||||
out->fDouble = t;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
||||
@@ -172,12 +172,16 @@ void STLExporter :: WriteMeshBinary(const aiMesh* m)
|
||||
}
|
||||
nor.Normalize();
|
||||
}
|
||||
ai_real nx = nor.x, ny = nor.y, nz = nor.z;
|
||||
// STL binary files use 4-byte floats. This may possibly cause loss of precision
|
||||
// for clients using 8-byte doubles
|
||||
float nx = (float) nor.x;
|
||||
float ny = (float) nor.y;
|
||||
float nz = (float) nor.z;
|
||||
AI_SWAP4(nx); AI_SWAP4(ny); AI_SWAP4(nz);
|
||||
mOutput.write((char *)&nx, 4); mOutput.write((char *)&ny, 4); mOutput.write((char *)&nz, 4);
|
||||
for(unsigned int a = 0; a < f.mNumIndices; ++a) {
|
||||
const aiVector3D& v = m->mVertices[f.mIndices[a]];
|
||||
ai_real vx = v.x, vy = v.y, vz = v.z;
|
||||
float vx = (float) v.x, vy = (float) v.y, vz = (float) v.z;
|
||||
AI_SWAP4(vx); AI_SWAP4(vy); AI_SWAP4(vz);
|
||||
mOutput.write((char *)&vx, 4); mOutput.write((char *)&vy, 4); mOutput.write((char *)&vz, 4);
|
||||
}
|
||||
|
||||
@@ -669,7 +669,7 @@ inline Image::Image()
|
||||
|
||||
}
|
||||
|
||||
inline void Image::Read(Value& obj, Asset& /*r*/)
|
||||
inline void Image::Read(Value& obj, Asset& r)
|
||||
{
|
||||
if (!mDataLength) {
|
||||
if (Value* uri = FindString(obj, "uri")) {
|
||||
@@ -686,6 +686,19 @@ inline void Image::Read(Value& obj, Asset& /*r*/)
|
||||
this->uri = uristr;
|
||||
}
|
||||
}
|
||||
else if (Value* bufferViewVal = FindUInt(obj, "bufferView")) {
|
||||
this->bufferView = r.bufferViews.Retrieve(bufferViewVal->GetUint());
|
||||
Ref<Buffer> buffer = this->bufferView->buffer;
|
||||
|
||||
this->mDataLength = this->bufferView->byteLength;
|
||||
// maybe this memcpy could be avoided if aiTexture does not delete[] pcData at destruction.
|
||||
this->mData = new uint8_t [this->mDataLength];
|
||||
memcpy(this->mData, buffer->GetPointer() + this->bufferView->byteOffset, this->mDataLength);
|
||||
|
||||
if (Value* mtype = FindString(obj, "mimeType")) {
|
||||
this->mimeType = mtype->GetString();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -948,24 +948,24 @@ Ref<Buffer> buf = pAsset_Root.buffers.Get(pCompression_Open3DGC.Buffer);
|
||||
size_t size_coordindex = ifs.GetNCoordIndex() * 3;// See float attributes note.
|
||||
|
||||
if(primitives[0].indices->count != size_coordindex)
|
||||
throw DeadlyImportError("GLTF: Open3DGC. Compressed indices count (" + std::to_string(size_coordindex) +
|
||||
") not equal to uncompressed (" + std::to_string(primitives[0].indices->count) + ").");
|
||||
throw DeadlyImportError("GLTF: Open3DGC. Compressed indices count (" + to_string(size_coordindex) +
|
||||
") not equal to uncompressed (" + to_string(primitives[0].indices->count) + ").");
|
||||
|
||||
size_coordindex *= sizeof(IndicesType);
|
||||
// Coordinates
|
||||
size_t size_coord = ifs.GetNCoord();// See float attributes note.
|
||||
|
||||
if(primitives[0].attributes.position[0]->count != size_coord)
|
||||
throw DeadlyImportError("GLTF: Open3DGC. Compressed positions count (" + std::to_string(size_coord) +
|
||||
") not equal to uncompressed (" + std::to_string(primitives[0].attributes.position[0]->count) + ").");
|
||||
throw DeadlyImportError("GLTF: Open3DGC. Compressed positions count (" + to_string(size_coord) +
|
||||
") not equal to uncompressed (" + to_string(primitives[0].attributes.position[0]->count) + ").");
|
||||
|
||||
size_coord *= 3 * sizeof(float);
|
||||
// Normals
|
||||
size_t size_normal = ifs.GetNNormal();// See float attributes note.
|
||||
|
||||
if(primitives[0].attributes.normal[0]->count != size_normal)
|
||||
throw DeadlyImportError("GLTF: Open3DGC. Compressed normals count (" + std::to_string(size_normal) +
|
||||
") not equal to uncompressed (" + std::to_string(primitives[0].attributes.normal[0]->count) + ").");
|
||||
throw DeadlyImportError("GLTF: Open3DGC. Compressed normals count (" + to_string(size_normal) +
|
||||
") not equal to uncompressed (" + to_string(primitives[0].attributes.normal[0]->count) + ").");
|
||||
|
||||
size_normal *= 3 * sizeof(float);
|
||||
// Additional attributes.
|
||||
@@ -989,8 +989,8 @@ Ref<Buffer> buf = pAsset_Root.buffers.Get(pCompression_Open3DGC.Buffer);
|
||||
if(idx_texcoord < primitives[0].attributes.texcoord.size())
|
||||
{
|
||||
if(primitives[0].attributes.texcoord[idx]->count != tval)
|
||||
throw DeadlyImportError("GLTF: Open3DGC. Compressed texture coordinates count (" + std::to_string(tval) +
|
||||
") not equal to uncompressed (" + std::to_string(primitives[0].attributes.texcoord[idx]->count) + ").");
|
||||
throw DeadlyImportError("GLTF: Open3DGC. Compressed texture coordinates count (" + to_string(tval) +
|
||||
") not equal to uncompressed (" + to_string(primitives[0].attributes.texcoord[idx]->count) + ").");
|
||||
|
||||
idx_texcoord++;
|
||||
}
|
||||
|
||||
@@ -194,9 +194,16 @@ void glTFImporter::ImportMaterials(glTF::Asset& r)
|
||||
aimat->AddProperty(&str, AI_MATKEY_NAME);
|
||||
}
|
||||
|
||||
SetMaterialColorProperty(embeddedTexIdxs, r, mat.diffuse, aimat, aiTextureType_DIFFUSE, AI_MATKEY_COLOR_DIFFUSE);
|
||||
SetMaterialColorProperty(embeddedTexIdxs, r, mat.ambient, aimat, aiTextureType_AMBIENT, AI_MATKEY_COLOR_AMBIENT );
|
||||
SetMaterialColorProperty(embeddedTexIdxs, r, mat.diffuse, aimat, aiTextureType_DIFFUSE, AI_MATKEY_COLOR_DIFFUSE );
|
||||
SetMaterialColorProperty(embeddedTexIdxs, r, mat.specular, aimat, aiTextureType_SPECULAR, AI_MATKEY_COLOR_SPECULAR);
|
||||
SetMaterialColorProperty(embeddedTexIdxs, r, mat.ambient, aimat, aiTextureType_AMBIENT, AI_MATKEY_COLOR_AMBIENT);
|
||||
SetMaterialColorProperty(embeddedTexIdxs, r, mat.emission, aimat, aiTextureType_EMISSIVE, AI_MATKEY_COLOR_EMISSIVE);
|
||||
|
||||
aimat->AddProperty(&mat.doubleSided, 1, AI_MATKEY_TWOSIDED);
|
||||
|
||||
if (mat.transparent && (mat.transparency != 1.0f)) {
|
||||
aimat->AddProperty(&mat.transparency, 1, AI_MATKEY_OPACITY);
|
||||
}
|
||||
|
||||
if (mat.shininess > 0.f) {
|
||||
aimat->AddProperty(&mat.shininess, 1, AI_MATKEY_SHININESS);
|
||||
|
||||
Reference in New Issue
Block a user