diff --git a/src/user/user_api.cc b/src/user/user_api.cc
index 98033998..ac9dc29c 100644
--- a/src/user/user_api.cc
+++ b/src/user/user_api.cc
@@ -1783,14 +1783,12 @@ void mj_clearCache(mjCache* cache) {
// get the internal asset cache used by the compiler
mjCache* mj_getCache() {
+ static mjCache cache_cwrapper = {0};
// mjCCache is not trivially destructible and so the global cache needs to
// allocated on the heap
if constexpr (kGlobalCacheSize != 0) {
static mjCCache* cache = new(std::nothrow) mjCCache(kGlobalCacheSize);
- static mjCache cache_cwrapper;
- cache_cwrapper.impl_ = cache;
- return cache->Capacity() > 0 ? &cache_cwrapper : nullptr;
- } else {
- return nullptr;
+ cache_cwrapper.impl_ = cache->Capacity() > 0 ? cache : nullptr;
}
+ return &cache_cwrapper;
}
diff --git a/src/user/user_cache.cc b/src/user/user_cache.cc
index fd8660fc..4fb37022 100644
--- a/src/user/user_cache.cc
+++ b/src/user/user_cache.cc
@@ -116,10 +116,10 @@ bool mjCCache::PopulateData(const std::string& id, const mjResource* resource, m
}
mjCAsset* asset = &(it->second);
- asset->IncrementAccess();
// update priority queue
entries_.erase(asset);
+ asset->IncrementAccess();
entries_.insert(asset);
return asset->PopulateData(fn);
diff --git a/test/user/user_api_test.cc b/test/user/user_api_test.cc
index a84f3d09..4823aa07 100644
--- a/test/user/user_api_test.cc
+++ b/test/user/user_api_test.cc
@@ -751,6 +751,42 @@ TEST_F(PluginTest, RecompileComparePngCache) {
mj_deleteVFS(vfs.get());
}
+TEST_F(PluginTest, DisableCache) {
+ static constexpr char xml[] = R"(
+
+
+
+
+
+
+
+
+
+
+)";
+
+ mjCache* cache = mj_getCache();
+ std::size_t capacity = mj_getCacheCapacity(cache);
+ mj_setCacheCapacity(cache, 0);
+
+ auto vfs = std::make_unique();
+ mj_defaultVFS(vfs.get());
+ mj_addBufferVFS(vfs.get(), "tex.png", tex1, sizeof(tex1));
+
+ std::array error;
+
+ // load model once
+ mjModel* m = LoadModelFromString(xml, error.data(), error.size(), vfs.get());
+
+ EXPECT_EQ(mj_getCacheSize(cache), 0);
+ EXPECT_EQ(m->ntexdata, 18); // w x h x rgb = 3 x 2 x 3
+
+ mj_setCacheCapacity(cache, capacity);
+
+ mj_deleteModel(m);
+ mj_deleteVFS(vfs.get());
+}
+
// -------------------------------- test textures ------------------------------
TEST_F(PluginTest, TextureFromBuffer) {