Export OBJ.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. /******************************************************************************/
  2. #include "stdafx.h"
  3. namespace EE{
  4. /******************************************************************************/
  5. Bool ExportOBJ(C Str &name, C MeshLod &mesh)
  6. {
  7. FileText f; if(f.write(name, ANSI))
  8. {
  9. Int vp=1,
  10. vt=1,
  11. vn=1;
  12. FREPA(mesh)
  13. {
  14. C MeshPart &part=mesh.parts[i];
  15. C MeshBase *base=&part.base;
  16. MeshBase temp; if(!base->is() && part.render.is())base=&temp.create(part.render);
  17. C Vec *pos =base->vtx.pos ();
  18. C Vec *nrm =base->vtx.nrm ();
  19. C Vec2 *tex =base->vtx.tex0();
  20. f.putLine(S+"g " +Replace(part.name, '\n', ' '));
  21. if(pos)FREPA(base->vtx)f.putLine(S+"v " +Dbl(-pos[i].x)+' '+Dbl( pos[i].y)+' '+Dbl(pos[i].z));
  22. if(tex)FREPA(base->vtx)f.putLine(S+"vt "+Dbl( tex[i].x)+' '+Dbl(1-tex[i].y) );
  23. if(nrm)FREPA(base->vtx)f.putLine(S+"vn "+Dbl(-nrm[i].x)+' '+Dbl( nrm[i].y)+' '+Dbl(nrm[i].z));
  24. if(C VecI *tri=base->tri.ind())FREPA(base->tri)
  25. {
  26. VecI t=tri[i]; t.reverse();
  27. f.putText(S+"f "+(t.x+vp)+'/'); if(tex)f.putText(S+(t.x+vt)); f.putChar('/'); if(nrm)f.putText(S+(t.x+vn));
  28. f.putText(S+ " "+(t.y+vp)+'/'); if(tex)f.putText(S+(t.y+vt)); f.putChar('/'); if(nrm)f.putText(S+(t.y+vn));
  29. f.putText(S+ " "+(t.z+vp)+'/'); if(tex)f.putText(S+(t.z+vt)); f.putChar('/'); if(nrm)f.putText(S+(t.z+vn));
  30. f.endLine();
  31. }
  32. if(C VecI4 *quad=base->quad.ind())FREPA(base->quad)
  33. {
  34. VecI4 q=quad[i]; q.reverse();
  35. f.putText(S+"f "+(q.x+vp)+'/'); if(tex)f.putText(S+(q.x+vt)); f.putChar('/'); if(nrm)f.putText(S+(q.x+vn));
  36. f.putText(S+ " "+(q.y+vp)+'/'); if(tex)f.putText(S+(q.y+vt)); f.putChar('/'); if(nrm)f.putText(S+(q.y+vn));
  37. f.putText(S+ " "+(q.z+vp)+'/'); if(tex)f.putText(S+(q.z+vt)); f.putChar('/'); if(nrm)f.putText(S+(q.z+vn));
  38. f.putText(S+ " "+(q.w+vp)+'/'); if(tex)f.putText(S+(q.w+vt)); f.putChar('/'); if(nrm)f.putText(S+(q.w+vn));
  39. f.endLine();
  40. }
  41. if(pos)vp+=base->vtxs();
  42. if(tex)vt+=base->vtxs();
  43. if(nrm)vn+=base->vtxs();
  44. }
  45. return true;
  46. }
  47. return false;
  48. }
  49. /******************************************************************************/
  50. }
  51. /******************************************************************************/