AudioCollision.cpp 14,8 КБ
Newer Older
aap's avatar
aap включено в состав коммита
1
#include "common.h"
Sergeanur's avatar
Sergeanur включено в состав коммита
2

aap's avatar
aap включено в состав коммита
3
4
5
6
7
8
9
10
11
12
#include "DMAudio.h"
#include "Entity.h"
#include "AudioCollision.h"
#include "AudioManager.h"
#include "AudioSamples.h"
#include "SurfaceTable.h"
#include "sampman.h"

const int CollisionSoundIntensity = 60;

Sergeanur's avatar
Sergeanur включено в состав коммита
13
14
15
void
cAudioManager::ReportCollision(CEntity *entity1, CEntity *entity2, uint8 surface1, uint8 surface2, float collisionPower,
                               float velocity)
Sergeanur's avatar
Sergeanur включено в состав коммита
16
{
Sergeanur's avatar
Sergeanur включено в состав коммита
17
18
19
	float distSquared;
	CVector v1;
	CVector v2;
Sergeanur's avatar
Sergeanur включено в состав коммита
20

Sergeanur's avatar
Sergeanur включено в состав коммита
21
	if(!m_bIsInitialised || m_nCollisionEntity < 0 || m_bIsPaused ||
Sergeanur's avatar
Sergeanur включено в состав коммита
22
23
	   (velocity < 0.0016f && collisionPower < 0.01f))
		return;
Sergeanur's avatar
Sergeanur включено в состав коммита
24

Sergeanur's avatar
Sergeanur включено в состав коммита
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
	if(entity1->IsBuilding()) {
		v1 = v2 = entity2->GetPosition();
	} else if(entity2->IsBuilding()) {
		v1 = v2 = entity1->GetPosition();
	} else {
		v1 = entity1->GetPosition();
		v2 = entity2->GetPosition();
	}
	CVector pos = (v1 + v2) * 0.5f;
	distSquared = GetDistanceSquared(pos);
	if(distSquared < SQR(CollisionSoundIntensity)) {
		m_sCollisionManager.m_sQueue.m_pEntity1 = entity1;
		m_sCollisionManager.m_sQueue.m_pEntity2 = entity2;
		m_sCollisionManager.m_sQueue.m_bSurface1 = surface1;
		m_sCollisionManager.m_sQueue.m_bSurface2 = surface2;
		m_sCollisionManager.m_sQueue.m_fIntensity1 = collisionPower;
		m_sCollisionManager.m_sQueue.m_fIntensity2 = velocity;
		m_sCollisionManager.m_sQueue.m_vecPosition = pos;
		m_sCollisionManager.m_sQueue.m_fDistance = distSquared;
		m_sCollisionManager.AddCollisionToRequestedQueue();
	}
Sergeanur's avatar
Sergeanur включено в состав коммита
46
47
}

aap's avatar
aap включено в состав коммита
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
void
cAudioCollisionManager::AddCollisionToRequestedQueue()
{
	int32 collisionsIndex;
	int32 i;


	if (m_bCollisionsInQueue < NUMAUDIOCOLLISIONS)
		collisionsIndex = m_bCollisionsInQueue++;
	else {
		collisionsIndex = m_bIndicesTable[NUMAUDIOCOLLISIONS - 1];
		if (m_sQueue.m_fDistance >= m_asCollisions1[collisionsIndex].m_fDistance) return;
	}

	m_asCollisions1[collisionsIndex] = m_sQueue;

	i = 0;
	if(collisionsIndex) {
		while(m_asCollisions1[m_bIndicesTable[i]].m_fDistance <= m_asCollisions1[collisionsIndex].m_fDistance) {
			if(++i >= collisionsIndex) {
				m_bIndicesTable[i] = collisionsIndex;
				return;
			}
		}
		memmove(&m_bIndicesTable[i + 1], &m_bIndicesTable[i], NUMAUDIOCOLLISIONS - 1 - i);
	}
	m_bIndicesTable[i] = collisionsIndex;
}

