Import XPS.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /******************************************************************************/
  2. #include "stdafx.h"
  3. namespace EE{
  4. /******************************************************************************/
  5. Bool ImportXPS(C Str &name, Mesh *mesh, Skeleton *skeleton, MemPtr<XMaterial> materials, MemPtr<Int> part_material_index)
  6. {
  7. if(mesh )mesh ->del();
  8. if(skeleton)skeleton->del();
  9. materials .clear();
  10. part_material_index.clear();
  11. FileText f; if(f.read(name))
  12. {
  13. Str s;
  14. MemtN<IndexWeight, 256> skin;
  15. MemtN<Byte , 256> old_to_new;
  16. f.fullLine(s); Int bones=TextInt(s); if(bones<0)goto error;
  17. Skeleton temp, *skel=(skeleton ? skeleton : mesh ? &temp : null); // if skel not specified, but we want mesh, then we have to process it
  18. if(skel)skel->bones.setNum(bones);
  19. FREP(bones)
  20. {
  21. SkelBone *bone=(skel ? &skel->bones[i] : null);
  22. f.fullLine(s); if(bone)Set(bone->name, s);
  23. f. getLine(s); if(bone){Int parent=TextInt(s); bone->parent=(InRange(parent, skel->bones) ? parent : 0xFF);}
  24. f. getLine(s); if(bone)bone->pos=TextVec(s);
  25. }
  26. if(skel)
  27. {
  28. skel->mirrorX().sortBones(old_to_new).setBoneTypes(); if(VIRTUAL_ROOT_BONE)REPAO(old_to_new)++; // 'mirrorX' must be called before 'setBoneTypes', 'sortBones' must be called before 'setBoneTypes' and 'SetSkin'
  29. }
  30. f.getLine(s); Int parts=TextInt(s); if(parts<0)goto error;
  31. if(part_material_index){part_material_index.setNum(parts); REPAO(part_material_index)=i;}
  32. if(materials ){ materials.setNum(parts); REPAO(materials ).name=i;} // name is needed so Editor can create multiple materials instead of trying to reuse just one
  33. if(mesh ) mesh->parts.setNum(parts);
  34. if(mesh || materials )FREP(parts)
  35. {
  36. MeshPart *part=(mesh ? &mesh->parts[i] : null);
  37. f.fullLine(s); if(part)Set(part->name, s);
  38. f. getLine(s); Int uv_layers=TextInt(s); if(uv_layers<0)goto error;
  39. f. getLine(s); Int textures=TextInt(s); if(textures <0)goto error;
  40. FREPD(t, textures)
  41. {
  42. f.fullLine(s); // tex file name
  43. if(materials)
  44. {
  45. XMaterial &mtrl=materials[i]; switch(t)
  46. {
  47. case 0: mtrl. color_map=s; break;
  48. case 1: mtrl.specular_map=s; break;
  49. case 2: mtrl. normal_map=s; break;
  50. case 3: mtrl.specular_map=s; break;
  51. }
  52. }
  53. f.getLine(s); Int uv_layer_index=TextInt(s); if(uv_layer_index<0)goto error;
  54. }
  55. if(materials)materials[i].fixPath(GetPath(name));
  56. f.getLine(s); Int vtxs=TextInt(s); if(vtxs<0)goto error;
  57. if(part)
  58. {
  59. MeshBase &base=part->base.create(vtxs, 0, 0, 0, VTX_POS|VTX_NRM|VTX_COLOR|(bones ? VTX_SKIN : 0)|((uv_layers>=1) ? VTX_TEX0 : 0)|((uv_layers>=2) ? VTX_TEX1 : 0));
  60. FREP(vtxs)
  61. {
  62. f.getLine(s); base.vtx.pos (i)= TextVec (s);
  63. f.getLine(s); base.vtx.nrm (i)=!TextVec (s);
  64. f.getLine(s); base.vtx.color(i)= TextColor(s);
  65. if( uv_layers>=1){f. getLine(s); base.vtx.tex0(i)=TextVec2(s);}
  66. if( uv_layers>=2){f. getLine(s); base.vtx.tex1(i)=TextVec2(s);}
  67. REP(uv_layers- 2) f.skipLine( ); // skip unprocessed
  68. if(bones>0)
  69. {
  70. f.getLine(s); VecB4 m=TextVecB4(s);
  71. f.getLine(s); Vec4 b=TextVec4 (s);
  72. FREPA(m)if(b.c[i] && InRange(m.c[i], old_to_new))skin.New().set(old_to_new[m.c[i]], b.c[i]/* /255.0f not needed because weight is normalized in 'SetSkin' */);
  73. SetSkin(skin, base.vtx.matrix(i), base.vtx.blend(i), skel); skin.clear();
  74. }
  75. }
  76. }else REP(vtxs*(3+uv_layers+(bones>0)*2))f.skipLine();
  77. f.getLine(s); Int tris=TextInt(s); if(tris<0)goto error;
  78. if(part)
  79. {
  80. MeshBase &base=part->base; base.tri._elms=tris; base.include(TRI_IND);
  81. Bool invalid=false;
  82. FREP(tris)
  83. {
  84. f.getLine(s); VecI &t=base.tri.ind(i); t=TextVecI(s).reverse(); REPA(t)if(!InRange(t.c[i], vtxs)){t.zero(); invalid=true; break;}
  85. }
  86. if(invalid)base.removeDegenerateFaces(0);
  87. }else REP(tris)f.skipLine();
  88. }
  89. if(mesh ){mesh->mirrorX().skeleton(skel).skeleton(null).setBox(); CleanMesh(*mesh);}
  90. if(skeleton){skel->setBoneShapes(); if(skeleton!=skel)Swap(*skeleton, *skel);}
  91. return true;
  92. }
  93. error:
  94. if(mesh)mesh->del();
  95. return false;
  96. }
  97. /******************************************************************************/
  98. }
  99. /******************************************************************************/