eval.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:18k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * eval.c:
  3.  *****************************************************************************
  4.  * Copyright (C) 2004 VideoLAN
  5.  * $Id: eval.c 8205 2004-07-17 13:55:48Z asmax $
  6.  *
  7.  * Authors: Cyril Deguet <asmax@videolan.org>
  8.  *          code from projectM http://xmms-projectm.sourceforge.net
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  23.  *****************************************************************************/
  24. /* Evaluation Code */
  25. #include <stdio.h>
  26. #include <stdlib.h>
  27. #include "common.h"
  28. #include "fatal.h"
  29. #include "param_types.h"
  30. #include "func_types.h"
  31. #include "expr_types.h"
  32. #include "eval.h"
  33. #include "engine_vars.h"
  34. #include "builtin_funcs.h"
  35. #define EVAL_ERROR -1
  36. /* All infix operators (except '=') are prototyped here */
  37. infix_op_t * infix_add, * infix_minus, * infix_div, * infix_mult,
  38.   * infix_or, * infix_and, * infix_mod, * infix_negative, * infix_positive;
  39. int mesh_i=-1, mesh_j=-1;
  40. static inline double eval_tree_expr(tree_expr_t * tree_expr);
  41. static inline double eval_prefun_expr(prefun_expr_t * prefun_expr);
  42. static inline double eval_val_expr(val_expr_t * val_expr);
  43. inline double eval_gen_expr(gen_expr_t * gen_expr) {
  44.   double l;
  45.   if (gen_expr == NULL) 
  46.      return 0;
  47.  
  48.   switch(gen_expr->type) {
  49.   case VAL_T:  
  50.     return eval_val_expr(gen_expr->item);
  51.   case PREFUN_T:
  52.     l = eval_prefun_expr(gen_expr->item);
  53.     //if (EVAL_DEBUG) printf("eval_gen_expr: prefix function return value: %fn", l);
  54.     return l;
  55.   case TREE_T:
  56.     return eval_tree_expr(gen_expr->item);
  57.   default:
  58.     #ifdef EVAL_DEBUG
  59.     printf("eval_gen_expr: general expression matched no cases!n");
  60.     #endif
  61.     return EVAL_ERROR;
  62.   }  
  63. }
  64. /* Evaluates functions in prefix form */
  65. static inline double eval_prefun_expr(prefun_expr_t * prefun_expr) {
  66. int i;
  67.        
  68. /* This is slightly less than safe, since
  69.    who knows if the passed argument is valid. For 
  70.    speed purposes we'll go with this */
  71. double arg_list[prefun_expr->num_args];
  72. #ifdef EVAL_DEBUG 
  73. printf("fn[");
  74. fflush(stdout);
  75. #endif
  76. /* Evaluate each argument before calling the function itself */
  77. for (i = 0; i < prefun_expr->num_args; i++) {
  78. arg_list[i] = eval_gen_expr(prefun_expr->expr_list[i]);
  79. #ifdef EVAL_DEBUG 
  80. if (i < (prefun_expr->num_args - 1))
  81. printf(", ");
  82. fflush(stdout);
  83. #endif
  84. }
  85. #ifdef EVAL_DEBUG 
  86. printf("]");
  87. fflush(stdout);
  88. #endif
  89. /* Now we call the function, passing a list of 
  90.    doubles as its argument */
  91.      
  92.      
  93. return (prefun_expr->func_ptr)(arg_list);
  94. }
  95. /* Evaluates a value expression */
  96. static inline double eval_val_expr(val_expr_t * val_expr) {
  97.   /* Shouldn't happen */
  98.   if (val_expr == NULL)
  99.     return EVAL_ERROR;
  100.   /* Value is a constant, return the double value */
  101.   if (val_expr->type == CONSTANT_TERM_T) {
  102.     #ifdef EVAL_DEBUG 
  103. printf("%.4f", val_expr->term.constant);
  104. fflush(stdout);
  105.     #endif
  106.     return (val_expr->term.constant);
  107.   }
  108.   /* Value is variable, dereference it */
  109.   if (val_expr->type == PARAM_TERM_T) {
  110.     switch (val_expr->term.param->type) {
  111. case P_TYPE_BOOL:
  112. #ifdef EVAL_DEBUG 
  113. printf("(%s:%.4f)", val_expr->term.param->name, (double)(*((int*)(val_expr->term.param->engine_val))));
  114. fflush(stdout);
  115. #endif
  116.        
  117.   
  118. return (double)(*((int*)(val_expr->term.param->engine_val)));
  119. case P_TYPE_INT:
  120. #ifdef EVAL_DEBUG 
  121. printf("(%s:%.4f)", val_expr->term.param->name, (double)(*((int*)(val_expr->term.param->engine_val))));
  122. fflush(stdout);
  123. #endif
  124.      
  125. return (double)(*((int*)(val_expr->term.param->engine_val)));
  126. case P_TYPE_DOUBLE:
  127. #ifdef EVAL_DEBUG 
  128. printf("(%s:%.4f)", val_expr->term.param->name, (*((double*)val_expr->term.param->engine_val)));
  129. fflush(stdout);
  130. #endif
  131. if (val_expr->term.param->matrix_flag | (val_expr->term.param->flags & P_FLAG_ALWAYS_MATRIX)) {
  132.   if (mesh_j >= 0) {
  133.     return (((double**)val_expr->term.param->matrix)[mesh_i][mesh_j]);
  134.   }
  135.   else {
  136.     return (((double*)val_expr->term.param->matrix)[mesh_i]);
  137.   }
  138. }
  139. return *((double*)(val_expr->term.param->engine_val));
  140. default:
  141.   return ERROR;
  142.     }
  143.   }
  144.   /* Unknown type, return failure */
  145.   return FAILURE;
  146. }
  147. /* Evaluates an expression tree */
  148. static inline double eval_tree_expr(tree_expr_t * tree_expr) {
  149. double left_arg, right_arg;
  150. infix_op_t * infix_op;
  151. /* Shouldn't happen */
  152. if (tree_expr == NULL)
  153.   return EVAL_ERROR;
  154. /* A leaf node, evaluate the general expression. If the expression is null as well, return zero */
  155. if (tree_expr->infix_op == NULL) {
  156. if (tree_expr->gen_expr == NULL)
  157. return 0;
  158. else
  159.    return eval_gen_expr(tree_expr->gen_expr);
  160. }
  161. /* Otherwise, this node is an infix operator. Evaluate
  162.    accordingly */
  163. infix_op = (infix_op_t*)tree_expr->infix_op;
  164. #ifdef EVAL_DEBUG 
  165. printf("(");
  166. fflush(stdout);
  167. #endif
  168. left_arg = eval_tree_expr(tree_expr->left);
  169. #ifdef EVAL_DEBUG 
  170. switch (infix_op->type) {
  171. case INFIX_ADD:
  172. printf("+");
  173. break;
  174. case INFIX_MINUS:
  175. printf("-");
  176. break;
  177. case INFIX_MULT:
  178. printf("*");
  179. break;
  180. case INFIX_MOD:
  181. printf("%%");
  182. break;
  183. case INFIX_OR:
  184. printf("|");
  185. break;
  186. case INFIX_AND:
  187. printf("&");
  188. break;
  189. case INFIX_DIV:
  190. printf("/");
  191. break;
  192. default:
  193. printf("?");
  194. }
  195. fflush(stdout);
  196. #endif
  197. right_arg = eval_tree_expr(tree_expr->right);
  198. #ifdef EVAL_DEBUG
  199. printf(")");
  200. fflush(stdout);
  201. #endif
  202. switch (infix_op->type) {
  203. case INFIX_ADD:
  204.   return (left_arg + right_arg);
  205. case INFIX_MINUS:
  206. return (left_arg - right_arg);
  207. case INFIX_MULT:
  208. return (left_arg * right_arg);
  209. case INFIX_MOD:
  210.   if ((int)right_arg == 0) {
  211.     #ifdef EVAL_DEBUG 
  212.     printf("eval_tree_expr: modulo zero!n");
  213.     #endif
  214.     return DIV_BY_ZERO; 
  215.   }
  216.   return ((int)left_arg % (int)right_arg);
  217. case INFIX_OR:
  218. return ((int)left_arg | (int)right_arg);
  219. case INFIX_AND:
  220. return ((int)left_arg & (int)right_arg);
  221. case INFIX_DIV:
  222.   if (right_arg == 0) {
  223.     #ifdef EVAL_DEBUG 
  224.     printf("eval_tree_expr: division by zero!n");
  225.     #endif
  226.     return MAX_DOUBLE_SIZE;
  227.   }
  228.   return (left_arg / right_arg);
  229. default:
  230.           #ifdef EVAL_DEBUG 
  231.     printf("eval_tree_expr: unknown infix operator!n");
  232.           #endif
  233. return ERROR;
  234. }
  235. return ERROR;
  236. }
  237. /* Converts a double value to a general expression */
  238. gen_expr_t * const_to_expr(double val) {
  239.   gen_expr_t * gen_expr;
  240.   val_expr_t * val_expr;
  241.   term_t term;
  242.   
  243.   term.constant = val;
  244.     
  245.   if ((val_expr = new_val_expr(CONSTANT_TERM_T, term)) == NULL)
  246.     return NULL;
  247.   gen_expr = new_gen_expr(VAL_T, (void*)val_expr);
  248.   if (gen_expr == NULL) {
  249. free_val_expr(val_expr);
  250.   }
  251.   
  252.   return gen_expr;
  253. }
  254. /* Converts a regular parameter to an expression */
  255. gen_expr_t * param_to_expr(param_t * param) {
  256.   gen_expr_t * gen_expr = NULL;
  257.   val_expr_t * val_expr = NULL;
  258.   term_t term;
  259.   if (param == NULL)
  260.     return NULL;
  261.  
  262.   /* This code is still a work in progress. We need
  263.      to figure out if the initial condition is used for 
  264.      each per frame equation or not. I am guessing that
  265.      it isn't, and it is thusly implemented this way */
  266.   
  267.   /* Current guess of true behavior (08/01/03) note from carm
  268.      First try to use the per_pixel_expr (with cloning). 
  269.      If it is null however, use the engine variable instead. */
  270.   
  271.   /* 08/20/03 : Presets are now objects, as well as per pixel equations. This ends up
  272.      making the parser handle the case where parameters are essentially per pixel equation
  273.      substitutions */
  274.        
  275.   
  276.   term.param = param;
  277.   if ((val_expr = new_val_expr(PARAM_TERM_T, term)) == NULL)
  278.     return NULL;
  279.   
  280.   if ((gen_expr = new_gen_expr(VAL_T, (void*)val_expr)) == NULL) {
  281.     free_val_expr(val_expr);
  282. return NULL;   
  283.   } 
  284.   return gen_expr;
  285. }
  286. /* Converts a prefix function to an expression */
  287. gen_expr_t * prefun_to_expr(double (*func_ptr)(), gen_expr_t ** expr_list, int num_args) {
  288.   gen_expr_t * gen_expr;
  289.   prefun_expr_t * prefun_expr;
  290.   
  291.   /* Malloc a new prefix function expression */
  292.   prefun_expr = (prefun_expr_t*)malloc(sizeof(prefun_expr_t));
  293.   if (prefun_expr == NULL)
  294.   return NULL;
  295.   
  296.   prefun_expr->num_args = num_args;
  297.   prefun_expr->func_ptr = func_ptr;
  298.   prefun_expr->expr_list = expr_list;
  299.   gen_expr = new_gen_expr(PREFUN_T, (void*)prefun_expr);
  300.   if (gen_expr == NULL)
  301.   free_prefun_expr(prefun_expr);
  302.   
  303.   return gen_expr;
  304. }
  305. /* Creates a new tree expression */
  306. tree_expr_t * new_tree_expr(infix_op_t * infix_op, gen_expr_t * gen_expr, tree_expr_t * left, tree_expr_t * right) {
  307. tree_expr_t * tree_expr;
  308. tree_expr = (tree_expr_t*)malloc(sizeof(tree_expr_t));
  309. if (tree_expr == NULL)
  310. return NULL;
  311. tree_expr->infix_op = infix_op;
  312. tree_expr->gen_expr = gen_expr;
  313. tree_expr->left = left;
  314. tree_expr->right = right;
  315. return tree_expr;
  316. }
  317. /* Creates a new value expression */
  318. val_expr_t * new_val_expr(int type, term_t term) {
  319.   val_expr_t * val_expr;
  320.   val_expr = (val_expr_t*)malloc(sizeof(val_expr_t));
  321.   if (val_expr == NULL)
  322.     return NULL;
  323.   val_expr->type = type;
  324.   val_expr->term = term;
  325.   return val_expr;
  326. }
  327. /* Creates a new general expression */
  328. gen_expr_t * new_gen_expr(int type, void * item) {
  329. gen_expr_t * gen_expr;
  330. gen_expr = (gen_expr_t*)malloc(sizeof(gen_expr_t));
  331. if (gen_expr == NULL)
  332. return NULL;
  333. gen_expr->type = type;
  334. gen_expr->item = item;
  335. return gen_expr;
  336. }
  337. /* Frees a general expression */
  338. int free_gen_expr(gen_expr_t * gen_expr) {
  339. if (gen_expr == NULL)
  340.   return SUCCESS;
  341. switch (gen_expr->type) {
  342. case VAL_T:
  343. free_val_expr(gen_expr->item);
  344. break;
  345. case PREFUN_T:
  346. free_prefun_expr(gen_expr->item);
  347. break;
  348. case TREE_T:
  349. free_tree_expr(gen_expr->item);
  350. break;
  351. default:
  352. return FAILURE;
  353. }
  354. free(gen_expr);
  355. return SUCCESS;
  356. }
  357. /* Frees a function in prefix notation */
  358. int free_prefun_expr(prefun_expr_t * prefun_expr) {
  359. int i;
  360. if (prefun_expr == NULL)
  361. return SUCCESS;
  362. /* Free every element in expression list */
  363. for (i = 0 ; i < prefun_expr->num_args; i++) {
  364. free_gen_expr(prefun_expr->expr_list[i]);
  365. }
  366. free(prefun_expr);
  367. return SUCCESS;
  368. }
  369. /* Frees values of type VARIABLE and CONSTANT */
  370. int free_val_expr(val_expr_t * val_expr) {
  371. if (val_expr == NULL)
  372. return SUCCESS;
  373. free(val_expr);
  374. return SUCCESS;
  375. }
  376. /* Frees a tree expression */
  377. int free_tree_expr(tree_expr_t * tree_expr) {
  378. if (tree_expr == NULL)
  379. return SUCCESS;
  380. /* free left tree */
  381. free_tree_expr(tree_expr->left);
  382. /* free general expression object */
  383. free_gen_expr(tree_expr->gen_expr);
  384. /* Note that infix operators are always
  385.    stored in memory unless the program 
  386.    exits, so we don't remove them here */
  387. /* free right tree */
  388. free_tree_expr(tree_expr->right);
  389. /* finally, free the struct itself */
  390. free(tree_expr);
  391. return SUCCESS;
  392. }
  393. /* Initializes all infix operators */
  394. int init_infix_ops() {
  395. infix_add = new_infix_op(INFIX_ADD, 4);
  396. infix_minus = new_infix_op(INFIX_MINUS, 3);
  397. infix_div = new_infix_op(INFIX_DIV, 2);
  398. infix_or = new_infix_op(INFIX_OR, 5);
  399. infix_and = new_infix_op(INFIX_AND,4);
  400. infix_mod = new_infix_op(INFIX_MOD, 1);
  401. infix_mult = new_infix_op(INFIX_MULT, 2);
  402. /* Prefix operators */
  403. infix_positive = new_infix_op(INFIX_ADD, 0);
  404. infix_negative = new_infix_op(INFIX_MINUS, 0);
  405. return SUCCESS;
  406. }
  407. /* Destroys the infix operator list. This should
  408.    be done on program exit */
  409. int destroy_infix_ops()
  410. {
  411.   free(infix_add);
  412.   free(infix_minus);
  413.   free(infix_div);
  414.   free(infix_or);
  415.   free(infix_and);
  416.   free(infix_mod);
  417.   free(infix_mult);
  418.   free(infix_positive);
  419.   free(infix_negative);
  420.   return SUCCESS;
  421. }
  422. /* Initializes an infix operator */
  423. infix_op_t * new_infix_op(int type, int precedence) {
  424. infix_op_t * infix_op;
  425. infix_op = (infix_op_t*)malloc(sizeof(infix_op_t));
  426. if (infix_op == NULL)
  427. return NULL;
  428. infix_op->type = type;
  429. infix_op->precedence = precedence;
  430. return infix_op;
  431. }
  432. /* Clones a general expression */
  433. gen_expr_t * clone_gen_expr(gen_expr_t * gen_expr) {
  434.   gen_expr_t * new_gen_expr;
  435.   val_expr_t * val_expr;
  436.   tree_expr_t * tree_expr;
  437.   prefun_expr_t * prefun_expr;
  438.   /* Null argument check */
  439.   if (gen_expr == NULL)
  440.     return NULL;
  441.   /* Out of memory */
  442.   if ((new_gen_expr = (gen_expr_t*)malloc(sizeof(gen_expr_t))) == NULL)
  443.     return NULL;
  444.   /* Case on the type of general expression */
  445.   switch (new_gen_expr->type = gen_expr->type) {
  446.   case VAL_T: /* val expression */
  447.     if ((val_expr = clone_val_expr((val_expr_t*)gen_expr->item)) == NULL) {
  448.       free(new_gen_expr);
  449.       return NULL;
  450.     }
  451.     new_gen_expr->item = (void*)val_expr;
  452.     break;
  453.     
  454.   case PREFUN_T: /* prefix function expression */
  455.     if ((prefun_expr = clone_prefun_expr((prefun_expr_t*)gen_expr->item)) == NULL) {
  456.       free(new_gen_expr);
  457.       return NULL;
  458.     }
  459.     new_gen_expr->item = (void*)prefun_expr;
  460.     break;
  461.     
  462.   case TREE_T:  /* tree expression */
  463.     if ((tree_expr = clone_tree_expr((tree_expr_t*)gen_expr->item)) == NULL) {
  464.       free(new_gen_expr);
  465.       return NULL;
  466.     }
  467.     new_gen_expr->item = (void*)tree_expr;
  468.     break;
  469.     
  470.   default: /* unknown type, ut oh.. */
  471.     free(new_gen_expr);
  472.     return NULL;
  473.   }
  474.   
  475.   return new_gen_expr; /* Return the new (cloned) general expression */
  476. }
  477. /* Clones a tree expression */
  478. tree_expr_t * clone_tree_expr(tree_expr_t * tree_expr) {
  479.   tree_expr_t * new_tree_expr;
  480.   /* Null argument */
  481.   if (tree_expr == NULL)
  482.     return NULL;
  483.   
  484.   /* Out of memory */
  485.   if ((new_tree_expr = (tree_expr_t*)malloc(sizeof(tree_expr_t))) == NULL) 
  486.     return NULL;
  487.   
  488.   /* Set each argument in tree_expr_t struct */
  489.   new_tree_expr->infix_op = tree_expr->infix_op;  /* infix operators are in shared memory */
  490.   new_tree_expr->gen_expr = clone_gen_expr(tree_expr->gen_expr); /* clone the general expression */
  491.   new_tree_expr->left = clone_tree_expr(tree_expr->left); /* clone the left tree expression */
  492.   new_tree_expr->right = clone_tree_expr(tree_expr->right); /* clone the right tree expression */
  493.   return new_tree_expr; /* Return the new (cloned) tree expression */
  494. }
  495. /* Clones a value expression, currently only passes the pointer to 
  496.    the value that this object represents, not a pointer to a copy of the value */
  497. val_expr_t * clone_val_expr(val_expr_t * val_expr) {
  498.   val_expr_t * new_val_expr;
  499.   /* Null argument */
  500.   if (val_expr == NULL)
  501.     return NULL;
  502.   
  503.   /* Allocate space, check for out of memory */
  504.   if ((new_val_expr = (val_expr_t*)malloc(sizeof(val_expr_t))) == NULL) 
  505.     return NULL;
  506.   /* Set the values in the val_expr_t struct */
  507.   new_val_expr->type = val_expr->type;
  508.   new_val_expr->term = val_expr->term;
  509.   
  510.   /* Return the new (cloned) value expression */
  511.   return new_val_expr;
  512. }
  513. /* Clones a prefix function with its arguments */
  514. prefun_expr_t * clone_prefun_expr(prefun_expr_t * prefun_expr) {
  515.   int i;
  516.   prefun_expr_t * new_prefun_expr;
  517.   
  518.   /* Null argument */
  519.   if (prefun_expr == NULL)
  520.     return NULL;
  521.   
  522.   /* Out of memory */
  523.   if ((new_prefun_expr = (prefun_expr_t*)malloc(sizeof(prefun_expr_t))) == NULL) 
  524.     return NULL;
  525.   
  526.   /* Set the function argument paired with its number of arguments */
  527.   new_prefun_expr->num_args = prefun_expr->num_args;
  528.   new_prefun_expr->func_ptr = prefun_expr->func_ptr;
  529.   /* Allocate space for the expression list pointers */
  530.   if ((new_prefun_expr->expr_list = (gen_expr_t**)malloc(sizeof(gen_expr_t*)*new_prefun_expr->num_args)) == NULL) {
  531.     free(new_prefun_expr);
  532.     return NULL;
  533.   }
  534.   /* Now copy each general expression from the argument expression list */
  535.   for (i = 0; i < new_prefun_expr->num_args;i++) 
  536.     new_prefun_expr->expr_list[i] = clone_gen_expr(prefun_expr->expr_list[i]);
  537.   
  538.   /* Finally, return the new (cloned) prefix function expression */
  539.   return new_prefun_expr;
  540. }
  541. /* Reinitializes the engine variables to a default (conservative and sane) value */
  542. void reset_engine_vars() {
  543.   zoom=1.0;
  544.   zoomexp= 1.0;
  545.   rot= 0.0;
  546.   warp= 0.0;
  547.   
  548.   sx= 1.0;
  549.   sy= 1.0;
  550.   dx= 0.0;
  551.   dy= 0.0;
  552.   cx= 0.5;
  553.   cy= 0.5;
  554.   
  555.   decay=.98;
  556.   
  557.   wave_r= 1.0;
  558.   wave_g= 0.2;
  559.   wave_b= 0.0;
  560.   wave_x= 0.5;
  561.   wave_y= 0.5;
  562.   wave_mystery= 0.0;
  563.   ob_size= 0.0;
  564.   ob_r= 0.0;
  565.   ob_g= 0.0;
  566.   ob_b= 0.0;
  567.   ob_a= 0.0;
  568.   ib_size = 0.0;
  569.   ib_r = 0.0;
  570.   ib_g = 0.0;
  571.   ib_b = 0.0;
  572.   ib_a = 0.0;
  573.   mv_a = 0.0;
  574.   mv_r = 0.0;
  575.   mv_g = 0.0;
  576.   mv_b = 0.0;
  577.   mv_l = 1.0;
  578.   mv_x = 16.0;
  579.   mv_y = 12.0;
  580.   mv_dy = 0.02;
  581.   mv_dx = 0.02;
  582.   
  583.   meshx = 0;
  584.   meshy = 0;
  585.  
  586.   Time = 0;
  587.   treb = 0;
  588.   mid = 0;
  589.   bass = 0;
  590.   treb_att = 0;
  591.   mid_att = 0;
  592.   bass_att = 0;
  593.   progress = 0;
  594.   frame = 0;
  595. // bass_thresh = 0;
  596. /* PER_FRAME CONSTANTS END */
  597.   fRating = 0;
  598.   fGammaAdj = 1.0;
  599.   fVideoEchoZoom = 1.0;
  600.   fVideoEchoAlpha = 0;
  601.   nVideoEchoOrientation = 0;
  602.  
  603.   nWaveMode = 7;
  604.   bAdditiveWaves = 0;
  605.   bWaveDots = 0;
  606.   bWaveThick = 0;
  607.   bModWaveAlphaByVolume = 0;
  608.   bMaximizeWaveColor = 0;
  609.   bTexWrap = 0;
  610.   bDarkenCenter = 0;
  611.   bRedBlueStereo = 0;
  612.   bBrighten = 0;
  613.   bDarken = 0;
  614.   bSolarize = 0;
  615.  bInvert = 0;
  616.  bMotionVectorsOn = 1;
  617.  
  618.   fWaveAlpha =1.0;
  619.   fWaveScale = 1.0;
  620.   fWaveSmoothing = 0;
  621.   fWaveParam = 0;
  622.   fModWaveAlphaStart = 0;
  623.   fModWaveAlphaEnd = 0;
  624.   fWarpAnimSpeed = 0;
  625.   fWarpScale = 0;
  626.   fShader = 0;
  627. /* PER_PIXEL CONSTANTS BEGIN */
  628.  x_per_pixel = 0;
  629.  y_per_pixel = 0;
  630.  rad_per_pixel = 0;
  631.  ang_per_pixel = 0;
  632. /* PER_PIXEL CONSTANT END */
  633. /* Q VARIABLES START */
  634.  q1 = 0;
  635.  q2 = 0;
  636.  q3 = 0;
  637.  q4 = 0;
  638.  q5 = 0;
  639.  q6 = 0;
  640.  q7 = 0;
  641.  q8 = 0;
  642.  /* Q VARIABLES END */
  643. }