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
#include "DMAudio.h"
#include "Entity.h"
#include "AudioCollision.h"
#include "AudioManager.h"
#include "AudioSamples.h"
#include "SurfaceTable.h"
#include "sampman.h"

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

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

Sergeanur's avatar
Sergeanur включено в состав коммита
23
24
25
26
27
28
29
30
31
32
	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);
Sergeanur's avatar
Sergeanur включено в состав коммита
33
	if(distSquared < SQR(COLLISION_MAX_DIST)) {
Sergeanur's avatar
Sergeanur включено в состав коммита
34
35
36
37
38
39
40
41
42
43
		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 включено в состав коммита
44
45
}

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


	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 включено в состав коммита
75
76
void
cAudioManager::ServiceCollisions()
aap's avatar
aap включено в состав коммита
77
{
Sergeanur's avatar
Sergeanur включено в состав коммита
78
79
80
	int i, j;
	bool8 abRepeatedCollision1[NUMAUDIOCOLLISIONS];
	bool8 abRepeatedCollision2[NUMAUDIOCOLLISIONS];
aap's avatar
aap включено в состав коммита
81

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

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

Sergeanur's avatar
Sergeanur включено в состав коммита
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
	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 включено в состав коммита
103

Sergeanur's avatar
Sergeanur включено в состав коммита
104
105
106
107
108
109
110
111
112
113
114
	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 включено в состав коммита
115
116
	}

Sergeanur's avatar
Sergeanur включено в состав коммита
117
118
119
120
121
122
123
124
125
126
127
128
	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 включено в состав коммита
129
			}
Sergeanur's avatar
Sergeanur включено в состав коммита
130
131
			SetUpOneShotCollisionSound(m_sCollisionManager.m_asCollisions1[index]);
			SetUpLoopingCollisionSound(m_sCollisionManager.m_asCollisions1[index], j);
aap's avatar
aap включено в состав коммита
132
133
		}
	}
Sergeanur's avatar
Sergeanur включено в состав коммита
134
135
136
137

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

