DataColor.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #ifndef _PARTICLE_DATA_COLOR_H_
  2. #define _PARTICLE_DATA_COLOR_H_
  3. #include <string.h>
  4. #include <stdarg.h>
  5. #include <stdio.h>
  6. #include "../../../common_h/core.h"
  7. #include "../../../common_h/templates.h"
  8. #include "..\..\icommon\memfile.h"
  9. #include "..\..\icommon\colorvertex.h"
  10. class FieldList;
  11. class TextFile;
  12. #ifndef _XBOX
  13. class TiXmlElement;
  14. #endif
  15. class DataColor
  16. {
  17. FieldList* Master;
  18. const char* szName;
  19. const char* szEditorName;
  20. const Color ZeroColor;
  21. array<ColorVertex> ColorGraph;
  22. Color MaxVal;
  23. Color MinVal;
  24. Color Result;
  25. public:
  26. //конструктор/деструктор
  27. DataColor (FieldList* pMaster);
  28. virtual ~DataColor ();
  29. //Получить значение (Текущее время, Общее время жизни, Коэфицент рандома[0..1])
  30. //Color GetValue (float Time, float LifeTime, float K_rand);
  31. //Получить значение (Текущее время, Общее время жизни, Коэфицент рандома[0..1])
  32. __forceinline Color GetValue (float Time, float LifeTime, float K_rand)
  33. {
  34. //Время у графика цвета всегда относительное...
  35. Time = (Time / LifeTime);
  36. DWORD Count = ColorGraph.Size();
  37. DWORD StartIndex = 0;
  38. for (DWORD n = StartIndex; n < (Count-1); n++)
  39. {
  40. float FromTime = ColorGraph[n].Time;
  41. float ToTime = ColorGraph[n+1].Time;
  42. //Если время в нужном диапазоне...
  43. if ((Time >= FromTime) && (Time <= ToTime))
  44. {
  45. float SegmentDeltaTime = ColorGraph[n+1].Time - ColorGraph[n].Time;
  46. float ValueDeltaTime = Time - ColorGraph[n].Time;
  47. float blend_k = 0.0f;
  48. if (SegmentDeltaTime > 0.001f) blend_k = ValueDeltaTime / SegmentDeltaTime;
  49. const Color & ValueFirstMax = ColorGraph[n].MaxValue;
  50. const Color & ValueSecondMax = ColorGraph[n+1].MaxValue;
  51. const Color & ValueFirstMin = ColorGraph[n].MinValue;
  52. const Color & ValueSecondMin = ColorGraph[n+1].MinValue;
  53. MaxVal.Lerp(ValueFirstMax, ValueSecondMax, blend_k);
  54. MinVal.Lerp(ValueFirstMin, ValueSecondMin, blend_k);
  55. Result.Lerp(MinVal, MaxVal, K_rand);
  56. return Result;
  57. }
  58. }
  59. return ZeroColor;
  60. }
  61. //Устанавливает "значение по умолчанию"
  62. //два индекса, Min=Max=Value
  63. void SetDefaultValue (const Color& Value);
  64. //Установить значения
  65. void SetValues (const ColorVertex* Values, DWORD Count);
  66. //Получить кол-во значений
  67. DWORD GetValuesCount ();
  68. //Получить мин. значение (по индексу)
  69. const Color& GetMinValue (DWORD Index);
  70. //Получить макс. значение (по индексу)
  71. const Color& GetMaxValue (DWORD Index);
  72. void Load (MemFile* File);
  73. void Write (MemFile* File);
  74. #ifndef _XBOX
  75. void LoadXML (TiXmlElement* root);
  76. void WriteXML (TextFile* xmlFile, dword level);
  77. #endif
  78. void SetName (const char* szName, const char* szEditorName);
  79. const char* GetEditorName ();
  80. const char* GetName ();
  81. const ColorVertex& GetByIndex (DWORD Index);
  82. };
  83. #endif