1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-07 12:30:27 +00:00

Clears RIDs wherever they are freed by VisualServer or PhysicsServer and possibly reused. Fixes #53374

This commit is contained in:
Cory Petkovsek
2021-11-06 06:55:15 +08:00
parent e00d20aa5a
commit 3d20218dae
5 changed files with 127 additions and 42 deletions

View File

@@ -3191,16 +3191,39 @@ void SpatialEditorViewport::_init_gizmo_instance(int p_idx) {
void SpatialEditorViewport::_finish_gizmo_instances() {
for (int i = 0; i < 3; i++) {
VS::get_singleton()->free(move_gizmo_instance[i]);
VS::get_singleton()->free(move_plane_gizmo_instance[i]);
VS::get_singleton()->free(rotate_gizmo_instance[i]);
VS::get_singleton()->free(scale_gizmo_instance[i]);
VS::get_singleton()->free(scale_plane_gizmo_instance[i]);
if (move_gizmo_instance[i].is_valid()) {
VS::get_singleton()->free(move_gizmo_instance[i]);
move_gizmo_instance[i] = RID();
}
if (move_plane_gizmo_instance[i].is_valid()) {
VS::get_singleton()->free(move_plane_gizmo_instance[i]);
move_plane_gizmo_instance[i] = RID();
}
if (rotate_gizmo_instance[i].is_valid()) {
VS::get_singleton()->free(rotate_gizmo_instance[i]);
rotate_gizmo_instance[i] = RID();
}
if (scale_gizmo_instance[i].is_valid()) {
VS::get_singleton()->free(scale_gizmo_instance[i]);
scale_gizmo_instance[i] = RID();
}
if (scale_plane_gizmo_instance[i].is_valid()) {
VS::get_singleton()->free(scale_plane_gizmo_instance[i]);
scale_plane_gizmo_instance[i] = RID();
}
}
// Rotation white outline
VS::get_singleton()->free(rotate_gizmo_instance[3]);
// Rotation white outline. All of the arrays above have 3 elements, this has 4.
if (rotate_gizmo_instance[3].is_valid()) {
VS::get_singleton()->free(rotate_gizmo_instance[3]);
rotate_gizmo_instance[3] = RID();
}
}
void SpatialEditorViewport::_toggle_camera_preview(bool p_activate) {
ERR_FAIL_COND(p_activate && !preview);
ERR_FAIL_COND(!p_activate && !previewing);
@@ -5855,16 +5878,30 @@ void SpatialEditor::_init_grid() {
}
void SpatialEditor::_finish_indicators() {
VisualServer::get_singleton()->free(origin_instance);
VisualServer::get_singleton()->free(origin);
if (origin_instance.is_valid()) {
VisualServer::get_singleton()->free(origin_instance);
origin_instance = RID();
}
if (origin.is_valid()) {
VisualServer::get_singleton()->free(origin);
origin = RID();
}
_finish_grid();
}
void SpatialEditor::_finish_grid() {
for (int i = 0; i < 3; i++) {
VisualServer::get_singleton()->free(grid_instance[i]);
VisualServer::get_singleton()->free(grid[i]);
if (grid_instance[i].is_valid()) {
VisualServer::get_singleton()->free(grid_instance[i]);
grid_instance[i] = RID();
}
if (grid[i].is_valid()) {
VisualServer::get_singleton()->free(grid[i]);
grid[i] = RID();
}
}
}