Guest User

Untitled

a guest
Mar 22nd, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.82 KB | None | 0 0
  1. template <class T> class _vec2
  2. {
  3. public:
  4. T dat[2];
  5. _vec2(T _x,T _y) { x=_x; y=_y; }
  6. _vec2() { for (int i=0;i<2;i++) dat[i]=0; }
  7. _vec2(const _vec2& a) { *this=a; }
  8. ~_vec2() {}
  9. // 1D
  10. T get_x() { return dat[0]; } void set_x(T q) { dat[0]=q; }
  11. T get_y() { return dat[1]; } void set_y(T q) { dat[1]=q; }
  12. __declspec( property (get=get_x, put=set_x) ) T x;
  13. __declspec( property (get=get_y, put=set_y) ) T y;
  14. __declspec( property (get=get_x, put=set_x) ) T r;
  15. __declspec( property (get=get_y, put=set_y) ) T g;
  16. __declspec( property (get=get_x, put=set_x) ) T s;
  17. __declspec( property (get=get_y, put=set_y) ) T t;
  18. // 2D
  19. _vec2<T> get_xy() { return _vec2<T>(x,y); } void set_xy(_vec2<T> q) { x=q.x; y=q.y; }
  20. _vec2<T> get_yx() { return _vec2<T>(y,x); } void set_yx(_vec2<T> q) { y=q.x; x=q.y; }
  21. __declspec( property (get=get_xy, put=set_xy) ) _vec2<T> xy;
  22. __declspec( property (get=get_xy, put=set_xy) ) _vec2<T> xg;
  23. __declspec( property (get=get_xy, put=set_xy) ) _vec2<T> xt;
  24. __declspec( property (get=get_yx, put=set_yx) ) _vec2<T> yx;
  25. __declspec( property (get=get_yx, put=set_yx) ) _vec2<T> yr;
  26. __declspec( property (get=get_yx, put=set_yx) ) _vec2<T> ys;
  27. __declspec( property (get=get_xy, put=set_xy) ) _vec2<T> ry;
  28. __declspec( property (get=get_xy, put=set_xy) ) _vec2<T> rg;
  29. __declspec( property (get=get_xy, put=set_xy) ) _vec2<T> rt;
  30. __declspec( property (get=get_yx, put=set_yx) ) _vec2<T> gx;
  31. __declspec( property (get=get_yx, put=set_yx) ) _vec2<T> gr;
  32. __declspec( property (get=get_yx, put=set_yx) ) _vec2<T> gs;
  33. __declspec( property (get=get_xy, put=set_xy) ) _vec2<T> sy;
  34. __declspec( property (get=get_xy, put=set_xy) ) _vec2<T> sg;
  35. __declspec( property (get=get_xy, put=set_xy) ) _vec2<T> st;
  36. __declspec( property (get=get_yx, put=set_yx) ) _vec2<T> tx;
  37. __declspec( property (get=get_yx, put=set_yx) ) _vec2<T> tr;
  38. __declspec( property (get=get_yx, put=set_yx) ) _vec2<T> ts;
  39. // operators
  40. _vec2* operator = (const _vec2 &a) { for (int i=0;i<2;i++) dat[i]=a.dat[i]; return this; } // =a
  41. T& operator [](const int i) { return dat[i]; } // a[i]
  42. _vec2<T> operator + () { return *this; } // +a
  43. _vec2<T> operator - () { _vec2<T> q; for (int i=0;i<2;i++) q.dat[i]= -dat[i]; return q; } // -a
  44. _vec2<T> operator ++ () { for (int i=0;i<2;i++) dat[i]++; return *this; } // ++a
  45. _vec2<T> operator -- () { for (int i=0;i<2;i++) dat[i]--; return *this; } // --a
  46. _vec2<T> operator ++ (int) { _vec2<T> q=*this; for (int i=0;i<2;i++) dat[i]++; return q; } // a++
  47. _vec2<T> operator -- (int) { _vec2<T> q=*this; for (int i=0;i<2;i++) dat[i]--; return q; } // a--
  48.  
  49. _vec2<T> operator + (_vec2<T>&v){ _vec2<T> q; for (int i=0;i<2;i++) q.dat[i]= dat[i]+v.dat[i]; return q; } // a+b
  50. _vec2<T> operator - (_vec2<T>&v){ _vec2<T> q; for (int i=0;i<2;i++) q.dat[i]= dat[i]-v.dat[i]; return q; } // a-b
  51. _vec2<T> operator * (_vec2<T>&v){ _vec2<T> q; for (int i=0;i<2;i++) q.dat[i]= dat[i]*v.dat[i]; return q; } // a*b
  52. _vec2<T> operator / (_vec2<T>&v){ _vec2<T> q; for (int i=0;i<2;i++) q.dat[i]=divide(dat[i],v.dat[i]); return q; } // a/b
  53.  
  54. _vec2<T> operator + (const T &c){ _vec2<T> q; for (int i=0;i<2;i++) q.dat[i]=dat[i]+c; return q; } // a+c
  55. _vec2<T> operator - (const T &c){ _vec2<T> q; for (int i=0;i<2;i++) q.dat[i]=dat[i]-c; return q; } // a-c
  56. _vec2<T> operator * (const T &c){ _vec2<T> q; for (int i=0;i<2;i++) q.dat[i]=dat[i]*c; return q; } // a*c
  57. _vec2<T> operator / (const T &c){ _vec2<T> q; for (int i=0;i<2;i++) q.dat[i]=divide(dat[i],c); return q; } // a/c
  58.  
  59. _vec2<T> operator +=(_vec2<T>&v){ this[0]=this[0]+v; return *this; };
  60. _vec2<T> operator -=(_vec2<T>&v){ this[0]=this[0]-v; return *this; };
  61. _vec2<T> operator *=(_vec2<T>&v){ this[0]=this[0]*v; return *this; };
  62. _vec2<T> operator /=(_vec2<T>&v){ this[0]=this[0]/v; return *this; };
  63.  
  64. _vec2<T> operator +=(const T &c){ this[0]=this[0]+c; return *this; };
  65. _vec2<T> operator -=(const T &c){ this[0]=this[0]-c; return *this; };
  66. _vec2<T> operator *=(const T &c){ this[0]=this[0]*c; return *this; };
  67. _vec2<T> operator /=(const T &c){ this[0]=this[0]/c; return *this; };
  68. // members
  69. int length() { return 2; } // dimensions
  70. };
  71.  
  72. void _vec_generate(AnsiString &txt,const int n) // generate _vec(n)<T> get/set source code n>=2
  73. {
  74. int i,j,k,l;
  75. int i3,j3,k3,l3;
  76. const int n3=12;
  77. const char x[n3]="xyzwrgbastpq";
  78. txt+="template <class T> class _vec"+AnsiString(n)+"rn";
  79. txt+="t{rn";
  80. for (;;)
  81. {
  82. if (n<1) break;
  83. txt+="t// 1Drn";
  84. for (i=0;i<n;i++) txt+=AnsiString().sprintf("tT get_%c() { return dat[%i]; } void set_%c(T q) { dat[%i]=q; }rn",x[i],i,x[i],i);
  85. for (j=0;j<12;j+=4) for (i=0;i<n;i++) txt+=AnsiString().sprintf("t__declspec( property (get=get_%c, put=set_%c) ) T %c;rn",x[i],x[i],x[i+j]);
  86. if (n<2) break;
  87. txt+="t// 2Drn";
  88. for (i=0;i<n;i++)
  89. for (j=0;j<n;j++) if (i!=j)
  90. {
  91. txt+=AnsiString().sprintf("t_vec2<T> get_%c%c() { return _vec2<T>(%c,%c); } ",x[i],x[j],x[i],x[j]);
  92. txt+=AnsiString().sprintf("void set_%c%c(_vec2<T> q) { %c=q.%c; %c=q.%c; }rn",x[i],x[j],x[i],x[0],x[j],x[1]);
  93. }
  94. for (i=i3=0;i3<n3;i3++,i=i3&3) if (i<n)
  95. for (j=j3=0;j3<n3;j3++,j=j3&3) if (j<n) if (i!=j)
  96. {
  97. txt+=AnsiString().sprintf("t__declspec( property (get=get_%c%c, put=set_%c%c) ) _vec2<T> %c%c;rn",x[i],x[j],x[i],x[j],x[i3],x[j3]);
  98. }
  99. if (n<3) break;
  100. txt+="t// 3Drn";
  101. for (i=0;i<n;i++)
  102. for (j=0;j<n;j++) if (i!=j)
  103. for (k=0;k<n;k++) if ((i!=k)&&(j!=k))
  104. {
  105. txt+=AnsiString().sprintf("t_vec3<T> get_%c%c%c() { return _vec3<T>(%c,%c,%c); } ",x[i],x[j],x[k],x[i],x[j],x[k]);
  106. txt+=AnsiString().sprintf("void set_%c%c%c(_vec3<T> q) { %c=q.%c; %c=q.%c; %c=q.%c; }rn",x[i],x[j],x[k],x[i],x[0],x[j],x[1],x[k],x[2]);
  107. }
  108. for (i=i3=0;i3<n3;i3++,i=i3&3) if (i<n)
  109. for (j=j3=0;j3<n3;j3++,j=j3&3) if (j<n) if (i!=j)
  110. for (k=k3=0;k3<n3;k3++,k=k3&3) if (k<n) if ((i!=k)&&(j!=k))
  111. {
  112. txt+=AnsiString().sprintf("t__declspec( property (get=get_%c%c%c, put=set_%c%c%c) ) _vec3<T> %c%c%c;rn",x[i],x[j],x[k],x[i],x[j],x[k],x[i3],x[j3],x[k3]);
  113. }
  114. if (n<4) break;
  115. txt+="t// 4Drn";
  116. for (i=0;i<n;i++)
  117. for (j=0;j<n;j++) if (i!=j)
  118. for (k=0;k<n;k++) if ((i!=k)&&(j!=k))
  119. for (l=0;l<n;l++) if ((i!=l)&&(j!=l)&&(k!=l))
  120. {
  121. txt+=AnsiString().sprintf("t_vec4<T> get_%c%c%c%c() { return _vec4<T>(%c,%c,%c,%c); } ",x[i],x[j],x[k],x[l],x[i],x[j],x[k],x[l]);
  122. txt+=AnsiString().sprintf("void set_%c%c%c%c(_vec4<T> q) { %c=q.%c; %c=q.%c; %c=q.%c; %c=q.%c; }rn",x[i],x[j],x[k],x[l],x[i],x[0],x[j],x[1],x[k],x[2],x[l],x[3]);
  123. }
  124. for (i=i3=0;i3<n3;i3++,i=i3&3) if (i<n)
  125. for (j=j3=0;j3<n3;j3++,j=j3&3) if (j<n) if (i!=j)
  126. for (k=k3=0;k3<n3;k3++,k=k3&3) if (k<n) if ((i!=k)&&(j!=k))
  127. for (l=l3=0;l3<n3;l3++,l=l3&3) if (l<n) if ((i!=l)&&(j!=l)&&(k!=l))
  128. {
  129. txt+=AnsiString().sprintf("t__declspec( property (get=get_%c%c%c%c, put=set_%c%c%c%c) ) _vec4<T> %c%c%c%c;rn",x[i],x[j],x[k],x[l],x[i],x[j],x[k],x[l],x[i3],x[j3],x[k3],x[l3]);
  130. }
  131. break;
  132. }
  133. txt+="t};rn";
  134. }
Add Comment
Please, Sign In to add comment