PageRenderTime 61ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/xbmc/visualizations/Milkdrop/vis_milkdrop/state.cpp

http://github.com/xbmc/xbmc
C++ | 1797 lines | 1229 code | 159 blank | 409 comment | 124 complexity | 0424d2390e76cb14efe62fe81527dd3c MD5 | raw file
Possible License(s): GPL-3.0, CC-BY-SA-3.0, LGPL-2.0, 0BSD, Unlicense, GPL-2.0, AGPL-1.0, BSD-3-Clause, LGPL-2.1, LGPL-3.0
  1. /*
  2. LICENSE
  3. -------
  4. Copyright 2005 Nullsoft, Inc.
  5. All rights reserved.
  6. Redistribution and use in source and binary forms, with or without modification,
  7. are permitted provided that the following conditions are met:
  8. * Redistributions of source code must retain the above copyright notice,
  9. this list of conditions and the following disclaimer.
  10. * Redistributions in binary form must reproduce the above copyright notice,
  11. this list of conditions and the following disclaimer in the documentation
  12. and/or other materials provided with the distribution.
  13. * Neither the name of Nullsoft nor the names of its contributors may be used to
  14. endorse or promote products derived from this software without specific prior written permission.
  15. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
  16. IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  17. FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  18. CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  19. DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  20. DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
  21. IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  22. OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  23. */
  24. #include "state.h"
  25. #include "support.h"
  26. #include "evallib/compiler.h"
  27. #include "plugin.h"
  28. #include "utility.h"
  29. //#include <stdlib.h>
  30. //#include <windows.h>
  31. #include <stdio.h>
  32. #include <math.h>
  33. extern CPlugin* g_plugin; // declared in main.cpp
  34. CState::CState()
  35. {
  36. //Default();
  37. // this is the list of variables that can be used for a PER-FRAME calculation;
  38. // it is a SUBSET of the per-vertex calculation variable list.
  39. m_pf_codehandle = NULL;
  40. m_pp_codehandle = NULL;
  41. for (int i=0; i<MAX_CUSTOM_WAVES; i++)
  42. {
  43. m_wave[i].m_pf_codehandle = NULL;
  44. m_wave[i].m_pp_codehandle = NULL;
  45. }
  46. for (int i=0; i<MAX_CUSTOM_SHAPES; i++)
  47. {
  48. m_shape[i].m_pf_codehandle = NULL;
  49. //m_shape[i].m_pp_codehandle = NULL;
  50. }
  51. //RegisterBuiltInVariables();
  52. }
  53. CState::~CState()
  54. {
  55. FreeVarsAndCode();
  56. }
  57. //--------------------------------------------------------------------------------
  58. void CState::RegisterBuiltInVariables(int flags)
  59. {
  60. if (flags & RECOMPILE_PRESET_CODE)
  61. {
  62. resetVars(m_pf_vars);
  63. var_pf_zoom = registerVar("zoom"); // i/o
  64. var_pf_zoomexp = registerVar("zoomexp"); // i/o
  65. var_pf_rot = registerVar("rot"); // i/o
  66. var_pf_warp = registerVar("warp"); // i/o
  67. var_pf_cx = registerVar("cx"); // i/o
  68. var_pf_cy = registerVar("cy"); // i/o
  69. var_pf_dx = registerVar("dx"); // i/o
  70. var_pf_dy = registerVar("dy"); // i/o
  71. var_pf_sx = registerVar("sx"); // i/o
  72. var_pf_sy = registerVar("sy"); // i/o
  73. var_pf_time = registerVar("time"); // i
  74. var_pf_fps = registerVar("fps"); // i
  75. var_pf_bass = registerVar("bass"); // i
  76. var_pf_mid = registerVar("mid"); // i
  77. var_pf_treb = registerVar("treb"); // i
  78. var_pf_bass_att = registerVar("bass_att"); // i
  79. var_pf_mid_att = registerVar("mid_att"); // i
  80. var_pf_treb_att = registerVar("treb_att"); // i
  81. var_pf_frame = registerVar("frame");
  82. var_pf_decay = registerVar("decay");
  83. var_pf_wave_a = registerVar("wave_a");
  84. var_pf_wave_r = registerVar("wave_r");
  85. var_pf_wave_g = registerVar("wave_g");
  86. var_pf_wave_b = registerVar("wave_b");
  87. var_pf_wave_x = registerVar("wave_x");
  88. var_pf_wave_y = registerVar("wave_y");
  89. var_pf_wave_mystery = registerVar("wave_mystery");
  90. var_pf_wave_mode = registerVar("wave_mode");
  91. var_pf_q1 = registerVar("q1");
  92. var_pf_q2 = registerVar("q2");
  93. var_pf_q3 = registerVar("q3");
  94. var_pf_q4 = registerVar("q4");
  95. var_pf_q5 = registerVar("q5");
  96. var_pf_q6 = registerVar("q6");
  97. var_pf_q7 = registerVar("q7");
  98. var_pf_q8 = registerVar("q8");
  99. var_pf_progress = registerVar("progress");
  100. var_pf_ob_size = registerVar("ob_size");
  101. var_pf_ob_r = registerVar("ob_r");
  102. var_pf_ob_g = registerVar("ob_g");
  103. var_pf_ob_b = registerVar("ob_b");
  104. var_pf_ob_a = registerVar("ob_a");
  105. var_pf_ib_size = registerVar("ib_size");
  106. var_pf_ib_r = registerVar("ib_r");
  107. var_pf_ib_g = registerVar("ib_g");
  108. var_pf_ib_b = registerVar("ib_b");
  109. var_pf_ib_a = registerVar("ib_a");
  110. var_pf_mv_x = registerVar("mv_x");
  111. var_pf_mv_y = registerVar("mv_y");
  112. var_pf_mv_dx = registerVar("mv_dx");
  113. var_pf_mv_dy = registerVar("mv_dy");
  114. var_pf_mv_l = registerVar("mv_l");
  115. var_pf_mv_r = registerVar("mv_r");
  116. var_pf_mv_g = registerVar("mv_g");
  117. var_pf_mv_b = registerVar("mv_b");
  118. var_pf_mv_a = registerVar("mv_a");
  119. var_pf_monitor = registerVar("monitor");
  120. var_pf_echo_zoom = registerVar("echo_zoom");
  121. var_pf_echo_alpha = registerVar("echo_alpha");
  122. var_pf_echo_orient = registerVar("echo_orient");
  123. var_pf_wave_usedots = registerVar("wave_usedots");
  124. var_pf_wave_thick = registerVar("wave_thick");
  125. var_pf_wave_additive = registerVar("wave_additive");
  126. var_pf_wave_brighten = registerVar("wave_brighten");
  127. var_pf_darken_center = registerVar("darken_center");
  128. var_pf_gamma = registerVar("gamma");
  129. var_pf_wrap = registerVar("wrap");
  130. var_pf_invert = registerVar("invert");
  131. var_pf_brighten = registerVar("brighten");
  132. var_pf_darken = registerVar("darken");
  133. var_pf_solarize = registerVar("solarize");
  134. var_pf_meshx = registerVar("meshx");
  135. var_pf_meshy = registerVar("meshy");
  136. resetVars(NULL);
  137. // this is the list of variables that can be used for a PER-VERTEX calculation:
  138. // ('vertex' meaning a vertex on the mesh) (as opposed to a once-per-frame calculation)
  139. resetVars(m_pv_vars);
  140. var_pv_zoom = registerVar("zoom"); // i/o
  141. var_pv_zoomexp = registerVar("zoomexp"); // i/o
  142. var_pv_rot = registerVar("rot"); // i/o
  143. var_pv_warp = registerVar("warp"); // i/o
  144. var_pv_cx = registerVar("cx"); // i/o
  145. var_pv_cy = registerVar("cy"); // i/o
  146. var_pv_dx = registerVar("dx"); // i/o
  147. var_pv_dy = registerVar("dy"); // i/o
  148. var_pv_sx = registerVar("sx"); // i/o
  149. var_pv_sy = registerVar("sy"); // i/o
  150. var_pv_time = registerVar("time"); // i
  151. var_pv_fps = registerVar("fps"); // i
  152. var_pv_bass = registerVar("bass"); // i
  153. var_pv_mid = registerVar("mid"); // i
  154. var_pv_treb = registerVar("treb"); // i
  155. var_pv_bass_att = registerVar("bass_att"); // i
  156. var_pv_mid_att = registerVar("mid_att"); // i
  157. var_pv_treb_att = registerVar("treb_att"); // i
  158. var_pv_frame = registerVar("frame");
  159. var_pv_x = registerVar("x"); // i
  160. var_pv_y = registerVar("y"); // i
  161. var_pv_rad = registerVar("rad"); // i
  162. var_pv_ang = registerVar("ang"); // i
  163. var_pv_q1 = registerVar("q1");
  164. var_pv_q2 = registerVar("q2");
  165. var_pv_q3 = registerVar("q3");
  166. var_pv_q4 = registerVar("q4");
  167. var_pv_q5 = registerVar("q5");
  168. var_pv_q6 = registerVar("q6");
  169. var_pv_q7 = registerVar("q7");
  170. var_pv_q8 = registerVar("q8");
  171. var_pv_progress = registerVar("progress");
  172. var_pv_meshx = registerVar("meshx");
  173. var_pv_meshy = registerVar("meshy");
  174. resetVars(NULL);
  175. }
  176. if (flags & RECOMPILE_WAVE_CODE)
  177. {
  178. for (int i=0; i<MAX_CUSTOM_WAVES; i++)
  179. {
  180. resetVars(m_wave[i].m_pf_vars);
  181. m_wave[i].var_pf_time = registerVar("time"); // i
  182. m_wave[i].var_pf_fps = registerVar("fps"); // i
  183. m_wave[i].var_pf_frame = registerVar("frame"); // i
  184. m_wave[i].var_pf_progress = registerVar("progress"); // i
  185. m_wave[i].var_pf_q1 = registerVar("q1"); // i
  186. m_wave[i].var_pf_q2 = registerVar("q2"); // i
  187. m_wave[i].var_pf_q3 = registerVar("q3"); // i
  188. m_wave[i].var_pf_q4 = registerVar("q4"); // i
  189. m_wave[i].var_pf_q5 = registerVar("q5"); // i
  190. m_wave[i].var_pf_q6 = registerVar("q6"); // i
  191. m_wave[i].var_pf_q7 = registerVar("q7"); // i
  192. m_wave[i].var_pf_q8 = registerVar("q8"); // i
  193. m_wave[i].var_pf_t1 = registerVar("t1"); // i/o
  194. m_wave[i].var_pf_t2 = registerVar("t2"); // i/o
  195. m_wave[i].var_pf_t3 = registerVar("t3"); // i/o
  196. m_wave[i].var_pf_t4 = registerVar("t4"); // i/o
  197. m_wave[i].var_pf_t5 = registerVar("t5"); // i/o
  198. m_wave[i].var_pf_t6 = registerVar("t6"); // i/o
  199. m_wave[i].var_pf_t7 = registerVar("t7"); // i/o
  200. m_wave[i].var_pf_t8 = registerVar("t8"); // i/o
  201. m_wave[i].var_pf_bass = registerVar("bass"); // i
  202. m_wave[i].var_pf_mid = registerVar("mid"); // i
  203. m_wave[i].var_pf_treb = registerVar("treb"); // i
  204. m_wave[i].var_pf_bass_att = registerVar("bass_att"); // i
  205. m_wave[i].var_pf_mid_att = registerVar("mid_att"); // i
  206. m_wave[i].var_pf_treb_att = registerVar("treb_att"); // i
  207. m_wave[i].var_pf_r = registerVar("r"); // i/o
  208. m_wave[i].var_pf_g = registerVar("g"); // i/o
  209. m_wave[i].var_pf_b = registerVar("b"); // i/o
  210. m_wave[i].var_pf_a = registerVar("a"); // i/o
  211. resetVars(NULL);
  212. resetVars(m_wave[i].m_pp_vars);
  213. m_wave[i].var_pp_time = registerVar("time"); // i
  214. m_wave[i].var_pp_fps = registerVar("fps"); // i
  215. m_wave[i].var_pp_frame = registerVar("frame"); // i
  216. m_wave[i].var_pp_progress = registerVar("progress"); // i
  217. m_wave[i].var_pp_q1 = registerVar("q1"); // i
  218. m_wave[i].var_pp_q2 = registerVar("q2"); // i
  219. m_wave[i].var_pp_q3 = registerVar("q3"); // i
  220. m_wave[i].var_pp_q4 = registerVar("q4"); // i
  221. m_wave[i].var_pp_q5 = registerVar("q5"); // i
  222. m_wave[i].var_pp_q6 = registerVar("q6"); // i
  223. m_wave[i].var_pp_q7 = registerVar("q7"); // i
  224. m_wave[i].var_pp_q8 = registerVar("q8"); // i
  225. m_wave[i].var_pp_t1 = registerVar("t1"); // i
  226. m_wave[i].var_pp_t2 = registerVar("t2"); // i
  227. m_wave[i].var_pp_t3 = registerVar("t3"); // i
  228. m_wave[i].var_pp_t4 = registerVar("t4"); // i
  229. m_wave[i].var_pp_t5 = registerVar("t5"); // i
  230. m_wave[i].var_pp_t6 = registerVar("t6"); // i
  231. m_wave[i].var_pp_t7 = registerVar("t7"); // i
  232. m_wave[i].var_pp_t8 = registerVar("t8"); // i
  233. m_wave[i].var_pp_bass = registerVar("bass"); // i
  234. m_wave[i].var_pp_mid = registerVar("mid"); // i
  235. m_wave[i].var_pp_treb = registerVar("treb"); // i
  236. m_wave[i].var_pp_bass_att = registerVar("bass_att"); // i
  237. m_wave[i].var_pp_mid_att = registerVar("mid_att"); // i
  238. m_wave[i].var_pp_treb_att = registerVar("treb_att"); // i
  239. m_wave[i].var_pp_sample = registerVar("sample"); // i
  240. m_wave[i].var_pp_value1 = registerVar("value1"); // i
  241. m_wave[i].var_pp_value2 = registerVar("value2"); // i
  242. m_wave[i].var_pp_x = registerVar("x"); // i/o
  243. m_wave[i].var_pp_y = registerVar("y"); // i/o
  244. m_wave[i].var_pp_r = registerVar("r"); // i/o
  245. m_wave[i].var_pp_g = registerVar("g"); // i/o
  246. m_wave[i].var_pp_b = registerVar("b"); // i/o
  247. m_wave[i].var_pp_a = registerVar("a"); // i/o
  248. resetVars(NULL);
  249. }
  250. }
  251. if (flags & RECOMPILE_SHAPE_CODE)
  252. {
  253. for (int i=0; i<MAX_CUSTOM_SHAPES; i++)
  254. {
  255. resetVars(m_shape[i].m_pf_vars);
  256. m_shape[i].var_pf_time = registerVar("time"); // i
  257. m_shape[i].var_pf_fps = registerVar("fps"); // i
  258. m_shape[i].var_pf_frame = registerVar("frame"); // i
  259. m_shape[i].var_pf_progress = registerVar("progress"); // i
  260. m_shape[i].var_pf_q1 = registerVar("q1"); // i
  261. m_shape[i].var_pf_q2 = registerVar("q2"); // i
  262. m_shape[i].var_pf_q3 = registerVar("q3"); // i
  263. m_shape[i].var_pf_q4 = registerVar("q4"); // i
  264. m_shape[i].var_pf_q5 = registerVar("q5"); // i
  265. m_shape[i].var_pf_q6 = registerVar("q6"); // i
  266. m_shape[i].var_pf_q7 = registerVar("q7"); // i
  267. m_shape[i].var_pf_q8 = registerVar("q8"); // i
  268. m_shape[i].var_pf_t1 = registerVar("t1"); // i/o
  269. m_shape[i].var_pf_t2 = registerVar("t2"); // i/o
  270. m_shape[i].var_pf_t3 = registerVar("t3"); // i/o
  271. m_shape[i].var_pf_t4 = registerVar("t4"); // i/o
  272. m_shape[i].var_pf_t5 = registerVar("t5"); // i/o
  273. m_shape[i].var_pf_t6 = registerVar("t6"); // i/o
  274. m_shape[i].var_pf_t7 = registerVar("t7"); // i/o
  275. m_shape[i].var_pf_t8 = registerVar("t8"); // i/o
  276. m_shape[i].var_pf_bass = registerVar("bass"); // i
  277. m_shape[i].var_pf_mid = registerVar("mid"); // i
  278. m_shape[i].var_pf_treb = registerVar("treb"); // i
  279. m_shape[i].var_pf_bass_att = registerVar("bass_att"); // i
  280. m_shape[i].var_pf_mid_att = registerVar("mid_att"); // i
  281. m_shape[i].var_pf_treb_att = registerVar("treb_att"); // i
  282. m_shape[i].var_pf_x = registerVar("x"); // i/o
  283. m_shape[i].var_pf_y = registerVar("y"); // i/o
  284. m_shape[i].var_pf_rad = registerVar("rad"); // i/o
  285. m_shape[i].var_pf_ang = registerVar("ang"); // i/o
  286. m_shape[i].var_pf_tex_ang = registerVar("tex_ang"); // i/o
  287. m_shape[i].var_pf_tex_zoom = registerVar("tex_zoom"); // i/o
  288. m_shape[i].var_pf_sides = registerVar("sides"); // i/o
  289. m_shape[i].var_pf_textured = registerVar("textured"); // i/o
  290. m_shape[i].var_pf_additive = registerVar("additive"); // i/o
  291. m_shape[i].var_pf_thick = registerVar("thick"); // i/o
  292. m_shape[i].var_pf_r = registerVar("r"); // i/o
  293. m_shape[i].var_pf_g = registerVar("g"); // i/o
  294. m_shape[i].var_pf_b = registerVar("b"); // i/o
  295. m_shape[i].var_pf_a = registerVar("a"); // i/o
  296. m_shape[i].var_pf_r2 = registerVar("r2"); // i/o
  297. m_shape[i].var_pf_g2 = registerVar("g2"); // i/o
  298. m_shape[i].var_pf_b2 = registerVar("b2"); // i/o
  299. m_shape[i].var_pf_a2 = registerVar("a2"); // i/o
  300. m_shape[i].var_pf_border_r = registerVar("border_r"); // i/o
  301. m_shape[i].var_pf_border_g = registerVar("border_g"); // i/o
  302. m_shape[i].var_pf_border_b = registerVar("border_b"); // i/o
  303. m_shape[i].var_pf_border_a = registerVar("border_a"); // i/o
  304. resetVars(NULL);
  305. /*
  306. resetVars(m_shape[i].m_pp_vars);
  307. m_shape[i].var_pp_time = registerVar("time"); // i
  308. m_shape[i].var_pp_fps = registerVar("fps"); // i
  309. m_shape[i].var_pp_frame = registerVar("frame"); // i
  310. m_shape[i].var_pp_progress = registerVar("progress"); // i
  311. m_shape[i].var_pp_q1 = registerVar("q1"); // i
  312. m_shape[i].var_pp_q2 = registerVar("q2"); // i
  313. m_shape[i].var_pp_q3 = registerVar("q3"); // i
  314. m_shape[i].var_pp_q4 = registerVar("q4"); // i
  315. m_shape[i].var_pp_q5 = registerVar("q5"); // i
  316. m_shape[i].var_pp_q6 = registerVar("q6"); // i
  317. m_shape[i].var_pp_q7 = registerVar("q7"); // i
  318. m_shape[i].var_pp_q8 = registerVar("q8"); // i
  319. m_shape[i].var_pp_t1 = registerVar("t1"); // i/o
  320. m_shape[i].var_pp_t2 = registerVar("t2"); // i/o
  321. m_shape[i].var_pp_t3 = registerVar("t3"); // i/o
  322. m_shape[i].var_pp_t4 = registerVar("t4"); // i/o
  323. m_shape[i].var_pp_t5 = registerVar("t5"); // i/o
  324. m_shape[i].var_pp_t6 = registerVar("t6"); // i/o
  325. m_shape[i].var_pp_t7 = registerVar("t7"); // i/o
  326. m_shape[i].var_pp_t8 = registerVar("t8"); // i/o
  327. m_shape[i].var_pp_bass = registerVar("bass"); // i
  328. m_shape[i].var_pp_mid = registerVar("mid"); // i
  329. m_shape[i].var_pp_treb = registerVar("treb"); // i
  330. m_shape[i].var_pp_bass_att = registerVar("bass_att"); // i
  331. m_shape[i].var_pp_mid_att = registerVar("mid_att"); // i
  332. m_shape[i].var_pp_treb_att = registerVar("treb_att"); // i
  333. m_shape[i].var_pp_x = registerVar("x"); // i/o
  334. m_shape[i].var_pp_y = registerVar("y"); // i/o
  335. m_shape[i].var_pp_rad = registerVar("rad"); // i/o
  336. m_shape[i].var_pp_ang = registerVar("ang"); // i/o
  337. m_shape[i].var_pp_sides = registerVar("sides"); // i/o
  338. m_shape[i].var_pp_r = registerVar("r"); // i/o
  339. m_shape[i].var_pp_g = registerVar("g"); // i/o
  340. m_shape[i].var_pp_b = registerVar("b"); // i/o
  341. m_shape[i].var_pp_a = registerVar("a"); // i/o
  342. m_shape[i].var_pp_r = registerVar("r2"); // i/o
  343. m_shape[i].var_pp_g = registerVar("g2"); // i/o
  344. m_shape[i].var_pp_b = registerVar("b2"); // i/o
  345. m_shape[i].var_pp_a = registerVar("a2"); // i/o
  346. m_shape[i].var_pp_border_r = registerVar("border_r"); // i/o
  347. m_shape[i].var_pp_border_g = registerVar("border_g"); // i/o
  348. m_shape[i].var_pp_border_b = registerVar("border_b"); // i/o
  349. m_shape[i].var_pp_border_a = registerVar("border_a"); // i/o
  350. resetVars(NULL);
  351. */
  352. }
  353. }
  354. }
  355. void CState::Default()
  356. {
  357. // DON'T FORGET TO ADD NEW VARIABLES TO BLEND FUNCTION, IMPORT, and EXPORT AS WELL!!!!!!!!
  358. strcpy(m_szDesc, "<no description>");
  359. //strcpy(m_szSection, "n/a");
  360. m_fRating = 3.0f;
  361. m_bBlending = false;
  362. m_fGammaAdj = 2.0f; // 1.0 = reg; +2.0 = double, +3.0 = triple...
  363. m_fVideoEchoZoom = 2.0f;
  364. m_fVideoEchoAlpha = 0.0f;
  365. m_nVideoEchoOrientation = 0; // 0-3
  366. m_fDecay = 0.98f; // 1.0 = none, 0.95 = heavy decay
  367. m_nWaveMode = 0;
  368. m_nOldWaveMode = -1;
  369. m_bAdditiveWaves = false;
  370. m_fWaveAlpha = 0.8f;
  371. m_fWaveScale = 1.0f;
  372. m_fWaveSmoothing = 0.75f; // 0 = no smoothing, 0.9 = HEAVY smoothing
  373. m_bWaveDots = false;
  374. m_bWaveThick = false;
  375. m_fWaveParam = 0.0f;
  376. m_bModWaveAlphaByVolume = false;
  377. m_fModWaveAlphaStart = 0.75f; // when relative volume hits this level, alpha -> 0
  378. m_fModWaveAlphaEnd = 0.95f; // when relative volume hits this level, alpha -> 1
  379. m_fWarpAnimSpeed = 1.0f; // additional timescaling for warp animation
  380. m_fWarpScale = 1.0f;
  381. m_fZoomExponent = 1.0f;
  382. m_fShader = 0.0f;
  383. m_bMaximizeWaveColor = true;
  384. m_bTexWrap = true;
  385. m_bDarkenCenter = false;
  386. m_bRedBlueStereo = false;
  387. m_fMvX = 12.0f;
  388. m_fMvY = 9.0f;
  389. m_fMvDX = 0.0f;
  390. m_fMvDY = 0.0f;
  391. m_fMvL = 0.9f;
  392. m_fMvR = 1.0f;
  393. m_fMvG = 1.0f;
  394. m_fMvB = 1.0f;
  395. m_fMvA = 1.0f;
  396. m_bBrighten = false;
  397. m_bDarken = false;
  398. m_bSolarize = false;
  399. m_bInvert = false;
  400. // DON'T FORGET TO ADD NEW VARIABLES TO BLEND FUNCTION, IMPORT, and EXPORT AS WELL!!!!!!!!
  401. // ALSO BE SURE TO REGISTER THEM ON THE MAIN MENU (SEE MILKDROP.CPP)
  402. // time-varying variables: base, var, varFreq1, varFreq2
  403. m_fZoom = 1.0f;
  404. m_fRot = 0.0f;
  405. m_fRotCX = 0.5f;
  406. m_fRotCY = 0.5f;
  407. m_fXPush = 0.0f;
  408. m_fYPush = 0.0f;
  409. m_fWarpAmount = 1.0f;
  410. m_fStretchX = 1.0f;
  411. m_fStretchY = 1.0f;
  412. m_fWaveR = 1.0f;
  413. m_fWaveG = 1.0f;
  414. m_fWaveB = 1.0f;
  415. m_fWaveX = 0.5f;
  416. m_fWaveY = 0.5f;
  417. m_fOuterBorderSize = 0.01f;
  418. m_fOuterBorderR = 0.0f;
  419. m_fOuterBorderG = 0.0f;
  420. m_fOuterBorderB = 0.0f;
  421. m_fOuterBorderA = 0.0f;
  422. m_fInnerBorderSize = 0.01f;
  423. m_fInnerBorderR = 0.25f;
  424. m_fInnerBorderG = 0.25f;
  425. m_fInnerBorderB = 0.25f;
  426. m_fInnerBorderA = 0.0f;
  427. for (int i=0; i<MAX_CUSTOM_WAVES; i++)
  428. {
  429. m_wave[i].enabled = 0;
  430. m_wave[i].samples = 512;
  431. m_wave[i].sep = 0;
  432. m_wave[i].scaling = 1.0f;
  433. m_wave[i].smoothing = 0.5f;
  434. m_wave[i].r = 1.0f;
  435. m_wave[i].g = 1.0f;
  436. m_wave[i].b = 1.0f;
  437. m_wave[i].a = 1.0f;
  438. m_wave[i].bSpectrum = 0;
  439. m_wave[i].bUseDots = 0;
  440. m_wave[i].bDrawThick = 0;
  441. m_wave[i].bAdditive = 0;
  442. }
  443. for (int i=0; i<MAX_CUSTOM_SHAPES; i++)
  444. {
  445. m_shape[i].enabled = 0;
  446. m_shape[i].sides = 4;
  447. m_shape[i].additive = 0;
  448. m_shape[i].thickOutline = 0;
  449. m_shape[i].textured = 0;
  450. m_shape[i].tex_zoom = 1.0f;
  451. m_shape[i].tex_ang = 0.0f;
  452. m_shape[i].x = 0.5f;
  453. m_shape[i].y = 0.5f;
  454. m_shape[i].rad = 0.1f;
  455. m_shape[i].ang = 0.0f;
  456. m_shape[i].r = 1.0f;
  457. m_shape[i].g = 0.0f;
  458. m_shape[i].b = 0.0f;
  459. m_shape[i].a = 1.0f;
  460. m_shape[i].r2 = 0.0f;
  461. m_shape[i].g2 = 1.0f;
  462. m_shape[i].b2 = 0.0f;
  463. m_shape[i].a2 = 0.0f;
  464. m_shape[i].border_r = 1.0f;
  465. m_shape[i].border_g = 1.0f;
  466. m_shape[i].border_b = 1.0f;
  467. m_shape[i].border_a = 0.1f;
  468. }
  469. // clear all code strings:
  470. m_szPerFrameInit[0] = 0;
  471. m_szPerFrameExpr[0] = 0;
  472. m_szPerPixelExpr[0] = 0;
  473. for (int i=0; i<MAX_CUSTOM_WAVES; i++)
  474. {
  475. m_wave[i].m_szInit[0] = 0;
  476. m_wave[i].m_szPerFrame[0] = 0;
  477. m_wave[i].m_szPerPoint[0] = 0;
  478. }
  479. for (int i=0; i<MAX_CUSTOM_SHAPES; i++)
  480. {
  481. m_shape[i].m_szInit[0] = 0;
  482. m_shape[i].m_szPerFrame[0] = 0;
  483. //m_shape[i].m_szPerPoint[0] = 0;
  484. }
  485. FreeVarsAndCode();
  486. }
  487. void CState::StartBlendFrom(CState *s_from, float fAnimTime, float fTimespan)
  488. {
  489. CState *s_to = this;
  490. // bools, ints, and strings instantly change
  491. s_to->m_fVideoEchoAlphaOld = s_from->m_fVideoEchoAlpha.eval(-1);
  492. s_to->m_nVideoEchoOrientationOld = s_from->m_nVideoEchoOrientation;
  493. s_to->m_nOldWaveMode = s_from->m_nWaveMode;
  494. /*
  495. s_to->m_fVideoEchoAlphaOld = s_from->m_fVideoEchoAlpha.eval(-1);
  496. s_to->m_nVideoEchoOrientationOld = s_from->m_nVideoEchoOrientation;
  497. s_to->m_nOldWaveMode = s_from->m_nWaveMode;
  498. s_to->m_nWaveMode = s_from->m_nWaveMode;
  499. s_to->m_bAdditiveWaves = s_from->m_bAdditiveWaves;
  500. s_to->m_nVideoEchoOrientation = s_from->m_nVideoEchoOrientation;
  501. s_to->m_fWarpAnimSpeed = s_from->m_fWarpAnimSpeed; // would req. 10 phase-matches to blend this one!!!
  502. s_to->m_bWaveDots = s_from->m_bWaveDots;
  503. s_to->m_bWaveThick = s_from->m_bWaveThick;
  504. s_to->m_bModWaveAlphaByVolume = s_from->m_bModWaveAlphaByVolume;
  505. s_to->m_bMaximizeWaveColor = s_from->m_bMaximizeWaveColor;
  506. s_to->m_bTexWrap = s_from->m_bTexWrap;
  507. s_to->m_bDarkenCenter = s_from->m_bDarkenCenter;
  508. s_to->m_bRedBlueStereo = s_from->m_bRedBlueStereo;
  509. s_to->m_bBrighten = s_from->m_bBrighten;
  510. s_to->m_bDarken = s_from->m_bDarken;
  511. s_to->m_bSolarize = s_from->m_bSolarize;
  512. s_to->m_bInvert = s_from->m_bInvert;
  513. s_to->m_fRating = s_from->m_fRating;
  514. */
  515. // expr. eval. also copies over immediately (replaces prev.)
  516. m_bBlending = true;
  517. m_fBlendStartTime = fAnimTime;
  518. m_fBlendDuration = fTimespan;
  519. /*
  520. //for (int e=0; e<MAX_EVALS; e++)
  521. {
  522. char szTemp[8192];
  523. strcpy(szTemp, m_szPerFrameExpr);
  524. strcpy(m_szPerFrameExpr, s_to->m_szPerFrameExpr);
  525. strcpy(s_to->m_szPerFrameExpr, szTemp);
  526. strcpy(szTemp, m_szPerPixelExpr);
  527. strcpy(m_szPerPixelExpr, s_to->m_szPerPixelExpr);
  528. strcpy(s_to->m_szPerPixelExpr, szTemp);
  529. strcpy(szTemp, m_szPerFrameInit);
  530. strcpy(m_szPerFrameInit, s_to->m_szPerFrameInit);
  531. strcpy(s_to->m_szPerFrameInit, szTemp);
  532. }
  533. RecompileExpressions();
  534. s_to->RecompileExpressions();
  535. strcpy(m_szDesc, s_to->m_szDesc);
  536. //strcpy(m_szSection, s_to->m_szSection);
  537. */
  538. // CBlendableFloats & SuperValues blend over time
  539. m_fGammaAdj .StartBlendFrom(&s_from->m_fGammaAdj , fAnimTime, fTimespan);
  540. m_fVideoEchoZoom .StartBlendFrom(&s_from->m_fVideoEchoZoom , fAnimTime, fTimespan);
  541. m_fVideoEchoAlpha.StartBlendFrom(&s_from->m_fVideoEchoAlpha, fAnimTime, fTimespan);
  542. m_fDecay .StartBlendFrom(&s_from->m_fDecay , fAnimTime, fTimespan);
  543. m_fWaveAlpha .StartBlendFrom(&s_from->m_fWaveAlpha , fAnimTime, fTimespan);
  544. m_fWaveScale .StartBlendFrom(&s_from->m_fWaveScale , fAnimTime, fTimespan);
  545. m_fWaveSmoothing .StartBlendFrom(&s_from->m_fWaveSmoothing , fAnimTime, fTimespan);
  546. m_fWaveParam .StartBlendFrom(&s_from->m_fWaveParam , fAnimTime, fTimespan);
  547. m_fWarpScale .StartBlendFrom(&s_from->m_fWarpScale , fAnimTime, fTimespan);
  548. m_fZoomExponent .StartBlendFrom(&s_from->m_fZoomExponent , fAnimTime, fTimespan);
  549. m_fShader .StartBlendFrom(&s_from->m_fShader , fAnimTime, fTimespan);
  550. m_fModWaveAlphaStart.StartBlendFrom(&s_from->m_fModWaveAlphaStart, fAnimTime, fTimespan);
  551. m_fModWaveAlphaEnd .StartBlendFrom(&s_from->m_fModWaveAlphaEnd, fAnimTime, fTimespan);
  552. m_fZoom .StartBlendFrom(&s_from->m_fZoom , fAnimTime, fTimespan);
  553. m_fRot .StartBlendFrom(&s_from->m_fRot , fAnimTime, fTimespan);
  554. m_fRotCX .StartBlendFrom(&s_from->m_fRotCX , fAnimTime, fTimespan);
  555. m_fRotCY .StartBlendFrom(&s_from->m_fRotCY , fAnimTime, fTimespan);
  556. m_fXPush .StartBlendFrom(&s_from->m_fXPush , fAnimTime, fTimespan);
  557. m_fYPush .StartBlendFrom(&s_from->m_fYPush , fAnimTime, fTimespan);
  558. m_fWarpAmount.StartBlendFrom(&s_from->m_fWarpAmount,fAnimTime, fTimespan);
  559. m_fStretchX .StartBlendFrom(&s_from->m_fStretchX , fAnimTime, fTimespan);
  560. m_fStretchY .StartBlendFrom(&s_from->m_fStretchY , fAnimTime, fTimespan);
  561. m_fWaveR .StartBlendFrom(&s_from->m_fWaveR , fAnimTime, fTimespan);
  562. m_fWaveG .StartBlendFrom(&s_from->m_fWaveG , fAnimTime, fTimespan);
  563. m_fWaveB .StartBlendFrom(&s_from->m_fWaveB , fAnimTime, fTimespan);
  564. m_fWaveX .StartBlendFrom(&s_from->m_fWaveX , fAnimTime, fTimespan);
  565. m_fWaveY .StartBlendFrom(&s_from->m_fWaveY , fAnimTime, fTimespan);
  566. m_fOuterBorderSize .StartBlendFrom(&s_from->m_fOuterBorderSize , fAnimTime, fTimespan);
  567. m_fOuterBorderR .StartBlendFrom(&s_from->m_fOuterBorderR , fAnimTime, fTimespan);
  568. m_fOuterBorderG .StartBlendFrom(&s_from->m_fOuterBorderG , fAnimTime, fTimespan);
  569. m_fOuterBorderB .StartBlendFrom(&s_from->m_fOuterBorderB , fAnimTime, fTimespan);
  570. m_fOuterBorderA .StartBlendFrom(&s_from->m_fOuterBorderA , fAnimTime, fTimespan);
  571. m_fInnerBorderSize .StartBlendFrom(&s_from->m_fInnerBorderSize , fAnimTime, fTimespan);
  572. m_fInnerBorderR .StartBlendFrom(&s_from->m_fInnerBorderR , fAnimTime, fTimespan);
  573. m_fInnerBorderG .StartBlendFrom(&s_from->m_fInnerBorderG , fAnimTime, fTimespan);
  574. m_fInnerBorderB .StartBlendFrom(&s_from->m_fInnerBorderB , fAnimTime, fTimespan);
  575. m_fInnerBorderA .StartBlendFrom(&s_from->m_fInnerBorderA , fAnimTime, fTimespan);
  576. m_fMvX .StartBlendFrom(&s_from->m_fMvX , fAnimTime, fTimespan);
  577. m_fMvY .StartBlendFrom(&s_from->m_fMvY , fAnimTime, fTimespan);
  578. m_fMvDX .StartBlendFrom(&s_from->m_fMvDX , fAnimTime, fTimespan);
  579. m_fMvDY .StartBlendFrom(&s_from->m_fMvDY , fAnimTime, fTimespan);
  580. m_fMvL .StartBlendFrom(&s_from->m_fMvL , fAnimTime, fTimespan);
  581. m_fMvR .StartBlendFrom(&s_from->m_fMvR , fAnimTime, fTimespan);
  582. m_fMvG .StartBlendFrom(&s_from->m_fMvG , fAnimTime, fTimespan);
  583. m_fMvB .StartBlendFrom(&s_from->m_fMvB , fAnimTime, fTimespan);
  584. m_fMvA .StartBlendFrom(&s_from->m_fMvA , fAnimTime, fTimespan);
  585. // if motion vectors were transparent before, don't morph the # in X and Y - just
  586. // start in the right place, and fade them in.
  587. bool bOldStateTransparent = (s_from->m_fMvA.eval(-1) < 0.001f);
  588. bool bNewStateTransparent = (s_to->m_fMvA.eval(-1) < 0.001f);
  589. if (!bOldStateTransparent && bNewStateTransparent)
  590. {
  591. s_from->m_fMvX = s_to->m_fMvX.eval(fAnimTime);
  592. s_from->m_fMvY = s_to->m_fMvY.eval(fAnimTime);
  593. s_from->m_fMvDX = s_to->m_fMvDX.eval(fAnimTime);
  594. s_from->m_fMvDY = s_to->m_fMvDY.eval(fAnimTime);
  595. s_from->m_fMvL = s_to->m_fMvL.eval(fAnimTime);
  596. s_from->m_fMvR = s_to->m_fMvR.eval(fAnimTime);
  597. s_from->m_fMvG = s_to->m_fMvG.eval(fAnimTime);
  598. s_from->m_fMvB = s_to->m_fMvB.eval(fAnimTime);
  599. }
  600. if (bNewStateTransparent && !bOldStateTransparent)
  601. {
  602. s_to->m_fMvX = s_from->m_fMvX.eval(fAnimTime);
  603. s_to->m_fMvY = s_from->m_fMvY.eval(fAnimTime);
  604. s_to->m_fMvDX = s_from->m_fMvDX.eval(fAnimTime);
  605. s_to->m_fMvDY = s_from->m_fMvDY.eval(fAnimTime);
  606. s_to->m_fMvL = s_from->m_fMvL.eval(fAnimTime);
  607. s_to->m_fMvR = s_from->m_fMvR.eval(fAnimTime);
  608. s_to->m_fMvG = s_from->m_fMvG.eval(fAnimTime);
  609. s_to->m_fMvB = s_from->m_fMvB.eval(fAnimTime);
  610. }
  611. }
  612. void WriteCode(FILE* fOut, int i, char* pStr, char* prefix)
  613. {
  614. char szLineName[32];
  615. int line = 1;
  616. int start_pos = 0;
  617. int char_pos = 0;
  618. while (pStr[start_pos] != 0)
  619. {
  620. while ( pStr[char_pos] != 0 &&
  621. pStr[char_pos] != LINEFEED_CONTROL_CHAR)
  622. char_pos++;
  623. sprintf(szLineName, "%s%d", prefix, line);
  624. char ch = pStr[char_pos];
  625. pStr[char_pos] = 0;
  626. //if (!WritePrivateProfileString(szSectionName,szLineName,&pStr[start_pos],szIniFile)) return false;
  627. fprintf(fOut, "%s=%s\n", szLineName, &pStr[start_pos]);
  628. pStr[char_pos] = ch;
  629. if (pStr[char_pos] != 0) char_pos++;
  630. start_pos = char_pos;
  631. line++;
  632. }
  633. }
  634. bool CState::Export(char *szSectionName, char *szIniFile)
  635. {
  636. FILE *fOut = fopen(szIniFile, "w");
  637. if (!fOut) return false;
  638. fprintf(fOut, "[%s]\n", szSectionName);
  639. fprintf(fOut, "%s=%f\n", "fRating", m_fRating);
  640. fprintf(fOut, "%s=%f\n", "fGammaAdj", m_fGammaAdj.eval(-1));
  641. fprintf(fOut, "%s=%f\n", "fDecay", m_fDecay.eval(-1));
  642. fprintf(fOut, "%s=%f\n", "fVideoEchoZoom", m_fVideoEchoZoom.eval(-1));
  643. fprintf(fOut, "%s=%f\n", "fVideoEchoAlpha", m_fVideoEchoAlpha.eval(-1));
  644. fprintf(fOut, "%s=%d\n", "nVideoEchoOrientation", m_nVideoEchoOrientation);
  645. fprintf(fOut, "%s=%d\n", "nWaveMode", m_nWaveMode);
  646. fprintf(fOut, "%s=%d\n", "bAdditiveWaves", m_bAdditiveWaves);
  647. fprintf(fOut, "%s=%d\n", "bWaveDots", m_bWaveDots);
  648. fprintf(fOut, "%s=%d\n", "bWaveThick", m_bWaveThick);
  649. fprintf(fOut, "%s=%d\n", "bModWaveAlphaByVolume", m_bModWaveAlphaByVolume);
  650. fprintf(fOut, "%s=%d\n", "bMaximizeWaveColor", m_bMaximizeWaveColor);
  651. fprintf(fOut, "%s=%d\n", "bTexWrap", m_bTexWrap );
  652. fprintf(fOut, "%s=%d\n", "bDarkenCenter", m_bDarkenCenter );
  653. fprintf(fOut, "%s=%d\n", "bRedBlueStereo", m_bRedBlueStereo );
  654. fprintf(fOut, "%s=%d\n", "bBrighten", m_bBrighten );
  655. fprintf(fOut, "%s=%d\n", "bDarken", m_bDarken );
  656. fprintf(fOut, "%s=%d\n", "bSolarize", m_bSolarize );
  657. fprintf(fOut, "%s=%d\n", "bInvert", m_bInvert );
  658. fprintf(fOut, "%s=%f\n", "fWaveAlpha", m_fWaveAlpha.eval(-1));
  659. fprintf(fOut, "%s=%f\n", "fWaveScale", m_fWaveScale.eval(-1));
  660. fprintf(fOut, "%s=%f\n", "fWaveSmoothing", m_fWaveSmoothing.eval(-1));
  661. fprintf(fOut, "%s=%f\n", "fWaveParam", m_fWaveParam.eval(-1));
  662. fprintf(fOut, "%s=%f\n", "fModWaveAlphaStart", m_fModWaveAlphaStart.eval(-1));
  663. fprintf(fOut, "%s=%f\n", "fModWaveAlphaEnd", m_fModWaveAlphaEnd.eval(-1));
  664. fprintf(fOut, "%s=%f\n", "fWarpAnimSpeed", m_fWarpAnimSpeed);
  665. fprintf(fOut, "%s=%f\n", "fWarpScale", m_fWarpScale.eval(-1));
  666. fprintf(fOut, "%s=%f\n", "fZoomExponent", m_fZoomExponent.eval(-1));
  667. fprintf(fOut, "%s=%f\n", "fShader", m_fShader.eval(-1));
  668. fprintf(fOut, "%s=%f\n", "zoom", m_fZoom .eval(-1));
  669. fprintf(fOut, "%s=%f\n", "rot", m_fRot .eval(-1));
  670. fprintf(fOut, "%s=%f\n", "cx", m_fRotCX .eval(-1));
  671. fprintf(fOut, "%s=%f\n", "cy", m_fRotCY .eval(-1));
  672. fprintf(fOut, "%s=%f\n", "dx", m_fXPush .eval(-1));
  673. fprintf(fOut, "%s=%f\n", "dy", m_fYPush .eval(-1));
  674. fprintf(fOut, "%s=%f\n", "warp", m_fWarpAmount.eval(-1));
  675. fprintf(fOut, "%s=%f\n", "sx", m_fStretchX .eval(-1));
  676. fprintf(fOut, "%s=%f\n", "sy", m_fStretchY .eval(-1));
  677. fprintf(fOut, "%s=%f\n", "wave_r", m_fWaveR .eval(-1));
  678. fprintf(fOut, "%s=%f\n", "wave_g", m_fWaveG .eval(-1));
  679. fprintf(fOut, "%s=%f\n", "wave_b", m_fWaveB .eval(-1));
  680. fprintf(fOut, "%s=%f\n", "wave_x", m_fWaveX .eval(-1));
  681. fprintf(fOut, "%s=%f\n", "wave_y", m_fWaveY .eval(-1));
  682. fprintf(fOut, "%s=%f\n", "ob_size", m_fOuterBorderSize.eval(-1));
  683. fprintf(fOut, "%s=%f\n", "ob_r", m_fOuterBorderR.eval(-1));
  684. fprintf(fOut, "%s=%f\n", "ob_g", m_fOuterBorderG.eval(-1));
  685. fprintf(fOut, "%s=%f\n", "ob_b", m_fOuterBorderB.eval(-1));
  686. fprintf(fOut, "%s=%f\n", "ob_a", m_fOuterBorderA.eval(-1));
  687. fprintf(fOut, "%s=%f\n", "ib_size", m_fInnerBorderSize.eval(-1));
  688. fprintf(fOut, "%s=%f\n", "ib_r", m_fInnerBorderR.eval(-1));
  689. fprintf(fOut, "%s=%f\n", "ib_g", m_fInnerBorderG.eval(-1));
  690. fprintf(fOut, "%s=%f\n", "ib_b", m_fInnerBorderB.eval(-1));
  691. fprintf(fOut, "%s=%f\n", "ib_a", m_fInnerBorderA.eval(-1));
  692. fprintf(fOut, "%s=%f\n", "nMotionVectorsX", m_fMvX.eval(-1));
  693. fprintf(fOut, "%s=%f\n", "nMotionVectorsY", m_fMvY.eval(-1));
  694. fprintf(fOut, "%s=%f\n", "mv_dx", m_fMvDX.eval(-1));
  695. fprintf(fOut, "%s=%f\n", "mv_dy", m_fMvDY.eval(-1));
  696. fprintf(fOut, "%s=%f\n", "mv_l", m_fMvL.eval(-1));
  697. fprintf(fOut, "%s=%f\n", "mv_r", m_fMvR.eval(-1));
  698. fprintf(fOut, "%s=%f\n", "mv_g", m_fMvG.eval(-1));
  699. fprintf(fOut, "%s=%f\n", "mv_b", m_fMvB.eval(-1));
  700. fprintf(fOut, "%s=%f\n", "mv_a", m_fMvA.eval(-1));
  701. int i=0;
  702. for (i=0; i<MAX_CUSTOM_WAVES; i++)
  703. m_wave[i].Export("", szIniFile, i, fOut);
  704. for (i=0; i<MAX_CUSTOM_SHAPES; i++)
  705. m_shape[i].Export("", szIniFile, i, fOut);
  706. // write out arbitrary expressions, one line at a time
  707. WriteCode(fOut, i, m_szPerFrameInit, "per_frame_init_");
  708. WriteCode(fOut, i, m_szPerFrameExpr, "per_frame_");
  709. WriteCode(fOut, i, m_szPerPixelExpr, "per_pixel_");
  710. /*
  711. int n2 = 3 + MAX_CUSTOM_WAVES*3 + MAX_CUSTOM_SHAPES*2;
  712. for (int n=0; n<n2; n++)
  713. {
  714. char *pStr;
  715. char prefix[64];
  716. switch(n)
  717. {
  718. case 0: pStr = m_szPerFrameExpr; strcpy(prefix, "per_frame_"); break;
  719. case 1: pStr = m_szPerPixelExpr; strcpy(prefix, "per_pixel_"); break;
  720. case 2: pStr = m_szPerFrameInit; strcpy(prefix, "per_frame_init_"); break;
  721. default:
  722. if (n < 3 + 3*MAX_CUSTOM_WAVES)
  723. {
  724. int i = (n-3) / 3;
  725. int j = (n-3) % 3;
  726. switch(j)
  727. {
  728. case 0: pStr = m_wave[i].m_szInit; sprintf(prefix, "wave_%d_init", i); break;
  729. case 1: pStr = m_wave[i].m_szPerFrame; sprintf(prefix, "wave_%d_per_frame", i); break;
  730. case 2: pStr = m_wave[i].m_szPerPoint; sprintf(prefix, "wave_%d_per_point", i); break;
  731. }
  732. }
  733. else
  734. {
  735. int i = (n-3-3*MAX_CUSTOM_WAVES) / 2;
  736. int j = (n-3-3*MAX_CUSTOM_WAVES) % 2;
  737. switch(j)
  738. {
  739. case 0: pStr = m_shape[i].m_szInit; sprintf(prefix, "shape_%d_init", i); break;
  740. case 1: pStr = m_shape[i].m_szPerFrame; sprintf(prefix, "shape_%d_per_frame", i); break;
  741. }
  742. }
  743. }
  744. char szLineName[32];
  745. int line = 1;
  746. int start_pos = 0;
  747. int char_pos = 0;
  748. while (pStr[start_pos] != 0)
  749. {
  750. while ( pStr[char_pos] != 0 &&
  751. pStr[char_pos] != LINEFEED_CONTROL_CHAR)
  752. char_pos++;
  753. sprintf(szLineName, "%s%d", prefix, line);
  754. char ch = pStr[char_pos];
  755. pStr[char_pos] = 0;
  756. //if (!WritePrivateProfileString(szSectionName,szLineName,&pStr[start_pos],szIniFile)) return false;
  757. fprintf(fOut, "%s=%s\n", szLineName, &pStr[start_pos]);
  758. pStr[char_pos] = ch;
  759. if (pStr[char_pos] != 0) char_pos++;
  760. start_pos = char_pos;
  761. line++;
  762. }
  763. }
  764. */
  765. fclose(fOut);
  766. return true;
  767. }
  768. int CWave::Export(char* szSection, char *szFile, int i, FILE* fOut)
  769. {
  770. FILE* f2 = fOut;
  771. if (!fOut)
  772. {
  773. f2 = fopen(szFile, "w");
  774. if (!f2) return 0;
  775. fprintf(f2, "[%s]\n", szSection);
  776. }
  777. fprintf(f2, "wavecode_%d_%s=%d\n", i, "enabled", enabled);
  778. fprintf(f2, "wavecode_%d_%s=%d\n", i, "samples", samples);
  779. fprintf(f2, "wavecode_%d_%s=%d\n", i, "sep", sep );
  780. fprintf(f2, "wavecode_%d_%s=%d\n", i, "bSpectrum", bSpectrum);
  781. fprintf(f2, "wavecode_%d_%s=%d\n", i, "bUseDots", bUseDots);
  782. fprintf(f2, "wavecode_%d_%s=%d\n", i, "bDrawThick", bDrawThick);
  783. fprintf(f2, "wavecode_%d_%s=%d\n", i, "bAdditive", bAdditive);
  784. fprintf(f2, "wavecode_%d_%s=%f\n", i, "scaling", scaling);
  785. fprintf(f2, "wavecode_%d_%s=%f\n", i, "smoothing", smoothing);
  786. fprintf(f2, "wavecode_%d_%s=%f\n", i, "r", r);
  787. fprintf(f2, "wavecode_%d_%s=%f\n", i, "g", g);
  788. fprintf(f2, "wavecode_%d_%s=%f\n", i, "b", b);
  789. fprintf(f2, "wavecode_%d_%s=%f\n", i, "a", a);
  790. // READ THE CODE IN
  791. char prefix[64];
  792. sprintf(prefix, "wave_%d_init", i); WriteCode(f2, i, m_szInit, prefix);
  793. sprintf(prefix, "wave_%d_per_frame", i); WriteCode(f2, i, m_szPerFrame, prefix);
  794. sprintf(prefix, "wave_%d_per_point", i); WriteCode(f2, i, m_szPerPoint, prefix);
  795. if (!fOut)
  796. fclose(f2); // [sic]
  797. return 1;
  798. }
  799. int CShape::Export(char* szSection, char *szFile, int i, FILE* fOut)
  800. {
  801. FILE* f2 = fOut;
  802. if (!fOut)
  803. {
  804. f2 = fopen(szFile, "w");
  805. if (!f2) return 0;
  806. fprintf(f2, "[%s]\n", szSection);
  807. }
  808. fprintf(f2, "shapecode_%d_%s=%d\n", i, "enabled", enabled);
  809. fprintf(f2, "shapecode_%d_%s=%d\n", i, "sides", sides);
  810. fprintf(f2, "shapecode_%d_%s=%d\n", i, "additive", additive);
  811. fprintf(f2, "shapecode_%d_%s=%d\n", i, "thickOutline",thickOutline);
  812. fprintf(f2, "shapecode_%d_%s=%d\n", i, "textured", textured);
  813. fprintf(f2, "shapecode_%d_%s=%f\n", i, "x", x);
  814. fprintf(f2, "shapecode_%d_%s=%f\n", i, "y", y);
  815. fprintf(f2, "shapecode_%d_%s=%f\n", i, "rad", rad);
  816. fprintf(f2, "shapecode_%d_%s=%f\n", i, "ang", ang);
  817. fprintf(f2, "shapecode_%d_%s=%f\n", i, "tex_ang", tex_ang);
  818. fprintf(f2, "shapecode_%d_%s=%f\n", i, "tex_zoom", tex_zoom);
  819. fprintf(f2, "shapecode_%d_%s=%f\n", i, "r", r);
  820. fprintf(f2, "shapecode_%d_%s=%f\n", i, "g", g);
  821. fprintf(f2, "shapecode_%d_%s=%f\n", i, "b", b);
  822. fprintf(f2, "shapecode_%d_%s=%f\n", i, "a", a);
  823. fprintf(f2, "shapecode_%d_%s=%f\n", i, "r2", r2);
  824. fprintf(f2, "shapecode_%d_%s=%f\n", i, "g2", g2);
  825. fprintf(f2, "shapecode_%d_%s=%f\n", i, "b2", b2);
  826. fprintf(f2, "shapecode_%d_%s=%f\n", i, "a2", a2);
  827. fprintf(f2, "shapecode_%d_%s=%f\n", i, "border_r", border_r);
  828. fprintf(f2, "shapecode_%d_%s=%f\n", i, "border_g", border_g);
  829. fprintf(f2, "shapecode_%d_%s=%f\n", i, "border_b", border_b);
  830. fprintf(f2, "shapecode_%d_%s=%f\n", i, "border_a", border_a);
  831. char prefix[64];
  832. sprintf(prefix, "shape_%d_init", i); WriteCode(f2, i, m_szInit, prefix);
  833. sprintf(prefix, "shape_%d_per_frame", i); WriteCode(f2, i, m_szPerFrame, prefix);
  834. //sprintf(prefix, "shape_%d_per_point", i); WriteCode(f2, i, m_szPerPoint, prefix);
  835. if (!fOut)
  836. fclose(f2); // [sic]
  837. return 1;
  838. }
  839. void ReadCode(char* szSectionName, char* szIniFile, char* pStr, char* prefix)
  840. {
  841. // read in & compile arbitrary expressions
  842. char szLineName[32];
  843. char szLine[8192];
  844. int len;
  845. int line = 1;
  846. int char_pos = 0;
  847. bool bDone = false;
  848. while (!bDone)
  849. {
  850. sprintf(szLineName, "%s%d", prefix, line);
  851. InternalGetPrivateProfileString(szSectionName, szLineName, "~!@#$", szLine, 8192, szIniFile); // fixme
  852. len = strlen(szLine);
  853. if ((strcmp(szLine, "~!@#$")==0) || // if the key was missing,
  854. (len >= 8191-char_pos-1)) // or if we're out of space
  855. {
  856. bDone = true;
  857. }
  858. else
  859. {
  860. sprintf(&pStr[char_pos], "%s%c", szLine, LINEFEED_CONTROL_CHAR);
  861. }
  862. char_pos += len + 1;
  863. line++;
  864. }
  865. pStr[char_pos++] = 0; // null-terminate
  866. // read in & compile arbitrary expressions
  867. /*
  868. int n2 = 3 + MAX_CUSTOM_WAVES*3 + MAX_CUSTOM_SHAPES*2;
  869. for (int n=0; n<n2; n++)
  870. {
  871. char *pStr;
  872. char prefix[64];
  873. char szLineName[32];
  874. char szLine[8192];
  875. int len;
  876. int line = 1;
  877. int char_pos = 0;
  878. bool bDone = false;
  879. switch(n)
  880. {
  881. case 0: pStr = m_szPerFrameExpr; strcpy(prefix, "per_frame_"); break;
  882. case 1: pStr = m_szPerPixelExpr; strcpy(prefix, "per_pixel_"); break;
  883. case 2: pStr = m_szPerFrameInit; strcpy(prefix, "per_frame_init_"); break;
  884. default:
  885. if (n < 3 + 3*MAX_CUSTOM_WAVES)
  886. {
  887. int i = (n-3) / 3;
  888. int j = (n-3) % 3;
  889. switch(j)
  890. {
  891. case 0: pStr = m_wave[i].m_szInit; sprintf(prefix, "wave_%d_init", i); break;
  892. case 1: pStr = m_wave[i].m_szPerFrame; sprintf(prefix, "wave_%d_per_frame", i); break;
  893. case 2: pStr = m_wave[i].m_szPerPoint; sprintf(prefix, "wave_%d_per_point", i); break;
  894. }
  895. }
  896. else
  897. {
  898. int i = (n-3-3*MAX_CUSTOM_WAVES) / 2;
  899. int j = (n-3-3*MAX_CUSTOM_WAVES) % 2;
  900. switch(j)
  901. {
  902. case 0: pStr = m_shape[i].m_szInit; sprintf(prefix, "shape_%d_init", i); break;
  903. case 1: pStr = m_shape[i].m_szPerFrame; sprintf(prefix, "shape_%d_per_frame", i); break;
  904. }
  905. }
  906. }
  907. while (!bDone)
  908. {
  909. sprintf(szLineName, "%s%d", prefix, line);
  910. InternalGetPrivateProfileString(szSectionName, szLineName, "~!@#$", szLine, 8192, szIniFile); // fixme
  911. len = strlen(szLine);
  912. if ((strcmp(szLine, "~!@#$")==0) || // if the key was missing,
  913. (len >= 8191-char_pos-1)) // or if we're out of space
  914. {
  915. bDone = true;
  916. }
  917. else
  918. {
  919. sprintf(&pStr[char_pos], "%s%c", szLine, LINEFEED_CONTROL_CHAR);
  920. }
  921. char_pos += len + 1;
  922. line++;
  923. }
  924. pStr[char_pos++] = 0; // null-terminate
  925. }
  926. */
  927. }
  928. int CWave::Import(char* szSectionName, char *szIniFile, int i)
  929. {
  930. // if (GetFileAttributes(szIniFile)==0xFFFFFFFF)
  931. // return 0;
  932. char buf[64];
  933. sprintf(buf, "wavecode_%d_%s", i, "enabled" ); enabled = InternalGetPrivateProfileInt (szSectionName, buf, enabled , szIniFile);
  934. sprintf(buf, "wavecode_%d_%s", i, "samples" ); samples = InternalGetPrivateProfileInt (szSectionName, buf, samples , szIniFile);
  935. sprintf(buf, "wavecode_%d_%s", i, "sep" ); sep = InternalGetPrivateProfileInt (szSectionName, buf, sep , szIniFile);
  936. sprintf(buf, "wavecode_%d_%s", i, "bSpectrum" ); bSpectrum = InternalGetPrivateProfileInt (szSectionName, buf, bSpectrum , szIniFile);
  937. sprintf(buf, "wavecode_%d_%s", i, "bUseDots" ); bUseDots = InternalGetPrivateProfileInt (szSectionName, buf, bUseDots , szIniFile);
  938. sprintf(buf, "wavecode_%d_%s", i, "bDrawThick"); bDrawThick = InternalGetPrivateProfileInt (szSectionName, buf, bDrawThick, szIniFile);
  939. sprintf(buf, "wavecode_%d_%s", i, "bAdditive" ); bAdditive = InternalGetPrivateProfileInt (szSectionName, buf, bAdditive , szIniFile);
  940. sprintf(buf, "wavecode_%d_%s", i, "scaling" ); scaling = InternalGetPrivateProfileFloat(szSectionName, buf, scaling , szIniFile);
  941. sprintf(buf, "wavecode_%d_%s", i, "smoothing" ); smoothing = InternalGetPrivateProfileFloat(szSectionName, buf, smoothing , szIniFile);
  942. sprintf(buf, "wavecode_%d_%s", i, "r" ); r = InternalGetPrivateProfileFloat(szSectionName, buf, r , szIniFile);
  943. sprintf(buf, "wavecode_%d_%s", i, "g" ); g = InternalGetPrivateProfileFloat(szSectionName, buf, g , szIniFile);
  944. sprintf(buf, "wavecode_%d_%s", i, "b" ); b = InternalGetPrivateProfileFloat(szSectionName, buf, b , szIniFile);
  945. sprintf(buf, "wavecode_%d_%s", i, "a" ); a = InternalGetPrivateProfileFloat(szSectionName, buf, a , szIniFile);
  946. // READ THE CODE IN
  947. char prefix[64];
  948. sprintf(prefix, "wave_%d_init", i); ReadCode(szSectionName, szIniFile, m_szInit, prefix);
  949. sprintf(prefix, "wave_%d_per_frame", i); ReadCode(szSectionName, szIniFile, m_szPerFrame, prefix);
  950. sprintf(prefix, "wave_%d_per_point", i); ReadCode(szSectionName, szIniFile, m_szPerPoint, prefix);
  951. return 1;
  952. }
  953. int CShape::Import(char* szSectionName, char *szIniFile, int i)
  954. {
  955. // if (GetFileAttributes(szIniFile)==0xFFFFFFFF)
  956. // return 0;
  957. char buf[64];
  958. sprintf(buf, "shapecode_%d_%s", i, "enabled" ); enabled = InternalGetPrivateProfileInt (szSectionName, buf, enabled , szIniFile);
  959. sprintf(buf, "shapecode_%d_%s", i, "sides" ); sides = InternalGetPrivateProfileInt (szSectionName, buf, sides , szIniFile);
  960. sprintf(buf, "shapecode_%d_%s", i, "additive" ); additive = InternalGetPrivateProfileInt (szSectionName, buf, additive , szIniFile);
  961. sprintf(buf, "shapecode_%d_%s", i, "thickOutline"); thickOutline = InternalGetPrivateProfileInt (szSectionName, buf, thickOutline, szIniFile);
  962. sprintf(buf, "shapecode_%d_%s", i, "textured" ); textured = InternalGetPrivateProfileInt (szSectionName, buf, textured , szIniFile);
  963. sprintf(buf, "shapecode_%d_%s", i, "x" ); x = InternalGetPrivateProfileFloat(szSectionName, buf, x , szIniFile);
  964. sprintf(buf, "shapecode_%d_%s", i, "y" ); y = InternalGetPrivateProfileFloat(szSectionName, buf, y , szIniFile);
  965. sprintf(buf, "shapecode_%d_%s", i, "rad" ); rad = InternalGetPrivateProfileFloat(szSectionName, buf, rad , szIniFile);
  966. sprintf(buf, "shapecode_%d_%s", i, "ang" ); ang = InternalGetPrivateProfileFloat(szSectionName, buf, ang , szIniFile);
  967. sprintf(buf, "shapecode_%d_%s", i, "tex_ang" ); tex_ang = InternalGetPrivateProfileFloat(szSectionName, buf, tex_ang , szIniFile);
  968. sprintf(buf, "shapecode_%d_%s", i, "tex_zoom" ); tex_zoom = InternalGetPrivateProfileFloat(szSectionName, buf, tex_zoom , szIniFile);
  969. sprintf(buf, "shapecode_%d_%s", i, "r" ); r = InternalGetPrivateProfileFloat(szSectionName, buf, r , szIniFile);
  970. sprintf(buf, "shapecode_%d_%s", i, "g" ); g = InternalGetPrivateProfileFloat(szSectionName, buf, g , szIniFile);
  971. sprintf(buf, "shapecode_%d_%s", i, "b" ); b = InternalGetPrivateProfileFloat(szSectionName, buf, b , szIniFile);
  972. sprintf(buf, "shapecode_%d_%s", i, "a" ); a = InternalGetPrivateProfileFloat(szSectionName, buf, a , szIniFile);
  973. sprintf(buf, "shapecode_%d_%s", i, "r2" ); r2 = InternalGetPrivateProfileFloat(szSectionName, buf, r2 , szIniFile);
  974. sprintf(buf, "shapecode_%d_%s", i, "g2" ); g2 = InternalGetPrivateProfileFloat(szSectionName, buf, g2 , szIniFile);
  975. sprintf(buf, "shapecode_%d_%s", i, "b2" ); b2 = InternalGetPrivateProfileFloat(szSectionName, buf, b2 , szIniFile);
  976. sprintf(buf, "shapecode_%d_%s", i, "a2" ); a2 = InternalGetPrivateProfileFloat(szSectionName, buf, a2 , szIniFile);
  977. sprintf(buf, "shapecode_%d_%s", i, "border_r" ); border_r = InternalGetPrivateProfileFloat(szSectionName, buf, border_r , szIniFile);
  978. sprintf(buf, "shapecode_%d_%s", i, "border_g" ); border_g = InternalGetPrivateProfileFloat(szSectionName, buf, border_g , szIniFile);
  979. sprintf(buf, "shapecode_%d_%s", i, "border_b" ); border_b = InternalGetPrivateProfileFloat(szSectionName, buf, border_b , szIniFile);
  980. sprintf(buf, "shapecode_%d_%s", i, "border_a" ); border_a = InternalGetPrivateProfileFloat(szSectionName, buf, border_a , szIniFile);
  981. // READ THE CODE IN
  982. char prefix[64];
  983. sprintf(prefix, "shape_%d_init", i); ReadCode(szSectionName, szIniFile, m_szInit, prefix);
  984. sprintf(prefix, "shape_%d_per_frame", i); ReadCode(szSectionName, szIniFile, m_szPerFrame, prefix);
  985. return 1;
  986. }
  987. void CState::Import(char *szSectionName, char *szIniFile)
  988. {
  989. Default();
  990. //strcpy(m_szSection, szSectionName);
  991. //InternalGetPrivateProfileString(szSectionName, "szDesc", "<no description>", m_szDesc, sizeof(m_szDesc), szIniFile);
  992. // extract a description of the preset from the filename
  993. {
  994. // copy get the filename (without the path)
  995. char *p = strrchr(szIniFile, '/');
  996. if (p==NULL) p = szIniFile;
  997. strcpy(m_szDesc, p+1);
  998. // next remove the extension
  999. RemoveExtension(m_szDesc);
  1000. }
  1001. m_fRating = InternalGetPrivateProfileFloat(szSectionName,"fRating",m_fRating,szIniFile);
  1002. m_fDecay = InternalGetPrivateProfileFloat(szSectionName,"fDecay",m_fDecay.eval(-1),szIniFile);
  1003. m_fGammaAdj = InternalGetPrivateProfileFloat(szSectionName,"fGammaAdj" ,m_fGammaAdj.eval(-1),szIniFile);
  1004. m_fVideoEchoZoom = InternalGetPrivateProfileFloat(szSectionName,"fVideoEchoZoom",m_fVideoEchoZoom.eval(-1),szIniFile);
  1005. m_fVideoEchoAlpha = InternalGetPrivateProfileFloat(szSectionName,"fVideoEchoAlpha",m_fVideoEchoAlpha.eval(-1),szIniFile);
  1006. m_nVideoEchoOrientation = InternalGetPrivateProfileInt (szSectionName,"nVideoEchoOrientation",m_nVideoEchoOrientation,szIniFile);
  1007. m_nWaveMode = InternalGetPrivateProfileInt (szSectionName,"nWaveMode",m_nWaveMode,szIniFile);
  1008. m_bAdditiveWaves = (InternalGetPrivateProfileInt (szSectionName,"bAdditiveWaves",m_bAdditiveWaves,szIniFile) != 0);
  1009. m_bWaveDots = (InternalGetPrivateProfileInt (szSectionName,"bWaveDots",m_bWaveDots,szIniFile) != 0);
  1010. m_bWaveThick = (InternalGetPrivateProfileInt (szSectionName,"bWaveThick",m_bWaveThick,szIniFile) != 0);
  1011. m_bModWaveAlphaByVolume = (InternalGetPrivateProfileInt (szSectionName,"bModWaveAlphaByVolume",m_bModWaveAlphaByVolume,szIniFile) != 0);
  1012. m_bMaximizeWaveColor = (InternalGetPrivateProfileInt (szSectionName,"bMaximizeWaveColor" ,m_bMaximizeWaveColor,szIniFile) != 0);
  1013. m_bTexWrap = (InternalGetPrivateProfileInt (szSectionName,"bTexWrap", m_bTexWrap,szIniFile) != 0);
  1014. m_bDarkenCenter = (InternalGetPrivateProfileInt (szSectionName,"bDarkenCenter", m_bDarkenCenter,szIniFile) != 0);
  1015. m_bRedBlueStereo = (InternalGetPrivateProfileInt (szSectionName,"bRedBlueStereo", m_bRedBlueStereo,szIniFile) != 0);
  1016. m_bBrighten = (InternalGetPrivateProfileInt (szSectionName,"bBrighten",m_bBrighten ,szIniFile) != 0);
  1017. m_bDarken = (InternalGetPrivateProfileInt (szSectionName,"bDarken" ,m_bDarken ,szIniFile) != 0);
  1018. m_bSolarize = (InternalGetPrivateProfileInt (szSectionName,"bSolarize",m_bSolarize ,szIniFile) != 0);
  1019. m_bInvert = (InternalGetPrivateProfileInt (szSectionName,"bInvert" ,m_bInvert ,szIniFile) != 0);
  1020. m_fWaveAlpha = InternalGetPrivateProfileFloat(szSectionName,"fWaveAlpha",m_fWaveAlpha.eval(-1),szIniFile);
  1021. m_fWaveScale = InternalGetPrivateProfileFloat(szSectionName,"fWaveScale",m_fWaveScale.eval(-1),szIniFile);
  1022. m_fWaveSmoothing = InternalGetPrivateProfileFloat(szSectionName,"fWaveSmoothing",m_fWaveSmoothing.eval(-1),szIniFile);
  1023. m_fWaveParam = InternalGetPrivateProfileFloat(szSectionName,"fWaveParam",m_fWaveParam.eval(-1),szIniFile);
  1024. m_fModWaveAlphaStart = InternalGetPrivateProfileFloat(szSectionName,"fModWaveAlphaStart",m_fModWaveAlphaStart.eval(-1),szIniFile);
  1025. m_fModWaveAlphaEnd = InternalGetPrivateProfileFloat(szSectionName,"fModWaveAlphaEnd",m_fModWaveAlphaEnd.eval(-1),szIniFile);
  1026. m_fWarpAnimSpeed = InternalGetPrivateProfileFloat(szSectionName,"fWarpAnimSpeed",m_fWarpAnimSpeed,szIniFile);
  1027. m_fWarpScale = InternalGetPrivateProfileFloat(szSectionName,"fWarpScale",m_fWarpScale.eval(-1),szIniFile);
  1028. m_fZoomExponent = InternalGetPrivateProfileFloat(szSectionName,"fZoomExponent",m_fZoomExponent.eval(-1),szIniFile);
  1029. m_fShader = InternalGetPrivateProfileFloat(szSectionName,"fShader",m_fShader.eval(-1),szIniFile);
  1030. m_fZoom = InternalGetPrivateProfileFloat(szSectionName,"zoom",m_fZoom.eval(-1),szIniFile);
  1031. m_fRot = InternalGetPrivateProfileFloat(szSectionName,"rot",m_fRot.eval(-1),szIniFile);
  1032. m_fRotCX = InternalGetPrivateProfileFloat(szSectionName,"cx",m_fRotCX.eval(-1),szIniFile);
  1033. m_fRotCY = InternalGetPrivateProfileFloat(szSectionName,"cy",m_fRotCY.eval(-1),szIniFile);
  1034. m_fXPush = InternalGetPrivateProfileFloat(szSectionName,"dx",m_fXPush.eval(-1),szIniFile);
  1035. m_fYPush = InternalGetPrivateProfileFloat(szSectionName,"dy",m_fYPush.eval(-1),szIniFile);
  1036. m_fWarpAmount = InternalGetPrivateProfileFloat(szSectionName,"warp",m_fWarpAmount.eval(-1),szIniFile);
  1037. m_fStretchX = InternalGetPrivateProfileFloat(szSectionName,"sx",m_fStretchX.eval(-1),szIniFile);
  1038. m_fStretchY = InternalGetPrivateProfileFloat(szSectionName,"sy",m_fStretchY.eval(-1),szIniFile);
  1039. m_fWaveR = InternalGetPrivateProfileFloat(szSectionName,"wave_r",m_fRot.eval(-1),szIniFile);
  1040. m_fWaveG = InternalGetPrivateProfileFloat(szSectionName,"wave_g",m_fRot.eval(-1),szIniFile);
  1041. m_fWaveB = InternalGetPrivateProfileFloat(szSectionName,"wave_b",m_fRot.eval(-1),szIniFile);
  1042. m_fWaveX = InternalGetPrivateProfileFloat(szSectionName,"wave_x",m_fRot.eval(-1),szIniFile);
  1043. m_fWaveY = InternalGetPrivateProfileFloat(szSectionName,"wave_y",m_fRot.eval(-1),szIniFile);
  1044. m_fOuterBorderSize = InternalGetPrivateProfileFloat(szSectionName,"ob_size",m_fOuterBorderSize.eval(-1),szIniFile);
  1045. m_fOuterBorderR = InternalGetPrivateProfileFloat(szSectionName,"ob_r", m_fOuterBorderR.eval(-1),szIniFile);
  1046. m_fOuterBorderG = InternalGetPrivateProfileFloat(szSectionName,"ob_g", m_fOuterBorderG.eval(-1),szIniFile);
  1047. m_fOuterBorderB = InternalGetPrivateProfileFloat(szSectionName,"ob_b", m_fOuterBorderB.eval(-1),szIniFile);
  1048. m_fOuterBorderA = InternalGetPrivateProfileFloat(szSectionName,"ob_a", m_fOuterBorderA.eval(-1),szIniFile);
  1049. m_fInnerBorderSize = InternalGetPrivateProfileFloat(szSectionName,"ib_size",m_fInnerBorderSize.eval(-1),szIniFile);
  1050. m_fInnerBorderR = InternalGetPrivateProfileFloat(szSectionName,"ib_r", m_fInnerBorderR.eval(-1),szIniFile);
  1051. m_fInnerBorderG = InternalGetPrivateProfileFloat(szSectionName,"ib_g", m_fInnerBorderG.eval(-1),szIniFile);
  1052. m_fInnerBorderB = InternalGetPrivateProfileFloat(szSectionName,"ib_b", m_fInnerBorderB.eval(-1),szIniFile);
  1053. m_fInnerBorderA = InternalGetPrivateProfileFloat(szSectionName,"ib_a", m_fInnerBorderA.eval(-1),szIniFile);
  1054. m_fMvX = InternalGetPrivateProfileFloat(szSectionName,"nMotionVectorsX", m_fMvX.eval(-1),szIniFile);
  1055. m_fMvY = InternalGetPrivateProfileFloat(szSectionName,"nMotionVectorsY", m_fMvY.eval(-1),szIniFile);
  1056. m_fMvDX = InternalGetPrivateProfileFloat(szSectionName,"mv_dx", m_fMvDX.eval(-1),szIniFile);
  1057. m_fMvDY = InternalGetPrivateProfileFloat(szSectionName,"mv_dy", m_fMvDY.eval(-1),szIniFile);
  1058. m_fMvL = InternalGetPrivateProfileFloat(szSectionName,"mv_l", m_fMvL.eval(-1),szIniFile);
  1059. m_fMvR = InternalGetPrivateProfileFloat(szSectionName,"mv_r", m_fMvR.eval(-1),szIniFile);
  1060. m_fMvG = InternalGetPrivateProfileFloat(szSectionName,"mv_g", m_fMvG.eval(-1),szIniFile);
  1061. m_fMvB = InternalGetPrivateProfileFloat(szSectionName,"mv_b", m_fMvB.eval(-1),szIniFile);
  1062. m_fMvA = (InternalGetPrivateProfileInt (szSectionName,"bMotionVectorsOn",false,szIniFile) == 0) ? 0.0f : 1.0f; // for backwards compatibility
  1063. m_fMvA = InternalGetPrivateProfileFloat(szSectionName,"mv_a", m_fMvA.eval(-1),szIniFile);
  1064. for (int i=0; i<MAX_CUSTOM_WAVES; i++)
  1065. {
  1066. m_wave[i].Import(szSectionName, szIniFile, i);
  1067. }
  1068. for (int i=0; i<MAX_CUSTOM_SHAPES; i++)
  1069. {
  1070. m_shape[i].Import(szSectionName, szIniFile, i);
  1071. }
  1072. ReadCode(szSectionName, szIniFile, m_szPerFrameInit, "per_frame_init_");
  1073. ReadCode(szSectionName, szIniFile, m_szPerFrameExpr, "per_frame_");
  1074. ReadCode(szSectionName, szIniFile, m_szPerPixelExpr, "per_pixel_");
  1075. /*
  1076. // read in & compile arbitrary expressions
  1077. int n2 = 3 + MAX_CUSTOM_WAVES*3 + MAX_CUSTOM_SHAPES*2;
  1078. for (int n=0; n<n2; n++)
  1079. {
  1080. char *pStr;
  1081. char prefix[64];
  1082. char szLineName[32];
  1083. char szLine[8192];
  1084. int len;
  1085. int line = 1;
  1086. int char_pos = 0;
  1087. bool bDone = false;
  1088. switch(n)
  1089. {
  1090. case 0: pStr = m_szPerFrameExpr; strcpy(prefix, "per_frame_"); break;
  1091. case 1: pStr = m_szPerPixelExpr; strcpy(prefix, "per_pixel_"); break;
  1092. case 2: pStr = m_szPerFrameInit; strcpy(prefix, "per_frame_init_"); break;
  1093. default:
  1094. if (n < 3 + 3*MAX_CUSTOM_WAVES)
  1095. {
  1096. int i = (n-3) / 3;
  1097. int j = (n-3) % 3;
  1098. switch(j)
  1099. {
  1100. case 0: pStr = m_wave[i].m_szInit; sprintf(prefix, "wave_%d_init", i); break;
  1101. case 1: pStr = m_wave[i].m_szPerFrame; sprintf(prefix, "wave_%d_per_frame", i); break;
  1102. case 2: pStr = m_wave[i].m_szPerPoint; sprintf(prefix, "wave_%d_per_point", i); break;
  1103. }
  1104. }
  1105. else
  1106. {
  1107. int i = (n-3-3*MAX_CUSTOM_WAVES) / 2;
  1108. int j = (n-3-3*MAX_CUSTOM_WAVES) % 2;
  1109. switch(j)
  1110. {
  1111. case 0: pStr = m_shape[i].m_szInit; sprintf(prefix, "shape_%d_init", i); break;
  1112. case 1: pStr = m_shape[i].m_szPerFrame; sprintf(prefix, "shape_%d_per_frame", i); break;
  1113. }
  1114. }
  1115. }
  1116. while (!bDone)
  1117. {
  1118. sprintf(szLineName, "%s%d", prefix, line);
  1119. InternalGetPrivateProfileString(szSectionName, szLineName, "~!@#$", szLine, 8192, szIniFile); // fixme
  1120. len = strlen(szLine);
  1121. if ((strcmp(szLine, "~!@#$")==0) || // if the key was missing,
  1122. (len >= 8191-char_pos-1)) // or if we're out of space
  1123. {
  1124. bDone = true;
  1125. }
  1126. else
  1127. {
  1128. sprintf(&pStr[char_pos], "%s%c", szLine, LINEFEED_CONTROL_CHAR);
  1129. }
  1130. char_pos += len + 1;
  1131. line++;
  1132. }
  1133. pStr[char_pos++] = 0; // null-terminate
  1134. }
  1135. */
  1136. RecompileExpressions();
  1137. }
  1138. void CState::FreeVarsAndCode()
  1139. {
  1140. // free the compiled expressions
  1141. if (m_pf_codehandle)
  1142. {
  1143. freeCode(m_pf_codehandle);
  1144. m_pf_codehandle = NULL;
  1145. }
  1146. if (m_pp_codehandle)
  1147. {
  1148. freeCode(m_pp_codehandle);
  1149. m_pp_codehandle = NULL;
  1150. }
  1151. for (int i=0; i<MAX_CUSTOM_WAVES; i++)
  1152. {
  1153. if (m_wave[i].m_pf_codehandle)
  1154. {
  1155. freeCode(m_wave[i].m_pf_codehandle);
  1156. m_wave[i].m_pf_codehandle = NULL;
  1157. }
  1158. if (m_wave[i].m_pp_codehandle)
  1159. {
  1160. freeCode(m_wave[i].m_pp_codehandle);
  1161. m_wave[i].m_pp_codehandle = NULL;
  1162. }
  1163. }
  1164. for (int i=0; i<MAX_CUSTOM_SHAPES; i++)
  1165. {
  1166. if (m_shape[i].m_pf_codehandle)
  1167. {
  1168. freeCode(m_shape[i].m_pf_codehandle);
  1169. m_shape[i].m_pf_codehandle = NULL;
  1170. }
  1171. /*if (m_shape[i].m_pp_codehandle)
  1172. {
  1173. freeCode(m_shape[i].m_pp_codehandle);
  1174. m_shape[i].m_pp_codehandle = NULL;
  1175. }*/
  1176. }
  1177. // free our text version of the expressions? - no!
  1178. //m_szPerFrameExpr[0] = 0;
  1179. //m_szPerPixelExpr[0] = 0;
  1180. // free the old variable names & reregister the built-in variables (since they got nuked too)
  1181. memset(m_pv_vars, 0, sizeof(varType)*EVAL_MAX_VARS);
  1182. memset(m_pf_vars, 0, sizeof(varType)*EVAL_MAX_VARS);
  1183. for (int i=0; i<MAX_CUSTOM_WAVES; i++)
  1184. {
  1185. memset(m_wave[i].m_pf_vars, 0, sizeof(varType)*EVAL_MAX_VARS);
  1186. memset(m_wave[i].m_pp_vars, 0, sizeof(varType)*EVAL_MAX_VARS);
  1187. }
  1188. for (int i=0; i<MAX_CUSTOM_SHAPES; i++)
  1189. {
  1190. memset(m_shape[i].m_pf_vars, 0, sizeof(varType)*EVAL_MAX_VARS);
  1191. //memset(m_shape[i].m_pp_vars, 0, sizeof(varType)*EVAL_MAX_VARS);
  1192. }
  1193. RegisterBuiltInVariables(0xFFFFFFFF);
  1194. }
  1195. void CState::StripLinefeedCharsAndComments(char *src, char *dest)
  1196. {
  1197. // replaces all LINEFEED_CONTROL_CHAR characters in src with a space in dest;
  1198. // also strips out all comments (beginning with '//' and going til end of line).
  1199. // Restriction: sizeof(dest) must be >= sizeof(src).
  1200. int i2 = 0;
  1201. int len = strlen(src);
  1202. int bComment = false;
  1203. for (int i=0; i<len; i++)
  1204. {
  1205. if (bComment)
  1206. {
  1207. if (src[i] == LINEFEED_CONTROL_CHAR)
  1208. bComment = false;
  1209. }
  1210. else
  1211. {
  1212. if ((src[i] =='\\' && src[i+1] =='\\') || (src[i] =='/' && src[i+1] =='/'))
  1213. bComment = true;
  1214. else if (src[i] != LINEFEED_CONTROL_CHAR)
  1215. dest[i2++] = src[i];
  1216. }
  1217. }
  1218. dest[i2] = 0;
  1219. }
  1220. void CState::RecompileExpressions(int flags, int bReInit)
  1221. {
  1222. // before we get started, if we redo the init code for the preset, we have to redo
  1223. // other things too, because q1-q8 could change.
  1224. if ((flags & RECOMPILE_PRESET_CODE) && bReInit)
  1225. {
  1226. flags |= RECOMPILE_WAVE_CODE;
  1227. flags |= RECOMPILE_SHAPE_CODE;
  1228. }
  1229. // free old code handles
  1230. if (flags & RECOMPILE_PRESET_CODE)
  1231. {
  1232. if (m_pf_codehandle)
  1233. {
  1234. freeCode(m_pf_codehandle);
  1235. m_pf_codehandle = NULL;
  1236. }
  1237. if (m_pp_codehandle)
  1238. {
  1239. freeCode(m_pp_codehandle);
  1240. m_pp_codehandle = NULL;
  1241. }
  1242. }
  1243. if (flags & RECOMPILE_WAVE_CODE)
  1244. {
  1245. for (int i=0; i<MAX_CUSTOM_WAVES; i++)
  1246. {
  1247. if (m_wave[i].m_pf_codehandle)
  1248. {
  1249. freeCode(m_wave[i].m_pf_codehandle);
  1250. m_wave[i].m_pf_codehandle = NULL;
  1251. }
  1252. if (m_wave[i].m_pp_codehandle)
  1253. {
  1254. freeCode(m_wave[i].m_pp_codehandle);
  1255. m_wave[i].m_pp_codehandle = NULL;
  1256. }
  1257. }
  1258. }
  1259. if (flags & RECOMPILE_SHAPE_CODE)
  1260. {
  1261. for (int i=0; i<MAX_CUSTOM_SHAPES; i++)
  1262. {
  1263. if (m_shape[i].m_pf_codehandle)
  1264. {
  1265. freeCode(m_shape[i].m_pf_codehandle);
  1266. m_shape[i].m_pf_codehandle = NULL;
  1267. }
  1268. /*if (m_shape[i].m_pp_codehandle)
  1269. {
  1270. freeCode(m_shape[i].m_pp_codehandle);
  1271. m_shape[i].m_pp_codehandle = NULL;
  1272. }*/
  1273. }
  1274. }
  1275. // if we're recompiling init code, clear vars to zero, and re-register built-in variables.
  1276. if (bReInit)
  1277. {
  1278. if (flags & RECOMPILE_PRESET_CODE)
  1279. {
  1280. memset(m_pv_vars, 0, sizeof(varType)*EVAL_MAX_VARS);
  1281. memset(m_pf_vars, 0, sizeof(varType)*EVAL_MAX_VARS);
  1282. }
  1283. if (flags & RECOMPILE_WAVE_CODE)
  1284. {
  1285. for (int i=0; i<MAX_CUSTOM_WAVES; i++)
  1286. {
  1287. memset(m_wave[i].m_pf_vars, 0, sizeof(varType)*EVAL_MAX_VARS);
  1288. memset(m_wave[i].m_pp_vars, 0, sizeof(varType)*EVAL_MAX_VARS);
  1289. }
  1290. }
  1291. if (flags & RECOMPILE_SHAPE_CODE)
  1292. {
  1293. for (int i=0; i<MAX_CUSTOM_SHAPES; i++)
  1294. {
  1295. memset(m_shape[i].m_pf_vars, 0, sizeof(varType)*EVAL_MAX_VARS);
  1296. //memset(m_shape[i].m_pp_vars, 0, sizeof(varType)*EVAL_MAX_VARS);
  1297. }
  1298. }
  1299. RegisterBuiltInVariables(flags);
  1300. }
  1301. // QUICK FIX: if the code strings ONLY have spaces and linefeeds, erase them,
  1302. // because for some strange reason this causes errors in compileCode().
  1303. int n2 = 3 + MAX_CUSTOM_WAVES*3 + MAX_CUSTOM_SHAPES*2;
  1304. for (int n=0; n<n2; n++)
  1305. {
  1306. char *pOrig;
  1307. switch(n)
  1308. {
  1309. case 0: pOrig = m_szPerFrameExpr; break;
  1310. case 1: pOrig = m_szPerPixelExpr; break;
  1311. case 2: pOrig = m_szPerFrameInit; break;
  1312. default:
  1313. if (n < 3 + 3*MAX_CUSTOM_WAVES)
  1314. {
  1315. int i = (n-3) / 3;
  1316. int j = (n-3) % 3;
  1317. switch(j)
  1318. {
  1319. case 0: pOrig = m_wave[i].m_szInit; break;
  1320. case 1: pOrig = m_wave[i].m_szPerFrame; break;
  1321. case 2: pOrig = m_wave[i].m_szPerPoint; break;
  1322. }
  1323. }
  1324. else
  1325. {
  1326. int i = (n-3-3*MAX_CUSTOM_WAVES) / 2;
  1327. int j = (n-3-3*MAX_CUSTOM_WAVES) % 2;
  1328. switch(j)
  1329. {
  1330. case 0: pOrig = m_shape[i].m_szInit; break;
  1331. case 1: pOrig = m_shape[i].m_szPerFrame; break;
  1332. }
  1333. }
  1334. }
  1335. char *p = pOrig;
  1336. while (*p==' ' || *p==LINEFEED_CONTROL_CHAR) p++;
  1337. if (*p == 0) pOrig[0] = 0;
  1338. }
  1339. // COMPILE NEW CODE.
  1340. #ifndef _NO_EXPR_
  1341. {
  1342. // clear any old error msg.:
  1343. g_plugin->m_fShowUserMessageUntilThisTime = g_plugin->GetTime();
  1344. char buf[8192*3];
  1345. if (flags & RECOMPILE_PRESET_CODE)
  1346. {
  1347. resetVars(m_pf_vars);
  1348. // 1. compile AND EXECUTE preset init code
  1349. StripLinefeedCharsAndComments(m_szPerFrameInit, buf);
  1350. if (buf[0] && bReInit)
  1351. {
  1352. int pf_codehandle_init;
  1353. if ( ! (pf_codehandle_init = compileCode(buf)))
  1354. {
  1355. sprintf(g_plugin->m_szUserMessage, "warning: preset \"%s\": error in 'per_frame_init' code", m_szDesc);
  1356. g_plugin->m_fShowUserMessageUntilThisTime = g_plugin->GetTime() + 6.0f;
  1357. q_values_after_init_code[0] = 0;
  1358. q_values_after_init_code[1] = 0;
  1359. q_values_after_init_code[2] = 0;
  1360. q_values_after_init_code[3] = 0;
  1361. q_values_after_init_code[4] = 0;
  1362. q_values_after_init_code[5] = 0;
  1363. q_values_after_init_code[6] = 0;
  1364. q_values_after_init_code[7] = 0;
  1365. monitor_after_init_code = 0;
  1366. }
  1367. else
  1368. {
  1369. // now execute the code, save the values of q1..q8, and clean up the code!
  1370. g_plugin->LoadPerFrameEvallibVars(g_plugin->m_pState);
  1371. executeCode(pf_codehandle_init);
  1372. q_values_after_init_code[0] = *var_pf_q1;
  1373. q_values_after_init_code[1] = *var_pf_q2;
  1374. q_values_after_init_code[2] = *var_pf_q3;
  1375. q_values_after_init_code[3] = *var_pf_q4;
  1376. q_values_after_init_code[4] = *var_pf_q5;
  1377. q_values_after_init_code[5] = *var_pf_q6;
  1378. q_values_after_init_code[6] = *var_pf_q7;
  1379. q_values_after_init_code[7] = *var_pf_q8;
  1380. monitor_after_init_code = *var_pf_monitor;
  1381. freeCode(pf_codehandle_init);
  1382. pf_codehandle_init = NULL;
  1383. }
  1384. }
  1385. // 2. compile preset per-frame code
  1386. StripLinefeedCharsAndComments(m_szPerFrameExpr, buf);
  1387. if (buf[0])
  1388. {
  1389. if ( ! (m_pf_codehandle = compileCode(buf)))
  1390. {
  1391. sprintf(g_plugin->m_szUserMessage, "warning: preset \"%s\": error in 'per_frame' code", m_szDesc);
  1392. g_plugin->m_fShowUserMessageUntilThisTime = g_plugin->GetTime() + 6.0f;
  1393. }
  1394. }
  1395. resetVars(NULL);
  1396. resetVars(m_pv_vars);
  1397. // 3. compile preset per-pixel code
  1398. StripLinefeedCharsAndComments(m_szPerPixelExpr, buf);
  1399. if (buf[0])
  1400. {
  1401. if ( ! (m_pp_codehandle = compileCode(buf)))
  1402. {
  1403. sprintf(g_plugin->m_szUserMessage, "warning: preset \"%s\": error in 'per_pixel' code", m_szDesc);
  1404. g_plugin->m_fShowUserMessageUntilThisTime = g_plugin->GetTime() + 6.0f;
  1405. }
  1406. }
  1407. resetVars(NULL);
  1408. }
  1409. if (flags & RECOMPILE_WAVE_CODE)
  1410. {
  1411. for (int i=0; i<MAX_CUSTOM_WAVES; i++)
  1412. {
  1413. // 1. compile AND EXECUTE custom waveform init code
  1414. StripLinefeedCharsAndComments(m_wave[i].m_szInit, buf);
  1415. if (buf[0] && bReInit)
  1416. {
  1417. resetVars(m_wave[i].m_pf_vars);
  1418. {
  1419. int codehandle_temp;
  1420. if ( ! (codehandle_temp = compileCode(buf)))
  1421. {
  1422. sprintf(g_plugin->m_szUserMessage, "warning: preset \"%s\": error in wave %d init code", m_szDesc, i);
  1423. g_plugin->m_fShowUserMessageUntilThisTime = g_plugin->GetTime() + 6.0f;
  1424. *m_wave[i].var_pf_q1 = q_values_after_init_code[0];
  1425. *m_wave[i].var_pf_q2 = q_values_after_init_code[1];
  1426. *m_wave[i].var_pf_q3 = q_values_after_init_code[2];
  1427. *m_wave[i].var_pf_q4 = q_values_after_init_code[3];
  1428. *m_wave[i].var_pf_q5 = q_values_after_init_code[4];
  1429. *m_wave[i].var_pf_q6 = q_values_after_init_code[5];
  1430. *m_wave[i].var_pf_q7 = q_values_after_init_code[6];
  1431. *m_wave[i].var_pf_q8 = q_values_after_init_code[7];
  1432. m_wave[i].t_values_after_init_code[0] = 0;
  1433. m_wave[i].t_values_after_init_code[1] = 0;
  1434. m_wave[i].t_values_after_init_code[2] = 0;
  1435. m_wave[i].t_values_after_init_code[3] = 0;
  1436. m_wave[i].t_values_after_init_code[4] = 0;
  1437. m_wave[i].t_values_after_init_code[5] = 0;
  1438. m_wave[i].t_values_after_init_code[6] = 0;
  1439. m_wave[i].t_values_after_init_code[7] = 0;
  1440. }
  1441. else
  1442. {
  1443. // now execute the code, save the values of q1..q8, and clean up the code!
  1444. g_plugin->LoadCustomWavePerFrameEvallibVars(g_plugin->m_pState, i);
  1445. executeCode(codehandle_temp);
  1446. m_wave[i].t_values_after_init_code[0] = *m_wave[i].var_pf_t1;
  1447. m_wave[i].t_values_after_init_code[1] = *m_wave[i].var_pf_t2;
  1448. m_wave[i].t_values_after_init_code[2] = *m_wave[i].var_pf_t3;
  1449. m_wave[i].t_values_after_init_code[3] = *m_wave[i].var_pf_t4;
  1450. m_wave[i].t_values_after_init_code[4] = *m_wave[i].var_pf_t5;
  1451. m_wave[i].t_values_after_init_code[5] = *m_wave[i].var_pf_t6;
  1452. m_wave[i].t_values_after_init_code[6] = *m_wave[i].var_pf_t7;
  1453. m_wave[i].t_values_after_init_code[7] = *m_wave[i].var_pf_t8;
  1454. freeCode(codehandle_temp);
  1455. codehandle_temp = NULL;
  1456. }
  1457. }
  1458. resetVars(NULL);
  1459. }
  1460. // 2. compile custom waveform per-frame code
  1461. StripLinefeedCharsAndComments(m_wave[i].m_szPerFrame, buf);
  1462. if (buf[0])
  1463. {
  1464. resetVars(m_wave[i].m_pf_vars);
  1465. if ( ! (m_wave[i].m_pf_codehandle = compileCode(buf)))
  1466. {
  1467. sprintf(g_plugin->m_szUserMessage, "warning: preset \"%s\": error in wave %d per-frame code", m_szDesc, i);
  1468. g_plugin->m_fShowUserMessageUntilThisTime = g_plugin->GetTime() + 6.0f;
  1469. }
  1470. resetVars(NULL);
  1471. }
  1472. // 3. compile custom waveform per-point code
  1473. StripLinefeedCharsAndComments(m_wave[i].m_szPerPoint, buf);
  1474. if (buf[0])
  1475. {
  1476. resetVars(m_wave[i].m_pp_vars);
  1477. if ( ! (m_wave[i].m_pp_codehandle = compileCode(buf)))
  1478. {
  1479. sprintf(g_plugin->m_szUserMessage, "warning: preset \"%s\": error in wave %d per-point code", m_szDesc, i);
  1480. g_plugin->m_fShowUserMessageUntilThisTime = g_plugin->GetTime() + 6.0f;
  1481. }
  1482. resetVars(NULL);
  1483. }
  1484. }
  1485. }
  1486. if (flags & RECOMPILE_SHAPE_CODE)
  1487. {
  1488. for (int i=0; i<MAX_CUSTOM_SHAPES; i++)
  1489. {
  1490. // 1. compile AND EXECUTE custom shape init code
  1491. StripLinefeedCharsAndComments(m_shape[i].m_szInit, buf);
  1492. if (buf[0] && bReInit)
  1493. {
  1494. resetVars(m_shape[i].m_pf_vars);
  1495. #ifndef _NO_EXPR_
  1496. {
  1497. int codehandle_temp;
  1498. if ( ! (codehandle_temp = compileCode(buf)))
  1499. {
  1500. sprintf(g_plugin->m_szUserMessage, "warning: preset \"%s\": error in shape %d init code", m_szDesc, i);
  1501. g_plugin->m_fShowUserMessageUntilThisTime = g_plugin->GetTime() + 6.0f;
  1502. *m_shape[i].var_pf_q1 = q_values_after_init_code[0];
  1503. *m_shape[i].var_pf_q2 = q_values_after_init_code[1];
  1504. *m_shape[i].var_pf_q3 = q_values_after_init_code[2];
  1505. *m_shape[i].var_pf_q4 = q_values_after_init_code[3];
  1506. *m_shape[i].var_pf_q5 = q_values_after_init_code[4];
  1507. *m_shape[i].var_pf_q6 = q_values_after_init_code[5];
  1508. *m_shape[i].var_pf_q7 = q_values_after_init_code[6];
  1509. *m_shape[i].var_pf_q8 = q_values_after_init_code[7];
  1510. m_shape[i].t_values_after_init_code[0] = 0;
  1511. m_shape[i].t_values_after_init_code[1] = 0;
  1512. m_shape[i].t_values_after_init_code[2] = 0;
  1513. m_shape[i].t_values_after_init_code[3] = 0;
  1514. m_shape[i].t_values_after_init_code[4] = 0;
  1515. m_shape[i].t_values_after_init_code[5] = 0;
  1516. m_shape[i].t_values_after_init_code[6] = 0;
  1517. m_shape[i].t_values_after_init_code[7] = 0;
  1518. }
  1519. else
  1520. {
  1521. // now execute the code, save the values of q1..q8, and clean up the code!
  1522. g_plugin->LoadCustomShapePerFrameEvallibVars(g_plugin->m_pState, i);
  1523. executeCode(codehandle_temp);
  1524. m_shape[i].t_values_after_init_code[0] = *m_shape[i].var_pf_t1;
  1525. m_shape[i].t_values_after_init_code[1] = *m_shape[i].var_pf_t2;
  1526. m_shape[i].t_values_after_init_code[2] = *m_shape[i].var_pf_t3;
  1527. m_shape[i].t_values_after_init_code[3] = *m_shape[i].var_pf_t4;
  1528. m_shape[i].t_values_after_init_code[4] = *m_shape[i].var_pf_t5;
  1529. m_shape[i].t_values_after_init_code[5] = *m_shape[i].var_pf_t6;
  1530. m_shape[i].t_values_after_init_code[6] = *m_shape[i].var_pf_t7;
  1531. m_shape[i].t_values_after_init_code[7] = *m_shape[i].var_pf_t8;
  1532. freeCode(codehandle_temp);
  1533. codehandle_temp = NULL;
  1534. }
  1535. }
  1536. #endif
  1537. resetVars(NULL);
  1538. }
  1539. // 2. compile custom shape per-frame code
  1540. StripLinefeedCharsAndComments(m_shape[i].m_szPerFrame, buf);
  1541. if (buf[0])
  1542. {
  1543. resetVars(m_shape[i].m_pf_vars);
  1544. #ifndef _NO_EXPR_
  1545. if ( ! (m_shape[i].m_pf_codehandle = compileCode(buf)))
  1546. {
  1547. sprintf(g_plugin->m_szUserMessage, "warning: preset \"%s\": error in shape %d per-frame code", m_szDesc, i);
  1548. g_plugin->m_fShowUserMessageUntilThisTime = g_plugin->GetTime() + 6.0f;
  1549. }
  1550. #endif
  1551. resetVars(NULL);
  1552. }
  1553. /*
  1554. // 3. compile custom shape per-point code
  1555. StripLinefeedCharsAndComments(m_shape[i].m_szPerPoint, buf);
  1556. if (buf[0])
  1557. {
  1558. resetVars(m_shape[i].m_pp_vars);
  1559. #ifndef _NO_EXPR_
  1560. if ( ! (m_shape[i].m_pp_codehandle = compileCode(buf)))
  1561. {
  1562. sprintf(g_plugin->m_szUserMessage, "warning: preset \"%s\": error in shape %d per-point code", m_szDesc, i);
  1563. g_plugin->m_fShowUserMessageUntilThisTime = g_plugin->GetTime() + 6.0f;
  1564. }
  1565. #endif
  1566. resetVars(NULL);
  1567. }
  1568. */
  1569. }
  1570. }
  1571. }
  1572. #endif
  1573. }
  1574. CBlendableFloat::CBlendableFloat()
  1575. {
  1576. m_bBlending = false;
  1577. }
  1578. CBlendableFloat::~CBlendableFloat()
  1579. {
  1580. }
  1581. //--------------------------------------------------------------------------------
  1582. float CBlendableFloat::eval(float fTime)
  1583. {
  1584. if (fTime < 0)
  1585. {
  1586. return val;
  1587. }
  1588. if (m_bBlending && (fTime > m_fBlendStartTime + m_fBlendDuration) || (fTime < m_fBlendStartTime))
  1589. {
  1590. m_bBlending = false;
  1591. }
  1592. if (!m_bBlending)
  1593. {
  1594. return val;
  1595. }
  1596. else
  1597. {
  1598. float mix = (fTime - m_fBlendStartTime) / m_fBlendDuration;
  1599. return (m_fBlendFrom*(1.0f - mix) + val*mix);
  1600. }
  1601. }
  1602. //--------------------------------------------------------------------------------
  1603. void CBlendableFloat::StartBlendFrom(CBlendableFloat *f_from, float fAnimTime, float fDuration)
  1604. {
  1605. if (fDuration < 0.001f)
  1606. return;
  1607. m_fBlendFrom = f_from->eval(fAnimTime);
  1608. m_bBlending = true;
  1609. m_fBlendStartTime = fAnimTime;
  1610. m_fBlendDuration = fDuration;
  1611. }