@@ -141,6 +141,25 @@ MeshShape::MeshShape(
141141 const Eigen::Vector3d& scale,
142142 const aiScene* mesh,
143143 const common::Uri& path,
144+ common::ResourceRetrieverPtr resourceRetriever,
145+ MeshOwnership ownership)
146+ : Shape(MESH),
147+ mMesh (nullptr ),
148+ mMeshOwnership(MeshOwnership::None),
149+ mDisplayList(0 ),
150+ mColorMode(MATERIAL_COLOR),
151+ mAlphaMode(BLEND),
152+ mColorIndex(0 )
153+ {
154+ setMesh (mesh, ownership, path, std::move (resourceRetriever));
155+ setScale (scale);
156+ }
157+
158+ // ==============================================================================
159+ MeshShape::MeshShape (
160+ const Eigen::Vector3d& scale,
161+ std::shared_ptr<const aiScene> mesh,
162+ const common::Uri& path,
144163 common::ResourceRetrieverPtr resourceRetriever)
145164 : Shape(MESH),
146165 mMesh(nullptr ),
@@ -150,7 +169,7 @@ MeshShape::MeshShape(
150169 mAlphaMode(BLEND),
151170 mColorIndex(0 )
152171{
153- setMesh (mesh, path, std::move (resourceRetriever));
172+ setMesh (std::move ( mesh) , path, std::move (resourceRetriever));
154173 setScale (scale);
155174}
156175
@@ -163,22 +182,7 @@ MeshShape::~MeshShape()
163182// ==============================================================================
164183void MeshShape::releaseMesh ()
165184{
166- if (!mMesh )
167- return ;
168-
169- switch (mMeshOwnership ) {
170- case MeshOwnership::Imported:
171- aiReleaseImport (const_cast <aiScene*>(mMesh ));
172- break ;
173- case MeshOwnership::Copied:
174- aiFreeScene (const_cast <aiScene*>(mMesh ));
175- break ;
176- case MeshOwnership::None:
177- default :
178- break ;
179- }
180-
181- mMesh = nullptr ;
185+ mMesh .reset ();
182186 mMeshOwnership = MeshOwnership::None;
183187}
184188
@@ -198,7 +202,7 @@ const std::string& MeshShape::getStaticType()
198202// ==============================================================================
199203const aiScene* MeshShape::getMesh () const
200204{
201- return mMesh ;
205+ return mMesh . get () ;
202206}
203207
204208// ==============================================================================
@@ -237,7 +241,11 @@ void MeshShape::setMesh(
237241 const std::string& path,
238242 common::ResourceRetrieverPtr resourceRetriever)
239243{
240- setMesh (mesh, common::Uri (path), std::move (resourceRetriever));
244+ setMesh (
245+ mesh,
246+ MeshOwnership::Imported,
247+ common::Uri (path),
248+ std::move (resourceRetriever));
241249}
242250
243251// ==============================================================================
@@ -246,15 +254,95 @@ void MeshShape::setMesh(
246254 const common::Uri& uri,
247255 common::ResourceRetrieverPtr resourceRetriever)
248256{
249- if (mesh == mMesh ) {
257+ setMesh (mesh, MeshOwnership::Imported, uri, std::move (resourceRetriever));
258+ }
259+
260+ // ==============================================================================
261+ namespace {
262+
263+ std::shared_ptr<const aiScene> makeMeshHandle (
264+ const aiScene* mesh, MeshShape::MeshOwnership ownership)
265+ {
266+ if (!mesh)
267+ return nullptr ;
268+
269+ switch (ownership) {
270+ case MeshShape::MeshOwnership::Imported:
271+ return std::shared_ptr<const aiScene>(mesh, [](const aiScene* scene) { //
272+ aiReleaseImport (const_cast <aiScene*>(scene));
273+ });
274+ case MeshShape::MeshOwnership::Copied:
275+ return std::shared_ptr<const aiScene>(mesh, [](const aiScene* scene) {
276+ aiFreeScene (const_cast <aiScene*>(scene));
277+ });
278+ case MeshShape::MeshOwnership::Manual:
279+ return std::shared_ptr<const aiScene>(mesh, [](const aiScene* scene) {
280+ delete const_cast <aiScene*>(scene);
281+ });
282+ case MeshShape::MeshOwnership::Custom:
283+ case MeshShape::MeshOwnership::None:
284+ default :
285+ return std::shared_ptr<const aiScene>(
286+ mesh, [](const aiScene*) { /* no-op */ });
287+ }
288+ }
289+
290+ } // namespace
291+
292+ // ==============================================================================
293+ void MeshShape::setMesh (
294+ const aiScene* mesh,
295+ MeshOwnership ownership,
296+ const common::Uri& uri,
297+ common::ResourceRetrieverPtr resourceRetriever)
298+ {
299+ if (mesh == mMesh .get () && ownership == mMeshOwnership ) {
250300 // Nothing to do.
251301 return ;
252302 }
253303
254304 releaseMesh ();
255305
256- mMesh = mesh;
257- mMeshOwnership = mesh ? MeshOwnership::Imported : MeshOwnership::None;
306+ mMesh = makeMeshHandle (mesh, ownership);
307+ mMeshOwnership = mesh ? ownership : MeshOwnership::None;
308+
309+ if (!mMesh ) {
310+ mMeshUri .clear ();
311+ mMeshPath .clear ();
312+ mResourceRetriever = nullptr ;
313+ return ;
314+ }
315+
316+ mMeshUri = uri;
317+
318+ if (uri.mScheme .get_value_or (" file" ) == " file" && uri.mPath ) {
319+ mMeshPath = uri.getFilesystemPath ();
320+ } else if (resourceRetriever) {
321+ DART_SUPPRESS_DEPRECATED_BEGIN
322+ mMeshPath = resourceRetriever->getFilePath (uri);
323+ DART_SUPPRESS_DEPRECATED_END
324+ } else {
325+ mMeshPath .clear ();
326+ }
327+
328+ mResourceRetriever = std::move (resourceRetriever);
329+
330+ incrementVersion ();
331+ }
332+
333+ // ==============================================================================
334+ void MeshShape::setMesh (
335+ std::shared_ptr<const aiScene> mesh,
336+ const common::Uri& uri,
337+ common::ResourceRetrieverPtr resourceRetriever)
338+ {
339+ if (mesh == mMesh && mMeshOwnership == MeshOwnership::Custom) {
340+ return ;
341+ }
342+
343+ releaseMesh ();
344+ mMesh = std::move (mesh);
345+ mMeshOwnership = mMesh ? MeshOwnership::Custom : MeshOwnership::None;
258346
259347 if (!mMesh ) {
260348 mMeshUri .clear ();
@@ -363,8 +451,7 @@ ShapePtr MeshShape::clone() const
363451 aiScene* new_scene = cloneMesh ();
364452
365453 auto new_shape = std::make_shared<MeshShape>(
366- mScale , new_scene, mMeshUri , mResourceRetriever );
367- new_shape->mMeshOwnership = MeshOwnership::Copied;
454+ mScale , new_scene, mMeshUri , mResourceRetriever , MeshOwnership::Copied);
368455 new_shape->mMeshPath = mMeshPath ;
369456 new_shape->mDisplayList = mDisplayList ;
370457 new_shape->mColorMode = mColorMode ;
@@ -418,7 +505,7 @@ aiScene* MeshShape::cloneMesh() const
418505 return nullptr ;
419506
420507 aiScene* new_scene = nullptr ;
421- aiCopyScene (mMesh , &new_scene);
508+ aiCopyScene (mMesh . get () , &new_scene);
422509 return new_scene;
423510}
424511
0 commit comments