179 if (!engine || sourceId < 0)
181 auto *ep = QAudioEnginePrivate::get(engine);
182 if (!ep->currentRoom)
184 auto *rp = QAudioRoomPrivate::get(ep->currentRoom);
188 QVector3D roomDim2 = ep->currentRoom->dimensions()/2.;
189 QVector3D roomPos = ep->currentRoom->position();
190 QQuaternion roomRot = ep->currentRoom->rotation();
191 QVector3D dist = pos - roomPos;
193 dist = roomRot.rotatedVector(dist);
194 if (qAbs(dist.x()) <= roomDim2.x() &&
195 qAbs(dist.y()) <= roomDim2.y() &&
196 qAbs(dist.z()) <= roomDim2.z()) {
198 ep->resonanceAudio->api->SetSourceRoomEffectsGain(sourceId, 1);
207 auto relativeListenerPos = ep->listenerPosition() - roomPos;
208 relativeListenerPos = roomRot.rotatedVector(relativeListenerPos);
210 auto direction = dist.normalized();
216 const float transitionDistance =
size + 0.4;
217 QAudioRoom::Wall walls[3];
218 walls[X] = direction.x() > 0 ? QAudioRoom::RightWall : QAudioRoom::LeftWall;
219 walls[Y] = direction.y() > 0 ? QAudioRoom::FrontWall : QAudioRoom::BackWall;
220 walls[Z] = direction.z() > 0 ? QAudioRoom::Ceiling : QAudioRoom::Floor;
221 float factors[3] = { 0., 0., 0. };
222 bool foundWall =
false;
223 if (direction.x() != 0) {
224 float sign = direction.x() > 0 ? 1.f : -1.f;
225 float dx = sign * roomDim2.x() - relativeListenerPos.x();
226 QVector3D intersection = relativeListenerPos + direction*dx/direction.x();
227 float dy = roomDim2.y() - qAbs(intersection.y());
228 float dz = roomDim2.z() - qAbs(intersection.z());
229 if (dy > 0 && dz > 0) {
232 factors[Y] = qMax(0.f, 1.f/3.f - dy/transitionDistance);
233 factors[Z] = qMax(0.f, 1.f/3.f - dz/transitionDistance);
234 factors[X] = 1.f - factors[Y] - factors[Z];
238 if (!foundWall && direction.y() != 0) {
239 float sign = direction.y() > 0 ? 1.f : -1.f;
240 float dy = sign * roomDim2.y() - relativeListenerPos.y();
241 QVector3D intersection = relativeListenerPos + direction*dy/direction.y();
242 float dx = roomDim2.x() - qAbs(intersection.x());
243 float dz = roomDim2.z() - qAbs(intersection.z());
244 if (dx > 0 && dz > 0) {
247 factors[X] = qMax(0.f, 1.f/3.f - dx/transitionDistance);
248 factors[Z] = qMax(0.f, 1.f/3.f - dz/transitionDistance);
249 factors[Y] = 1.f - factors[X] - factors[Z];
254 Q_ASSERT(direction.z() != 0);
255 float sign = direction.z() > 0 ? 1.f : -1.f;
256 float dz = sign * roomDim2.z() - relativeListenerPos.z();
257 QVector3D intersection = relativeListenerPos + direction*dz/direction.z();
258 float dx = roomDim2.x() - qAbs(intersection.x());
259 float dy = roomDim2.y() - qAbs(intersection.y());
260 if (dx > 0 && dy > 0) {
263 factors[X] = qMax(0.f, 1.f/3.f - dx/transitionDistance);
264 factors[Y] = qMax(0.f, 1.f/3.f - dy/transitionDistance);
265 factors[Z] = 1.f - factors[X] - factors[Y];
271 for (
int i = 0; i < 3; ++i) {
277 ep->resonanceAudio->api->SetSourceRoomEffectsGain(sourceId, 0);
279 ep->resonanceAudio->api->SetSoundObjectOcclusionIntensity(sourceId, occlusionIntensity + wallOcclusion);
280 ep->resonanceAudio->api->SetSourceVolume(sourceId, volume*wallDampening);