| 41 | } |
| 42 | |
| 43 | float Occluders::occlusion(const FloatPoint3D & sourcePos, const FloatPoint3D & listenerPos) const |
| 44 | { |
| 45 | float occlusionAttenuation = 1.0f; |
| 46 | for (const auto & i : occluders) |
| 47 | { |
| 48 | FloatPoint3D occPos(i.second.x, i.second.y, i.second.z); |
| 49 | |
| 50 | float t; |
| 51 | float d = distanceFromPointToLine(occPos, listenerPos, sourcePos, t); |
| 52 | |
| 53 | if (t <= 0 || t >= 1) |
| 54 | continue; |
| 55 | |
| 56 | float maxAtten = i.second.maxAttenuation; |
| 57 | |
| 58 | if (d <= i.second.innerRadius) |
| 59 | { |
| 60 | occlusionAttenuation *= maxAtten; |
| 61 | } |
| 62 | else if (d <= i.second.outerRadius) |
| 63 | { |
| 64 | float inner = i.second.innerRadius; |
| 65 | float t = (d - inner) / (i.second.outerRadius - inner); |
| 66 | occlusionAttenuation *= maxAtten + (1.0f - maxAtten) * t; |
| 67 | } |
| 68 | } |
| 69 | return occlusionAttenuation; |
| 70 | } |
| 71 | |
| 72 | // @tofix - pass in HRTF loader path |
| 73 | SpatializationNode::SpatializationNode(AudioContext & ac) |
no test coverage detected