Export Element.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. /******************************************************************************/
  2. #include "stdafx.h"
  3. /******************************************************************************/
  4. ExportWindow Export;
  5. /******************************************************************************/
  6. /******************************************************************************/
  7. void ExportWindow::Save(C Str &name, ptr) {Export.save(name);}
  8. void ExportWindow::save(C Str &name)
  9. {
  10. bool ok=false;
  11. if(Elm *elm=Proj.findElm(elm_id))
  12. {
  13. Proj.flushElm(elm->id);
  14. switch(elm->type)
  15. {
  16. case ELM_ANIM:
  17. {
  18. Animation anim; if(anim.load(Proj.gamePath(elm_id)))
  19. {
  20. if(ElmAnim *anim_data=elm->animData())
  21. {
  22. Skeleton skel; if(anim_data->skel_id.valid())skel.load(Proj.gamePath(anim_data->skel_id));
  23. anim.transform(~anim_data->transform(), skel); // restore to original transformation
  24. }
  25. ok=anim.save(name);
  26. }
  27. }break;
  28. case ELM_OBJ:
  29. {
  30. if(C Elm *mesh_elm=Proj.findElm(elm->objData()->mesh_id, ELM_MESH))
  31. {
  32. Mesh mesh; if(Load(mesh, Proj.editPath(mesh_elm->id), Proj.game_path))
  33. {
  34. ok=ExportOBJ(name, mesh);
  35. }
  36. }else Gui.msgBox(S, "Object doesn't have any Mesh");
  37. }break;
  38. case ELM_SKEL:
  39. {
  40. Skeleton skel; if(skel.load(Proj.gamePath(elm_id)))
  41. {
  42. if(ElmSkel *skel_data=elm->skelData())skel.transform(~skel_data->transform()); // restore to original transformation
  43. ok=skel.save(name);
  44. }
  45. }break;
  46. case ELM_IMAGE:
  47. case ELM_ICON:
  48. {
  49. Str src=Proj.basePath(*elm);
  50. if(GetExt(name)==ext)ok=FCopy(src, name);else
  51. {
  52. Image image; if(image.ImportTry(src))ok=image.Export(name);
  53. }
  54. }break;
  55. case ELM_PANEL_IMAGE:
  56. {
  57. PanelImage panel; if(panel.load(Proj.gamePath(elm_id)))ok=panel.image.Export(name);
  58. }break;
  59. case ELM_CODE:
  60. {
  61. Str code; if(Proj.codeGet(elm_id, code))
  62. {
  63. FileText f; if(ok=f.write(name))f.putText(code);
  64. }
  65. }break;
  66. case ELM_IMAGE_ATLAS:
  67. case ELM_PHYS_MTRL:
  68. case ELM_FONT:
  69. case ELM_SOUND:
  70. case ELM_VIDEO:
  71. case ELM_FILE:
  72. {
  73. ok=FCopy(Proj.gamePath(elm_id), name);
  74. }break;
  75. case ELM_MINI_MAP:
  76. {
  77. if(ElmMiniMap *mini_map_data=elm->miniMapData())
  78. if(MiniMapVer *ver=Proj.miniMapVerGet(elm_id))
  79. if(ver->images.elms())
  80. if(int image_size=ver->settings.image_size)
  81. {
  82. Game::MiniMap map; if(map.load(Proj.gamePath(elm_id)))
  83. {
  84. RectI images=ver->images.last(); REPA(ver->images)images|=ver->images[i];
  85. Image image, temp; if(image.createSoftTry(image_size*(images.w()+1), image_size*(images.h()+1), 1, IMAGE_R8G8B8A8))
  86. {
  87. image.clear();
  88. for(int y=images.min.y; y<=images.max.y; y++)
  89. for(int x=images.min.x; x<=images.max.x; x++)
  90. {
  91. C Image &src=map(VecI2(x, y));
  92. if(src.is() && src.copyTry(temp, image_size, image_size, 1, IMAGE_R8G8B8A8, IMAGE_SOFT, 1))
  93. {
  94. int ox=(x-images.min.x )*image_size,
  95. oy=( images.max.y-y)*image_size;
  96. REPD(y, temp.h())
  97. REPD(x, temp.w())image.pixel(x+ox, y+oy, temp.pixel(x, y));
  98. }
  99. map.clear();
  100. }
  101. ok=image.Export(name);
  102. }
  103. }
  104. }
  105. }break;
  106. }
  107. }
  108. if(ok)Explore(name, true);
  109. }
  110. void ExportWindow::activate(C UID &elm_id)
  111. {
  112. hide();
  113. T.elm_id=elm_id;
  114. if(Elm *elm=Proj.findElm(elm_id))
  115. {
  116. ext.clear(); Str supp_ext;
  117. switch(elm->type)
  118. {
  119. default: return;
  120. case ELM_IMAGE:
  121. {
  122. ::File f; if(f.readTry(Proj.editPath(elm_id))) // set main extension
  123. {
  124. Image temp;
  125. //if(!ext.is()){f.pos(0); if(temp.ImportWEBP(f))ext="webp";} ignore WEBP because it's not popular yet
  126. if(!ext.is()){f.pos(0); if(temp.ImportPNG (f))ext="png" ;}
  127. if(!ext.is()){f.pos(0); if(temp.ImportJPG (f))ext="jpg" ;}
  128. }
  129. supp_ext=ext+"|bmp|png|jpg|tga|tif|webp|ico|icns|img"; // add secondary extensions
  130. }break;
  131. case ELM_PANEL_IMAGE:
  132. case ELM_MINI_MAP : supp_ext="bmp|png|jpg|tga|tif|webp|img"; break;
  133. case ELM_OBJ : ext="obj"; break;
  134. case ELM_ANIM : ext="anim"; break;
  135. case ELM_FONT : ext="font"; break;
  136. case ELM_IMAGE_ATLAS: ext="atlas"; break;
  137. case ELM_SKEL : ext="skel"; break;
  138. case ELM_PHYS_MTRL : ext="physmtrl"; break;
  139. case ELM_ICON : ext="img"; supp_ext="bmp|png|jpg|tga|tif|webp|img"; break;
  140. case ELM_CODE : supp_ext="txt|c|cpp|h|cs|cc|cxx|m|mm"; break;
  141. case ELM_SOUND: {SoundHeader sound; sound.load(Proj.gamePath(elm_id)); ext=CaseDown(sound.codecName());} break;
  142. case ELM_VIDEO:
  143. {
  144. Video video; if(video.create(Proj.gamePath(elm_id)))switch(video.codec())
  145. {
  146. case VIDEO_THEORA: ext="ogv" ; break;
  147. case VIDEO_VP9 : ext="webm"; break;
  148. }
  149. }break;
  150. case ELM_FILE: ext=GetExt(elm->srcFile()); break;
  151. }
  152. if(!supp_ext.is())supp_ext=ext;
  153. if(!is())::EE::WindowIO::create().io(null, Save);
  154. ::EE::WindowIO::ext(supp_ext).save().name(elm->name).textline.selectAll();
  155. }
  156. }
  157. ExportWindow::ExportWindow() : elm_id(UIDZero) {}
  158. /******************************************************************************/