Sergeanur's avatar
Sergeanur включено в состав коммита
77
78
void
cAudioManager::ServiceCollisions()
aap's avatar
aap включено в состав коммита
79
{
Sergeanur's avatar
Sergeanur включено в состав коммита
80
81
82
	int i, j;
	bool8 abRepeatedCollision1[NUMAUDIOCOLLISIONS];
	bool8 abRepeatedCollision2[NUMAUDIOCOLLISIONS];
aap's avatar
aap включено в состав коммита
83

Sergeanur's avatar
Sergeanur включено в состав коммита
84
	m_sQueueSample.m_nEntityIndex = m_nCollisionEntity;
aap's avatar
aap включено в состав коммита
85

Sergeanur's avatar
Sergeanur включено в состав коммита
86
87
	for (int i = 0; i < NUMAUDIOCOLLISIONS; i++)
		abRepeatedCollision1[i] = abRepeatedCollision2[i] = FALSE;
aap's avatar
aap включено в состав коммита
88

Sergeanur's avatar
Sergeanur включено в состав коммита
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
	for (i = 0; i < m_sCollisionManager.m_bCollisionsInQueue; i++) {
		for (j = 0; j < NUMAUDIOCOLLISIONS; j++) {
			int index = m_sCollisionManager.m_bIndicesTable[i];
			if ((m_sCollisionManager.m_asCollisions1[index].m_pEntity1 == m_sCollisionManager.m_asCollisions2[j].m_pEntity1)
				&& (m_sCollisionManager.m_asCollisions1[index].m_pEntity2 == m_sCollisionManager.m_asCollisions2[j].m_pEntity2)
				&& (m_sCollisionManager.m_asCollisions1[index].m_bSurface1 == m_sCollisionManager.m_asCollisions2[j].m_bSurface1)
				&& (m_sCollisionManager.m_asCollisions1[index].m_bSurface2 == m_sCollisionManager.m_asCollisions2[j].m_bSurface2)
				) {
				abRepeatedCollision1[index] = TRUE;
				abRepeatedCollision2[j] = TRUE;
				m_sCollisionManager.m_asCollisions1[index].m_nBaseVolume = ++m_sCollisionManager.m_asCollisions2[j].m_nBaseVolume;
				SetUpLoopingCollisionSound(m_sCollisionManager.m_asCollisions1[index], j);
				break;
			}
		}
	}
aap's avatar
aap включено в состав коммита
105

Sergeanur's avatar
Sergeanur включено в состав коммита
106
107
108
109
110
111
112
113
114
115
116
	for (i = 0; i < NUMAUDIOCOLLISIONS; i++) {
		if (!abRepeatedCollision2[i]) {
			m_sCollisionManager.m_asCollisions2[i].m_pEntity1 = nil;
			m_sCollisionManager.m_asCollisions2[i].m_pEntity2 = nil;
			m_sCollisionManager.m_asCollisions2[i].m_bSurface1 = SURFACE_DEFAULT;
			m_sCollisionManager.m_asCollisions2[i].m_bSurface2 = SURFACE_DEFAULT;
			m_sCollisionManager.m_asCollisions2[i].m_fIntensity2 = 0.0f;
			m_sCollisionManager.m_asCollisions2[i].m_fIntensity1 = 0.0f;
			m_sCollisionManager.m_asCollisions2[i].m_vecPosition = CVector(0.0f, 0.0f, 0.0f);
			m_sCollisionManager.m_asCollisions2[i].m_fDistance = 0.0f;
		}
aap's avatar
aap включено в состав коммита
117
118
	}

Sergeanur's avatar
Sergeanur включено в состав коммита
119
120
121
122
123
124
125
126
127
128
129
130
	for (i = 0; i < m_sCollisionManager.m_bCollisionsInQueue; i++) {
		int index = m_sCollisionManager.m_bIndicesTable[i];
		if (!abRepeatedCollision1[index]) {
			for (j = 0; j < NUMAUDIOCOLLISIONS; j++) {
				if (!abRepeatedCollision2[j]) {
					m_sCollisionManager.m_asCollisions2[j].m_nBaseVolume = 1;
					m_sCollisionManager.m_asCollisions2[j].m_pEntity1 = m_sCollisionManager.m_asCollisions1[index].m_pEntity1;
					m_sCollisionManager.m_asCollisions2[j].m_pEntity2 = m_sCollisionManager.m_asCollisions1[index].m_pEntity2;
					m_sCollisionManager.m_asCollisions2[j].m_bSurface1 = m_sCollisionManager.m_asCollisions1[index].m_bSurface1;
					m_sCollisionManager.m_asCollisions2[j].m_bSurface2 = m_sCollisionManager.m_asCollisions1[index].m_bSurface2;
					break;
				}
aap's avatar
aap включено в состав коммита
131
			}
Sergeanur's avatar
Sergeanur включено в состав коммита
132
133
			SetUpOneShotCollisionSound(m_sCollisionManager.m_asCollisions1[index]);
			SetUpLoopingCollisionSound(m_sCollisionManager.m_asCollisions1[index], j);
aap's avatar
aap включено в состав коммита
134
135
		}
	}
Sergeanur's avatar
Sergeanur включено в состав коммита
136
137
138
139

	for (int i = 0; i < NUMAUDIOCOLLISIONS; i++)
		m_sCollisionManager.m_bIndicesTable[i] = NUMAUDIOCOLLISIONS;
	m_sCollisionManager.m_bCollisionsInQueue = 0;
aap's avatar
aap включено в состав коммита
140
}
Sergeanur's avatar
Sergeanur включено в состав коммита
141

