Project Update.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /******************************************************************************/
  2. #include "stdafx.h"
  3. /******************************************************************************/
  4. /******************************************************************************/
  5. void ProjectUpdate::Error(C Str &error) {Gui.msgBox(S, error);}
  6. void ProjectUpdate::ErrorLoad(C Str &path ) {Error(S+"Can't load image:\n\""+path+'"');}
  7. void ProjectUpdate::ErrorSave(C Str &path ) {Error(S+"Can't save image:\n\""+path+'"');}
  8. void ProjectUpdate::UpdateTex( UID &tex_id, ProjectUpdate &pu, int thread_index) {pu.updateTex(tex_id);}
  9. void ProjectUpdate::updateTex(C UID &tex_id)
  10. {
  11. Str path=proj->texPath(tex_id);
  12. Image img;
  13. // load
  14. File f, temp, *src=&f;
  15. if(!f.readTry(path)){ErrorLoad(path); goto error;}
  16. if(IsServer)
  17. {
  18. if(!Decompress(*src, temp, true)){ErrorLoad(path); goto error;}
  19. src=&temp; src->pos(0);
  20. }
  21. ThreadMayUseGPUData();
  22. if(!img.load(*src)){ErrorLoad(path); goto error;}
  23. f.del();
  24. // convert
  25. if(!UpdateMtrlTex(img, img)){Error("Can't convert texture"); goto error;}
  26. // save
  27. if(IsServer) // server
  28. {
  29. if(!img.save(temp.writeMem())){ErrorSave(path); goto error;} temp.pos(0);
  30. if(!Compress(temp, f.writeMem(), COMPRESS_LZMA, 5, false)){ErrorSave(path); goto error;} f.pos(0);
  31. if(!SafeOverwrite(f, path)){ErrorSave(path); goto error;}
  32. }else
  33. if(!Save(img, path)){ErrorSave(path); goto error;} // client
  34. {
  35. SyncLocker locker(lock);
  36. proj->texs_update.binaryExclude(tex_id, Compare);
  37. }
  38. error:;
  39. }
  40. void ProjectUpdate::start(Project &proj, Threads &threads)
  41. {
  42. T.proj=&proj;
  43. T.texs=proj.texs_update; // copy because 'proj.texs_update' will be dynamically updated
  44. REPA(texs)threads.queue(texs[i], UpdateTex, T);
  45. }
  46. void ProjectUpdate::stop(Threads &threads)
  47. {
  48. REPA(texs)threads.cancel(texs[i], UpdateTex, T);
  49. REPA(texs)threads.wait (texs[i], UpdateTex, T);
  50. T.proj=null;
  51. }
  52. ProjectUpdate::ProjectUpdate() : proj(null) {}
  53. /******************************************************************************/