Mission3DSound.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. //===========================================================================================================================
  2. // Spirenkov Maxim, 2004
  3. //===========================================================================================================================
  4. // Mission objects
  5. //===========================================================================================================================
  6. // Mission3DSound
  7. //===========================================================================================================================
  8. #include "Mission3DSound.h"
  9. //============================================================================================
  10. //Mission3DSound
  11. //============================================================================================
  12. Mission3DSound::Mission3DSound()
  13. {
  14. model = null;
  15. }
  16. Mission3DSound::~Mission3DSound()
  17. {
  18. if(model) model->Release();
  19. }
  20. //============================================================================================
  21. //Инициализировать объект
  22. bool Mission3DSound::Create(MOPReader & reader)
  23. {
  24. position = reader.Position();
  25. return CreateSounds(reader, &position);
  26. }
  27. //Получить матрицу объекта
  28. Matrix & Mission3DSound::GetMatrix(Matrix & mtx)
  29. {
  30. mtx.SetIdentity().pos = position;
  31. return mtx;
  32. }
  33. //Обработчик команд для объекта
  34. void Mission3DSound::Command(const char * id, dword numParams, const char ** params)
  35. {
  36. if(string::IsEqual(id, "volume"))
  37. {
  38. if(numParams >= 1)
  39. {
  40. char * endPtr = null;
  41. float vol = (float)strtod(params[0], &endPtr);
  42. UpdateVolumes(Clampf(vol));
  43. }else{
  44. LogicDebugError("Can't set new sound volume. Not enought params.");
  45. }
  46. }else{
  47. LogicDebugError("Unknown command: \"%s\"", id);
  48. }
  49. }
  50. //Инициализировать объект
  51. bool Mission3DSound::EditMode_Create(MOPReader & reader)
  52. {
  53. //Создаём модельку
  54. angle = 0.0f;
  55. model = Geometry().CreateGMX("editor\\sound3d.gmx", &Animation(), &Particles(), &Sound());
  56. SetUpdate(&Mission3DSound::EditModeDraw, ML_GEOMETRY5);
  57. Create(reader);
  58. return true;
  59. }
  60. //Обновить параметры
  61. bool Mission3DSound::EditMode_Update(MOPReader & reader)
  62. {
  63. Create(reader);
  64. return true;
  65. }
  66. //Получить размеры описывающего ящика
  67. void Mission3DSound::EditMode_GetSelectBox(Vector & min, Vector & max)
  68. {
  69. if(model)
  70. {
  71. Vector c = (model->GetLocalBound().vMin + model->GetLocalBound().vMax)*0.5f;
  72. Vector s = (model->GetLocalBound().vMax - model->GetLocalBound().vMin)*0.5f;
  73. s.x = s.z = coremax(s.x, s.z);
  74. min = c - s;
  75. max = c + s;
  76. return;
  77. }
  78. min = -0.2f;
  79. max = 0.2f;
  80. }
  81. //Рисование модельки в режиме редактирования
  82. void _cdecl Mission3DSound::EditModeDraw(float dltTime, long level)
  83. {
  84. Matrix mtx;
  85. if(model)
  86. {
  87. angle += dltTime*0.5f;
  88. if(angle > 2.0f*PI) angle -= 2.0f*PI;
  89. model->SetTransform(mtx.Build(Vector(0.0f, angle, 0.0f), position));
  90. model->Draw();
  91. }else Render().DrawSphere(GetMatrix(mtx).pos, 0.1f, 0xff707080);
  92. }
  93. //============================================================================================
  94. //Параметры инициализации
  95. //============================================================================================
  96. MOP_BEGINLISTCG(Mission3DSound, "3D sound", '1.00', 100, "Position sound\nCommands: volume (0..1)", "Effects")
  97. MOP_POSITION("Position", Vector(0.0f))
  98. MISSION_SOUND_PARAMS
  99. MOP_ENDLIST(Mission3DSound)