Sergeanur's avatar
Sergeanur включено в состав коммита
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
static const int32 gOneShotCol[] = {SFX_COL_TARMAC_1,
                                    SFX_COL_TARMAC_1,
                                    SFX_COL_GRASS_1,
                                    SFX_COL_GRAVEL_1,
                                    SFX_COL_MUD_1,
                                    SFX_COL_TARMAC_1,
                                    SFX_COL_CAR_1,
                                    SFX_COL_GRASS_1,
                                    SFX_COL_SCAFFOLD_POLE_1,
                                    SFX_COL_GARAGE_DOOR_1,
                                    SFX_COL_CAR_PANEL_1,
                                    SFX_COL_THICK_METAL_PLATE_1,
                                    SFX_COL_SCAFFOLD_POLE_1,
                                    SFX_COL_LAMP_POST_1,
                                    SFX_COL_HYDRANT_1,
                                    SFX_COL_HYDRANT_1,
                                    SFX_COL_METAL_CHAIN_FENCE_1,
                                    SFX_COL_PED_1,
                                    SFX_COL_SAND_1,
                                    SFX_SPLASH_1,
                                    SFX_COL_WOOD_CRATES_1,
                                    SFX_COL_WOOD_BENCH_1,
                                    SFX_COL_WOOD_SOLID_1,
                                    SFX_COL_GRASS_1,
                                    SFX_COL_GRASS_1,
                                    SFX_COL_VEG_1,
                                    SFX_COL_TARMAC_1,
                                    SFX_COL_CONTAINER_1,
                                    SFX_COL_NEWS_VENDOR_1,
                                    SFX_TYRE_BUMP,
                                    SFX_COL_CARDBOARD_1,
                                    SFX_COL_TARMAC_1,
                                    SFX_COL_GATE};
aap's avatar
aap включено в состав коммита
175
176

