- snd = ch->sfx;
- VectorSubtract(ch->origin, listener_origin, source_vec);
-
- dist = VectorNormalizeLength(source_vec) * ch->dist_mult;
-
- dot = DotProduct(listener_right, source_vec);
-
- if (shm->channels == 1)
- {
- rscale = 1.0;
- lscale = 1.0;
- }
- else
- {
- rscale = 1.0 + dot;
- lscale = 1.0 - dot;
- }
-
- // add in distance effect
- scale = (1.0 - dist) * rscale;
- ch->rightvol = (int) (ch->master_vol * scale);
- if (ch->rightvol < 0)
- ch->rightvol = 0;
-
- scale = (1.0 - dist) * lscale;
- ch->leftvol = (int) (ch->master_vol * scale);
- if (ch->leftvol < 0)
- ch->leftvol = 0;
+ VectorSubtract(ch->origin, listener_vieworigin, source_vec);
+ dist = VectorNormalizeLength(source_vec);
+ // distance
+ scale = ch->master_vol * (1.0 - (dist * ch->dist_mult));
+ // panning
+ pan = scale * DotProduct(listener_viewleft, source_vec);
+ // calculate the volumes
+ ch->leftvol = (int) (scale + pan);
+ ch->rightvol = (int) (scale - pan);