summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2023-05-22 17:02:23 +0200
committerRémi Verschelde <rverschelde@gmail.com>2023-05-22 17:02:23 +0200
commit5dc093b19a26b5055ceecaf1e1076bb5b4529a5a (patch)
tree5a277d7a98402ece618c9d6efac1dcc7bbe55e45
parentab935aaac63bdfcbd34eb06f6f94111b84d27e84 (diff)
parent69f2bc27517a0a352f0a7859de16c2fafa7a0264 (diff)
downloadredot-engine-5dc093b19a26b5055ceecaf1e1076bb5b4529a5a.tar.gz
Merge pull request #77341 from RedworkDE/doctool-material-error-fix
Fix error in `BaseMaterial3D` when running doctool
-rw-r--r--core/templates/self_list.h11
-rw-r--r--scene/resources/material.cpp16
-rw-r--r--scene/resources/material.h2
3 files changed, 18 insertions, 11 deletions
diff --git a/core/templates/self_list.h b/core/templates/self_list.h
index c3d7391d6c..ff6fa953ae 100644
--- a/core/templates/self_list.h
+++ b/core/templates/self_list.h
@@ -99,11 +99,20 @@ public:
p_elem->_root = nullptr;
}
+ void clear() {
+ while (_first) {
+ remove(_first);
+ }
+ }
+
_FORCE_INLINE_ SelfList<T> *first() { return _first; }
_FORCE_INLINE_ const SelfList<T> *first() const { return _first; }
_FORCE_INLINE_ List() {}
- _FORCE_INLINE_ ~List() { ERR_FAIL_COND(_first != nullptr); }
+ _FORCE_INLINE_ ~List() {
+ // A self list must be empty on destruction.
+ DEV_ASSERT(_first == nullptr);
+ }
};
private:
diff --git a/scene/resources/material.cpp b/scene/resources/material.cpp
index d35c49b266..5752f4cc1a 100644
--- a/scene/resources/material.cpp
+++ b/scene/resources/material.cpp
@@ -475,13 +475,11 @@ ShaderMaterial::~ShaderMaterial() {
/////////////////////////////////
Mutex BaseMaterial3D::material_mutex;
-SelfList<BaseMaterial3D>::List *BaseMaterial3D::dirty_materials = nullptr;
+SelfList<BaseMaterial3D>::List BaseMaterial3D::dirty_materials;
HashMap<BaseMaterial3D::MaterialKey, BaseMaterial3D::ShaderData, BaseMaterial3D::MaterialKey> BaseMaterial3D::shader_map;
BaseMaterial3D::ShaderNames *BaseMaterial3D::shader_names = nullptr;
void BaseMaterial3D::init_shaders() {
- dirty_materials = memnew(SelfList<BaseMaterial3D>::List);
-
shader_names = memnew(ShaderNames);
shader_names->albedo = "albedo";
@@ -568,14 +566,14 @@ HashMap<uint64_t, Ref<StandardMaterial3D>> BaseMaterial3D::materials_for_2d;
void BaseMaterial3D::finish_shaders() {
materials_for_2d.clear();
- memdelete(dirty_materials);
- dirty_materials = nullptr;
+ dirty_materials.clear();
memdelete(shader_names);
+ shader_names = nullptr;
}
void BaseMaterial3D::_update_shader() {
- dirty_materials->remove(&element);
+ dirty_materials.remove(&element);
MaterialKey mk = _compute_key();
if (mk == current_key) {
@@ -1494,8 +1492,8 @@ void BaseMaterial3D::_update_shader() {
void BaseMaterial3D::flush_changes() {
MutexLock lock(material_mutex);
- while (dirty_materials->first()) {
- dirty_materials->first()->self()->_update_shader();
+ while (dirty_materials.first()) {
+ dirty_materials.first()->self()->_update_shader();
}
}
@@ -1503,7 +1501,7 @@ void BaseMaterial3D::_queue_shader_change() {
MutexLock lock(material_mutex);
if (_is_initialized() && !element.in_list()) {
- dirty_materials->add(&element);
+ dirty_materials.add(&element);
}
}
diff --git a/scene/resources/material.h b/scene/resources/material.h
index b70522dda1..677ddf30d8 100644
--- a/scene/resources/material.h
+++ b/scene/resources/material.h
@@ -452,7 +452,7 @@ private:
};
static Mutex material_mutex;
- static SelfList<BaseMaterial3D>::List *dirty_materials;
+ static SelfList<BaseMaterial3D>::List dirty_materials;
static ShaderNames *shader_names;
SelfList<BaseMaterial3D> element;