void
Sergeanur's avatar
Sergeanur включено в состав коммита
177
cAudioManager::SetUpOneShotCollisionSound(const cAudioCollision &col)
aap's avatar
aap включено в состав коммита
178
{
Sergeanur's avatar
Sergeanur включено в состав коммита
179
180
	uint16 s1;
	uint16 s2;
aap's avatar
aap включено в состав коммита
181
182
183
184
185
186
187
188

	int32 emittingVol;
	float ratio;

	static uint16 counter = 28;

	for(int32 i = 0; i < 2; i++) {
		if(i) {
Sergeanur's avatar
Sergeanur включено в состав коммита
189
190
			s1 = col.m_bSurface2;
			s2 = col.m_bSurface1;
aap's avatar
aap включено в состав коммита
191
		} else {
Sergeanur's avatar
Sergeanur включено в состав коммита
192
193
			s1 = col.m_bSurface1;
			s2 = col.m_bSurface2;
aap's avatar
aap включено в состав коммита
194
		}
Sergeanur's avatar
Sergeanur включено в состав коммита
195
		ratio = GetCollisionOneShotRatio(s1, col.m_fIntensity1);
aap's avatar
aap включено в состав коммита
196
197
198
		if(s1 == SURFACE_CAR && s2 == SURFACE_PED) ratio /= 4.0f;
		if(s1 == SURFACE_CAR && ratio < 0.6f) {
			s1 = SURFACE_CAR_PANEL;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
199
			ratio = Min(1.f, 2.f * ratio);
aap's avatar
aap включено в состав коммита
200
201
202
		}
		emittingVol = 40.f * ratio;
		if(emittingVol) {
Sergeanur's avatar
Sergeanur включено в состав коммита
203
			m_sQueueSample.m_fDistance = Sqrt(col.m_fDistance);
Sergeanur's avatar
Sergeanur включено в состав коммита
204
			m_sQueueSample.m_nVolume =
aap's avatar
aap включено в состав коммита
205
			    ComputeVolume(emittingVol, CollisionSoundIntensity, m_sQueueSample.m_fDistance);
Sergeanur's avatar
Sergeanur включено в состав коммита
206
			if(m_sQueueSample.m_nVolume > 0) {
aap's avatar
aap включено в состав коммита
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
				m_sQueueSample.m_nSampleIndex = gOneShotCol[s1];
				switch(m_sQueueSample.m_nSampleIndex) {
				case SFX_COL_TARMAC_1:
					m_sQueueSample.m_nSampleIndex += m_anRandomTable[3] % 5;
					break;
				case SFX_COL_CAR_PANEL_1:
					m_sQueueSample.m_nSampleIndex += m_anRandomTable[0] % 6;
					break;
				case SFX_COL_LAMP_POST_1:
					m_sQueueSample.m_nSampleIndex += m_anRandomTable[1] % 2;
					break;
				case SFX_COL_METAL_CHAIN_FENCE_1:
					m_sQueueSample.m_nSampleIndex += m_anRandomTable[3] % 4;
					break;
				case SFX_COL_PED_1:
					m_sQueueSample.m_nSampleIndex += m_anRandomTable[4] % 5;
					break;
				case SFX_COL_WOOD_CRATES_1:
					m_sQueueSample.m_nSampleIndex += m_anRandomTable[4] % 4;
					break;
				case SFX_COL_WOOD_BENCH_1:
					m_sQueueSample.m_nSampleIndex += m_anRandomTable[1] % 4;
					break;
				case SFX_COL_VEG_1:
					m_sQueueSample.m_nSampleIndex += m_anRandomTable[2] % 5;
					break;
				case SFX_COL_NEWS_VENDOR_1:
					m_sQueueSample.m_nSampleIndex += m_anRandomTable[2] % 3;
					break;
				case SFX_COL_CAR_1:
					m_sQueueSample.m_nSampleIndex += m_anRandomTable[1] % 5;
					break;
				case SFX_COL_CARDBOARD_1:
					m_sQueueSample.m_nSampleIndex += m_anRandomTable[3] % 2;
					break;
				default: break;
				}
				switch(s1) {
				case SURFACE_GLASS: m_sQueueSample.m_nFrequency = 13500; break;
aap's avatar
aap включено в состав коммита
246
247
				case SURFACE_GIRDER: m_sQueueSample.m_nFrequency = 8819; break;
				case SURFACE_WATER:
aap's avatar
aap включено в состав коммита
248
249
250
					m_sQueueSample.m_nFrequency =
					    2 * SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex);
					break;
aap's avatar
aap включено в состав коммита
251
252
				case SURFACE_RUBBER: m_sQueueSample.m_nFrequency = 6000; break;
				case SURFACE_PLASTIC: m_sQueueSample.m_nFrequency = 8000; break;
aap's avatar
aap включено в состав коммита
253
254
255
256
257
258
				default:
					m_sQueueSample.m_nFrequency =
					    SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex);
					break;
				}
				m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency / 16);
Filip Gawin's avatar
Filip Gawin включено в состав коммита
259
				m_sQueueSample.m_nCounter = counter++;
aap's avatar
aap включено в состав коммита
260
				if(counter >= 255) counter = 28;
Sergeanur's avatar
Sergeanur включено в состав коммита
261
				m_sQueueSample.m_vecPos = col.m_vecPosition;
Sergeanur's avatar
Sergeanur включено в состав коммита
262
				m_sQueueSample.m_nBankIndex = SFX_BANK_0;
Sergeanur's avatar
Sergeanur включено в состав коммита
263
				m_sQueueSample.m_bIs2D = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
264
				m_sQueueSample.m_nPriority = 11;
aap's avatar
aap включено в состав коммита
265
				m_sQueueSample.m_nLoopCount = 1;
Sergeanur's avatar
Sergeanur включено в состав коммита
266
				SET_EMITTING_VOLUME(emittingVol);
Sergeanur's avatar
Sergeanur включено в состав коммита
267
				RESET_LOOP_OFFSETS
aap's avatar
aap включено в состав коммита
268
				m_sQueueSample.m_fSpeedMultiplier = 4.0f;
Sergeanur's avatar
Sergeanur включено в состав коммита
269
270
271
				m_sQueueSample.m_MaxDistance = CollisionSoundIntensity;
				m_sQueueSample.m_bStatic = TRUE;
				m_sQueueSample.m_bReverb = TRUE;
Sergeanur's avatar
Sergeanur включено в состав коммита
272
				SET_SOUND_REFLECTION(FALSE);
aap's avatar
aap включено в состав коммита
273
274
275
276
277
278
279
				AddSampleToRequestedQueue();
			}
		}
	}
}

