Skip to content

Commit 5f9dff3

Browse files
Disconnect Area Signals in AkEnvironment node
Fixes a crash when reparenting the AkEnvironment node.
1 parent bcba5ce commit 5f9dff3

File tree

3 files changed

+42
-12
lines changed

3 files changed

+42
-12
lines changed

addons/Wwise/native/src/scene/ak_environment.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@ void AkEnvironment::_enter_tree()
2222
connect("area_exited", callable_mp(this, &AkEnvironment::_on_area_exited));
2323
}
2424

25+
void AkEnvironment::_exit_tree()
26+
{
27+
RETURN_IF_EDITOR;
28+
29+
disconnect("area_entered", callable_mp(this, &AkEnvironment::_on_area_entered));
30+
disconnect("area_exited", callable_mp(this, &AkEnvironment::_on_area_exited));
31+
}
32+
2533
void AkEnvironment::_on_area_entered(const Area3D* area)
2634
{
2735
Node* parent = area->get_parent();

addons/Wwise/native/src/scene/ak_environment.h

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class AkEnvironment : public Area3D
2222

2323
public:
2424
virtual void _enter_tree() override;
25+
virtual void _exit_tree() override;
2526

2627
void _on_area_entered(const Area3D* area);
2728
void _on_area_exited(const Area3D* area);

addons/Wwise/native/src/scene/ak_environment_data.cpp

+33-12
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,18 @@ void AkEnvironmentData::add_highest_priority_environments()
5454
{
5555
if (aux_array_data.data.size() < active_environments.size())
5656
{
57+
Vector<int> invalid_indices;
58+
5759
for (int i = 0; i < active_environments.size(); i++)
5860
{
61+
Variant environment = active_environments[i];
62+
63+
if (!UtilityFunctions::is_instance_valid(environment))
64+
{
65+
invalid_indices.push_back(i);
66+
continue;
67+
}
68+
5969
const AkEnvironment* env = Object::cast_to<AkEnvironment>(active_environments[i].operator godot::Object*());
6070

6171
if (env)
@@ -68,26 +78,37 @@ void AkEnvironmentData::add_highest_priority_environments()
6878
continue;
6979
}
7080

71-
for (int i = 0; i < aux_array_data.data.size(); i++)
81+
bool exists = false;
82+
for (int j = 0; j < aux_array_data.data.size(); j++)
7283
{
73-
Dictionary current_aux_data = aux_array_data.data[i];
74-
if (current_aux_data.has("aux_bus_id"))
84+
Dictionary current_aux_data = aux_array_data.data[j];
85+
if (current_aux_data.has("aux_bus_id") &&
86+
(uint32_t)current_aux_data["aux_bus_id"] == aux_bus->get_id())
7587
{
76-
if ((uint32_t)current_aux_data["aux_bus_id"] == aux_bus->get_id())
77-
{
78-
continue;
79-
}
88+
exists = true;
89+
break;
8090
}
8191
}
8292

83-
Dictionary aux_data;
84-
uint32_t id = aux_bus->get_id();
85-
aux_data["control_value"] = 1.0f;
86-
aux_data["aux_bus_id"] = id;
87-
aux_array_data.data.append(aux_data);
93+
if (!exists)
94+
{
95+
Dictionary aux_data;
96+
aux_data["control_value"] = 1.0f;
97+
aux_data["aux_bus_id"] = aux_bus->get_id();
98+
aux_array_data.data.append(aux_data);
99+
}
88100
}
89101
}
90102
}
103+
104+
if (!invalid_indices.is_empty())
105+
{
106+
for (int i = invalid_indices.size() - 1; i >= 0; i--)
107+
{
108+
active_environments.remove_at(invalid_indices[i]);
109+
}
110+
have_environments_changed = true;
111+
}
91112
}
92113
}
93114

0 commit comments

Comments
 (0)