Mshb Transform.cpp 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. /******************************************************************************/
  2. #include "stdafx.h"
  3. namespace EE{
  4. /******************************************************************************/
  5. MeshBase& MeshBase::move ( C Vec &move) {if(Vec *pos=vtx.pos())REPA(vtx) (*pos++)+= move; if(Vec *pos=vtx.hlp())REPA(vtx) (*pos++)+= move; return T;}
  6. MeshBase& MeshBase::scale (C Vec &scale ) {if(Vec *pos=vtx.pos())REPA(vtx) (*pos++)*= scale ; if(Vec *pos=vtx.hlp())REPA(vtx) (*pos++)*= scale ; return T;}
  7. MeshBase& MeshBase::scaleMove(C Vec &scale, C Vec &move) {if(Vec *pos=vtx.pos())REPA(vtx){Vec &p=*pos++; p=p*scale + move;} if(Vec *pos=vtx.hlp())REPA(vtx){Vec &p=*pos++; p=p*scale + move;} return T;}
  8. MeshBase& MeshBase::setSize (C Box &box )
  9. {
  10. Box b=T;
  11. Vec d=b.size(),
  12. scale((d.x>EPS) ? box.w()/d.x : 0,
  13. (d.y>EPS) ? box.h()/d.y : 0,
  14. (d.z>EPS) ? box.d()/d.z : 0),
  15. move=box.min-b.min*scale;
  16. return scaleMove(scale, move);
  17. }
  18. MeshBase& MeshBase::transform(C Matrix3 &matrix)
  19. {
  20. Int n;
  21. Matrix3 matrix_n=matrix; matrix_n.inverseScale();
  22. n=vtxs (); Transform(vtx .pos(), matrix , n);
  23. Transform(vtx .hlp(), matrix , n);
  24. Transform(vtx .nrm(), matrix_n, n); Normalize(vtx .nrm(), n);
  25. Transform(vtx .tan(), matrix_n, n); Normalize(vtx .tan(), n);
  26. Transform(vtx .bin(), matrix_n, n); Normalize(vtx .bin(), n);
  27. n=edges(); Transform(edge.nrm(), matrix_n, n); Normalize(edge.nrm(), n);
  28. n=tris (); Transform(tri .nrm(), matrix_n, n); Normalize(tri .nrm(), n);
  29. n=quads(); Transform(quad.nrm(), matrix_n, n); Normalize(quad.nrm(), n);
  30. return T;
  31. }
  32. MeshBase& MeshBase::transform(C Matrix &matrix)
  33. {
  34. Int n;
  35. Matrix3 matrix_n=matrix; matrix_n.inverseScale();
  36. n=vtxs (); Transform(vtx .pos(), matrix , n);
  37. Transform(vtx .hlp(), matrix , n);
  38. Transform(vtx .nrm(), matrix_n, n); Normalize(vtx .nrm(), n);
  39. Transform(vtx .tan(), matrix_n, n); Normalize(vtx .tan(), n);
  40. Transform(vtx .bin(), matrix_n, n); Normalize(vtx .bin(), n);
  41. n=edges(); Transform(edge.nrm(), matrix_n, n); Normalize(edge.nrm(), n);
  42. n=tris (); Transform(tri .nrm(), matrix_n, n); Normalize(tri .nrm(), n);
  43. n=quads(); Transform(quad.nrm(), matrix_n, n); Normalize(quad.nrm(), n);
  44. return T;
  45. }
  46. MeshBase& MeshBase::animate(C MemPtrN<Matrix, 256> &matrixes)
  47. {
  48. if(matrixes.elms())
  49. {
  50. Vec *pos =vtx.pos (),
  51. *nrm =vtx.nrm (),
  52. *tan =vtx.tan (),
  53. *bin =vtx.bin (),
  54. *hlp =vtx.hlp (), v;
  55. C VecB4 *blend=vtx.blend (),
  56. *mtrx =vtx.matrix();
  57. if(blend && mtrx)REPA(vtx)
  58. {
  59. C VecB4 &bi=*blend++; Vec4 b=bi; b/=255.0f; b.w=1-b.xyz.sum();
  60. C Matrix &m0=(InRange(mtrx->c[0], matrixes) ? matrixes[mtrx->c[0]] : matrixes[0]),
  61. &m1=(InRange(mtrx->c[1], matrixes) ? matrixes[mtrx->c[1]] : matrixes[0]),
  62. &m2=(InRange(mtrx->c[2], matrixes) ? matrixes[mtrx->c[2]] : matrixes[0]),
  63. &m3=(InRange(mtrx->c[3], matrixes) ? matrixes[mtrx->c[3]] : matrixes[0]); mtrx++;
  64. if(pos){v=*pos; *pos=b.x*(v*m0 ) + b.y*(v*m1 ) + b.z*(v*m2 ) + b.w*(v*m3 ); pos++;}
  65. if(hlp){v=*hlp; *hlp=b.x*(v*m0 ) + b.y*(v*m1 ) + b.z*(v*m2 ) + b.w*(v*m3 ); hlp++;}
  66. if(nrm){v=*nrm; *nrm=b.x*(v*m0.orn()) + b.y*(v*m1.orn()) + b.z*(v*m2.orn()) + b.w*(v*m3.orn()); nrm->normalize(); nrm++;}
  67. if(tan){v=*tan; *tan=b.x*(v*m0.orn()) + b.y*(v*m1.orn()) + b.z*(v*m2.orn()) + b.w*(v*m3.orn()); tan->normalize(); tan++;}
  68. if(bin){v=*bin; *bin=b.x*(v*m0.orn()) + b.y*(v*m1.orn()) + b.z*(v*m2.orn()) + b.w*(v*m3.orn()); bin->normalize(); bin++;}
  69. }
  70. }
  71. return T;
  72. }
  73. MeshBase& MeshBase::animate(C AnimatedSkeleton &anim_skel)
  74. {
  75. MemtN<Matrix, 256> matrixes;
  76. anim_skel.getMatrixes(matrixes);
  77. animate(matrixes);
  78. return T;
  79. }
  80. /******************************************************************************/
  81. MeshBase& MeshBase::mirrorX()
  82. {
  83. ChsX(vtx .pos(), vtxs ());
  84. ChsX(vtx .hlp(), vtxs ());
  85. ChsX(vtx .nrm(), vtxs ());
  86. ChsX(vtx .tan(), vtxs ());
  87. ChsX(vtx .bin(), vtxs ());
  88. ChsX(edge.nrm(), edges());
  89. ChsX(tri .nrm(), tris ());
  90. ChsX(quad.nrm(), quads());
  91. Reverse(edge.ind(), edges());
  92. Reverse(tri .ind(), tris ());
  93. SwapXZ (quad.ind(), quads()); // use 'SwapXZ' to preserve the same triangles being generated, but flipped, this is important, because 'Reverse' would cause different triangle combination
  94. if(vtx.tan() && !vtx.bin())setBinormals(); // binormals are needed if tangents are present
  95. return T;
  96. }
  97. MeshBase& MeshBase::mirrorY()
  98. {
  99. ChsY(vtx .pos(), vtxs ());
  100. ChsY(vtx .hlp(), vtxs ());
  101. ChsY(vtx .nrm(), vtxs ());
  102. ChsY(vtx .tan(), vtxs ());
  103. ChsY(vtx .bin(), vtxs ());
  104. ChsY(edge.nrm(), edges());
  105. ChsY(tri .nrm(), tris ());
  106. ChsY(quad.nrm(), quads());
  107. Reverse(edge.ind(), edges());
  108. Reverse(tri .ind(), tris ());
  109. SwapXZ (quad.ind(), quads()); // use 'SwapXZ' to preserve the same triangles being generated, but flipped, this is important, because 'Reverse' would cause different triangle combination
  110. if(vtx.tan() && !vtx.bin())setBinormals(); // binormals are needed if tangents are present
  111. return T;
  112. }
  113. MeshBase& MeshBase::mirrorZ()
  114. {
  115. ChsZ(vtx .pos(), vtxs ());
  116. ChsZ(vtx .hlp(), vtxs ());
  117. ChsZ(vtx .nrm(), vtxs ());
  118. ChsZ(vtx .tan(), vtxs ());
  119. ChsZ(vtx .bin(), vtxs ());
  120. ChsZ(edge.nrm(), edges());
  121. ChsZ(tri .nrm(), tris ());
  122. ChsZ(quad.nrm(), quads());
  123. Reverse(edge.ind(), edges());
  124. Reverse(tri .ind(), tris ());
  125. SwapXZ (quad.ind(), quads()); // use 'SwapXZ' to preserve the same triangles being generated, but flipped, this is important, because 'Reverse' would cause different triangle combination
  126. if(vtx.tan() && !vtx.bin())setBinormals(); // binormals are needed if tangents are present
  127. return T;
  128. }
  129. MeshBase& MeshBase::rightToLeft()
  130. {
  131. RightToLeft(vtx .pos(), vtxs ());
  132. RightToLeft(vtx .hlp(), vtxs ());
  133. RightToLeft(vtx .nrm(), vtxs ());
  134. RightToLeft(vtx .tan(), vtxs ());
  135. RightToLeft(vtx .bin(), vtxs ());
  136. RightToLeft(edge.nrm(), edges());
  137. RightToLeft(tri .nrm(), tris ());
  138. RightToLeft(quad.nrm(), quads());
  139. Reverse(edge.ind(), edges());
  140. Reverse(tri .ind(), tris ());
  141. SwapXZ (quad.ind(), quads()); // use 'SwapXZ' to preserve the same triangles being generated, but flipped, this is important, because 'Reverse' would cause different triangle combination
  142. if(vtx.tan() && !vtx.bin())setBinormals(); // binormals are needed if tangents are present
  143. return T;
  144. }
  145. /******************************************************************************/
  146. MeshBase& MeshBase::reverse()
  147. {
  148. Chs (vtx .nrm(), vtxs ());
  149. if(!edge.flag())Chs (edge.nrm(), edges());
  150. Chs (tri .nrm(), tris ());
  151. Chs (quad.nrm(), quads());
  152. Reverse(edge.ind(), edges());
  153. Reverse(tri .ind(), tris ());
  154. SwapXZ (quad.ind(), quads()); // use 'SwapXZ' to preserve the same triangles being generated, but flipped, this is important, because 'Reverse' would cause different triangle combination
  155. if(vtx.tan() && !vtx.bin())setBinormals(); // binormals are needed if tangents are present
  156. return T;
  157. }
  158. MeshBase& MeshBase::reverse(Int face)
  159. {
  160. if(face&SIGN_BIT)
  161. {
  162. face^=SIGN_BIT;
  163. if(InRange(face, quad))
  164. {
  165. quad.ind(face).swapXZ(); // use 'swapXZ' to preserve the same triangles being generated, but flipped, this is important, because 'reverse' would cause different triangle combination
  166. if(quad.nrm())quad.nrm(face).chs ();
  167. }
  168. }else
  169. {
  170. if(InRange(face, tri))
  171. {
  172. tri.ind(face).reverse();
  173. if(tri.nrm())tri.nrm(face).chs ();
  174. }
  175. }
  176. return T;
  177. }
  178. MeshBase& MeshBase::reverse(C MemPtr<Int> &faces)
  179. {
  180. if(faces.elms())
  181. {
  182. Memt<Bool> tri_is, quad_is; CreateFaceIs(tri_is, quad_is, faces, tris(), quads());
  183. MeshBase temp; splitFaces(temp, null, tri_is, quad_is);
  184. if(temp.is())
  185. {
  186. T+=temp.reverse();
  187. weldVtx(VTX_ALL, EPSD, EPS_COL_COS, -1); // use small epsilon in case mesh is scaled down
  188. }
  189. }
  190. return T;
  191. }
  192. /******************************************************************************/
  193. }
  194. /******************************************************************************/