SwingMachine.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. //===========================================================================================================================
  2. // Spirenkov Maxim, 2003
  3. //===========================================================================================================================//
  4. // Mission objects
  5. //===========================================================================================================================
  6. // SwingMachine
  7. //============================================================================================
  8. #include "SwingMachine.h"
  9. //============================================================================================
  10. SwingMachine::SwingMachine()
  11. {
  12. angX = angZ = 0.0f;
  13. spdX = spdZ = 0.0f;
  14. ampX = ampZ = 0.0f;
  15. }
  16. SwingMachine::~SwingMachine()
  17. {
  18. IMission * mis = &Mission();
  19. if(mis) mis->SetSwingParams(Vector(0.0f));
  20. }
  21. //============================================================================================
  22. //Инициализировать объект
  23. bool SwingMachine::Create(MOPReader & reader)
  24. {
  25. spdX = reader.Float()*(PI/180.0f);
  26. spdZ = reader.Float()*(PI/180.0f);
  27. ampX = reader.Float()*(PI/180.0f);
  28. ampZ = reader.Float()*(PI/180.0f);
  29. matrix.pos = reader.Position();
  30. isGlobalSet = reader.Bool();
  31. Activate(reader.Bool());
  32. return true;
  33. }
  34. //Активировать/деактивировать объект
  35. void SwingMachine::Activate(bool isActive)
  36. {
  37. MissionObject::Activate(isActive);
  38. if(!EditMode_IsOn())
  39. {
  40. if(IsActive())
  41. {
  42. SetUpdate(&SwingMachine::Work, ML_SCENE_START - 1);
  43. }else{
  44. DelUpdate(&SwingMachine::Work);
  45. if(isGlobalSet)
  46. {
  47. Mission().SetSwingParams(Vector(0.0f));
  48. }else{
  49. matrix.SetIdentity3x3();
  50. }
  51. }
  52. }
  53. }
  54. void _cdecl SwingMachine::Work(float dltTime, long level)
  55. {
  56. angX += spdX*dltTime;
  57. angZ += spdZ*dltTime;
  58. if(angX > PI*2.0f) angX -= PI*2.0f;
  59. if(angZ > PI*2.0f) angZ -= PI*2.0f;
  60. Vector ang(ampX*sinf(angX), 0.0f, ampZ*sinf(angZ));
  61. if(isGlobalSet)
  62. {
  63. Mission().SetSwingParams(ang);
  64. }else{
  65. matrix.Build(ang, matrix.pos);
  66. }
  67. }
  68. //Получить матрицу объекта
  69. Matrix & SwingMachine::GetMatrix(Matrix & mtx)
  70. {
  71. if(isGlobalSet)
  72. {
  73. mtx.SetIdentity();
  74. return mtx;
  75. }
  76. return mtx = matrix;
  77. }
  78. //============================================================================================
  79. //Инициализировать объект
  80. bool SwingMachine::EditMode_Create(MOPReader & reader)
  81. {
  82. Create(reader);
  83. SetUpdate(&SwingMachine::EditMode_Work, ML_GEOMETRY1);
  84. return true;
  85. }
  86. //Инициализировать объект
  87. bool SwingMachine::EditMode_Update(MOPReader & reader)
  88. {
  89. Create(reader);
  90. return true;
  91. }
  92. void _cdecl SwingMachine::EditMode_Work(float dltTime, long level)
  93. {
  94. if(!EditMode_IsSelect())
  95. {
  96. Mission().SetSwingParams(Vector(0.0f));
  97. }else{
  98. Work(dltTime, level);
  99. }
  100. }
  101. //============================================================================================
  102. //Параметры инициализации
  103. //============================================================================================
  104. MOP_BEGINLISTCG(SwingMachine, "Swing machine", '1.00', 0x0, "Swing world", "Effects")
  105. MOP_FLOATEXC("Swing temp around X axis", 20.0f, 0.0f, 10000.0f, "Angle_X = Amplitude_X*sin(time*#bTemp_X@b), #bTemp_X@b in degrees per second")
  106. MOP_FLOATEXC("Swing temp around Z axis", 15.0f, 0.0f, 10000.0f, "Angle_Z = Amplitude_Z*sin(time*#bTemp_Z@b), #bTemp_Z@b in degrees per second")
  107. MOP_FLOATEXC("Swing amplitude by X axis", 2.0f, 0.0f, 10000.0f, "Angle_X = #bAmplitude_X@b*sin(time*temp), #bAmplitude_X@b in degrees")
  108. MOP_FLOATEXC("Swing amplitude by Z axis", 6.0f, 0.0f, 10000.0f, "Angle_Z = #bAmplitude_Z@b*sin(time*temp), #bAmplitude_Z@b in degrees")
  109. MOP_POSITIONC("Local position", Vector(0.0f), "Position for local mode");
  110. MOP_BOOLC("Global swing", true, "Swing all mission or just connection objects")
  111. MOP_BOOLC("Active", true, "Active object in start mission time")
  112. MOP_ENDLIST(SwingMachine)