Calculate.cpp 61 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776
  1. /******************************************************************************/
  2. #include "stdafx.h"
  3. namespace EE{
  4. /******************************************************************************/
  5. enum CALC_ELM_TYPE : Byte
  6. {
  7. CET_NONE,
  8. CET_OP ,
  9. CET_VAL ,
  10. CET_VAR ,
  11. CET_FUNC,
  12. };
  13. /******************************************************************************/
  14. Char CalcError[128];
  15. /******************************************************************************/
  16. static Bool E(C Str &name ) {Set(CalcError, name ); return false;}
  17. static Bool E(C Str &name, C CalcValue &arg ) {Set(CalcError, S+name+'('+arg.typeName() +')'); return false;}
  18. static Bool E(C Str &name, C CalcValue &a0 , C CalcValue &a1 ) {Set(CalcError, S+name+'('+a0 .typeName()+", "+a1.typeName() +')'); return false;}
  19. static Bool E(C Str &name, C CalcValue &a0 , C CalcValue &a1, C CalcValue &a2 ) {Set(CalcError, S+name+'('+a0 .typeName()+", "+a1.typeName()+", "+a2.typeName() +')'); return false;}
  20. static Bool E(C Str &name, C CalcValue &a0 , C CalcValue &a1, C CalcValue &a2, C CalcValue &a3) {Set(CalcError, S+name+'('+a0 .typeName()+", "+a1.typeName()+", "+a2.typeName()+", "+a3.typeName()+')'); return false;}
  21. /******************************************************************************/
  22. CChar8* CalcValue::typeName()C
  23. {
  24. switch(type)
  25. {
  26. case CVAL_INT : return "Int";
  27. case CVAL_REAL: return "Real";
  28. case CVAL_VEC2: return "Vec2";
  29. case CVAL_VEC : return "Vec";
  30. case CVAL_VEC4: return "Vec4";
  31. default : return null;
  32. }
  33. }
  34. Str CalcValue::asText(Int precision)C
  35. {
  36. switch(type)
  37. {
  38. case CVAL_INT : return TextInt (i); break;
  39. case CVAL_REAL: return TextReal(r, (precision==INT_MAX) ? PRECISION_DBL : precision);
  40. case CVAL_VEC2: return v2.asText(precision);
  41. case CVAL_VEC : return v .asText(precision);
  42. case CVAL_VEC4: return v4.asText(precision);
  43. default : return S;
  44. }
  45. }
  46. Int CalcValue::asInt()C
  47. {
  48. switch(type)
  49. {
  50. case CVAL_INT : return i;
  51. case CVAL_REAL: return Round(r );
  52. case CVAL_VEC2: return Round(v2.x);
  53. case CVAL_VEC : return Round(v .x);
  54. case CVAL_VEC4: return Round(v4.x);
  55. default : return 0;
  56. }
  57. }
  58. UInt CalcValue::asUInt()C
  59. {
  60. switch(type)
  61. {
  62. case CVAL_INT : return i;
  63. case CVAL_REAL: return RoundU(r );
  64. case CVAL_VEC2: return RoundU(v2.x);
  65. case CVAL_VEC : return RoundU(v .x);
  66. case CVAL_VEC4: return RoundU(v4.x);
  67. default : return 0;
  68. }
  69. }
  70. Long CalcValue::asLong()C
  71. {
  72. switch(type)
  73. {
  74. case CVAL_INT : return i;
  75. case CVAL_REAL: return RoundL(r );
  76. case CVAL_VEC2: return RoundL(v2.x);
  77. case CVAL_VEC : return RoundL(v .x);
  78. case CVAL_VEC4: return RoundL(v4.x);
  79. default : return 0;
  80. }
  81. }
  82. ULong CalcValue::asULong()C
  83. {
  84. switch(type)
  85. {
  86. case CVAL_INT : return i;
  87. case CVAL_REAL: return RoundUL(r );
  88. case CVAL_VEC2: return RoundUL(v2.x);
  89. case CVAL_VEC : return RoundUL(v .x);
  90. case CVAL_VEC4: return RoundUL(v4.x);
  91. default : return 0;
  92. }
  93. }
  94. Flt CalcValue::asFlt()C
  95. {
  96. switch(type)
  97. {
  98. case CVAL_INT : return i;
  99. case CVAL_REAL: return r;
  100. case CVAL_VEC2: return v2.x;
  101. case CVAL_VEC : return v .x;
  102. case CVAL_VEC4: return v4.x;
  103. default : return 0;
  104. }
  105. }
  106. Dbl CalcValue::asDbl()C
  107. {
  108. switch(type)
  109. {
  110. case CVAL_INT : return i;
  111. case CVAL_REAL: return r;
  112. case CVAL_VEC2: return v2.x;
  113. case CVAL_VEC : return v .x;
  114. case CVAL_VEC4: return v4.x;
  115. default : return 0;
  116. }
  117. }
  118. Vec2 CalcValue::asVec2()C
  119. {
  120. switch(type)
  121. {
  122. case CVAL_INT : return i;
  123. case CVAL_REAL: return r;
  124. case CVAL_VEC2: return v2;
  125. case CVAL_VEC : return v .xy;
  126. case CVAL_VEC4: return v4.xy;
  127. default : return 0;
  128. }
  129. }
  130. VecD2 CalcValue::asVecD2()C
  131. {
  132. switch(type)
  133. {
  134. case CVAL_INT : return i;
  135. case CVAL_REAL: return r;
  136. case CVAL_VEC2: return v2;
  137. case CVAL_VEC : return v .xy;
  138. case CVAL_VEC4: return v4.xy;
  139. default : return 0;
  140. }
  141. }
  142. VecI2 CalcValue::asVecI2()C
  143. {
  144. switch(type)
  145. {
  146. case CVAL_INT : return i;
  147. case CVAL_REAL: return Round(r );
  148. case CVAL_VEC2: return Round(v2 );
  149. case CVAL_VEC : return Round(v .xy);
  150. case CVAL_VEC4: return Round(v4.xy);
  151. default : return 0;
  152. }
  153. }
  154. Vec CalcValue::asVec()C
  155. {
  156. switch(type)
  157. {
  158. case CVAL_INT : return i;
  159. case CVAL_REAL: return r;
  160. case CVAL_VEC2: return Vec(v2, 0);
  161. case CVAL_VEC : return v;
  162. case CVAL_VEC4: return v4.xyz;
  163. default : return 0;
  164. }
  165. }
  166. VecD CalcValue::asVecD()C
  167. {
  168. switch(type)
  169. {
  170. case CVAL_INT : return i;
  171. case CVAL_REAL: return r;
  172. case CVAL_VEC2: return VecD(v2, 0);
  173. case CVAL_VEC : return v;
  174. case CVAL_VEC4: return v4.xyz;
  175. default : return 0;
  176. }
  177. }
  178. VecI CalcValue::asVecI()C
  179. {
  180. switch(type)
  181. {
  182. case CVAL_INT : return i;
  183. case CVAL_REAL: return Round(r );
  184. case CVAL_VEC2: return VecI(Round(v2 ), 0);
  185. case CVAL_VEC : return Round(v );
  186. case CVAL_VEC4: return Round(v4.xyz);
  187. default : return 0;
  188. }
  189. }
  190. Vec4 CalcValue::asVec4()C
  191. {
  192. switch(type)
  193. {
  194. case CVAL_INT : return i;
  195. case CVAL_REAL: return r;
  196. case CVAL_VEC2: return Vec4(v2, 0, 0);
  197. case CVAL_VEC : return Vec4(v , 0);
  198. case CVAL_VEC4: return v4;
  199. default : return 0;
  200. }
  201. }
  202. VecD4 CalcValue::asVecD4()C
  203. {
  204. switch(type)
  205. {
  206. case CVAL_INT : return i;
  207. case CVAL_REAL: return r;
  208. case CVAL_VEC2: return VecD4(v2, 0, 0);
  209. case CVAL_VEC : return VecD4(v , 0);
  210. case CVAL_VEC4: return v4;
  211. default : return 0;
  212. }
  213. }
  214. VecI4 CalcValue::asVecI4()C
  215. {
  216. switch(type)
  217. {
  218. case CVAL_INT : return i;
  219. case CVAL_REAL: return Round(r );
  220. case CVAL_VEC2: return VecI4(Round(v2), 0, 0);
  221. case CVAL_VEC : return VecI4(Round(v ) , 0);
  222. case CVAL_VEC4: return Round(v4);
  223. default : return 0;
  224. }
  225. }
  226. /******************************************************************************/
  227. Bool CalcValue::notLogical()
  228. {
  229. switch(type)
  230. {
  231. case CVAL_INT : i =!i ; return true;
  232. case CVAL_REAL: r =!r ; return true;
  233. case CVAL_VEC2: v2=!v2; return true;
  234. case CVAL_VEC : v =!v ; return true;
  235. case CVAL_VEC4: v4=!v4; return true;
  236. default : return false;
  237. }
  238. }
  239. Bool CalcValue::notBitwise()
  240. {
  241. switch(type)
  242. {
  243. case CVAL_INT: i=~i; return true;
  244. default : return false;
  245. }
  246. }
  247. Bool CalcValue::chs()
  248. {
  249. switch(type)
  250. {
  251. case CVAL_INT : CHS(i) ; return true;
  252. case CVAL_REAL: CHS(r) ; return true;
  253. case CVAL_VEC2: v2.chs(); return true;
  254. case CVAL_VEC : v .chs(); return true;
  255. case CVAL_VEC4: v4.chs(); return true;
  256. default : return false;
  257. }
  258. }
  259. Bool CalcValue::abs()
  260. {
  261. switch(type)
  262. {
  263. case CVAL_INT : ABS(i) ; return true;
  264. case CVAL_REAL: ABS(r) ; return true;
  265. case CVAL_VEC2: v2.abs(); return true;
  266. case CVAL_VEC : v .abs(); return true;
  267. case CVAL_VEC4: v4.abs(); return true;
  268. default : return false;
  269. }
  270. }
  271. Bool CalcValue::sign()
  272. {
  273. switch(type)
  274. {
  275. case CVAL_INT : i=Sign(i); return true;
  276. case CVAL_REAL: i=Sign(r); type=CVAL_INT; return true;
  277. case CVAL_VEC2: v2.set(Sign(v2.x), Sign(v2.y)); return true;
  278. case CVAL_VEC : v .set(Sign(v .x), Sign(v .y), Sign(v .z)); return true;
  279. case CVAL_VEC4: v4.set(Sign(v4.x), Sign(v4.y), Sign(v4.z), Sign(v4.w)); return true;
  280. default : return false;
  281. }
  282. }
  283. /******************************************************************************/
  284. Bool CalcValue::sat()
  285. {
  286. switch(type)
  287. {
  288. case CVAL_INT : SAT(i) ; return true;
  289. case CVAL_REAL: SAT(r) ; return true;
  290. case CVAL_VEC2: v2.sat(); return true;
  291. case CVAL_VEC : v .sat(); return true;
  292. case CVAL_VEC4: v4.sat(); return true;
  293. default : return false;
  294. }
  295. }
  296. Bool CalcValue::min(C CalcValue &x)
  297. {
  298. switch(type)
  299. {
  300. case CVAL_INT: switch(x.type)
  301. {
  302. case CVAL_INT : i=Min( i , x.i); return true;
  303. case CVAL_REAL: r=Min(Dbl(i), x.r); type=CVAL_REAL; return true;
  304. }break;
  305. case CVAL_REAL: switch(x.type)
  306. {
  307. case CVAL_INT : r=Min(r, Dbl(x.i)); return true;
  308. case CVAL_REAL: r=Min(r, x.r ); return true;
  309. }break;
  310. case CVAL_VEC2: if(x.type==CVAL_VEC2){v2=Min(v2, x.v2); return true;} break;
  311. case CVAL_VEC : if(x.type==CVAL_VEC ){v =Min(v , x.v ); return true;} break;
  312. case CVAL_VEC4: if(x.type==CVAL_VEC4){v4=Min(v4, x.v4); return true;} break;
  313. }
  314. return false;
  315. }
  316. Bool CalcValue::max(C CalcValue &x)
  317. {
  318. switch(type)
  319. {
  320. case CVAL_INT: switch(x.type)
  321. {
  322. case CVAL_INT : i=Max( i , x.i); return true;
  323. case CVAL_REAL: r=Max(Dbl(i), x.r); type=CVAL_REAL; return true;
  324. }break;
  325. case CVAL_REAL: switch(x.type)
  326. {
  327. case CVAL_INT : r=Max(r, Dbl(x.i)); return true;
  328. case CVAL_REAL: r=Max(r, x.r ); return true;
  329. }break;
  330. case CVAL_VEC2: if(x.type==CVAL_VEC2){v2=Max(v2, x.v2); return true;} break;
  331. case CVAL_VEC : if(x.type==CVAL_VEC ){v =Max(v , x.v ); return true;} break;
  332. case CVAL_VEC4: if(x.type==CVAL_VEC4){v4=Max(v4, x.v4); return true;} break;
  333. }
  334. return false;
  335. }
  336. Bool CalcValue::avg(C CalcValue &x)
  337. {
  338. switch(type)
  339. {
  340. case CVAL_INT: switch(x.type)
  341. {
  342. case CVAL_INT : r=Avg(Dbl(i), Dbl(x.i)); type=CVAL_REAL; return true;
  343. case CVAL_REAL: r=Avg(Dbl(i), x.r ); type=CVAL_REAL; return true;
  344. }break;
  345. case CVAL_REAL: switch(x.type)
  346. {
  347. case CVAL_INT : r=Avg(r, Dbl(x.i)); return true;
  348. case CVAL_REAL: r=Avg(r, x.r ); return true;
  349. }break;
  350. case CVAL_VEC2: if(x.type==CVAL_VEC2){v2=Avg(v2, x.v2); return true;} break;
  351. case CVAL_VEC : if(x.type==CVAL_VEC ){v =Avg(v , x.v ); return true;} break;
  352. case CVAL_VEC4: if(x.type==CVAL_VEC4){v4=Avg(v4, x.v4); return true;} break;
  353. }
  354. return false;
  355. }
  356. /******************************************************************************/
  357. Bool CalcValue::add(C CalcValue &x)
  358. {
  359. switch(type)
  360. {
  361. case CVAL_INT: switch(x.type)
  362. {
  363. case CVAL_INT : i =i+x.i ; return true;
  364. case CVAL_REAL: r =i+x.r ; type=CVAL_REAL; return true;
  365. case CVAL_VEC2: v2=i+x.v2; type=CVAL_VEC2; return true;
  366. case CVAL_VEC : v =i+x.v ; type=CVAL_VEC ; return true;
  367. case CVAL_VEC4: v4=i+x.v4; type=CVAL_VEC4; return true;
  368. }break;
  369. case CVAL_REAL: switch(x.type)
  370. {
  371. case CVAL_INT : r =r+x.i ; return true;
  372. case CVAL_REAL: r =r+x.r ; return true;
  373. case CVAL_VEC2: v2=r+x.v2; type=CVAL_VEC2; return true;
  374. case CVAL_VEC : v =r+x.v ; type=CVAL_VEC ; return true;
  375. case CVAL_VEC4: v4=r+x.v4; type=CVAL_VEC4; return true;
  376. }break;
  377. case CVAL_VEC2: switch(x.type)
  378. {
  379. case CVAL_INT : v2+=x.i ; return true;
  380. case CVAL_REAL: v2+=x.r ; return true;
  381. case CVAL_VEC2: v2+=x.v2; return true;
  382. }break;
  383. case CVAL_VEC: switch(x.type)
  384. {
  385. case CVAL_INT : v+=x.i; return true;
  386. case CVAL_REAL: v+=x.r; return true;
  387. case CVAL_VEC : v+=x.v; return true;
  388. }break;
  389. case CVAL_VEC4: switch(x.type)
  390. {
  391. case CVAL_INT : v4+=x.i ; return true;
  392. case CVAL_REAL: v4+=x.r ; return true;
  393. case CVAL_VEC4: v4+=x.v4; return true;
  394. }break;
  395. }
  396. return false;
  397. }
  398. Bool CalcValue::sub(C CalcValue &x)
  399. {
  400. switch(type)
  401. {
  402. case CVAL_INT: switch(x.type)
  403. {
  404. case CVAL_INT : i =i-x.i ; return true;
  405. case CVAL_REAL: r =i-x.r ; type=CVAL_REAL; return true;
  406. case CVAL_VEC2: v2=i-x.v2; type=CVAL_VEC2; return true;
  407. case CVAL_VEC : v =i-x.v ; type=CVAL_VEC ; return true;
  408. case CVAL_VEC4: v4=i-x.v4; type=CVAL_VEC4; return true;
  409. }break;
  410. case CVAL_REAL: switch(x.type)
  411. {
  412. case CVAL_INT : r =r-x.i ; return true;
  413. case CVAL_REAL: r =r-x.r ; return true;
  414. case CVAL_VEC2: v2=r-x.v2; type=CVAL_VEC2; return true;
  415. case CVAL_VEC : v =r-x.v ; type=CVAL_VEC ; return true;
  416. case CVAL_VEC4: v4=r-x.v4; type=CVAL_VEC4; return true;
  417. }break;
  418. case CVAL_VEC2: switch(x.type)
  419. {
  420. case CVAL_INT : v2-=x.i ; return true;
  421. case CVAL_REAL: v2-=x.r ; return true;
  422. case CVAL_VEC2: v2-=x.v2; return true;
  423. }break;
  424. case CVAL_VEC: switch(x.type)
  425. {
  426. case CVAL_INT : v-=x.i; return true;
  427. case CVAL_REAL: v-=x.r; return true;
  428. case CVAL_VEC : v-=x.v; return true;
  429. }break;
  430. case CVAL_VEC4: switch(x.type)
  431. {
  432. case CVAL_INT : v4-=x.i ; return true;
  433. case CVAL_REAL: v4-=x.r ; return true;
  434. case CVAL_VEC4: v4-=x.v4; return true;
  435. }break;
  436. }
  437. return false;
  438. }
  439. Bool CalcValue::mul(C CalcValue &x)
  440. {
  441. switch(type)
  442. {
  443. case CVAL_INT: switch(x.type)
  444. {
  445. case CVAL_INT : i =i*x.i ; return true;
  446. case CVAL_REAL: r =i*x.r ; type=CVAL_REAL; return true;
  447. case CVAL_VEC2: v2=i*x.v2; type=CVAL_VEC2; return true;
  448. case CVAL_VEC : v =i*x.v ; type=CVAL_VEC ; return true;
  449. case CVAL_VEC4: v4=i*x.v4; type=CVAL_VEC4; return true;
  450. }break;
  451. case CVAL_REAL: switch(x.type)
  452. {
  453. case CVAL_INT : r =r*x.i ; return true;
  454. case CVAL_REAL: r =r*x.r ; return true;
  455. case CVAL_VEC2: v2=r*x.v2; type=CVAL_VEC2; return true;
  456. case CVAL_VEC : v =r*x.v ; type=CVAL_VEC ; return true;
  457. case CVAL_VEC4: v4=r*x.v4; type=CVAL_VEC4; return true;
  458. }break;
  459. case CVAL_VEC2: switch(x.type)
  460. {
  461. case CVAL_INT : v2*=x.i ; return true;
  462. case CVAL_REAL: v2*=x.r ; return true;
  463. case CVAL_VEC2: v2*=x.v2; return true;
  464. }break;
  465. case CVAL_VEC: switch(x.type)
  466. {
  467. case CVAL_INT : v*=x.i; return true;
  468. case CVAL_REAL: v*=x.r; return true;
  469. case CVAL_VEC : v*=x.v; return true;
  470. }break;
  471. case CVAL_VEC4: switch(x.type)
  472. {
  473. case CVAL_INT : v4*=x.i ; return true;
  474. case CVAL_REAL: v4*=x.r ; return true;
  475. case CVAL_VEC4: v4*=x.v4; return true;
  476. }break;
  477. }
  478. return false;
  479. }
  480. Bool CalcValue::div(C CalcValue &x)
  481. {
  482. switch(type)
  483. {
  484. case CVAL_INT: switch(x.type)
  485. {
  486. case CVAL_INT : r =Dbl(i)/x.i ; type=CVAL_REAL; return true;
  487. case CVAL_REAL: r = i /x.r ; type=CVAL_REAL; return true;
  488. case CVAL_VEC2: v2= i /x.v2; type=CVAL_VEC2; return true;
  489. case CVAL_VEC : v = i /x.v ; type=CVAL_VEC ; return true;
  490. case CVAL_VEC4: v4= i /x.v4; type=CVAL_VEC4; return true;
  491. }break;
  492. case CVAL_REAL: switch(x.type)
  493. {
  494. case CVAL_INT : r =r/x.i ; return true;
  495. case CVAL_REAL: r =r/x.r ; return true;
  496. case CVAL_VEC2: v2=r/x.v2; type=CVAL_VEC2; return true;
  497. case CVAL_VEC : v =r/x.v ; type=CVAL_VEC ; return true;
  498. case CVAL_VEC4: v4=r/x.v4; type=CVAL_VEC4; return true;
  499. }break;
  500. case CVAL_VEC2: switch(x.type)
  501. {
  502. case CVAL_INT : v2/=x.i ; return true;
  503. case CVAL_REAL: v2/=x.r ; return true;
  504. case CVAL_VEC2: v2/=x.v2; return true;
  505. }break;
  506. case CVAL_VEC: switch(x.type)
  507. {
  508. case CVAL_INT : v/=x.i; return true;
  509. case CVAL_REAL: v/=x.r; return true;
  510. case CVAL_VEC : v/=x.v; return true;
  511. }break;
  512. case CVAL_VEC4: switch(x.type)
  513. {
  514. case CVAL_INT : v4/=x.i ; return true;
  515. case CVAL_REAL: v4/=x.r ; return true;
  516. case CVAL_VEC4: v4/=x.v4; return true;
  517. }break;
  518. }
  519. return false;
  520. }
  521. Bool CalcValue::mod(C CalcValue &x)
  522. {
  523. switch(type)
  524. {
  525. case CVAL_INT: switch(x.type)
  526. {
  527. case CVAL_INT: if(x.i)i%=x.i;else i=0; return true;
  528. }break;
  529. }
  530. return false;
  531. }
  532. /******************************************************************************/
  533. Bool CalcValue::sqr()
  534. {
  535. switch(type)
  536. {
  537. case CVAL_INT : i *=i ; return true;
  538. case CVAL_REAL: r *=r ; return true;
  539. case CVAL_VEC2: v2*=v2; return true;
  540. case CVAL_VEC : v *=v ; return true;
  541. case CVAL_VEC4: v4*=v4; return true;
  542. default : return false;
  543. }
  544. }
  545. Bool CalcValue::cube()
  546. {
  547. switch(type)
  548. {
  549. case CVAL_INT : i *=i *i ; return true;
  550. case CVAL_REAL: r *=r *r ; return true;
  551. case CVAL_VEC2: v2*=v2*v2; return true;
  552. case CVAL_VEC : v *=v *v ; return true;
  553. case CVAL_VEC4: v4*=v4*v4; return true;
  554. default : return false;
  555. }
  556. }
  557. Bool CalcValue::sqrt()
  558. {
  559. switch(type)
  560. {
  561. case CVAL_INT : r=Sqrt(Dbl(i)); type=CVAL_REAL; return true;
  562. case CVAL_REAL: r=Sqrt( r ); return true;
  563. case CVAL_VEC2: v2.set(Sqrt(v2.x), Sqrt(v2.y)); return true;
  564. case CVAL_VEC : v .set(Sqrt(v .x), Sqrt(v .y), Sqrt(v .z)); return true;
  565. case CVAL_VEC4: v4.set(Sqrt(v4.x), Sqrt(v4.y), Sqrt(v4.z), Sqrt(v4.w)); return true;
  566. default : return false;
  567. }
  568. }
  569. Bool CalcValue::cbrt()
  570. {
  571. switch(type)
  572. {
  573. case CVAL_INT : r=Cbrt(Dbl(i)); type=CVAL_REAL; return true;
  574. case CVAL_REAL: r=Cbrt( r ); return true;
  575. case CVAL_VEC2: v2.set(Cbrt(v2.x), Cbrt(v2.y)); return true;
  576. case CVAL_VEC : v .set(Cbrt(v .x), Cbrt(v .y), Cbrt(v .z)); return true;
  577. case CVAL_VEC4: v4.set(Cbrt(v4.x), Cbrt(v4.y), Cbrt(v4.z), Cbrt(v4.w)); return true;
  578. default : return false;
  579. }
  580. }
  581. Bool CalcValue::pow(C CalcValue &x)
  582. {
  583. switch(type)
  584. {
  585. case CVAL_INT: switch(x.type)
  586. {
  587. case CVAL_INT : r=Pow(Dbl(i), Dbl(x.i)); type=CVAL_REAL; return true;
  588. case CVAL_REAL: r=Pow(Dbl(i), x.r ); type=CVAL_REAL; return true;
  589. }break;
  590. case CVAL_REAL: switch(x.type)
  591. {
  592. case CVAL_INT : r=Pow(r, Dbl(x.i)); return true;
  593. case CVAL_REAL: r=Pow(r, x.r ); return true;
  594. }break;
  595. }
  596. return false;
  597. }
  598. Bool CalcValue::ln()
  599. {
  600. switch(type)
  601. {
  602. case CVAL_INT : r=Ln(Dbl(i)); type=CVAL_REAL; return true;
  603. case CVAL_REAL: r=Ln( r ); return true;
  604. }
  605. return false;
  606. }
  607. Bool CalcValue::log2()
  608. {
  609. switch(type)
  610. {
  611. case CVAL_INT : r=Log2(Dbl(i)); type=CVAL_REAL; return true;
  612. case CVAL_REAL: r=Log2( r ); return true;
  613. }
  614. return false;
  615. }
  616. Bool CalcValue::log(C CalcValue &x)
  617. {
  618. switch(type)
  619. {
  620. case CVAL_INT: switch(x.type)
  621. {
  622. case CVAL_INT : r=Log(Dbl(i), Dbl(x.i)); type=CVAL_REAL; return true;
  623. case CVAL_REAL: r=Log(Dbl(i), x.r ); type=CVAL_REAL; return true;
  624. }break;
  625. case CVAL_REAL: switch(x.type)
  626. {
  627. case CVAL_INT : r=Log(r, Dbl(x.i)); return true;
  628. case CVAL_REAL: r=Log(r, x.r ); return true;
  629. }break;
  630. }
  631. return false;
  632. }
  633. /******************************************************************************/
  634. Bool CalcValue::And(C CalcValue &x) {if(type==CVAL_INT && x.type==CVAL_INT){i &=x.i; return true;} return false;}
  635. Bool CalcValue::Or (C CalcValue &x) {if(type==CVAL_INT && x.type==CVAL_INT){i |=x.i; return true;} return false;}
  636. Bool CalcValue::Xor(C CalcValue &x) {if(type==CVAL_INT && x.type==CVAL_INT){i ^=x.i; return true;} return false;}
  637. Bool CalcValue::shl(C CalcValue &x) {if(type==CVAL_INT && x.type==CVAL_INT){i<<=x.i; return true;} return false;}
  638. Bool CalcValue::shr(C CalcValue &x) {if(type==CVAL_INT && x.type==CVAL_INT){i>>=x.i; return true;} return false;}
  639. Bool CalcValue::rol(C CalcValue &x) {if(type==CVAL_INT && x.type==CVAL_INT){i=Rol(i, x.i); return true;} return false;}
  640. Bool CalcValue::ror(C CalcValue &x) {if(type==CVAL_INT && x.type==CVAL_INT){i=Ror(i, x.i); return true;} return false;}
  641. /******************************************************************************/
  642. Bool CalcValue::equal(C CalcValue &x)
  643. {
  644. switch(type)
  645. {
  646. case CVAL_INT: switch(x.type)
  647. {
  648. case CVAL_INT : i=(i==x.i); return true;
  649. case CVAL_REAL: i=(i==x.r); return true;
  650. }break;
  651. case CVAL_REAL: switch(x.type)
  652. {
  653. case CVAL_INT : i=(r==x.i); type=CVAL_INT; return true;
  654. case CVAL_REAL: i=(r==x.r); type=CVAL_INT; return true;
  655. }break;
  656. case CVAL_VEC2: if(x.type==CVAL_VEC2){i=(v2==x.v2); type=CVAL_INT; return true;} break;
  657. case CVAL_VEC : if(x.type==CVAL_VEC ){i=(v ==x.v ); type=CVAL_INT; return true;} break;
  658. case CVAL_VEC4: if(x.type==CVAL_VEC4){i=(v4==x.v4); type=CVAL_INT; return true;} break;
  659. }
  660. return false;
  661. }
  662. Bool CalcValue::notEqual(C CalcValue &x)
  663. {
  664. switch(type)
  665. {
  666. case CVAL_INT: switch(x.type)
  667. {
  668. case CVAL_INT : i=(i!=x.i); return true;
  669. case CVAL_REAL: i=(i!=x.r); return true;
  670. }break;
  671. case CVAL_REAL: switch(x.type)
  672. {
  673. case CVAL_INT : i=(r!=x.i); type=CVAL_INT; return true;
  674. case CVAL_REAL: i=(r!=x.r); type=CVAL_INT; return true;
  675. }break;
  676. case CVAL_VEC2: if(x.type==CVAL_VEC2){i=(v2!=x.v2); type=CVAL_INT; return true;} break;
  677. case CVAL_VEC : if(x.type==CVAL_VEC ){i=(v !=x.v ); type=CVAL_INT; return true;} break;
  678. case CVAL_VEC4: if(x.type==CVAL_VEC4){i=(v4!=x.v4); type=CVAL_INT; return true;} break;
  679. }
  680. return false;
  681. }
  682. Bool CalcValue::equalGreater(C CalcValue &x)
  683. {
  684. switch(type)
  685. {
  686. case CVAL_INT: switch(x.type)
  687. {
  688. case CVAL_INT : i=(i>=x.i); return true;
  689. case CVAL_REAL: i=(i>=x.r); return true;
  690. }break;
  691. case CVAL_REAL: switch(x.type)
  692. {
  693. case CVAL_INT : i=(r>=x.i); type=CVAL_INT; return true;
  694. case CVAL_REAL: i=(r>=x.r); type=CVAL_INT; return true;
  695. }break;
  696. }
  697. return false;
  698. }
  699. Bool CalcValue::equalSmaller(C CalcValue &x)
  700. {
  701. switch(type)
  702. {
  703. case CVAL_INT: switch(x.type)
  704. {
  705. case CVAL_INT : i=(i<=x.i); return true;
  706. case CVAL_REAL: i=(i<=x.r); return true;
  707. }break;
  708. case CVAL_REAL: switch(x.type)
  709. {
  710. case CVAL_INT : i=(r<=x.i); type=CVAL_INT; return true;
  711. case CVAL_REAL: i=(r<=x.r); type=CVAL_INT; return true;
  712. }break;
  713. }
  714. return false;
  715. }
  716. Bool CalcValue::greater(C CalcValue &x)
  717. {
  718. switch(type)
  719. {
  720. case CVAL_INT: switch(x.type)
  721. {
  722. case CVAL_INT : i=(i>x.i); return true;
  723. case CVAL_REAL: i=(i>x.r); return true;
  724. }break;
  725. case CVAL_REAL: switch(x.type)
  726. {
  727. case CVAL_INT : i=(r>x.i); type=CVAL_INT; return true;
  728. case CVAL_REAL: i=(r>x.r); type=CVAL_INT; return true;
  729. }break;
  730. }
  731. return false;
  732. }
  733. Bool CalcValue::smaller(C CalcValue &x)
  734. {
  735. switch(type)
  736. {
  737. case CVAL_INT: switch(x.type)
  738. {
  739. case CVAL_INT : i=(i<x.i); return true;
  740. case CVAL_REAL: i=(i<x.r); return true;
  741. }break;
  742. case CVAL_REAL: switch(x.type)
  743. {
  744. case CVAL_INT : i=(r<x.i); type=CVAL_INT; return true;
  745. case CVAL_REAL: i=(r<x.r); type=CVAL_INT; return true;
  746. }break;
  747. }
  748. return false;
  749. }
  750. /******************************************************************************/
  751. Bool CalcValue::andLogical(C CalcValue &x)
  752. {
  753. switch(type)
  754. {
  755. case CVAL_INT: switch(x.type)
  756. {
  757. case CVAL_INT : i=(i && x.i); return true;
  758. case CVAL_REAL: i=(i && x.r); return true;
  759. }break;
  760. case CVAL_REAL: switch(x.type)
  761. {
  762. case CVAL_INT : i=(r && x.i); type=CVAL_INT; return true;
  763. case CVAL_REAL: i=(r && x.r); type=CVAL_INT; return true;
  764. }break;
  765. }
  766. return false;
  767. }
  768. Bool CalcValue::orLogical(C CalcValue &x)
  769. {
  770. switch(type)
  771. {
  772. case CVAL_INT: switch(x.type)
  773. {
  774. case CVAL_INT : i=(i || x.i); return true;
  775. case CVAL_REAL: i=(i || x.r); return true;
  776. }break;
  777. case CVAL_REAL: switch(x.type)
  778. {
  779. case CVAL_INT : i=(r || x.i); type=CVAL_INT; return true;
  780. case CVAL_REAL: i=(r || x.r); type=CVAL_INT; return true;
  781. }break;
  782. }
  783. return false;
  784. }
  785. Bool CalcValue::xorLogical(C CalcValue &x)
  786. {
  787. switch(type)
  788. {
  789. case CVAL_INT: switch(x.type)
  790. {
  791. case CVAL_INT : i=((i!=0) ^ (x.i!=0)); return true;
  792. case CVAL_REAL: i=((i!=0) ^ (x.r!=0)); return true;
  793. }break;
  794. case CVAL_REAL: switch(x.type)
  795. {
  796. case CVAL_INT : i=((r!=0) ^ (x.i!=0)); type=CVAL_INT; return true;
  797. case CVAL_REAL: i=((r!=0) ^ (x.r!=0)); type=CVAL_INT; return true;
  798. }break;
  799. }
  800. return false;
  801. }
  802. /******************************************************************************/
  803. Bool CalcValue::trunc()
  804. {
  805. switch(type)
  806. {
  807. case CVAL_INT : return true;
  808. case CVAL_REAL: i =TruncL(r ); type=CVAL_INT; return true;
  809. case CVAL_VEC2: v2=Trunc (v2); return true;
  810. case CVAL_VEC : v =Trunc (v ); return true;
  811. case CVAL_VEC4: v4=Trunc (v4); return true;
  812. default : return false;
  813. }
  814. }
  815. Bool CalcValue::round()
  816. {
  817. switch(type)
  818. {
  819. case CVAL_INT : return true;
  820. case CVAL_REAL: i =RoundL(r ); type=CVAL_INT; return true;
  821. case CVAL_VEC2: v2=Round (v2); return true;
  822. case CVAL_VEC : v =Round (v ); return true;
  823. case CVAL_VEC4: v4=Round (v4); return true;
  824. default : return false;
  825. }
  826. }
  827. Bool CalcValue::floor()
  828. {
  829. switch(type)
  830. {
  831. case CVAL_INT : return true;
  832. case CVAL_REAL: i =FloorL(r ); type=CVAL_INT; return true;
  833. case CVAL_VEC2: v2=Floor (v2); return true;
  834. case CVAL_VEC : v =Floor (v ); return true;
  835. case CVAL_VEC4: v4=Floor (v4); return true;
  836. default : return false;
  837. }
  838. }
  839. Bool CalcValue::ceil()
  840. {
  841. switch(type)
  842. {
  843. case CVAL_INT : return true;
  844. case CVAL_REAL: i =CeilL(r ); type=CVAL_INT; return true;
  845. case CVAL_VEC2: v2=Ceil (v2); return true;
  846. case CVAL_VEC : v =Ceil (v ); return true;
  847. case CVAL_VEC4: v4=Ceil (v4); return true;
  848. default : return false;
  849. }
  850. }
  851. Bool CalcValue::frac()
  852. {
  853. switch(type)
  854. {
  855. case CVAL_INT : i=0; return true;
  856. case CVAL_REAL: r =Frac(r ); return true;
  857. case CVAL_VEC2: v2=Frac(v2); return true;
  858. case CVAL_VEC : v =Frac(v ); return true;
  859. case CVAL_VEC4: v4=Frac(v4); return true;
  860. default : return false;
  861. }
  862. }
  863. Bool CalcValue::alignTrunc(C CalcValue &x)
  864. {
  865. switch(type)
  866. {
  867. case CVAL_INT: switch(x.type)
  868. {
  869. case CVAL_INT : r=AlignTrunc(Dbl(i), Dbl(x.i)); type=CVAL_REAL; return true;
  870. case CVAL_REAL: r=AlignTrunc(Dbl(i), x.r ); type=CVAL_REAL; return true;
  871. }break;
  872. case CVAL_REAL: switch(x.type)
  873. {
  874. case CVAL_INT : r=AlignTrunc(r, Dbl(x.i)); return true;
  875. case CVAL_REAL: r=AlignTrunc(r, x.r ); return true;
  876. }break;
  877. }
  878. return false;
  879. }
  880. Bool CalcValue::alignRound(C CalcValue &x)
  881. {
  882. switch(type)
  883. {
  884. case CVAL_INT: switch(x.type)
  885. {
  886. case CVAL_INT : r=AlignRound(Dbl(i), Dbl(x.i)); type=CVAL_REAL; return true;
  887. case CVAL_REAL: r=AlignRound(Dbl(i), x.r ); type=CVAL_REAL; return true;
  888. }break;
  889. case CVAL_REAL: switch(x.type)
  890. {
  891. case CVAL_INT : r=AlignRound(r, Dbl(x.i)); return true;
  892. case CVAL_REAL: r=AlignRound(r, x.r ); return true;
  893. }break;
  894. }
  895. return false;
  896. }
  897. Bool CalcValue::alignFloor(C CalcValue &x)
  898. {
  899. switch(type)
  900. {
  901. case CVAL_INT: switch(x.type)
  902. {
  903. case CVAL_INT : r=AlignFloor(Dbl(i), Dbl(x.i)); type=CVAL_REAL; return true;
  904. case CVAL_REAL: r=AlignFloor(Dbl(i), x.r ); type=CVAL_REAL; return true;
  905. }break;
  906. case CVAL_REAL: switch(x.type)
  907. {
  908. case CVAL_INT : r=AlignFloor(r, Dbl(x.i)); return true;
  909. case CVAL_REAL: r=AlignFloor(r, x.r ); return true;
  910. }break;
  911. }
  912. return false;
  913. }
  914. Bool CalcValue::alignCeil(C CalcValue &x)
  915. {
  916. switch(type)
  917. {
  918. case CVAL_INT: switch(x.type)
  919. {
  920. case CVAL_INT : r=AlignCeil(Dbl(i), Dbl(x.i)); type=CVAL_REAL; return true;
  921. case CVAL_REAL: r=AlignCeil(Dbl(i), x.r ); type=CVAL_REAL; return true;
  922. }break;
  923. case CVAL_REAL: switch(x.type)
  924. {
  925. case CVAL_INT : r=AlignCeil(r, Dbl(x.i)); return true;
  926. case CVAL_REAL: r=AlignCeil(r, x.r ); return true;
  927. }break;
  928. }
  929. return false;
  930. }
  931. /******************************************************************************/
  932. Bool CalcValue::sin()
  933. {
  934. switch(type)
  935. {
  936. case CVAL_INT : r=Sin(Dbl(i)); type=CVAL_REAL; return true;
  937. case CVAL_REAL: r=Sin( r ); return true;
  938. }
  939. return false;
  940. }
  941. Bool CalcValue::cos()
  942. {
  943. switch(type)
  944. {
  945. case CVAL_INT : r=Cos(Dbl(i)); type=CVAL_REAL; return true;
  946. case CVAL_REAL: r=Cos( r ); return true;
  947. }
  948. return false;
  949. }
  950. Bool CalcValue::tan()
  951. {
  952. switch(type)
  953. {
  954. case CVAL_INT : r=Tan(Dbl(i)); type=CVAL_REAL; return true;
  955. case CVAL_REAL: r=Tan( r ); return true;
  956. }
  957. return false;
  958. }
  959. Bool CalcValue::ctg()
  960. {
  961. switch(type)
  962. {
  963. case CVAL_INT : r=Ctg(Dbl(i)); type=CVAL_REAL; return true;
  964. case CVAL_REAL: r=Ctg( r ); return true;
  965. }
  966. return false;
  967. }
  968. Bool CalcValue::acos()
  969. {
  970. switch(type)
  971. {
  972. case CVAL_INT : r=Acos(Dbl(i)); type=CVAL_REAL; return true;
  973. case CVAL_REAL: r=Acos( r ); return true;
  974. }
  975. return false;
  976. }
  977. Bool CalcValue::asin()
  978. {
  979. switch(type)
  980. {
  981. case CVAL_INT : r=Asin(Dbl(i)); type=CVAL_REAL; return true;
  982. case CVAL_REAL: r=Asin( r ); return true;
  983. }
  984. return false;
  985. }
  986. Bool CalcValue::atan()
  987. {
  988. switch(type)
  989. {
  990. case CVAL_INT : r=Atan(Dbl(i)); type=CVAL_REAL; return true;
  991. case CVAL_REAL: r=Atan( r ); return true;
  992. }
  993. return false;
  994. }
  995. Bool CalcValue::degToRad()
  996. {
  997. switch(type)
  998. {
  999. case CVAL_INT : r=DegToRad(Dbl(i)); type=CVAL_REAL; return true;
  1000. case CVAL_REAL: r=DegToRad( r ); return true;
  1001. }
  1002. return false;
  1003. }
  1004. Bool CalcValue::radToDeg()
  1005. {
  1006. switch(type)
  1007. {
  1008. case CVAL_INT : r=RadToDeg(Dbl(i)); type=CVAL_REAL; return true;
  1009. case CVAL_REAL: r=RadToDeg( r ); return true;
  1010. }
  1011. return false;
  1012. }
  1013. /******************************************************************************/
  1014. Bool CalcValue::length()
  1015. {
  1016. switch(type)
  1017. {
  1018. case CVAL_VEC2: r=v2.length(); type=CVAL_REAL; return true;
  1019. case CVAL_VEC : r=v .length(); type=CVAL_REAL; return true;
  1020. case CVAL_VEC4: r=v4.length(); type=CVAL_REAL; return true;
  1021. }
  1022. return false;
  1023. }
  1024. Bool CalcValue::length2()
  1025. {
  1026. switch(type)
  1027. {
  1028. case CVAL_VEC2: r=v2.length2(); type=CVAL_REAL; return true;
  1029. case CVAL_VEC : r=v .length2(); type=CVAL_REAL; return true;
  1030. case CVAL_VEC4: r=v4.length2(); type=CVAL_REAL; return true;
  1031. }
  1032. return false;
  1033. }
  1034. Bool CalcValue::dot(C CalcValue &x)
  1035. {
  1036. if(type==x.type)switch(type)
  1037. {
  1038. case CVAL_VEC2: r=Dot(v2, x.v2); type=CVAL_REAL; return true;
  1039. case CVAL_VEC : r=Dot(v , x.v ); type=CVAL_REAL; return true;
  1040. case CVAL_VEC4: r=Dot(v4, x.v4); type=CVAL_REAL; return true;
  1041. }
  1042. return false;
  1043. }
  1044. Bool CalcValue::cross(C CalcValue &x)
  1045. {
  1046. if(type==CVAL_VEC && x.type==CVAL_VEC){v=Cross(v, x.v); return true;}
  1047. return false;
  1048. }
  1049. Bool CalcValue::perp()
  1050. {
  1051. switch(type)
  1052. {
  1053. case CVAL_VEC2: v2=Perp(v2); return true;
  1054. case CVAL_VEC : v =Perp(v ); return true;
  1055. }
  1056. return false;
  1057. }
  1058. /******************************************************************************/
  1059. static Bool CLogicalNot(CalcValue &x) {return x.notLogical() ? true : E("!" , x);}
  1060. static Bool CBitwiseNot(CalcValue &x) {return x.notBitwise() ? true : E("~" , x);}
  1061. static Bool CChs (CalcValue &x) {return x.chs () ? true : E("-" , x);}
  1062. static Bool CAbs (CalcValue &x) {return x.abs () ? true : E("Abs" , x);}
  1063. static Bool CSign (CalcValue &x) {return x.sign () ? true : E("Sign", x);}
  1064. static Bool CSat(CalcValue &x ) {return x.sat( ) ? true : E("Sat", x );}
  1065. static Bool CMin(CalcValue &x, CalcValue &y) {return x.min(y) ? true : E("Min", x, y);}
  1066. static Bool CMax(CalcValue &x, CalcValue &y) {return x.max(y) ? true : E("Max", x, y);}
  1067. static Bool CAvg(CalcValue &x, CalcValue &y) {return x.avg(y) ? true : E("Avg", x, y);}
  1068. static Bool CAdd(CalcValue &x, CalcValue &y) {return x.add(y) ? true : E("+", x, y);}
  1069. static Bool CSub(CalcValue &x, CalcValue &y) {return x.sub(y) ? true : E("-", x, y);}
  1070. static Bool CMul(CalcValue &x, CalcValue &y) {return x.mul(y) ? true : E("*", x, y);}
  1071. static Bool CDiv(CalcValue &x, CalcValue &y) {return x.div(y) ? true : E("/", x, y);}
  1072. static Bool CMod(CalcValue &x, CalcValue &y) {return x.mod(y) ? true : E("%", x, y);}
  1073. static Bool CSqr (CalcValue &x ) {return x.sqr ( ) ? true : E("Sqr" , x );}
  1074. static Bool CCube(CalcValue &x ) {return x.cube( ) ? true : E("Cube", x );}
  1075. static Bool CSqrt(CalcValue &x ) {return x.sqrt( ) ? true : E("Sqrt", x );}
  1076. static Bool CCbrt(CalcValue &x ) {return x.cbrt( ) ? true : E("Cbrt", x );}
  1077. static Bool CPow (CalcValue &x, CalcValue &y) {return x.pow (y) ? true : E("Pow" , x, y);}
  1078. static Bool CLn (CalcValue &x ) {return x.ln ( ) ? true : E("Ln" , x );}
  1079. static Bool CLog2(CalcValue &x ) {return x.log2( ) ? true : E("Log2", x );}
  1080. static Bool CLog (CalcValue &x, CalcValue &y) {return x.log (y) ? true : E("Log" , x, y);}
  1081. static Bool CAnd(CalcValue &x, CalcValue &y) {return x.And(y) ? true : E("&" , x, y);}
  1082. static Bool COr (CalcValue &x, CalcValue &y) {return x.Or (y) ? true : E("|" , x, y);}
  1083. static Bool CXor(CalcValue &x, CalcValue &y) {return x.Xor(y) ? true : E("^" , x, y);}
  1084. static Bool CShl(CalcValue &x, CalcValue &y) {return x.shl(y) ? true : E("<<", x, y);}
  1085. static Bool CShr(CalcValue &x, CalcValue &y) {return x.shr(y) ? true : E(">>", x, y);}
  1086. static Bool CRol(CalcValue &x, CalcValue &y) {return x.rol(y) ? true : E("Rol", x, y);}
  1087. static Bool CRor(CalcValue &x, CalcValue &y) {return x.ror(y) ? true : E("Ror", x, y);}
  1088. static Bool CEqual(CalcValue &x, CalcValue &y) {return x. equal (y) ? true : E("==", x, y);}
  1089. static Bool CNequ (CalcValue &x, CalcValue &y) {return x. notEqual (y) ? true : E("!=", x, y);}
  1090. static Bool CGr (CalcValue &x, CalcValue &y) {return x. greater(y) ? true : E(">" , x, y);}
  1091. static Bool CSm (CalcValue &x, CalcValue &y) {return x. smaller(y) ? true : E("<" , x, y);}
  1092. static Bool CEgr (CalcValue &x, CalcValue &y) {return x.equalGreater(y) ? true : E(">=", x, y);}
  1093. static Bool CEsm (CalcValue &x, CalcValue &y) {return x.equalSmaller(y) ? true : E("<=", x, y);}
  1094. static Bool CLogicalAnd(CalcValue &x, CalcValue &y) {return x.andLogical(y) ? true : E("&&", x, y);}
  1095. static Bool CLogicalOr (CalcValue &x, CalcValue &y) {return x. orLogical(y) ? true : E("||", x, y);}
  1096. static Bool CLogicalXor(CalcValue &x, CalcValue &y) {return x.xorLogical(y) ? true : E("^^", x, y);}
  1097. static Bool CTrunc (CalcValue &x ) {return x.trunc ( ) ? true : E("Trunc" , x);}
  1098. static Bool CRound (CalcValue &x ) {return x.round ( ) ? true : E("Round" , x);}
  1099. static Bool CFloor (CalcValue &x ) {return x.floor ( ) ? true : E("Floor" , x);}
  1100. static Bool CCeil (CalcValue &x ) {return x.ceil ( ) ? true : E("Ceil" , x);}
  1101. static Bool CFrac (CalcValue &x ) {return x.frac ( ) ? true : E("Frac" , x);}
  1102. static Bool CAlignT(CalcValue &x, CalcValue &y) {return x.alignTrunc(y) ? true : E("AlignTrunc", x, y);}
  1103. static Bool CAlignR(CalcValue &x, CalcValue &y) {return x.alignRound(y) ? true : E("AlignRound", x, y);}
  1104. static Bool CAlignF(CalcValue &x, CalcValue &y) {return x.alignFloor(y) ? true : E("AlignFloor", x, y);}
  1105. static Bool CAlignC(CalcValue &x, CalcValue &y) {return x.alignCeil (y) ? true : E("AlignCeil" , x, y);}
  1106. static Bool CSin (CalcValue &x) {return x.sin () ? true : E("Sin" , x);}
  1107. static Bool CCos (CalcValue &x) {return x.cos () ? true : E("Cos" , x);}
  1108. static Bool CTan (CalcValue &x) {return x.tan () ? true : E("Tan" , x);}
  1109. static Bool CCtg (CalcValue &x) {return x.ctg () ? true : E("Ctg" , x);}
  1110. static Bool CAcos (CalcValue &x) {return x.acos () ? true : E("Acos" , x);}
  1111. static Bool CAsin (CalcValue &x) {return x.asin () ? true : E("Asin" , x);}
  1112. static Bool CAtan (CalcValue &x) {return x.atan () ? true : E("Atan" , x);}
  1113. static Bool CDegToRad(CalcValue &x) {return x.degToRad() ? true : E("DegToRad", x);}
  1114. static Bool CRadToDeg(CalcValue &x) {return x.radToDeg() ? true : E("RadToDeg", x);}
  1115. static Bool CLength (CalcValue &x ) {return x.length ( ) ? true : E("Length" , x );}
  1116. static Bool CLength2(CalcValue &x ) {return x.length2( ) ? true : E("Length2", x );}
  1117. static Bool CDot (CalcValue &x, CalcValue &y) {return x.dot (y) ? true : E("Dot" , x, y);}
  1118. static Bool CCross (CalcValue &x, CalcValue &y) {return x.cross (y) ? true : E("Cross" , x, y);}
  1119. static Bool CPerp (CalcValue &x ) {return x.perp ( ) ? true : E("Perp" , x );}
  1120. static Bool CAngle(CalcValue &x, CalcValue &y)
  1121. {
  1122. Dbl xr, yr;
  1123. if(x.type==CVAL_INT )xr=x.i;else
  1124. if(x.type==CVAL_REAL)xr=x.r;else return E("Angle", x, y);
  1125. if(y.type==CVAL_INT )yr=y.i;else
  1126. if(y.type==CVAL_REAL)yr=y.r;else return E("Angle", x, y);
  1127. x.r =Angle(VecD2(xr, yr));
  1128. x.type=CVAL_REAL; return true;
  1129. }
  1130. static Bool CPinch(CalcValue &x, CalcValue &y)
  1131. {
  1132. Dbl step, pinch;
  1133. if(x.type==CVAL_INT )step =x.i;else
  1134. if(x.type==CVAL_REAL)step =x.r;else return E("Pinch", x, y);
  1135. if(y.type==CVAL_INT )pinch=y.i;else
  1136. if(y.type==CVAL_REAL)pinch=y.r;else return E("Pinch", x, y);
  1137. x.r =Pinch(step, pinch);
  1138. x.type=CVAL_REAL; return true;
  1139. }
  1140. static Bool CSmoothSqr(CalcValue &x)
  1141. {
  1142. if(x.type==CVAL_INT )x.r=SmoothSqr(Dbl(x.i));else
  1143. if(x.type==CVAL_REAL)x.r=SmoothSqr( x.r );else return E("SmoothSqr", x);
  1144. x.type=CVAL_REAL; return true;
  1145. }
  1146. static Bool CSmoothCube(CalcValue &x)
  1147. {
  1148. if(x.type==CVAL_INT )x.r=SmoothCube(Dbl(x.i));else
  1149. if(x.type==CVAL_REAL)x.r=SmoothCube( x.r );else return E("SmoothCube", x);
  1150. x.type=CVAL_REAL; return true;
  1151. }
  1152. static Bool CSmoothCubeInv(CalcValue &x)
  1153. {
  1154. if(x.type==CVAL_INT )x.r=SmoothCubeInv(Dbl(x.i));else
  1155. if(x.type==CVAL_REAL)x.r=SmoothCubeInv( x.r );else return E("CSmoothCubeInv", x);
  1156. x.type=CVAL_REAL; return true;
  1157. }
  1158. static Bool CSmoothCube2(CalcValue &x)
  1159. {
  1160. if(x.type==CVAL_INT )x.r=SmoothCube2(Dbl(x.i));else
  1161. if(x.type==CVAL_REAL)x.r=SmoothCube2( x.r );else return E("SmoothCube2", x);
  1162. x.type=CVAL_REAL; return true;
  1163. }
  1164. static Bool CSmoothSextic(CalcValue &x)
  1165. {
  1166. if(x.type==CVAL_INT )x.r=SmoothSextic(Dbl(x.i));else
  1167. if(x.type==CVAL_REAL)x.r=SmoothSextic( x.r );else return E("SmoothSextic", x);
  1168. x.type=CVAL_REAL; return true;
  1169. }
  1170. static Bool CSmoothSin(CalcValue &x)
  1171. {
  1172. if(x.type==CVAL_INT )x.r=SmoothSin(Dbl(x.i));else
  1173. if(x.type==CVAL_REAL)x.r=SmoothSin( x.r );else return E("SmoothSin", x);
  1174. x.type=CVAL_REAL; return true;
  1175. }
  1176. static Bool CSmoothPow(CalcValue &x, CalcValue &y)
  1177. {
  1178. Dbl step, pow;
  1179. if(x.type==CVAL_INT )step=x.i;else
  1180. if(x.type==CVAL_REAL)step=x.r;else return E("SmoothPow", x, y);
  1181. if(y.type==CVAL_INT )pow =y.i;else
  1182. if(y.type==CVAL_REAL)pow =y.r;else return E("SmoothPow", x, y);
  1183. x.r =SmoothPow(step, pow);
  1184. x.type=CVAL_REAL; return true;
  1185. }
  1186. static Bool CSmoothPinch(CalcValue &x, CalcValue &y)
  1187. {
  1188. Dbl step, pinch;
  1189. if(x.type==CVAL_INT )step =x.i;else
  1190. if(x.type==CVAL_REAL)step =x.r;else return E("SmoothPinch", x, y);
  1191. if(y.type==CVAL_INT )pinch=y.i;else
  1192. if(y.type==CVAL_REAL)pinch=y.r;else return E("SmoothPinch", x, y);
  1193. x.r =SmoothPinch(step, pinch);
  1194. x.type=CVAL_REAL; return true;
  1195. }
  1196. static Bool CVec2(CalcValue &x, CalcValue &y)
  1197. {
  1198. if(x.type==CVAL_INT )x.v2.x=x.i;else
  1199. if(x.type==CVAL_REAL)x.v2.x=x.r;else return E("Vec2", x, y);
  1200. if(y.type==CVAL_INT )x.v2.y=y.i;else
  1201. if(y.type==CVAL_REAL)x.v2.y=y.r;else return E("Vec2", x, y);
  1202. x.type=CVAL_VEC2; return true;
  1203. }
  1204. static Bool CVec(CalcValue &x, CalcValue &y, CalcValue &z)
  1205. {
  1206. if(x.type==CVAL_INT )x.v.x=x.i;else
  1207. if(x.type==CVAL_REAL)x.v.x=x.r;else return E("Vec", x, y, z);
  1208. if(y.type==CVAL_INT )x.v.y=y.i;else
  1209. if(y.type==CVAL_REAL)x.v.y=y.r;else return E("Vec", x, y, z);
  1210. if(z.type==CVAL_INT )x.v.z=z.i;else
  1211. if(z.type==CVAL_REAL)x.v.z=z.r;else return E("Vec", x, y, z);
  1212. x.type=CVAL_VEC; return true;
  1213. }
  1214. static Bool CVec4(CalcValue &x, CalcValue &y, CalcValue &z, CalcValue &w)
  1215. {
  1216. if(x.type==CVAL_INT )x.v4.x=x.i;else
  1217. if(x.type==CVAL_REAL)x.v4.x=x.r;else return E("Vec4", x, y, z, w);
  1218. if(y.type==CVAL_INT )x.v4.y=y.i;else
  1219. if(y.type==CVAL_REAL)x.v4.y=y.r;else return E("Vec4", x, y, z, w);
  1220. if(z.type==CVAL_INT )x.v4.z=z.i;else
  1221. if(z.type==CVAL_REAL)x.v4.z=z.r;else return E("Vec4", x, y, z, w);
  1222. if(w.type==CVAL_INT )x.v4.w=w.i;else
  1223. if(w.type==CVAL_REAL)x.v4.w=w.r;else return E("Vec4", x, y, z, w);
  1224. x.type=CVAL_VEC4; return true;
  1225. }
  1226. static Bool CLerp(CalcValue &x, CalcValue &y, CalcValue &z)
  1227. {
  1228. Dbl from, to, s;
  1229. if(z.type==CVAL_INT )s=z.i;else
  1230. if(z.type==CVAL_REAL)s=z.r;else return E("Lerp", x, y, z);
  1231. if(x.type==CVAL_VEC2 && y.type==CVAL_VEC2){x.v2=Lerp(x.v2, y.v2, s); return true;}
  1232. if(x.type==CVAL_VEC && y.type==CVAL_VEC ){x.v =Lerp(x.v , y.v , s); return true;}
  1233. if(x.type==CVAL_VEC4 && y.type==CVAL_VEC4){x.v4=Lerp(x.v4, y.v4, s); return true;}
  1234. if(x.type==CVAL_INT )from=x.i;else
  1235. if(x.type==CVAL_REAL)from=x.r;else return E("Lerp", x, y, z);
  1236. if(y.type==CVAL_INT )to =y.i;else
  1237. if(y.type==CVAL_REAL)to =y.r;else return E("Lerp", x, y, z);
  1238. x.r =Lerp(from, to, s);
  1239. x.type=CVAL_REAL; return true;
  1240. }
  1241. static Bool CLerpR(CalcValue &x, CalcValue &y, CalcValue &z)
  1242. {
  1243. Dbl from, to, s;
  1244. if(x.type==CVAL_INT )from=x.i;else
  1245. if(x.type==CVAL_REAL)from=x.r;else return E("LerpR", x, y, z);
  1246. if(y.type==CVAL_INT )to =y.i;else
  1247. if(y.type==CVAL_REAL)to =y.r;else return E("LerpR", x, y, z);
  1248. if(z.type==CVAL_INT )s =z.i;else
  1249. if(z.type==CVAL_REAL)s =z.r;else return E("LerpR", x, y, z);
  1250. x.r =LerpR(from, to, s);
  1251. x.type=CVAL_REAL; return true;
  1252. }
  1253. static Bool CLerpRS(CalcValue &x, CalcValue &y, CalcValue &z)
  1254. {
  1255. Dbl from, to, s;
  1256. if(x.type==CVAL_INT )from=x.i;else
  1257. if(x.type==CVAL_REAL)from=x.r;else return E("LerpRS", x, y, z);
  1258. if(y.type==CVAL_INT )to =y.i;else
  1259. if(y.type==CVAL_REAL)to =y.r;else return E("LerpRS", x, y, z);
  1260. if(z.type==CVAL_INT )s =z.i;else
  1261. if(z.type==CVAL_REAL)s =z.r;else return E("LerpRS", x, y, z);
  1262. x.r =LerpRS(from, to, s);
  1263. x.type=CVAL_REAL; return true;
  1264. }
  1265. static Bool CLerpSmoothSqr(CalcValue &x, CalcValue &y, CalcValue &z)
  1266. {
  1267. Dbl from, to, s;
  1268. if(x.type==CVAL_INT )from=x.i;else
  1269. if(x.type==CVAL_REAL)from=x.r;else return E("LerpSmoothSqr", x, y, z);
  1270. if(y.type==CVAL_INT )to =y.i;else
  1271. if(y.type==CVAL_REAL)to =y.r;else return E("LerpSmoothSqr", x, y, z);
  1272. if(z.type==CVAL_INT )s =z.i;else
  1273. if(z.type==CVAL_REAL)s =z.r;else return E("LerpSmoothSqr", x, y, z);
  1274. x.r =LerpSmoothSqr(from, to, s);
  1275. x.type=CVAL_REAL; return true;
  1276. }
  1277. static Bool CLerpSmoothCube(CalcValue &x, CalcValue &y, CalcValue &z)
  1278. {
  1279. Dbl from, to, s;
  1280. if(x.type==CVAL_INT )from=x.i;else
  1281. if(x.type==CVAL_REAL)from=x.r;else return E("LerpSmoothCube", x, y, z);
  1282. if(y.type==CVAL_INT )to =y.i;else
  1283. if(y.type==CVAL_REAL)to =y.r;else return E("LerpSmoothCube", x, y, z);
  1284. if(z.type==CVAL_INT )s =z.i;else
  1285. if(z.type==CVAL_REAL)s =z.r;else return E("LerpSmoothCube", x, y, z);
  1286. x.r =LerpSmoothCube(from, to, s);
  1287. x.type=CVAL_REAL; return true;
  1288. }
  1289. static Bool CLerpSmoothCube2(CalcValue &x, CalcValue &y, CalcValue &z)
  1290. {
  1291. Dbl from, to, s;
  1292. if(x.type==CVAL_INT )from=x.i;else
  1293. if(x.type==CVAL_REAL)from=x.r;else return E("LerpSmoothCube2", x, y, z);
  1294. if(y.type==CVAL_INT )to =y.i;else
  1295. if(y.type==CVAL_REAL)to =y.r;else return E("LerpSmoothCube2", x, y, z);
  1296. if(z.type==CVAL_INT )s =z.i;else
  1297. if(z.type==CVAL_REAL)s =z.r;else return E("LerpSmoothCube2", x, y, z);
  1298. x.r =LerpSmoothCube2(from, to, s);
  1299. x.type=CVAL_REAL; return true;
  1300. }
  1301. static Bool CLerpSmoothSextic(CalcValue &x, CalcValue &y, CalcValue &z)
  1302. {
  1303. Dbl from, to, s;
  1304. if(x.type==CVAL_INT )from=x.i;else
  1305. if(x.type==CVAL_REAL)from=x.r;else return E("LerpSmoothSextic", x, y, z);
  1306. if(y.type==CVAL_INT )to =y.i;else
  1307. if(y.type==CVAL_REAL)to =y.r;else return E("LerpSmoothSextic", x, y, z);
  1308. if(z.type==CVAL_INT )s =z.i;else
  1309. if(z.type==CVAL_REAL)s =z.r;else return E("LerpSmoothSextic", x, y, z);
  1310. x.r =LerpSmoothSextic(from, to, s);
  1311. x.type=CVAL_REAL; return true;
  1312. }
  1313. static Bool CLerpSmoothSin(CalcValue &x, CalcValue &y, CalcValue &z)
  1314. {
  1315. Dbl from, to, s;
  1316. if(x.type==CVAL_INT )from=x.i;else
  1317. if(x.type==CVAL_REAL)from=x.r;else return E("LerpSmoothSin", x, y, z);
  1318. if(y.type==CVAL_INT )to =y.i;else
  1319. if(y.type==CVAL_REAL)to =y.r;else return E("LerpSmoothSin", x, y, z);
  1320. if(z.type==CVAL_INT )s =z.i;else
  1321. if(z.type==CVAL_REAL)s =z.r;else return E("LerpSmoothSin", x, y, z);
  1322. x.r =LerpSmoothSin(from, to, s);
  1323. x.type=CVAL_REAL; return true;
  1324. }
  1325. static Bool CLerpSmoothPow(CalcValue &x, CalcValue &y, CalcValue &z, CalcValue &w)
  1326. {
  1327. Dbl from, to, s, p;
  1328. if(x.type==CVAL_INT )from=x.i;else
  1329. if(x.type==CVAL_REAL)from=x.r;else return E("LerpSmoothPow", x, y, z, w);
  1330. if(y.type==CVAL_INT )to =y.i;else
  1331. if(y.type==CVAL_REAL)to =y.r;else return E("LerpSmoothPow", x, y, z, w);
  1332. if(z.type==CVAL_INT )s =z.i;else
  1333. if(z.type==CVAL_REAL)s =z.r;else return E("LerpSmoothPow", x, y, z, w);
  1334. if(w.type==CVAL_INT )p =w.i;else
  1335. if(w.type==CVAL_REAL)p =w.r;else return E("LerpSmoothPow", x, y, z, w);
  1336. x.r =LerpSmoothPow(from, to, s, p);
  1337. x.type=CVAL_REAL; return true;
  1338. }
  1339. static Bool CLerpSmoothPinch(CalcValue &x, CalcValue &y, CalcValue &z, CalcValue &w)
  1340. {
  1341. Dbl from, to, s, p;
  1342. if(x.type==CVAL_INT )from=x.i;else
  1343. if(x.type==CVAL_REAL)from=x.r;else return E("LerpSmoothPinch", x, y, z, w);
  1344. if(y.type==CVAL_INT )to =y.i;else
  1345. if(y.type==CVAL_REAL)to =y.r;else return E("LerpSmoothPinch", x, y, z, w);
  1346. if(z.type==CVAL_INT )s =z.i;else
  1347. if(z.type==CVAL_REAL)s =z.r;else return E("LerpSmoothPinch", x, y, z, w);
  1348. if(w.type==CVAL_INT )p =w.i;else
  1349. if(w.type==CVAL_REAL)p =w.r;else return E("LerpSmoothPinch", x, y, z, w);
  1350. x.r =LerpSmoothPinch(from, to, s, p);
  1351. x.type=CVAL_REAL; return true;
  1352. }
  1353. static Bool CScaleFactor(CalcValue &x)
  1354. {
  1355. if(x.type==CVAL_INT )x.r=ScaleFactor(Dbl(x.i));else
  1356. if(x.type==CVAL_REAL)x.r=ScaleFactor( x.r );else return E("ScaleFactor", x);
  1357. x.type=CVAL_REAL; return true;
  1358. }
  1359. static Bool CScaleFactorR(CalcValue &x)
  1360. {
  1361. if(x.type==CVAL_INT )x.r=ScaleFactorR(Dbl(x.i));else
  1362. if(x.type==CVAL_REAL)x.r=ScaleFactorR( x.r );else return E("ScaleFactorR", x);
  1363. x.type=CVAL_REAL; return true;
  1364. }
  1365. /******************************************************************************/
  1366. static struct CalcOpInfo
  1367. {
  1368. Byte priority, args;
  1369. CChar8 *t;
  1370. Ptr func;
  1371. }C CalcOpInfos[]=
  1372. {
  1373. #define COT_LOGICAL_NOT 0
  1374. {0, 1, "!", (Ptr)CLogicalNot},
  1375. #define COT_BITWISE_NOT 1
  1376. {0, 1, "~", (Ptr)CBitwiseNot},
  1377. #define COT_ADD 2
  1378. {3, 2, "+", (Ptr)CAdd},
  1379. #define COT_SUB 3
  1380. {3, 2, "-", (Ptr)CSub},
  1381. #define COT_MUL 4
  1382. {2, 2, "*", (Ptr)CMul},
  1383. #define COT_POW 5
  1384. {1, 2, "**", (Ptr)CPow},
  1385. #define COT_DIV 6
  1386. {2, 2, "/", (Ptr)CDiv},
  1387. #define COT_MOD 7
  1388. {2, 2, "%", (Ptr)CMod},
  1389. #define COT_AND 8
  1390. {4, 2, "&", (Ptr)CAnd},
  1391. #define COT_OR 9
  1392. {4, 2, "|", (Ptr)COr},
  1393. #define COT_XOR 10
  1394. {4, 2, "^", (Ptr)CXor},
  1395. #define COT_SHL 11
  1396. {5, 2, "<<", (Ptr)CShl},
  1397. #define COT_SHR 12
  1398. {5, 2, ">>", (Ptr)CShr},
  1399. #define COT_EQU 13
  1400. {6, 2, "==", (Ptr)CEqual},
  1401. #define COT_NEQ 14
  1402. {6, 2, "!=", (Ptr)CNequ},
  1403. #define COT_GR 15
  1404. {6, 2, ">", (Ptr)CGr},
  1405. #define COT_SM 16
  1406. {6, 2, "<", (Ptr)CSm},
  1407. #define COT_EGR 17
  1408. {6, 2, ">=", (Ptr)CEgr},
  1409. #define COT_ESM 18
  1410. {6, 2, "<=", (Ptr)CEsm},
  1411. #define COT_LOGICAL_AND 19
  1412. {7, 2, "&&", (Ptr)CLogicalAnd},
  1413. #define COT_LOGICAL_OR 20
  1414. {7, 2, "||", (Ptr)CLogicalOr},
  1415. #define COT_LOGICAL_XOR 21
  1416. {7, 2, "^^", (Ptr)CLogicalXor},
  1417. #define COT_COMMA 22
  1418. {8, 0, ",", null},
  1419. #define COT_LBR 23
  1420. {9, 0, "(", null},
  1421. #define COT_RBR 24
  1422. {9, 0, ")", null},
  1423. };
  1424. struct CalcOp
  1425. {
  1426. UInt type;
  1427. };
  1428. /******************************************************************************/
  1429. static struct CalcFuncInfo
  1430. {
  1431. Byte args;
  1432. CChar8 *t;
  1433. Ptr func;
  1434. }C CalcFuncInfos[]=
  1435. {
  1436. {1, "Abs" , (Ptr)CAbs },
  1437. {1, "Sign" , (Ptr)CSign },
  1438. {1, "Sat" , (Ptr)CSat },
  1439. {2, "Min" , (Ptr)CMin },
  1440. {2, "Max" , (Ptr)CMax },
  1441. {2, "Avg" , (Ptr)CAvg },
  1442. {1, "Trunc" , (Ptr)CTrunc },
  1443. {1, "Round" , (Ptr)CRound },
  1444. {1, "Floor" , (Ptr)CFloor },
  1445. {1, "Ceil" , (Ptr)CCeil },
  1446. {1, "Frac" , (Ptr)CFrac },
  1447. {2, "AlignTrunc" , (Ptr)CAlignT },
  1448. {2, "AlignRound" , (Ptr)CAlignR },
  1449. {2, "AlignFloor" , (Ptr)CAlignF },
  1450. {2, "AlignCeil" , (Ptr)CAlignC },
  1451. {1, "Ln" , (Ptr)CLn },
  1452. {1, "Log2" , (Ptr)CLog2 },
  1453. {2, "Log" , (Ptr)CLog },
  1454. {1, "Sin" , (Ptr)CSin },
  1455. {1, "Cos" , (Ptr)CCos },
  1456. {1, "Tan" , (Ptr)CTan },
  1457. {1, "Ctg" , (Ptr)CCtg },
  1458. {1, "Acos" , (Ptr)CAcos },
  1459. {1, "Asin" , (Ptr)CAsin },
  1460. {1, "Atan" , (Ptr)CAtan },
  1461. {1, "DegToRad" , (Ptr)CDegToRad },
  1462. {1, "RadToDeg" , (Ptr)CRadToDeg },
  1463. {2, "Angle" , (Ptr)CAngle },
  1464. {1, "Sqr" , (Ptr)CSqr },
  1465. {1, "Cube" , (Ptr)CCube },
  1466. {1, "Sqrt" , (Ptr)CSqrt },
  1467. {1, "Cbrt" , (Ptr)CCbrt },
  1468. {2, "Pow" , (Ptr)CPow },
  1469. {2, "Pinch" , (Ptr)CPinch },
  1470. {1, "SmoothSqr" , (Ptr)CSmoothSqr },
  1471. {1, "SmoothCube" , (Ptr)CSmoothCube },
  1472. {1, "SmoothCubeInv" , (Ptr)CSmoothCubeInv },
  1473. {1, "SmoothCube2" , (Ptr)CSmoothCube2 },
  1474. {1, "SmoothSextic" , (Ptr)CSmoothSextic },
  1475. {1, "SmoothSin" , (Ptr)CSmoothSin },
  1476. {2, "SmoothPow" , (Ptr)CSmoothPow },
  1477. {2, "SmoothPinch" , (Ptr)CSmoothPinch },
  1478. {2, "Vec2" , (Ptr)CVec2 },
  1479. {3, "Vec" , (Ptr)CVec },
  1480. {4, "Vec4" , (Ptr)CVec4 },
  1481. {1, "Len" , (Ptr)CLength },
  1482. {1, "Length" , (Ptr)CLength },
  1483. {1, "Len2" , (Ptr)CLength2 },
  1484. {1, "Length2" , (Ptr)CLength2 },
  1485. {2, "Dot" , (Ptr)CDot },
  1486. {2, "Cross" , (Ptr)CCross },
  1487. {1, "Perp" , (Ptr)CPerp },
  1488. {3, "Lerp" , (Ptr)CLerp },
  1489. {3, "LerpR" , (Ptr)CLerpR },
  1490. {3, "LerpRS" , (Ptr)CLerpRS },
  1491. {3, "LerpSmoothSqr" , (Ptr)CLerpSmoothSqr },
  1492. {3, "LerpSmoothCube" , (Ptr)CLerpSmoothCube },
  1493. {3, "LerpSmoothCube2" , (Ptr)CLerpSmoothCube2 },
  1494. {3, "LerpSmoothSextic", (Ptr)CLerpSmoothSextic},
  1495. {3, "LerpSmoothSin" , (Ptr)CLerpSmoothSin },
  1496. {4, "LerpSmoothPow" , (Ptr)CLerpSmoothPow },
  1497. {4, "LerpSmoothPinch" , (Ptr)CLerpSmoothPinch },
  1498. {1, "ScaleFactor" , (Ptr)CScaleFactor },
  1499. {1, "ScaleFactorR" , (Ptr)CScaleFactorR },
  1500. {2, "Rol" , (Ptr)CRol },
  1501. {2, "Ror" , (Ptr)CRor },
  1502. };
  1503. struct CalcFunc
  1504. {
  1505. C CalcFuncInfo *funi;
  1506. };
  1507. /******************************************************************************/
  1508. struct CalcElm
  1509. {
  1510. CALC_ELM_TYPE type;
  1511. union
  1512. {
  1513. CalcOp o;
  1514. CalcValue v;
  1515. CalcFunc f;
  1516. };
  1517. CalcElm() {} // needed because of union
  1518. };
  1519. /******************************************************************************/
  1520. static Bool ReadChar(Meml<CalcElm> &elms, CChar* &text, C MemPtr<CalcVar> &vars)
  1521. {
  1522. Char name[256];
  1523. for(Int i=0; ; )
  1524. {
  1525. Char c=*text; if(!(CharFlag(c)&(CHARF_ALPHA|CHARF_DIG|CHARF_UNDER)) && c!='.'){name[i]='\0'; break;}
  1526. name[i++]=c; text++;
  1527. if(!InRange(i, name))return false;
  1528. }
  1529. if(Equal(name, "pi"))
  1530. {
  1531. CalcElm &elm=elms.New();
  1532. elm.type =CET_VAL;
  1533. elm.v.type=CVAL_REAL;
  1534. elm.v.r =PID;
  1535. return true;
  1536. }else
  1537. if(Equal(name, "e"))
  1538. {
  1539. CalcElm &elm=elms.New();
  1540. elm.type =CET_VAL;
  1541. elm.v.type=CVAL_REAL;
  1542. elm.v.r =2.7182818284590452353602874713527;
  1543. return true;
  1544. }
  1545. REPA(CalcFuncInfos)if(Equal(name, CalcFuncInfos[i].t))
  1546. {
  1547. CalcElm &elm=elms.New();
  1548. elm.type =CET_FUNC;
  1549. elm.f.funi=&CalcFuncInfos[i];
  1550. return true;
  1551. }
  1552. REPA(vars)if(Equal(name, vars[i].name))
  1553. {
  1554. CalcElm &elm=elms.New();
  1555. elm.type=CET_VAL;
  1556. elm.v =vars[i].value;
  1557. return true;
  1558. }
  1559. return E(name);
  1560. }
  1561. /******************************************************************************/
  1562. static void AddOp(Meml<CalcElm> &elms, UInt op)
  1563. {
  1564. CalcElm &elm=elms.New();
  1565. elm.type =CET_OP;
  1566. elm.o.type=op;
  1567. }
  1568. static Bool ReadOp(Meml<CalcElm> &elms, CChar* &text)
  1569. {
  1570. Char c=text[1];
  1571. switch(text[0])
  1572. {
  1573. case '+': AddOp(elms, COT_ADD ); break;
  1574. case '-': AddOp(elms, COT_SUB ); break;
  1575. case '/': AddOp(elms, COT_DIV ); break;
  1576. case '%': AddOp(elms, COT_MOD ); break;
  1577. case '~': AddOp(elms, COT_BITWISE_NOT); break;
  1578. case ',': AddOp(elms, COT_COMMA ); break;
  1579. case '(': AddOp(elms, COT_LBR ); break;
  1580. case ')': AddOp(elms, COT_RBR ); break;
  1581. case '=': if(c=='='){AddOp(elms, COT_EQU ); text++;} break;
  1582. case '!': if(c=='='){AddOp(elms, COT_NEQ ); text++;}else AddOp(elms, COT_LOGICAL_NOT); break;
  1583. case '*': if(c=='*'){AddOp(elms, COT_POW ); text++;}else AddOp(elms, COT_MUL); break;
  1584. case '&': if(c=='&'){AddOp(elms, COT_LOGICAL_AND); text++;}else AddOp(elms, COT_AND); break;
  1585. case '|': if(c=='|'){AddOp(elms, COT_LOGICAL_OR ); text++;}else AddOp(elms, COT_OR ); break;
  1586. case '^': if(c=='^'){AddOp(elms, COT_LOGICAL_XOR); text++;}else AddOp(elms, COT_XOR); break;
  1587. case '<': if(c=='<'){AddOp(elms, COT_SHL ); text++;}else if(c=='='){AddOp(elms, COT_ESM); text++;}else AddOp(elms, COT_SM); break;
  1588. case '>': if(c=='>'){AddOp(elms, COT_SHR ); text++;}else if(c=='='){AddOp(elms, COT_EGR); text++;}else AddOp(elms, COT_GR); break;
  1589. default : return E(text);
  1590. }
  1591. text++; return true;
  1592. }
  1593. /******************************************************************************/
  1594. static CalcElm* Celm(MemlNode *node) {return node ? (CalcElm*)node->data() : null;}
  1595. /******************************************************************************/
  1596. static Bool CFuncReady(Meml<CalcElm> &elms, MemlNode *node, Int args)
  1597. {
  1598. CalcElm *c;
  1599. if(args<1 || args>4 || !node)return false;
  1600. if(!(c=Celm(node=node->next())))return false; if(c->type!=CET_OP || c->o.type!=COT_LBR )return false; // (
  1601. if(!(c=Celm(node=node->next())))return false; if(c->type!=CET_VAL )return false; // x
  1602. for(; --args; )
  1603. {
  1604. if(!(c=Celm(node=node->next())))return false; if(c->type!=CET_OP || c->o.type!=COT_COMMA)return false; // ,
  1605. if(!(c=Celm(node=node->next())))return false; if(c->type!=CET_VAL )return false; // y
  1606. }
  1607. if(!(c=Celm(node=node->next())))return false; if(c->type!=CET_OP || c->o.type!=COT_RBR )return false; // )
  1608. return true;
  1609. }
  1610. /******************************************************************************/
  1611. Bool Calculate(CalcValue &value, C Str &expression, C MemPtr<CalcVar> &vars)
  1612. {
  1613. CalcError[0]=0;
  1614. value.type=CVAL_NONE;
  1615. Meml<CalcElm> elms;
  1616. if(CChar *text=expression)for(;;)
  1617. {
  1618. Char c =*text; if(!c)break; if(c==' '){text++; continue;}
  1619. UInt cf=CharFlag(c);
  1620. if( cf& CHARF_DIG || c=='.' ){CalcElm &elm=elms.New(); elm.type=CET_VAL; text=TextValue(text, elm.v); if(!elm.v.type)goto error;}else
  1621. if(!(cf&(CHARF_ALPHA|CHARF_UNDER))){if(!ReadOp (elms, text ))goto error;}else
  1622. {if(!ReadChar(elms, text, vars))goto error;}
  1623. }
  1624. for(Int loop=true; loop--; )MFREP(elms)
  1625. {
  1626. #define NEXT(next) {i=next; loop=true; continue;}
  1627. MemlNode * next=i->next(),
  1628. * prev=i->prev(),
  1629. *nnext=(next ? next->next() : null),
  1630. *pprev=(prev ? prev->prev() : null);
  1631. CalcElm * c=Celm( i),
  1632. * n=Celm( next),
  1633. * p=Celm( prev),
  1634. *nn=Celm(nnext),
  1635. *pp=Celm(pprev);
  1636. UInt cet=( c ? c->type : CET_NONE),
  1637. net=( n ? n->type : CET_NONE),
  1638. pet=( p ? p->type : CET_NONE),
  1639. nnet=(nn ? nn->type : CET_NONE),
  1640. ppet=(pp ? pp->type : CET_NONE);
  1641. if(cet==CET_OP && net==CET_VAL)
  1642. {
  1643. UInt cot=c->o.type;
  1644. C CalcOpInfo &opi=CalcOpInfos[cot];
  1645. if(opi.args==1)
  1646. {
  1647. if(!((Bool(*)(CalcValue&))opi.func)(n->v))goto error;
  1648. elms.remove(i);
  1649. NEXT(next);
  1650. }
  1651. if(opi.args==2 && pet==CET_VAL)
  1652. if(!ppet || (ppet==CET_OP && opi.priority< CalcOpInfos[pp->o.type].priority))
  1653. if(!nnet || (nnet==CET_OP && opi.priority<=CalcOpInfos[nn->o.type].priority))
  1654. {
  1655. if(!((Bool(*)(CalcValue&, CalcValue&))opi.func)(p->v, n->v))goto error;
  1656. elms.remove(i );
  1657. elms.remove(next);
  1658. NEXT(prev);
  1659. }
  1660. if(cot==COT_ADD)if(!pet || (pet==CET_OP && p->o.type!=COT_RBR)){ elms.remove(i); NEXT(next);}
  1661. if(cot==COT_SUB)if(!pet || (pet==CET_OP && p->o.type!=COT_RBR)){CChs(n->v); elms.remove(i); NEXT(next);}
  1662. if(cot==COT_LBR)if(nnet==CET_OP && nn->o.type==COT_RBR && pet!=CET_FUNC){ elms.remove(i); elms.remove(nnext); NEXT(next);}
  1663. }else
  1664. if(cet==CET_FUNC)
  1665. {
  1666. C CalcFuncInfo &funi=*c->f.funi;
  1667. if(CFuncReady(elms, i, funi.args))
  1668. {
  1669. if(funi.args==1){if(!((Bool(*)(CalcValue& ))funi.func)(nn->v))goto error;}else
  1670. if(funi.args==2){if(!((Bool(*)(CalcValue&, CalcValue& ))funi.func)(nn->v, Celm(nnext->next()->next())->v))goto error;}else
  1671. if(funi.args==3){if(!((Bool(*)(CalcValue&, CalcValue&, CalcValue& ))funi.func)(nn->v, Celm(nnext->next()->next())->v, Celm(nnext->next()->next()->next()->next())->v))goto error;}else
  1672. if(funi.args==4){if(!((Bool(*)(CalcValue&, CalcValue&, CalcValue&, CalcValue&))funi.func)(nn->v, Celm(nnext->next()->next())->v, Celm(nnext->next()->next()->next()->next())->v, Celm(nnext->next()->next()->next()->next()->next()->next())->v))goto error;}
  1673. elms.remove(i ); // func
  1674. elms.remove(next); // (
  1675. i=nnext->next(); REPD(j, 2*(funi.args-1)){next=i->next(); elms.remove(i); i=next;} // ,y
  1676. elms.remove(i ); // )
  1677. NEXT(nnext);
  1678. }
  1679. }
  1680. }
  1681. if(elms.elms()==1)
  1682. {
  1683. CalcElm &elm=elms[elms.first()];
  1684. if(elm.type==CET_VAL)value=elm.v;
  1685. }
  1686. return true;
  1687. error:
  1688. return false;
  1689. }
  1690. /******************************************************************************/
  1691. Int CalculateI (C Str &expression, C MemPtr<CalcVar> &vars) {CalcValue value; Calculate(value, expression, vars); return value.asInt ();}
  1692. Long CalculateL (C Str &expression, C MemPtr<CalcVar> &vars) {CalcValue value; Calculate(value, expression, vars); return value.asLong ();}
  1693. Flt CalculateF (C Str &expression, C MemPtr<CalcVar> &vars) {CalcValue value; Calculate(value, expression, vars); return value.asFlt ();}
  1694. Dbl CalculateD (C Str &expression, C MemPtr<CalcVar> &vars) {CalcValue value; Calculate(value, expression, vars); return value.asDbl ();}
  1695. VecD2 CalculateV2(C Str &expression, C MemPtr<CalcVar> &vars) {CalcValue value; Calculate(value, expression, vars); return value.asVecD2();}
  1696. VecD CalculateV (C Str &expression, C MemPtr<CalcVar> &vars) {CalcValue value; Calculate(value, expression, vars); return value.asVecD ();}
  1697. VecD4 CalculateV4(C Str &expression, C MemPtr<CalcVar> &vars) {CalcValue value; Calculate(value, expression, vars); return value.asVecD4();}
  1698. /******************************************************************************/
  1699. }
  1700. /******************************************************************************/