Sergeanur's avatar
Sergeanur включено в состав коммита
140
static const uint32 gOneShotCol[] = {SFX_COL_TARMAC_1,
Sergeanur's avatar
Sergeanur включено в состав коммита
141
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
                                    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 включено в состав коммита
173
174

void
Sergeanur's avatar
Sergeanur включено в состав коммита
175
cAudioManager::SetUpOneShotCollisionSound(const cAudioCollision &col)
aap's avatar
aap включено в состав коммита
176
{
Sergeanur's avatar
Sergeanur включено в состав коммита
177
178
	uint16 s1;
	uint16 s2;
aap's avatar
aap включено в состав коммита
179

Sergeanur's avatar
Sergeanur включено в состав коммита
180
	uint32 emittingVol;
aap's avatar
aap включено в состав коммита
181
182
183
184
185
186
	float ratio;

	static uint16 counter = 28;

	for(int32 i = 0; i < 2; i++) {
		if(i) {
Sergeanur's avatar
Sergeanur включено в состав коммита
187
188
			s1 = col.m_bSurface2;
			s2 = col.m_bSurface1;
aap's avatar
aap включено в состав коммита
189
		} else {
Sergeanur's avatar
Sergeanur включено в состав коммита
190
191
			s1 = col.m_bSurface1;
			s2 = col.m_bSurface2;
aap's avatar
aap включено в состав коммита
192
		}
Sergeanur's avatar
Sergeanur включено в состав коммита
193
		ratio = GetCollisionOneShotRatio(s1, col.m_fIntensity1);
aap's avatar
aap включено в состав коммита
194
195
196
		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 включено в состав коммита
197
			ratio = Min(1.f, 2.f * ratio);
aap's avatar
aap включено в состав коммита
198
		}
Sergeanur's avatar
Sergeanur включено в состав коммита
199
		emittingVol = 40 * ratio;
aap's avatar
aap включено в состав коммита
200
		if(emittingVol) {
Sergeanur's avatar
Sergeanur включено в состав коммита
201
			m_sQueueSample.m_fDistance = Sqrt(col.m_fDistance);
Sergeanur's avatar
Sergeanur включено в состав коммита
202
			m_sQueueSample.m_nVolume =
Sergeanur's avatar
Sergeanur включено в состав коммита
203
			    ComputeVolume(emittingVol, COLLISION_MAX_DIST, m_sQueueSample.m_fDistance);
Sergeanur's avatar
Sergeanur включено в состав коммита
204
			if(m_sQueueSample.m_nVolume > 0) {
aap's avatar
aap включено в состав коммита
205
206
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
				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 включено в состав коммита
244
245
				case SURFACE_GIRDER: m_sQueueSample.m_nFrequency = 8819; break;
				case SURFACE_WATER:
aap's avatar
aap включено в состав коммита
246
247
248
					m_sQueueSample.m_nFrequency =
					    2 * SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex);
					break;
aap's avatar
aap включено в состав коммита
249
250
				case SURFACE_RUBBER: m_sQueueSample.m_nFrequency = 6000; break;
				case SURFACE_PLASTIC: m_sQueueSample.m_nFrequency = 8000; break;
aap's avatar
aap включено в состав коммита
251
252
253
254
255
256
				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 включено в состав коммита
257
				m_sQueueSample.m_nCounter = counter++;
aap's avatar
aap включено в состав коммита
258
				if(counter >= 255) counter = 28;
Sergeanur's avatar
Sergeanur включено в состав коммита
259
				m_sQueueSample.m_vecPos = col.m_vecPosition;
Sergeanur's avatar
Sergeanur включено в состав коммита
260
				m_sQueueSample.m_nBankIndex = SFX_BANK_0;
Sergeanur's avatar
Sergeanur включено в состав коммита
261
				m_sQueueSample.m_bIs2D = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
262
				m_sQueueSample.m_nPriority = 11;
aap's avatar
aap включено в состав коммита
263
				m_sQueueSample.m_nLoopCount = 1;
Sergeanur's avatar
Sergeanur включено в состав коммита
264
				SET_EMITTING_VOLUME(emittingVol);
Sergeanur's avatar
Sergeanur включено в состав коммита
265
				RESET_LOOP_OFFSETS
aap's avatar
aap включено в состав коммита
266
				m_sQueueSample.m_fSpeedMultiplier = 4.0f;
Sergeanur's avatar
Sergeanur включено в состав коммита
267
				m_sQueueSample.m_MaxDistance = COLLISION_MAX_DIST;
Sergeanur's avatar
Sergeanur включено в состав коммита
268
269
				m_sQueueSample.m_bStatic = TRUE;
				m_sQueueSample.m_bReverb = TRUE;
Sergeanur's avatar
Sergeanur включено в состав коммита
270
				SET_SOUND_REFLECTION(FALSE);
aap's avatar
aap включено в состав коммита
271
272
273
274
275
276
277
				AddSampleToRequestedQueue();
			}
		}
	}
}

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

Sergeanur's avatar
Sergeanur включено в состав коммита
307
308
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
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 включено в состав коммита
339
	}
Sergeanur's avatar
Sergeanur включено в состав коммита
340
341
342
	if(audioCollision.m_nBaseVolume < 2) vol = audioCollision.m_nBaseVolume * vol / 2;
	return vol;
}
aap's avatar
aap включено в состав коммита
343

Sergeanur's avatar
Sergeanur включено в состав коммита
344
345
346
347
348
349
350
351
352
353
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 включено в состав коммита
354
355
	case SURFACE_CARDBOARDBOX:
	case SURFACE_GRAVEL:
Sergeanur's avatar
Sergeanur включено в состав коммита
356
357
	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 включено в состав коммита
358
359
	case SURFACE_GLASS:
	case SURFACE_METAL_CHAIN_FENCE: return GetCollisionRatio(b, 0.1f, 10.f, 9.9f);
Sergeanur's avatar
Sergeanur включено в состав коммита
360
361
362
363
364
	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 включено в состав коммита
365
	case SURFACE_METAL_GATE:
Sergeanur's avatar
Sergeanur включено в состав коммита
366
367
368
369
	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 включено в состав коммита
370
371
372
373
	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 включено в состав коммита
374
375
376
377
378
379
380
	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 включено в состав коммита
381
	default: break;
aap's avatar
aap включено в состав коммита
382
383
	}

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

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

Sergeanur's avatar
Sergeanur включено в состав коммита
393
394
395
396
397
398
399
400
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 включено в состав коммита
401
}