void
Sergeanur's avatar
Sergeanur включено в состав коммита
280
cAudioManager::SetUpLoopingCollisionSound(const cAudioCollision &col, uint8 counter)
aap's avatar
aap включено в состав коммита
281
{
Sergeanur's avatar
Sergeanur включено в состав коммита
282
283
284
285
286
287
	if(col.m_fIntensity2 > 0.0016f) {
		uint8 emittingVol = SetLoopingCollisionRequestedSfxFreqAndGetVol(col);
		if(emittingVol) {
			m_sQueueSample.m_fDistance = Sqrt(col.m_fDistance);
			m_sQueueSample.m_nVolume =
			    ComputeVolume(emittingVol, CollisionSoundIntensity, m_sQueueSample.m_fDistance);
Sergeanur's avatar
Sergeanur включено в состав коммита
288
			if(m_sQueueSample.m_nVolume > 0) {
Sergeanur's avatar
Sergeanur включено в состав коммита
289
290
291
292
				m_sQueueSample.m_nCounter = counter;
				m_sQueueSample.m_vecPos = col.m_vecPosition;
				m_sQueueSample.m_nBankIndex = SFX_BANK_0;
				m_sQueueSample.m_bIs2D = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
293
				m_sQueueSample.m_nPriority = 7;
Sergeanur's avatar
Sergeanur включено в состав коммита
294
				m_sQueueSample.m_nLoopCount = 0;
Sergeanur's avatar
Sergeanur включено в состав коммита
295
				SET_EMITTING_VOLUME(emittingVol);
Sergeanur's avatar
Sergeanur включено в состав коммита
296
297
				SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex);
				m_sQueueSample.m_fSpeedMultiplier = 4.0f;
Sergeanur's avatar
Sergeanur включено в состав коммита
298
299
300
301
				m_sQueueSample.m_MaxDistance = CollisionSoundIntensity;
				m_sQueueSample.m_bStatic = FALSE;
				m_sQueueSample.m_nFramesToPlay = 5;
				m_sQueueSample.m_bReverb = TRUE;
Sergeanur's avatar
Sergeanur включено в состав коммита
302
				SET_SOUND_REFLECTION(FALSE);
Sergeanur's avatar
Sergeanur включено в состав коммита
303
				AddSampleToRequestedQueue();
aap's avatar
aap включено в состав коммита
304
305
306
			}
		}
	}
