#include "texture_eval.h" #include using namespace std; eval_item texture_routine::eval(const vector3d& pt) { eval_item tmps[NUM_TMPS], accum, ept(pt); std::stack loops; for(size_t i=0; i= TEMP_START && s.src0 < TEMP_END) s0 = &tmps[s.src0 - TEMP_START]; if(s.src0 >= CONST_START && s.src0 < CONST_END) s0 = &consts[s.src0 - CONST_START]; // std::cout << s.src1 << endl; if(s.src1 == POINT_INDEX) s1 = &ept; if(s.src1 >= TEMP_START && s.src1 < TEMP_END) s1 = &tmps[s.src1 - TEMP_START]; if(s.src1 >= CONST_START && s.src1 < CONST_END) s1 = &consts[s.src1 - CONST_START]; // std::cout << s.src2 << endl; if(s.src2 == POINT_INDEX) s2 = &ept; if(s.src2 >= TEMP_START && s.src2 < TEMP_END) s2 = &tmps[s.src2 - TEMP_START]; if(s.src2 >= CONST_START && s.src2 < CONST_END) s2 = &consts[s.src2 - CONST_START]; // std::cout << s.dest << endl; if(s.dest >= TEMP_START && s.dest < TEMP_END) dst = &tmps[s.dest - TEMP_START]; // std::cout << s.func << endl; // std::cout << "ENDS" << endl; switch(s.func) { case add_: *dst = eval_add(*s0, *s1); break; case sub_: *dst = eval_sub(*s0, *s1); break; case mul_: *dst = eval_mul(*s0, *s1); break; case div_: *dst = eval_div(*s0, *s1); break; case dot_: *dst = eval_dot(*s0, *s1); break; case cross_: *dst = eval_cross(*s0, *s1); break; case mod_: *dst = eval_mod(*s0, *s1); break; case sin_: *dst = eval_func(*s0, sin); break; case cos_: *dst = eval_func(*s0, cos); break; case tan_: *dst = eval_func(*s0, tan); break; case exp_: *dst = eval_func(*s0, exp); break; case log_: *dst = eval_func(*s0, log); break; case neg_: *dst = eval_func(*s0, neg); break; case pow_: *dst = eval_pow(*s0, *s1); break; case atan2_: *dst = eval_atan2(*s0, *s1); break; case if_: if(!non_zero(*s0)) i = s.src1 - 1; // increments adds one break; case endif_: /* do nothing */ break; case while_: if(!non_zero(*s0)) i = s.src1; // inc to after endwhile break; case endwhile_: i = s.src0 - 1; break; case inc_: *dst = eval_func(*s0, eval_inc); break; case dec_: *dst = eval_func(*s0, eval_dec); break; case pack_: *dst = eval_pack(*s0, *s1, *s2); break; case getx_: *dst = eval_getx(*s0); break; case gety_: *dst = eval_gety(*s0); break; case getz_: *dst = eval_getz(*s0); break; case eq_: *dst = eval_eq(*s0, *s1); break; case lt_: *dst = eval_lt(*s0, *s1); break; case gt_: *dst = eval_lt(*s1, *s0); break; case ne_: *dst = eval_not(eval_eq(*s0, *s1)); break; case ge_: *dst = eval_not(eval_lt(*s0, *s1)); break; case le_: *dst = eval_not(eval_lt(*s1, *s0)); break; case invalid_: break; } } return tmps[0]; }