diff --git a/code/MMDImporter.cpp b/code/MMDImporter.cpp index c813063ab..76ad9115c 100644 --- a/code/MMDImporter.cpp +++ b/code/MMDImporter.cpp @@ -168,7 +168,7 @@ void MMDImporter::CreateDataFromImport(const pmx::PmxModel *pModel, } // create node hierarchy for bone position - aiNode **ppNode = new aiNode *[pModel->bone_count]; + std::unique_ptr ppNode(new aiNode *[pModel->bone_count]); for (auto i = 0; i < pModel->bone_count; i++) { ppNode[i] = new aiNode(pModel->bones[i].bone_name); } @@ -177,9 +177,9 @@ void MMDImporter::CreateDataFromImport(const pmx::PmxModel *pModel, const pmx::PmxBone &bone = pModel->bones[i]; if (bone.parent_index < 0) { - pScene->mRootNode->addChildren(1, ppNode + i); + pScene->mRootNode->addChildren(1, ppNode.get() + i); } else { - ppNode[bone.parent_index]->addChildren(1, ppNode + i); + ppNode[bone.parent_index]->addChildren(1, ppNode.get() + i); aiVector3D v3 = aiVector3D( bone.position[0] - pModel->bones[bone.parent_index].position[0], @@ -324,8 +324,10 @@ aiMesh *MMDImporter::CreateMesh(const pmx::PmxModel *pModel, auto it = bone_vertex_map.find(ii); if (it != bone_vertex_map.end()) { pBone->mNumWeights = static_cast(it->second.size()); - pBone->mWeights = it->second.data(); - it->second.swap(*(new vector)); + pBone->mWeights = new aiVertexWeight[pBone->mNumWeights]; + for (unsigned int j = 0; j < pBone->mNumWeights; j++) { + pBone->mWeights[j] = it->second[j]; + } } bone_ptr_ptr[ii] = pBone; } diff --git a/code/glTFAsset.h b/code/glTFAsset.h index 0c3de16a5..e1daf27a2 100644 --- a/code/glTFAsset.h +++ b/code/glTFAsset.h @@ -649,7 +649,7 @@ namespace glTF int width, height; private: - uint8_t* mData; + std::unique_ptr mData; size_t mDataLength; public: @@ -664,7 +664,7 @@ namespace glTF { return mDataLength; } inline const uint8_t* GetData() const - { return mData; } + { return mData.get(); } inline uint8_t* StealData(); diff --git a/code/glTFAsset.inl b/code/glTFAsset.inl index a5d74f5a0..b01957f3b 100644 --- a/code/glTFAsset.inl +++ b/code/glTFAsset.inl @@ -297,7 +297,7 @@ inline void Buffer::Read(Value& obj, Asset& r) if (dataURI.base64) { uint8_t* data = 0; this->byteLength = Util::DecodeBase64(dataURI.data, dataURI.dataLength, data); - this->mData.reset(data); + this->mData.reset(data, std::default_delete()); if (statedLength > 0 && this->byteLength != statedLength) { throw DeadlyImportError("GLTF: buffer \"" + id + "\", expected " + to_string(statedLength) + @@ -601,7 +601,6 @@ T Accessor::Indexer::GetValue(int i) inline Image::Image() : width(0) , height(0) - , mData(0) , mDataLength(0) { @@ -624,8 +623,8 @@ inline void Image::Read(Value& obj, Asset& r) Ref bv = r.bufferViews.Get(bufferViewId); if (bv) { mDataLength = bv->byteLength; - mData = new uint8_t[mDataLength]; - memcpy(mData, bv->buffer->GetPointer() + bv->byteOffset, mDataLength); + mData.reset(new uint8_t[mDataLength]); + memcpy(mData.get(), bv->buffer->GetPointer() + bv->byteOffset, mDataLength); } } } @@ -640,7 +639,9 @@ inline void Image::Read(Value& obj, Asset& r) if (ParseDataURI(uristr, uri->GetStringLength(), dataURI)) { mimeType = dataURI.mediaType; if (dataURI.base64) { - mDataLength = Util::DecodeBase64(dataURI.data, dataURI.dataLength, mData); + uint8_t *ptr = nullptr; + mDataLength = Util::DecodeBase64(dataURI.data, dataURI.dataLength, ptr); + mData.reset(ptr); } } else { @@ -652,10 +653,8 @@ inline void Image::Read(Value& obj, Asset& r) inline uint8_t* Image::StealData() { - uint8_t* data = mData; mDataLength = 0; - mData = 0; - return data; + return mData.release(); } inline void Image::SetData(uint8_t* data, size_t length, Asset& r) @@ -670,7 +669,7 @@ inline void Image::SetData(uint8_t* data, size_t length, Asset& r) bufferView->byteOffset = b->AppendData(data, length); } else { // text file: will be stored as a data uri - this->mData = data; + this->mData.reset(data); this->mDataLength = length; } } diff --git a/code/glTFImporter.cpp b/code/glTFImporter.cpp index 5d1b5afab..381e459fd 100644 --- a/code/glTFImporter.cpp +++ b/code/glTFImporter.cpp @@ -616,7 +616,7 @@ void glTFImporter::ImportEmbeddedTextures(glTF::Asset& r) // Add the embedded textures for (size_t i = 0; i < r.images.Size(); ++i) { - Image img = r.images[i]; + Image &img = r.images[i]; if (!img.HasData()) continue; int idx = mScene->mNumTextures++;