MCPcopy Create free account
hub / github.com/JACoders/OpenJK / S_SpatializeOrigin

Function S_SpatializeOrigin

code/client/snd_dma.cpp:1350–1428  ·  view source on GitHub ↗

================= S_SpatializeOrigin Used for spatializing s_channels ================= */

Source from the content-addressed store, hash-verified

1348=================
1349*/
1350static 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 }

Callers 2

S_AddLoopSoundsFunction · 0.70
snd_dma.cppFile · 0.70

Calls 3

VectorSubtractFunction · 0.85
VectorNormalizeFunction · 0.85
DotProductFunction · 0.85

Tested by

no test coverage detected