Sergeanur's avatar
Sergeanur включено в состав коммита
307
}
aap's avatar
aap включено в состав коммита
308

Sergeanur's avatar
Sergeanur включено в состав коммита
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
uint32
cAudioManager::SetLoopingCollisionRequestedSfxFreqAndGetVol(const cAudioCollision &audioCollision)
{
	uint8 surface1 = audioCollision.m_bSurface1;
	uint8 surface2 = audioCollision.m_bSurface2;
	int32 vol;
	float ratio;

	if(surface1 == SURFACE_GRASS || surface2 == SURFACE_GRASS || surface1 == SURFACE_HEDGE ||
	   surface2 == SURFACE_HEDGE) {
		ratio = GetCollisionRatio(audioCollision.m_fIntensity2, 0.0001f, 0.09f, 0.0899f);
		m_sQueueSample.m_nSampleIndex = SFX_RAIN;
		m_sQueueSample.m_nFrequency = 13000.f * ratio + 35000;
		vol = 50.f * ratio;
	} else if(surface1 == SURFACE_WATER || surface2 == SURFACE_WATER) {
		ratio = GetCollisionRatio(audioCollision.m_fIntensity2, 0.0001f, 0.09f, 0.0899f);
		m_sQueueSample.m_nSampleIndex = SFX_BOAT_WATER_LOOP;
		m_sQueueSample.m_nFrequency = 6050.f * ratio + 16000;
		vol = 30.f * ratio;
	} else if(surface1 == SURFACE_GRAVEL || surface2 == SURFACE_GRAVEL || surface1 == SURFACE_MUD_DRY ||
		surface2 == SURFACE_MUD_DRY || surface1 == SURFACE_SAND || surface2 == SURFACE_SAND) {
		ratio = GetCollisionRatio(audioCollision.m_fIntensity2, 0.0001f, 0.09f, 0.0899f);
		m_sQueueSample.m_nSampleIndex = SFX_GRAVEL_SKID;
		m_sQueueSample.m_nFrequency = 6000.f * ratio + 10000;
		vol = 50.f * ratio;
	} else if(surface1 == SURFACE_PED || surface2 == SURFACE_PED) {
		return 0;
	} else {
		ratio = GetCollisionRatio(audioCollision.m_fIntensity2, 0.0001f, 0.09f, 0.0899f);
		m_sQueueSample.m_nSampleIndex = SFX_SCRAPE_CAR_1;
		m_sQueueSample.m_nFrequency = 10000.f * ratio + 10000;
		vol = 40.f * ratio;
aap's avatar
aap включено в состав коммита
341
	}
Sergeanur's avatar
Sergeanur включено в состав коммита
342
343
344
	if(audioCollision.m_nBaseVolume < 2) vol = audioCollision.m_nBaseVolume * vol / 2;
	return vol;
}
aap's avatar
aap включено в состав коммита
345

