Skip to content

Commit

Permalink
Merge pull request #77341 from RedworkDE/doctool-material-error-fix
Browse files Browse the repository at this point in the history
Fix error in `BaseMaterial3D` when running doctool
  • Loading branch information
akien-mga committed May 22, 2023
2 parents ab935aa + 69f2bc2 commit 5dc093b
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 11 deletions.
11 changes: 10 additions & 1 deletion core/templates/self_list.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,11 +99,20 @@ class SelfList {
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:
Expand Down
16 changes: 7 additions & 9 deletions scene/resources/material.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -1494,16 +1492,16 @@ 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();
}
}

void BaseMaterial3D::_queue_shader_change() {
MutexLock lock(material_mutex);

if (_is_initialized() && !element.in_list()) {
dirty_materials->add(&element);
dirty_materials.add(&element);
}
}

Expand Down
2 changes: 1 addition & 1 deletion scene/resources/material.h
Original file line number Diff line number Diff line change
Expand Up @@ -452,7 +452,7 @@ class BaseMaterial3D : public Material {
};

static Mutex material_mutex;
static SelfList<BaseMaterial3D>::List *dirty_materials;
static SelfList<BaseMaterial3D>::List dirty_materials;
static ShaderNames *shader_names;

SelfList<BaseMaterial3D> element;
Expand Down

0 comments on commit 5dc093b

Please sign in to comment.