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

http://github.com/xbmc/xbmc · C++ · 1797 lines · 1229 code · 159 blank · 409 comment · 127 complexity · 0424d2390e76cb14efe62fe81527dd3c MD5 · raw file

Large files are truncated click here to view the full file

  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" ); a