Sergeanur's avatar
Sergeanur включено в состав коммита
346
347
348
349
350
351
352
353
354
355
float
cAudioManager::GetCollisionOneShotRatio(uint32 a, float b)
{
	switch(a) {
	case SURFACE_DEFAULT:
	case SURFACE_TARMAC:
	case SURFACE_PAVEMENT:
	case SURFACE_STEEP_CLIFF:
	case SURFACE_TRANSPARENT_STONE: return GetCollisionRatio(b, 10.f, 60.f, 50.f);
	case SURFACE_GRASS:
Sergeanur's avatar
Sergeanur включено в состав коммита
356
357
	case SURFACE_CARDBOARDBOX:
	case SURFACE_GRAVEL:
Sergeanur's avatar
Sergeanur включено в состав коммита
358
359
	case SURFACE_MUD_DRY: return GetCollisionRatio(b, 0.f, 2.f, 2.f);
	case SURFACE_CAR: return GetCollisionRatio(b, 6.f, 50.f, 44.f);
Sergeanur's avatar
Sergeanur включено в состав коммита
360
361
	case SURFACE_GLASS:
	case SURFACE_METAL_CHAIN_FENCE: return GetCollisionRatio(b, 0.1f, 10.f, 9.9f);
Sergeanur's avatar
Sergeanur включено в состав коммита
362
363
364
365
366
	case SURFACE_TRANSPARENT_CLOTH:
	case SURFACE_THICK_METAL_PLATE: return GetCollisionRatio(b, 30.f, 130.f, 100.f);
	case SURFACE_GARAGE_DOOR: return GetCollisionRatio(b, 20.f, 100.f, 80.f);
	case SURFACE_CAR_PANEL: return GetCollisionRatio(b, 0.f, 4.f, 4.f);
	case SURFACE_SCAFFOLD_POLE:
Sergeanur's avatar
Sergeanur включено в состав коммита
367
	case SURFACE_METAL_GATE:
Sergeanur's avatar
Sergeanur включено в состав коммита
368
369
370
371
	case SURFACE_LAMP_POST: return GetCollisionRatio(b, 1.f, 10.f, 9.f);
	case SURFACE_FIRE_HYDRANT: return GetCollisionRatio(b, 1.f, 15.f, 14.f);
	case SURFACE_GIRDER: return GetCollisionRatio(b, 8.f, 50.f, 42.f);
	case SURFACE_PED: return GetCollisionRatio(b, 0.f, 20.f, 20.f);
Sergeanur's avatar
Sergeanur включено в состав коммита
372
373
374
375
	case SURFACE_SAND:
	case SURFACE_WATER:
	case SURFACE_RUBBER:
	case SURFACE_WHEELBASE: return GetCollisionRatio(b, 0.f, 10.f, 10.f);
Sergeanur's avatar
Sergeanur включено в состав коммита
376
377
378
379
380
381
382
	case SURFACE_WOOD_CRATES: return GetCollisionRatio(b, 1.f, 4.f, 3.f);
	case SURFACE_WOOD_BENCH: return GetCollisionRatio(b, 0.1f, 5.f, 4.9f);
	case SURFACE_WOOD_SOLID: return GetCollisionRatio(b, 0.1f, 40.f, 39.9f);
	case SURFACE_PLASTIC: return GetCollisionRatio(b, 0.1f, 4.f, 3.9f);
	case SURFACE_HEDGE: return GetCollisionRatio(b, 0.f, 0.5f, 0.5f);
	case SURFACE_CONTAINER: return GetCollisionRatio(b, 4.f, 40.f, 36.f);
	case SURFACE_NEWS_VENDOR: return GetCollisionRatio(b, 0.f, 5.f, 5.f);
Sergeanur's avatar
Sergeanur включено в состав коммита
383
	default: break;
aap's avatar
aap включено в состав коммита
384
385
	}

Sergeanur's avatar
Sergeanur включено в состав коммита
386
	return 0.f;
aap's avatar
aap включено в состав коммита
387
388
}

Sergeanur's avatar
Sergeanur включено в состав коммита
389
390
float
cAudioManager::GetCollisionLoopingRatio(uint32 a, uint32 b, float c)
aap's avatar
aap включено в состав коммита
391
{
Sergeanur's avatar
Sergeanur включено в состав коммита
392
393
	return GetCollisionRatio(c, 0.0f, 0.02f, 0.02f);
}
aap's avatar
aap включено в состав коммита
394

Sergeanur's avatar
Sergeanur включено в состав коммита
395
396
397
398
399
400
401
402
float
cAudioManager::GetCollisionRatio(float a, float b, float c, float d)
{
	float e;
	e = a;
	if(a <= b) return 0.0f;
	if(c <= a) e = c;
	return (e - b) / d;
aap's avatar
aap включено в состав коммита
403
}