================= S_SpatializeOrigin Used for spatializing s_channels ================= */
| 1348 | ================= |
| 1349 | */ |
| 1350 | static void S_SpatializeOrigin (const vec3_t origin, float master_vol, int *left_vol, int *right_vol, soundChannel_t channel) |
| 1351 | { |
| 1352 | vec_t dot; |
| 1353 | vec_t dist; |
| 1354 | vec_t lscale, rscale, scale; |
| 1355 | vec3_t source_vec; |
| 1356 | float dist_mult = SOUND_ATTENUATE; |
| 1357 | |
| 1358 | // calculate stereo seperation and distance attenuation |
| 1359 | VectorSubtract(origin, listener_origin, source_vec); |
| 1360 | |
| 1361 | dist = VectorNormalize(source_vec); |
| 1362 | if ( channel == CHAN_VOICE ) |
| 1363 | { |
| 1364 | dist -= SOUND_FULLVOLUME * 3.0f; |
| 1365 | // dist_mult = VOICE_ATTENUATE; // tweak added (this fixes an NPC dialogue "in your ears" bug, but we're not sure if it'll make a bunch of others fade too early. Too close to shipping...) |
| 1366 | } |
| 1367 | else if ( channel == CHAN_LESS_ATTEN ) |
| 1368 | { |
| 1369 | dist -= SOUND_FULLVOLUME * 5.0f; // maybe is too large |
| 1370 | } |
| 1371 | else if ( channel == CHAN_VOICE_ATTEN ) |
| 1372 | { |
| 1373 | dist -= SOUND_FULLVOLUME * 1.35f; // used to be 0.15f, dropped off too sharply - dmv |
| 1374 | dist_mult = VOICE_ATTENUATE; |
| 1375 | } |
| 1376 | else if ( channel == CHAN_VOICE_GLOBAL ) |
| 1377 | { |
| 1378 | dist = -1; |
| 1379 | } |
| 1380 | else // use normal attenuation. |
| 1381 | { |
| 1382 | dist -= SOUND_FULLVOLUME; |
| 1383 | } |
| 1384 | |
| 1385 | if (dist < 0) |
| 1386 | { |
| 1387 | dist = 0; // close enough to be at full volume |
| 1388 | } |
| 1389 | dist *= dist_mult; // different attenuation levels |
| 1390 | |
| 1391 | dot = -DotProduct(listener_axis[1], source_vec); |
| 1392 | |
| 1393 | if (dma.channels == 1) // || !dist_mult) |
| 1394 | { // no attenuation = no spatialization |
| 1395 | rscale = SOUND_FMAXVOL; |
| 1396 | lscale = SOUND_FMAXVOL; |
| 1397 | } |
| 1398 | else |
| 1399 | { |
| 1400 | //rscale = 0.5 * (1.0 + dot); |
| 1401 | //lscale = 0.5 * (1.0 - dot); |
| 1402 | rscale = s_separation->value + ( 1.0f - s_separation->value ) * dot; |
| 1403 | lscale = s_separation->value - ( 1.0f - s_separation->value ) * dot; |
| 1404 | if ( rscale < 0 ) |
| 1405 | { |
| 1406 | rscale = 0; |
| 1407 | } |
no test coverage detected