summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbitsawer <sawerduster@gmail.com>2023-06-19 10:46:12 +0300
committerbitsawer <sawerduster@gmail.com>2023-06-19 11:07:15 +0300
commitdab0871d41f0fe08dd836c02906af2a7aedcd4c8 (patch)
tree362f298a1b28121690c4bd632d709bf851a2b0a5
parent116f783db73f4bf7e9e96ae54dd3d0a20337cc8a (diff)
downloadredot-engine-dab0871d41f0fe08dd836c02906af2a7aedcd4c8.tar.gz
Fix invalid RID errors when freeing a mesh with blend shapes
-rw-r--r--drivers/gles3/storage/mesh_storage.cpp10
-rw-r--r--servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp11
2 files changed, 13 insertions, 8 deletions
diff --git a/drivers/gles3/storage/mesh_storage.cpp b/drivers/gles3/storage/mesh_storage.cpp
index 8a027aad1c..ad4bdae272 100644
--- a/drivers/gles3/storage/mesh_storage.cpp
+++ b/drivers/gles3/storage/mesh_storage.cpp
@@ -633,6 +633,12 @@ void MeshStorage::mesh_set_shadow_mesh(RID p_mesh, RID p_shadow_mesh) {
void MeshStorage::mesh_clear(RID p_mesh) {
Mesh *mesh = mesh_owner.get_or_null(p_mesh);
ERR_FAIL_COND(!mesh);
+
+ // Clear instance data before mesh data.
+ for (MeshInstance *mi : mesh->instances) {
+ _mesh_instance_clear(mi);
+ }
+
for (uint32_t i = 0; i < mesh->surface_count; i++) {
Mesh::Surface &s = *mesh->surfaces[i];
@@ -704,10 +710,6 @@ void MeshStorage::mesh_clear(RID p_mesh) {
mesh->surfaces = nullptr;
mesh->surface_count = 0;
mesh->material_cache.clear();
- //clear instance data
- for (MeshInstance *mi : mesh->instances) {
- _mesh_instance_clear(mi);
- }
mesh->has_bone_weights = false;
mesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MESH);
diff --git a/servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp b/servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp
index d3c22e4826..67b5cdd291 100644
--- a/servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp
+++ b/servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp
@@ -727,6 +727,12 @@ void MeshStorage::mesh_set_shadow_mesh(RID p_mesh, RID p_shadow_mesh) {
void MeshStorage::mesh_clear(RID p_mesh) {
Mesh *mesh = mesh_owner.get_or_null(p_mesh);
ERR_FAIL_COND(!mesh);
+
+ // Clear instance data before mesh data.
+ for (MeshInstance *mi : mesh->instances) {
+ _mesh_instance_clear(mi);
+ }
+
for (uint32_t i = 0; i < mesh->surface_count; i++) {
Mesh::Surface &s = *mesh->surfaces[i];
if (s.vertex_buffer.is_valid()) {
@@ -766,10 +772,6 @@ void MeshStorage::mesh_clear(RID p_mesh) {
mesh->surfaces = nullptr;
mesh->surface_count = 0;
mesh->material_cache.clear();
- //clear instance data
- for (MeshInstance *mi : mesh->instances) {
- _mesh_instance_clear(mi);
- }
mesh->has_bone_weights = false;
mesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MESH);
@@ -860,6 +862,7 @@ void MeshStorage::_mesh_instance_clear(MeshInstance *mi) {
if (mi->blend_weights_buffer.is_valid()) {
RD::get_singleton()->free(mi->blend_weights_buffer);
+ mi->blend_weights_buffer = RID();
}
mi->blend_weights.clear();
mi->weights_dirty = false;