Fix M3D import crash and memory leak.
The same default material pointer was assigned to all the materials in the scene, so poor destructor tried to free the same pointer multiple times.pull/4044/head
parent
d2b7e9c38c
commit
0590a39159
|
@ -233,12 +233,12 @@ void M3DImporter::importMaterials(const M3DWrapper &m3d) {
|
||||||
ASSIMP_LOG_DEBUG("M3D: importMaterials ", mScene->mNumMaterials);
|
ASSIMP_LOG_DEBUG("M3D: importMaterials ", mScene->mNumMaterials);
|
||||||
|
|
||||||
// add a default material as first
|
// add a default material as first
|
||||||
aiMaterial *mat = new aiMaterial;
|
aiMaterial *defaultMat = new aiMaterial;
|
||||||
mat->AddProperty(&name, AI_MATKEY_NAME);
|
defaultMat->AddProperty(&name, AI_MATKEY_NAME);
|
||||||
c.a = 1.0f;
|
c.a = 1.0f;
|
||||||
c.b = c.g = c.r = 0.6f;
|
c.b = c.g = c.r = 0.6f;
|
||||||
mat->AddProperty(&c, 1, AI_MATKEY_COLOR_DIFFUSE);
|
defaultMat->AddProperty(&c, 1, AI_MATKEY_COLOR_DIFFUSE);
|
||||||
mScene->mMaterials[0] = mat;
|
mScene->mMaterials[0] = defaultMat;
|
||||||
|
|
||||||
if (!m3d->nummaterial || !m3d->material) {
|
if (!m3d->nummaterial || !m3d->material) {
|
||||||
return;
|
return;
|
||||||
|
@ -300,12 +300,12 @@ void M3DImporter::importMaterials(const M3DWrapper &m3d) {
|
||||||
m->prop[j].value.textureid < m3d->numtexture &&
|
m->prop[j].value.textureid < m3d->numtexture &&
|
||||||
m3d->texture[m->prop[j].value.textureid].name) {
|
m3d->texture[m->prop[j].value.textureid].name) {
|
||||||
name.Set(std::string(std::string(m3d->texture[m->prop[j].value.textureid].name) + ".png"));
|
name.Set(std::string(std::string(m3d->texture[m->prop[j].value.textureid].name) + ".png"));
|
||||||
mat->AddProperty(&name, aiTxProps[k].pKey, aiTxProps[k].type, aiTxProps[k].index);
|
newMat->AddProperty(&name, aiTxProps[k].pKey, aiTxProps[k].type, aiTxProps[k].index);
|
||||||
n = 0;
|
n = 0;
|
||||||
mat->AddProperty(&n, 1, _AI_MATKEY_UVWSRC_BASE, aiProps[k].type, aiProps[k].index);
|
newMat->AddProperty(&n, 1, _AI_MATKEY_UVWSRC_BASE, aiProps[k].type, aiProps[k].index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mScene->mMaterials[i + 1] = mat;
|
mScene->mMaterials[i + 1] = newMat;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,35 +50,32 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
using namespace Assimp;
|
using namespace Assimp;
|
||||||
|
|
||||||
class utM3DImportExport : public AbstractImportExportBase {
|
TEST(utM3DImportExport, import_cube_normals) {
|
||||||
public:
|
Assimp::Importer importer;
|
||||||
bool importerTest() override {
|
const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/M3D/cube_normals.m3d", aiProcess_ValidateDataStructure);
|
||||||
Assimp::Importer importer;
|
|
||||||
const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/M3D/cube_normals.m3d", aiProcess_ValidateDataStructure);
|
|
||||||
#ifndef ASSIMP_BUILD_NO_M3D_IMPORTER
|
#ifndef ASSIMP_BUILD_NO_M3D_IMPORTER
|
||||||
return nullptr != scene;
|
ASSERT_NE(nullptr, scene);
|
||||||
#else
|
#else
|
||||||
return nullptr == scene;
|
ASSERT_EQ(nullptr, scene);
|
||||||
#endif // ASSIMP_BUILD_NO_M3D_IMPORTER
|
#endif // ASSIMP_BUILD_NO_M3D_IMPORTER
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef ASSIMP_BUILD_NO_EXPORT
|
TEST(utM3DImportExport, import_cube_usemtl) {
|
||||||
bool exporterTest() override {
|
Assimp::Importer importer;
|
||||||
Assimp::Importer importer;
|
const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/M3D/cube_usemtl.m3d", aiProcess_ValidateDataStructure);
|
||||||
const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/M3D/cube_normals.m3d", aiProcess_ValidateDataStructure);
|
#ifndef ASSIMP_BUILD_NO_M3D_IMPORTER
|
||||||
Exporter exporter;
|
ASSERT_NE(nullptr, scene);
|
||||||
aiReturn ret = exporter.Export(scene, "m3d", ASSIMP_TEST_MODELS_DIR "/M3D/cube_normals_out.m3d");
|
#else
|
||||||
return ret == AI_SUCCESS;
|
ASSERT_EQ(nullptr, scene);
|
||||||
}
|
#endif // ASSIMP_BUILD_NO_M3D_IMPORTER
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST_F(utM3DImportExport, importM3DFromFileTest) {
|
|
||||||
EXPECT_TRUE(importerTest());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef ASSIMP_BUILD_NO_EXPORT
|
#ifndef ASSIMP_BUILD_NO_EXPORT
|
||||||
TEST_F(utM3DImportExport, exportM3DFromFileTest) {
|
TEST(utM3DImportExport, export_cube_normals) {
|
||||||
EXPECT_TRUE(exporterTest());
|
Assimp::Importer importer;
|
||||||
|
const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/M3D/cube_normals.m3d", aiProcess_ValidateDataStructure);
|
||||||
|
Exporter exporter;
|
||||||
|
aiReturn ret = exporter.Export(scene, "m3d", ASSIMP_TEST_MODELS_DIR "/M3D/cube_normals_out.m3d");
|
||||||
|
ASSERT_EQ(AI_SUCCESS, ret);
|
||||||
}
|
}
|
||||||
#endif // ASSIMP_BUILD_NO_EXPORT
|
#endif // ASSIMP_BUILD_NO_EXPORT
|
||||||
|
|
Loading…
Reference in New Issue