| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- #include "MissionRandomSound.h"
- MissionRandomSound::MissionRandomSound() : volumes(_FL_)
- {
- }
- MissionRandomSound::~MissionRandomSound()
- {
- }
- //Инициализировать объект
- bool MissionRandomSound::Create(MOPReader & reader)
- {
- volumes.DelAll();
- volumes.AddElements(reader.Array());
- for(long i = 0; i < volumes; i++)
- {
- Vector pos = reader.Position();
- Vector ang = reader.Angles();
- volumes[i].mtx.Build(ang, pos);
- volumes[i].size = reader.Position();
- }
- return CreateSounds(reader, &Vector(0.0f));
- }
- //Инициализировать объект
- bool MissionRandomSound::EditMode_Create(MOPReader & reader)
- {
- SetUpdate(&MissionRandomSound::EditModeDraw, ML_GEOMETRY5);
- Create(reader);
- return true;
- }
- //Обновить параметры
- bool MissionRandomSound::EditMode_Update(MOPReader & reader)
- {
- Create(reader);
- return true;
- }
- //Рисование модельки в режиме редактирования
- void _cdecl MissionRandomSound::EditModeDraw(float dltTime, long level)
- {
- if(!EditMode_IsSelect()) return;
- if(!Mission().EditMode_IsAdditionalDraw()) return;
- for(long i = 0; i < volumes; i++)
- {
- SoundVolume & sv = volumes[i];
- Render().DrawBox(-sv.size, sv.size, sv.mtx, 0xff00ffff);
- }
- for(long i = 0; i < sounds; i++)
- {
- SoundElement & se = sounds[i];
- if(!se.sound) continue;
- if(se.states & s_stoped) continue;
- if(!se.sound->IsPlay()) continue;
- Render().DrawSphere(((ISound3D *)se.sound)->GetPosition(), 0.7f, 0xff0000ff);
- }
- }
- //Работа
- void _cdecl MissionRandomSound::Work(float dltTime, long level)
- {
- if(EditMode_IsOn() && !EditMode_IsSelect())
- {
- return;
- }
- for(long i = 0; i < sounds; i++)
- {
- SoundElement & se = sounds[i];
- if(!se.sound) continue;
- if(se.states & s_stoped) continue;
- if(se.sound->IsPlay()) continue;
- se.waitTime -= dltTime;
- if(se.waitTime > 0.0f) continue;
- if((se.states & s_periodical) == 0)
- {
- se.states |= s_stoped;
- }
- se.waitTime = se.minTime + Rnd(se.maxTime - se.minTime);
- ((ISound3D *)se.sound)->SetPosition(GetRandomPosition());
- se.sound->Play();
- }
- }
- //Найти произвольную позицию
- inline Vector MissionRandomSound::GetRandomPosition()
- {
- long index = (long)Rnd((float)volumes.Size());
- if(index >= volumes) index = volumes - 1;
- SoundVolume & sv = volumes[index];
- return sv.mtx*Vector().Rand(-sv.size, sv.size);
- }
- //============================================================================================
- //Параметры инициализации
- //============================================================================================
- MOP_BEGINLISTCG(MissionRandomSound, "Random sound", '1.00', 100, "Sound play at random positions", "Effects")
- MOP_ARRAYBEG("Boxes", 1, 100)
- MOP_POSITION("Position", Vector(0.0f))
- MOP_ANGLES("Angles", Vector(0.0f))
- MOP_POSITIONEX("Size", Vector(1.0f), Vector(0.0f), Vector(1000.0f))
- MOP_ARRAYEND
- MISSION_SOUND_PARAMS
- MOP_ENDLIST(MissionRandomSound)
|