2
0

Create Materials.cpp 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. /******************************************************************************/
  2. #include "stdafx.h"
  3. /******************************************************************************/
  4. CreateMaterials CreateMtrls;
  5. State CreateMaterialsState(UpdateCreateMaterials, DrawCreateMaterials, InitCreateMaterials, ShutCreateMaterials);
  6. /******************************************************************************/
  7. bool InitCreateMaterials()
  8. {
  9. SetKbExclusive();
  10. Proj.pause();
  11. UpdateProgress.create(Rect_C(0, -0.05f, 1, 0.045f));
  12. REPA(CreateMtrls.data)WorkerThreads.queue(CreateMtrls.data[i], CreateMtrls.Process);
  13. return true;
  14. }
  15. void ShutCreateMaterials()
  16. {
  17. REPA(CreateMtrls.data)WorkerThreads.cancel(CreateMtrls.data[i], CreateMtrls.Process);
  18. REPA(CreateMtrls.data)WorkerThreads.wait (CreateMtrls.data[i], CreateMtrls.Process);
  19. UpdateProgress.del();
  20. Proj.refresh().resume();
  21. WindowSetNormal();
  22. WindowFlash();
  23. }
  24. /******************************************************************************/
  25. bool UpdateCreateMaterials()
  26. {
  27. if(Kb.bp(KB_ESC)){SetProjectState(); Gui.msgBox(S, "Creating Materials breaked on user request");}
  28. if(!WorkerThreads.busy())SetProjectState();
  29. UpdateProgress.set(CreateMtrls.data.elms()-WorkerThreads.queued(), CreateMtrls.data.elms());
  30. WindowSetProgress(UpdateProgress());
  31. Time.wait(1000/30);
  32. //Gui.update(); this may cause conflicts with 'Proj.elmChanged'
  33. Server.update(null, true);
  34. if(Ms.bp(3))WindowToggle();
  35. return true;
  36. }
  37. /******************************************************************************/
  38. void DrawCreateMaterials()
  39. {
  40. D.clear(BackgroundColor());
  41. D.text(0, 0.05f, "Creating Materials");
  42. GuiPC gpc;
  43. gpc.visible=gpc.enabled=true;
  44. gpc.client_rect=gpc.clip.set(-D.w(), -D.h(), D.w(), D.h());
  45. gpc.offset.zero();
  46. UpdateProgress.draw(gpc);
  47. D.clip();
  48. }
  49. /******************************************************************************/
  50. /******************************************************************************/
  51. ::CreateMaterials::Src& CreateMaterials::Src::set(C UID &id ) {T.name=Proj.elmFullName(id); T.id =id ; return T;}
  52. ::CreateMaterials::Src& CreateMaterials::Src::set(C Str &file) {T.name=file ; T.file=file; return T;}
  53. int CreateMaterials::CompareSrcPath(C Src &a, C Src &b) {return ComparePathNumber(a.name, b.name);}
  54. int CreateMaterials::CompareSrcID(C Src &a, C Src &b)
  55. {
  56. if(int c=Compare(a.id, b.id))return c;
  57. return CompareSrcPath(a, b);
  58. }
  59. void CreateMaterials::Create(CreateMaterials &cm) {cm.createDo();}
  60. void CreateMaterials::createDo()
  61. {
  62. if(data.elms())
  63. {
  64. if(parent_id.fromText(path))path.clear();else{path.tailSlash(true); parent_id.zero();}
  65. shared_path.clear();
  66. bool has_shared_path=false;
  67. REPA(data)
  68. {
  69. C Str &file=data[i].file; if(file.is())
  70. {
  71. if(has_shared_path)
  72. {
  73. for(; shared_path.is() && !StartsPath(file, shared_path); )shared_path=GetPath(shared_path);
  74. }else
  75. {
  76. shared_path=GetPath(file); has_shared_path=true;
  77. }
  78. }
  79. }
  80. CreateMaterialsState.set(StateFadeTime);
  81. }
  82. }
  83. void CreateMaterials::Process(Src &src, ptr user, int thread_index) {CreateMtrls.process(src);}
  84. void CreateMaterials::process(Src &src)
  85. {
  86. ThreadMayUseGPUData();
  87. EditMaterial edit; edit.newData();
  88. edit.color_map=(src.id.valid() ? S+EncodeFileName(src.id) : CodeEdit.importPaths(src.file));
  89. edit.color_map_time.getUTC();
  90. SyncLockerEx locker(lock);
  91. Image base_0, base_1;
  92. uint bt=Proj.createBaseTextures(base_0, base_1, edit, false);
  93. locker.off();
  94. if(base_0.is() && !base_1.is())
  95. {
  96. if(bt&BT_ALPHA) // if we ended up having an alpha texture, then set alpha-test params
  97. {
  98. edit.tech=MTECH_ALPHA_TEST;
  99. edit.color.w=0.5f;
  100. }
  101. // save texture
  102. IMAGE_TYPE ct; ImageProps(base_0, &edit.base_0_tex, &ct, ForceHQMtrlBase0 ? FORCE_HQ : 0);
  103. locker.on();
  104. if(Proj.includeTex(edit.base_0_tex)){locker.off(); base_0.copyTry(base_0, -1, -1, -1, ct, IMAGE_2D, 0, FILTER_BEST, false); Proj.saveTex(base_0, edit.base_0_tex);}
  105. // save materials
  106. Str name=GetBase(src.name); if(src.file.is())name=GetExtNot(name); // if this is from a file, then eat the extension
  107. locker.on();
  108. Elm *src_elm=Proj.findElm(src.id);
  109. Elm &elm=Proj.Project::newElm(name, src_elm ? src_elm->parent_id : Proj.getPathID(path+SkipStartPath(GetPath(src.file), shared_path), parent_id), ELM_MTRL); // if creating from element then create in elements place
  110. locker.off();
  111. Save(edit, Proj.editPath(elm));
  112. if(ElmMaterial *data=elm.mtrlData()){data->newData(); data->from(edit);}
  113. Proj.makeGameVer(elm);
  114. // we don't need to call Server send mtrl elements, because materials are created while the Server connection is paused, it will be restarted once creation finished, and auto-sync will start
  115. }
  116. ThreadFinishedUsingGPUData();
  117. }
  118. void CreateMaterials::clearProj()
  119. {
  120. path.clear();
  121. data.clear();
  122. list.clear();
  123. toGui();
  124. }
  125. void CreateMaterials::create()
  126. {
  127. add("Create Materials in following Project Location:", MEMBER(CreateMaterials, path)).elmType(ELM_ANY);
  128. Rect r=::PropWin::create("Create Materials", Vec2(0.03f, -0.1f), 0.045f, 0.05f, 0.7f); button[2].func(HideProjAct, SCAST(GuiObj, T)).show();
  129. autoData(this);
  130. rect(Rect_C(0, 0, 1.8f, 1.3f));
  131. T+=text.create(Vec2(clientWidth()/2, -0.05f), "Drag and Drop Image Elements and Image Files to create Materials from them:");
  132. T+=create_button.create(Rect_D(clientWidth()/2, -clientHeight()+0.03f, 0.3f, 0.06f), "Create").func(Create, T).desc("Create Materials from given Images");
  133. T+=region.create(Rect(0, create_button.rect().max.y, clientWidth(), r.min.y).extend(-0.03f));
  134. ListColumn lc[]=
  135. {
  136. ListColumn(MEMBER(Src, name), LCW_DATA, "Name"),
  137. };
  138. region+=list.create(lc, Elms(lc), true).elmHeight(0.038f).textSize(0, 1); FlagDisable(list.flag, LIST_SORTABLE); list.cur_mode=LCM_MOUSE;
  139. }
  140. CreateMaterials& CreateMaterials::show()
  141. {
  142. if(hidden())
  143. {
  144. clearProj();
  145. ::EE::Window::show();
  146. }
  147. return T;
  148. }
  149. void CreateMaterials::update(C GuiPC &gpc)
  150. {
  151. ::EE::ClosableWindow::update(gpc);
  152. if(visible() && gpc.visible)
  153. {
  154. if(Ms.tappedFirst(0) && Gui.ms()==&list)if(Src *src=list())if(Elm *elm=Proj.findElm(src->id))ImageEdit.toggle(elm);
  155. }
  156. }
  157. void CreateMaterials::drop(C Str &name)
  158. {
  159. switch(FileInfoSystem(name).type)
  160. {
  161. case FSTD_FILE:
  162. {
  163. if(ExtType(GetExt(name))==EXT_IMAGE)data.binaryInclude(Src().set(name), CompareSrcID);
  164. }break;
  165. case FSTD_DIR:
  166. {
  167. for(FileFind ff(name); ff(); )drop(ff.pathName());
  168. }break;
  169. }
  170. }
  171. void CreateMaterials::drop(C MemPtr<Str> &names, GuiObj *obj, C Vec2 &screen_pos)
  172. {
  173. if(contains(obj))
  174. {
  175. data.sort(CompareSrcID); REPA(names)drop(names[i]);
  176. data.sort(CompareSrcPath);
  177. list.setData(data);
  178. }
  179. }
  180. void CreateMaterials::drag(C MemPtr<UID> &elms, GuiObj *obj, C Vec2 &screen_pos)
  181. {
  182. if(contains(obj))
  183. {
  184. REPA(props)if(props[i].contains(obj))return; // ignore when dragging on properties
  185. data.sort(CompareSrcID); REPA(elms)if(Elm *elm=Proj.findElm(elms[i], ELM_IMAGE))data.binaryInclude(Src().set(elm->id), CompareSrcID);
  186. data.sort(CompareSrcPath);
  187. list.setData(data);
  188. }
  189. }
  190. CreateMaterials::CreateMaterials() : parent_id(UIDZero) {}
  191. CreateMaterials::Src::Src() : id(UIDZero) {}
  192. /******************************************************************************/