| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- /******************************************************************************/
- #include "stdafx.h"
- /******************************************************************************/
- /******************************************************************************/
- void ProjectUpdate::Error(C Str &error) {Gui.msgBox(S, error);}
- void ProjectUpdate::ErrorLoad(C Str &path ) {Error(S+"Can't load image:\n\""+path+'"');}
- void ProjectUpdate::ErrorSave(C Str &path ) {Error(S+"Can't save image:\n\""+path+'"');}
- void ProjectUpdate::UpdateTex( UID &tex_id, ProjectUpdate &pu, int thread_index) {pu.updateTex(tex_id);}
- void ProjectUpdate::updateTex(C UID &tex_id)
- {
- Str path=proj->texPath(tex_id);
- Image img;
- // load
- File f, temp, *src=&f;
- if(!f.readTry(path)){ErrorLoad(path); goto error;}
- if(IsServer)
- {
- if(!Decompress(*src, temp, true)){ErrorLoad(path); goto error;}
- src=&temp; src->pos(0);
- }
- ThreadMayUseGPUData();
- if(!img.load(*src)){ErrorLoad(path); goto error;}
- f.del();
- // convert
- if(!UpdateMtrlTex(img, img)){Error("Can't convert texture"); goto error;}
- // save
- if(IsServer) // server
- {
- if(!img.save(temp.writeMem())){ErrorSave(path); goto error;} temp.pos(0);
- if(!Compress(temp, f.writeMem(), COMPRESS_LZMA, 5, false)){ErrorSave(path); goto error;} f.pos(0);
- if(!SafeOverwrite(f, path)){ErrorSave(path); goto error;}
- }else
- if(!Save(img, path)){ErrorSave(path); goto error;} // client
- {
- SyncLocker locker(lock);
- proj->texs_update.binaryExclude(tex_id, Compare);
- }
- error:;
- }
- void ProjectUpdate::start(Project &proj, Threads &threads)
- {
- T.proj=&proj;
- T.texs=proj.texs_update; // copy because 'proj.texs_update' will be dynamically updated
- REPA(texs)threads.queue(texs[i], UpdateTex, T);
- }
- void ProjectUpdate::stop(Threads &threads)
- {
- REPA(texs)threads.cancel(texs[i], UpdateTex, T);
- REPA(texs)threads.wait (texs[i], UpdateTex, T);
- T.proj=null;
- }
- ProjectUpdate::ProjectUpdate() : proj(null) {}
- /******************************************************************************/
|