Collection of DPF-based plugins for packaging
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

272 lines
7.0KB

  1. //
  2. // C++ Implementation: MilkdropPresetFactory
  3. //
  4. // Description:
  5. //
  6. //
  7. // Author: Carmelo Piccione <carmelo.piccione@gmail.com>, (C) 2008
  8. //
  9. // Copyright: See COPYING file that comes with this distribution
  10. //
  11. //
  12. //
  13. #include "MilkdropPresetFactory.hpp"
  14. #include "MilkdropPreset.hpp"
  15. #include "BuiltinFuncs.hpp"
  16. #include "Eval.hpp"
  17. #include "IdlePreset.hpp"
  18. #include "PresetFrameIO.hpp"
  19. MilkdropPresetFactory::MilkdropPresetFactory(int gx_, int gy_)
  20. : gx(gx_)
  21. , gy(gy_)
  22. , _presetOutputsCache(nullptr)
  23. {
  24. /* Initializes the builtin function database */
  25. BuiltinFuncs::init_builtin_func_db();
  26. /* Initializes all infix operators */
  27. Eval::init_infix_ops();
  28. }
  29. MilkdropPresetFactory::~MilkdropPresetFactory()
  30. {
  31. Eval::destroy_infix_ops();
  32. BuiltinFuncs::destroy_builtin_func_db();
  33. if (_presetOutputsCache)
  34. {
  35. delete (_presetOutputsCache);
  36. _presetOutputsCache = nullptr;
  37. }
  38. }
  39. /* Reinitializes the engine variables to a default (conservative and sane) value */
  40. void resetPresetOutputs(PresetOutputs* presetOutputs)
  41. {
  42. if (!presetOutputs)
  43. {
  44. return;
  45. }
  46. presetOutputs->zoom = 1.0;
  47. presetOutputs->zoomexp = 1.0;
  48. presetOutputs->rot = 0.0;
  49. presetOutputs->warp = 0.0;
  50. presetOutputs->sx = 1.0;
  51. presetOutputs->sy = 1.0;
  52. presetOutputs->dx = 0.0;
  53. presetOutputs->dy = 0.0;
  54. presetOutputs->cx = 0.5;
  55. presetOutputs->cy = 0.5;
  56. presetOutputs->screenDecay = .98;
  57. presetOutputs->wave.r = 1.0;
  58. presetOutputs->wave.g = 0.2;
  59. presetOutputs->wave.b = 0.0;
  60. presetOutputs->wave.x = 0.5;
  61. presetOutputs->wave.y = 0.5;
  62. presetOutputs->wave.mystery = 0.0;
  63. presetOutputs->border.outer_size = 0.0;
  64. presetOutputs->border.outer_r = 0.0;
  65. presetOutputs->border.outer_g = 0.0;
  66. presetOutputs->border.outer_b = 0.0;
  67. presetOutputs->border.outer_a = 0.0;
  68. presetOutputs->border.inner_size = 0.0;
  69. presetOutputs->border.inner_r = 0.0;
  70. presetOutputs->border.inner_g = 0.0;
  71. presetOutputs->border.inner_b = 0.0;
  72. presetOutputs->border.inner_a = 0.0;
  73. presetOutputs->mv.a = 0.0;
  74. presetOutputs->mv.r = 0.0;
  75. presetOutputs->mv.g = 0.0;
  76. presetOutputs->mv.b = 0.0;
  77. presetOutputs->mv.length = 1.0;
  78. presetOutputs->mv.x_num = 16.0;
  79. presetOutputs->mv.y_num = 12.0;
  80. presetOutputs->mv.x_offset = 0.02;
  81. presetOutputs->mv.y_offset = 0.02;
  82. /* PER_FRAME CONSTANTS END */
  83. presetOutputs->fRating = 0;
  84. presetOutputs->fGammaAdj = 1.0;
  85. presetOutputs->videoEcho.zoom = 1.0;
  86. presetOutputs->videoEcho.a = 0;
  87. presetOutputs->videoEcho.orientation = Normal;
  88. presetOutputs->wave.additive = false;
  89. presetOutputs->wave.dots = false;
  90. presetOutputs->wave.thick = false;
  91. presetOutputs->wave.modulateAlphaByVolume = 0;
  92. presetOutputs->wave.maximizeColors = 0;
  93. presetOutputs->textureWrap = 0;
  94. presetOutputs->bDarkenCenter = 0;
  95. presetOutputs->bRedBlueStereo = 0;
  96. presetOutputs->bBrighten = 0;
  97. presetOutputs->bDarken = 0;
  98. presetOutputs->bSolarize = 0;
  99. presetOutputs->bInvert = 0;
  100. presetOutputs->bMotionVectorsOn = 1;
  101. presetOutputs->wave.a = 1.0;
  102. presetOutputs->wave.scale = 1.0;
  103. presetOutputs->wave.smoothing = 0;
  104. presetOutputs->wave.mystery = 0;
  105. presetOutputs->wave.modOpacityEnd = 0;
  106. presetOutputs->wave.modOpacityStart = 0;
  107. presetOutputs->fWarpAnimSpeed = 0;
  108. presetOutputs->fWarpScale = 0;
  109. presetOutputs->fShader = 0;
  110. /* PER_PIXEL CONSTANT END */
  111. /* Q VARIABLES START */
  112. for (int i = 0; i < 32; i++)
  113. {
  114. presetOutputs->q[i] = 0;
  115. }
  116. // for ( std::vector<CustomWave*>::iterator pos = presetOutputs->customWaves.begin();
  117. // pos != presetOutputs->customWaves.end(); ++pos )
  118. // if ( *pos != 0 ) delete ( *pos );
  119. // for ( std::vector<CustomShape*>::iterator pos = presetOutputs->customShapes.begin();
  120. // pos != presetOutputs->customShapes.end(); ++pos )
  121. // if ( *pos != 0 ) delete ( *pos );
  122. presetOutputs->customWaves.clear();
  123. presetOutputs->customShapes.clear();
  124. /* Q VARIABLES END */
  125. }
  126. /* Reinitializes the engine variables to a default (conservative and sane) value */
  127. void MilkdropPresetFactory::reset()
  128. {
  129. if (_presetOutputsCache)
  130. {
  131. resetPresetOutputs(_presetOutputsCache);
  132. }
  133. }
  134. PresetOutputs* MilkdropPresetFactory::createPresetOutputs(int gx, int gy)
  135. {
  136. PresetOutputs* presetOutputs = new PresetOutputs();
  137. presetOutputs->Initialize(gx, gy);
  138. /* PER FRAME CONSTANTS BEGIN */
  139. presetOutputs->zoom = 1.0;
  140. presetOutputs->zoomexp = 1.0;
  141. presetOutputs->rot = 0.0;
  142. presetOutputs->warp = 0.0;
  143. presetOutputs->sx = 1.0;
  144. presetOutputs->sy = 1.0;
  145. presetOutputs->dx = 0.0;
  146. presetOutputs->dy = 0.0;
  147. presetOutputs->cx = 0.5;
  148. presetOutputs->cy = 0.5;
  149. presetOutputs->screenDecay = .98;
  150. //_presetInputs.meshx = 0;
  151. //_presetInputs.meshy = 0;
  152. /* PER_FRAME CONSTANTS END */
  153. presetOutputs->fRating = 0;
  154. presetOutputs->fGammaAdj = 1.0;
  155. presetOutputs->videoEcho.zoom = 1.0;
  156. presetOutputs->videoEcho.a = 0;
  157. presetOutputs->videoEcho.orientation = Normal;
  158. presetOutputs->textureWrap = 0;
  159. presetOutputs->bDarkenCenter = 0;
  160. presetOutputs->bRedBlueStereo = 0;
  161. presetOutputs->bBrighten = 0;
  162. presetOutputs->bDarken = 0;
  163. presetOutputs->bSolarize = 0;
  164. presetOutputs->bInvert = 0;
  165. presetOutputs->bMotionVectorsOn = 1;
  166. presetOutputs->fWarpAnimSpeed = 0;
  167. presetOutputs->fWarpScale = 0;
  168. presetOutputs->fShader = 0;
  169. /* PER_PIXEL CONSTANTS BEGIN */
  170. /* PER_PIXEL CONSTANT END */
  171. /* Q AND T VARIABLES START */
  172. for (unsigned int i = 0; i < NUM_Q_VARIABLES; i++)
  173. {
  174. presetOutputs->q[i] = 0;
  175. }
  176. /* Q AND T VARIABLES END */
  177. return presetOutputs;
  178. }
  179. std::unique_ptr<Preset>
  180. MilkdropPresetFactory::allocate(const std::string& url, const std::string& name, const std::string& author)
  181. {
  182. PresetOutputs* presetOutputs;
  183. // use cached PresetOutputs if there is one, otherwise allocate
  184. if (_presetOutputsCache)
  185. {
  186. presetOutputs = _presetOutputsCache;
  187. _presetOutputsCache = nullptr;
  188. }
  189. else
  190. {
  191. presetOutputs = createPresetOutputs(gx, gy);
  192. }
  193. resetPresetOutputs(presetOutputs);
  194. std::string path;
  195. if (PresetFactory::protocol(url, path) == PresetFactory::IDLE_PRESET_PROTOCOL)
  196. {
  197. return IdlePresets::allocate(this, path, presetOutputs);
  198. }
  199. else
  200. {
  201. return std::unique_ptr<Preset>(new MilkdropPreset(this, url, name, presetOutputs));
  202. }
  203. }
  204. // this gives the preset a way to return the PresetOutput w/o dependency on class projectM behavior
  205. void MilkdropPresetFactory::releasePreset(Preset* preset)
  206. {
  207. auto milkdropPreset = dynamic_cast<MilkdropPreset*>(preset);
  208. if (!milkdropPreset || !milkdropPreset->_presetOutputs)
  209. {
  210. // Instance is not a MilkdropPreset or has no PresetOutput object.
  211. return;
  212. }
  213. // return PresetOutputs to the cache
  214. if (!_presetOutputsCache)
  215. {
  216. _presetOutputsCache = milkdropPreset->_presetOutputs;
  217. }
  218. else
  219. {
  220. delete milkdropPreset->_presetOutputs;
  221. }
  222. }