EditorResourceBrowser.as 57 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682
  1. UIElement@ browserWindow;
  2. Window@ browserFilterWindow;
  3. ListView@ browserDirList;
  4. ListView@ browserFileList;
  5. LineEdit@ browserSearch;
  6. BrowserFile@ browserDragFile;
  7. Node@ browserDragNode;
  8. Component@ browserDragComponent;
  9. View3D@ resourceBrowserPreview;
  10. Scene@ resourcePreviewScene;
  11. Node@ resourcePreviewNode;
  12. Node@ resourcePreviewCameraNode;
  13. Node@ resourcePreviewLightNode;
  14. Light@ resourcePreviewLight;
  15. int browserSearchSortMode = 0;
  16. BrowserDir@ rootDir;
  17. Array<BrowserFile@> browserFiles;
  18. Dictionary browserDirs;
  19. Array<int> activeResourceTypeFilters;
  20. Array<int> activeResourceDirFilters;
  21. Array<BrowserFile@> browserFilesToScan;
  22. const uint BROWSER_WORKER_ITEMS_PER_TICK = 10;
  23. const uint BROWSER_SEARCH_LIMIT = 50;
  24. const int BROWSER_SORT_MODE_ALPHA = 1;
  25. const int BROWSER_SORT_MODE_SEARCH = 2;
  26. const int RESOURCE_TYPE_UNUSABLE = -2;
  27. const int RESOURCE_TYPE_UNKNOWN = -1;
  28. const int RESOURCE_TYPE_NOTSET = 0;
  29. const int RESOURCE_TYPE_SCENE = 1;
  30. const int RESOURCE_TYPE_SCRIPTFILE = 2;
  31. const int RESOURCE_TYPE_MODEL = 3;
  32. const int RESOURCE_TYPE_MATERIAL = 4;
  33. const int RESOURCE_TYPE_ANIMATION = 5;
  34. const int RESOURCE_TYPE_IMAGE = 6;
  35. const int RESOURCE_TYPE_SOUND = 7;
  36. const int RESOURCE_TYPE_TEXTURE = 8;
  37. const int RESOURCE_TYPE_FONT = 9;
  38. const int RESOURCE_TYPE_PREFAB = 10;
  39. const int RESOURCE_TYPE_TECHNIQUE = 11;
  40. const int RESOURCE_TYPE_PARTICLEEFFECT = 12;
  41. const int RESOURCE_TYPE_UIELEMENT = 13;
  42. const int RESOURCE_TYPE_UIELEMENTS = 14;
  43. const int RESOURCE_TYPE_ANIMATION_SETTINGS = 15;
  44. const int RESOURCE_TYPE_RENDERPATH = 16;
  45. const int RESOURCE_TYPE_TEXTURE_ATLAS = 17;
  46. const int RESOURCE_TYPE_2D_PARTICLE_EFFECT = 18;
  47. const int RESOURCE_TYPE_TEXTURE_3D = 19;
  48. const int RESOURCE_TYPE_CUBEMAP = 20;
  49. const int RESOURCE_TYPE_PARTICLEEMITTER = 21;
  50. const int RESOURCE_TYPE_2D_ANIMATION_SET = 22;
  51. // any resource type > 0 is valid
  52. const int NUMBER_OF_VALID_RESOURCE_TYPES = 22;
  53. const StringHash XML_TYPE_SCENE("scene");
  54. const StringHash XML_TYPE_NODE("node");
  55. const StringHash XML_TYPE_MATERIAL("material");
  56. const StringHash XML_TYPE_TECHNIQUE("technique");
  57. const StringHash XML_TYPE_PARTICLEEFFECT("particleeffect");
  58. const StringHash XML_TYPE_PARTICLEEMITTER("particleemitter");
  59. const StringHash XML_TYPE_TEXTURE("texture");
  60. const StringHash XML_TYPE_ELEMENT("element");
  61. const StringHash XML_TYPE_ELEMENTS("elements");
  62. const StringHash XML_TYPE_ANIMATION_SETTINGS("animation");
  63. const StringHash XML_TYPE_RENDERPATH("renderpath");
  64. const StringHash XML_TYPE_TEXTURE_ATLAS("TextureAtlas");
  65. const StringHash XML_TYPE_2D_PARTICLE_EFFECT("particleEmitterConfig");
  66. const StringHash XML_TYPE_TEXTURE_3D("texture3d");
  67. const StringHash XML_TYPE_CUBEMAP("cubemap");
  68. const StringHash XML_TYPE_SPRITER_DATA("spriter_data");
  69. const StringHash JSON_TYPE_SCENE("scene");
  70. const StringHash JSON_TYPE_NODE("node");
  71. const StringHash JSON_TYPE_MATERIAL("material");
  72. const StringHash JSON_TYPE_TECHNIQUE("technique");
  73. const StringHash JSON_TYPE_PARTICLEEFFECT("particleeffect");
  74. const StringHash JSON_TYPE_PARTICLEEMITTER("particleemitter");
  75. const StringHash JSON_TYPE_TEXTURE("texture");
  76. const StringHash JSON_TYPE_ELEMENT("element");
  77. const StringHash JSON_TYPE_ELEMENTS("elements");
  78. const StringHash JSON_TYPE_ANIMATION_SETTINGS("animation");
  79. const StringHash JSON_TYPE_RENDERPATH("renderpath");
  80. const StringHash JSON_TYPE_TEXTURE_ATLAS("TextureAtlas");
  81. const StringHash JSON_TYPE_2D_PARTICLE_EFFECT("particleEmitterConfig");
  82. const StringHash JSON_TYPE_TEXTURE_3D("texture3d");
  83. const StringHash JSON_TYPE_CUBEMAP("cubemap");
  84. const StringHash JSON_TYPE_SPRITER_DATA("spriter_data");
  85. const StringHash BINARY_TYPE_SCENE("USCN");
  86. const StringHash BINARY_TYPE_PACKAGE("UPAK");
  87. const StringHash BINARY_TYPE_COMPRESSED_PACKAGE("ULZ4");
  88. const StringHash BINARY_TYPE_ANGLESCRIPT("ASBC");
  89. const StringHash BINARY_TYPE_MODEL("UMDL");
  90. const StringHash BINARY_TYPE_MODEL2("UMD2");
  91. const StringHash BINARY_TYPE_SHADER("USHD");
  92. const StringHash BINARY_TYPE_ANIMATION("UANI");
  93. const StringHash EXTENSION_TYPE_TTF(".ttf");
  94. const StringHash EXTENSION_TYPE_OTF(".otf");
  95. const StringHash EXTENSION_TYPE_OGG(".ogg");
  96. const StringHash EXTENSION_TYPE_WAV(".wav");
  97. const StringHash EXTENSION_TYPE_DDS(".dds");
  98. const StringHash EXTENSION_TYPE_PNG(".png");
  99. const StringHash EXTENSION_TYPE_JPG(".jpg");
  100. const StringHash EXTENSION_TYPE_JPEG(".jpeg");
  101. const StringHash EXTENSION_TYPE_HDR(".hdr");
  102. const StringHash EXTENSION_TYPE_BMP(".bmp");
  103. const StringHash EXTENSION_TYPE_TGA(".tga");
  104. const StringHash EXTENSION_TYPE_KTX(".ktx");
  105. const StringHash EXTENSION_TYPE_PVR(".pvr");
  106. const StringHash EXTENSION_TYPE_OBJ(".obj");
  107. const StringHash EXTENSION_TYPE_FBX(".fbx");
  108. const StringHash EXTENSION_TYPE_COLLADA(".dae");
  109. const StringHash EXTENSION_TYPE_BLEND(".blend");
  110. const StringHash EXTENSION_TYPE_ANGELSCRIPT(".as");
  111. const StringHash EXTENSION_TYPE_LUASCRIPT(".lua");
  112. const StringHash EXTENSION_TYPE_HLSL(".hlsl");
  113. const StringHash EXTENSION_TYPE_GLSL(".glsl");
  114. const StringHash EXTENSION_TYPE_FRAGMENTSHADER(".frag");
  115. const StringHash EXTENSION_TYPE_VERTEXSHADER(".vert");
  116. const StringHash EXTENSION_TYPE_HTML(".html");
  117. const StringHash TEXT_VAR_FILE_ID("browser_file_id");
  118. const StringHash TEXT_VAR_DIR_ID("browser_dir_id");
  119. const StringHash TEXT_VAR_RESOURCE_TYPE("resource_type");
  120. const StringHash TEXT_VAR_RESOURCE_DIR_ID("resource_dir_id");
  121. const int BROWSER_FILE_SOURCE_RESOURCE_DIR = 1;
  122. uint browserDirIndex = 1;
  123. uint browserFileIndex = 1;
  124. BrowserDir@ selectedBrowserDirectory;
  125. BrowserFile@ selectedBrowserFile;
  126. Text@ browserStatusMessage;
  127. Text@ browserResultsMessage;
  128. bool ignoreRefreshBrowserResults = false;
  129. String resourceDirsCache;
  130. void CreateResourceBrowser()
  131. {
  132. if (browserWindow !is null) return;
  133. CreateResourceBrowserUI();
  134. InitResourceBrowserPreview();
  135. RebuildResourceDatabase();
  136. }
  137. void RebuildResourceDatabase()
  138. {
  139. if (browserWindow is null)
  140. return;
  141. String newResourceDirsCache = Join(cache.resourceDirs, ';');
  142. ScanResourceDirectories();
  143. if (newResourceDirsCache != resourceDirsCache)
  144. {
  145. resourceDirsCache = newResourceDirsCache;
  146. PopulateResourceDirFilters();
  147. }
  148. PopulateBrowserDirectories();
  149. PopulateResourceBrowserFilesByDirectory(rootDir);
  150. }
  151. void ScanResourceDirectories()
  152. {
  153. browserDirs.Clear();
  154. browserFiles.Clear();
  155. browserFilesToScan.Clear();
  156. rootDir = BrowserDir("");
  157. browserDirs.Set("", @rootDir);
  158. // collect all of the items and sort them afterwards
  159. for(uint i=0; i < cache.resourceDirs.length; ++i)
  160. {
  161. if (activeResourceDirFilters.Find(i) > -1)
  162. continue;
  163. ScanResourceDir(i);
  164. }
  165. }
  166. // used to stop ui from blocking while determining file types
  167. void DoResourceBrowserWork()
  168. {
  169. if (browserFilesToScan.length == 0)
  170. return;
  171. int counter = 0;
  172. bool updateBrowserUI = false;
  173. BrowserFile@ scanItem = browserFilesToScan[0];
  174. while(counter < BROWSER_WORKER_ITEMS_PER_TICK)
  175. {
  176. scanItem.DetermainResourceType();
  177. // next
  178. browserFilesToScan.Erase(0);
  179. if (browserFilesToScan.length > 0)
  180. @scanItem = browserFilesToScan[0];
  181. else
  182. break;
  183. counter++;
  184. }
  185. if (browserFilesToScan.length > 0)
  186. browserStatusMessage.text = localization.Get("Files left to scan: " )+ browserFilesToScan.length;
  187. else
  188. browserStatusMessage.text = localization.Get("Scan complete");
  189. }
  190. void CreateResourceBrowserUI()
  191. {
  192. browserWindow = LoadEditorUI("UI/EditorResourceBrowser.xml");
  193. browserDirList = browserWindow.GetChild("DirectoryList", true);
  194. browserFileList = browserWindow.GetChild("FileList", true);
  195. browserSearch = browserWindow.GetChild("Search", true);
  196. browserStatusMessage = browserWindow.GetChild("StatusMessage", true);
  197. browserResultsMessage = browserWindow.GetChild("ResultsMessage", true);
  198. // browserWindow.visible = false;
  199. browserWindow.opacity = uiMaxOpacity;
  200. browserFilterWindow = LoadEditorUI("UI/EditorResourceFilterWindow.xml");
  201. CreateResourceFilterUI();
  202. HideResourceFilterWindow();
  203. int height = Min(ui.root.height / 4, 300);
  204. browserWindow.SetSize(900, height);
  205. browserWindow.SetPosition(35, ui.root.height - height - 25);
  206. CloseContextMenu();
  207. ui.root.AddChild(browserWindow);
  208. ui.root.AddChild(browserFilterWindow);
  209. SubscribeToEvent(browserWindow.GetChild("CloseButton", true), "Released", "HideResourceBrowserWindow");
  210. SubscribeToEvent(browserWindow.GetChild("RescanButton", true), "Released", "HandleRescanResourceBrowserClick");
  211. SubscribeToEvent(browserWindow.GetChild("FilterButton", true), "Released", "ToggleResourceFilterWindow");
  212. SubscribeToEvent(browserDirList, "SelectionChanged", "HandleResourceBrowserDirListSelectionChange");
  213. SubscribeToEvent(browserSearch, "TextChanged", "HandleResourceBrowserSearchTextChange");
  214. SubscribeToEvent(browserFileList, "ItemClicked", "HandleBrowserFileClick");
  215. SubscribeToEvent(browserFileList, "SelectionChanged", "HandleResourceBrowserFileListSelectionChange");
  216. SubscribeToEvent(cache, "FileChanged", "HandleFileChanged");
  217. }
  218. void CreateResourceFilterUI()
  219. {
  220. UIElement@ options = browserFilterWindow.GetChild("TypeOptions", true);
  221. CheckBox@ toggleAllTypes = browserFilterWindow.GetChild("ToggleAllTypes", true);
  222. CheckBox@ toggleAllResourceDirs = browserFilterWindow.GetChild("ToggleAllResourceDirs", true);
  223. SubscribeToEvent(toggleAllTypes, "Toggled", "HandleResourceTypeFilterToggleAllTypesToggled");
  224. SubscribeToEvent(toggleAllResourceDirs, "Toggled", "HandleResourceDirFilterToggleAllTypesToggled");
  225. SubscribeToEvent(browserFilterWindow.GetChild("CloseButton", true), "Released", "HideResourceFilterWindow");
  226. int columns = 2;
  227. UIElement@ col1 = browserFilterWindow.GetChild("TypeFilterColumn1", true);
  228. UIElement@ col2 = browserFilterWindow.GetChild("TypeFilterColumn2", true);
  229. // use array to get sort of items
  230. Array<ResourceType@> sorted;
  231. for (int i=1; i <= NUMBER_OF_VALID_RESOURCE_TYPES; ++i)
  232. sorted.Push(ResourceType(i, ResourceTypeName(i)));
  233. // 2 unknown types are reserved for the top, the rest are alphabetized
  234. sorted.Sort();
  235. sorted.Insert(0, ResourceType(RESOURCE_TYPE_UNKNOWN, ResourceTypeName(RESOURCE_TYPE_UNKNOWN)) );
  236. sorted.Insert(0, ResourceType(RESOURCE_TYPE_UNUSABLE, ResourceTypeName(RESOURCE_TYPE_UNUSABLE)) );
  237. uint halfColumns = uint( Ceil( float(sorted.length) / float(columns) ) );
  238. for (uint i = 0; i < sorted.length; ++i)
  239. {
  240. ResourceType@ type = sorted[i];
  241. UIElement@ resourceTypeHolder = UIElement();
  242. if (i < halfColumns)
  243. col1.AddChild(resourceTypeHolder);
  244. else
  245. col2.AddChild(resourceTypeHolder);
  246. resourceTypeHolder.layoutMode = LM_HORIZONTAL;
  247. resourceTypeHolder.layoutSpacing = 4;
  248. Text@ label = Text();
  249. label.style = "EditorAttributeText";
  250. label.text = type.name;
  251. CheckBox@ checkbox = CheckBox();
  252. checkbox.name = type.id;
  253. checkbox.SetStyleAuto();
  254. checkbox.vars[TEXT_VAR_RESOURCE_TYPE] = i;
  255. checkbox.checked = true;
  256. SubscribeToEvent(checkbox, "Toggled", "HandleResourceTypeFilterToggled");
  257. resourceTypeHolder.AddChild(checkbox);
  258. resourceTypeHolder.AddChild(label);
  259. }
  260. }
  261. void CreateDirList(BrowserDir@ dir, UIElement@ parentUI = null)
  262. {
  263. Text@ dirText = Text();
  264. browserDirList.InsertItem(browserDirList.numItems, dirText, parentUI);
  265. dirText.style = "FileSelectorListText";
  266. dirText.text = dir.resourceKey.empty ? localization.Get("Root") : dir.name;
  267. dirText.name = dir.resourceKey;
  268. dirText.vars[TEXT_VAR_DIR_ID] = dir.resourceKey;
  269. // Sort directories alphetically
  270. browserSearchSortMode = BROWSER_SORT_MODE_ALPHA;
  271. dir.children.Sort();
  272. for(uint i=0; i<dir.children.length; ++i)
  273. CreateDirList(dir.children[i], dirText);
  274. }
  275. void CreateFileList(BrowserFile@ file)
  276. {
  277. Text@ fileText = Text();
  278. fileText.style = "FileSelectorListText";
  279. fileText.layoutMode = LM_HORIZONTAL;
  280. browserFileList.InsertItem(browserFileList.numItems, fileText);
  281. file.browserFileListRow = fileText;
  282. InitializeBrowserFileListRow(fileText, file);
  283. }
  284. void InitializeBrowserFileListRow(Text@ fileText, BrowserFile@ file)
  285. {
  286. fileText.RemoveAllChildren();
  287. VariantMap params = VariantMap();
  288. fileText.vars[TEXT_VAR_FILE_ID] = file.id;
  289. fileText.vars[TEXT_VAR_RESOURCE_TYPE] = file.resourceType;
  290. if (file.resourceType > 0)
  291. fileText.dragDropMode = DD_SOURCE;
  292. {
  293. Text@ text = Text();
  294. fileText.AddChild(text);
  295. text.style = "FileSelectorListText";
  296. text.text = file.fullname;
  297. text.name = file.resourceKey;
  298. }
  299. {
  300. Text@ text = Text();
  301. fileText.AddChild(text);
  302. text.style = "FileSelectorListText";
  303. text.text = file.ResourceTypeName();
  304. }
  305. if (file.resourceType == RESOURCE_TYPE_MATERIAL ||
  306. file.resourceType == RESOURCE_TYPE_MODEL ||
  307. file.resourceType == RESOURCE_TYPE_PARTICLEEFFECT ||
  308. file.resourceType == RESOURCE_TYPE_PREFAB
  309. )
  310. {
  311. SubscribeToEvent(fileText, "DragBegin", "HandleBrowserFileDragBegin");
  312. SubscribeToEvent(fileText, "DragEnd", "HandleBrowserFileDragEnd");
  313. }
  314. }
  315. void InitResourceBrowserPreview()
  316. {
  317. resourcePreviewScene = Scene("PreviewScene");
  318. resourcePreviewScene.CreateComponent("Octree");
  319. PhysicsWorld@ physicsWorld = resourcePreviewScene.CreateComponent("PhysicsWorld");
  320. physicsWorld.enabled = false;
  321. physicsWorld.gravity = Vector3(0.0, 0.0, 0.0);
  322. Node@ zoneNode = resourcePreviewScene.CreateChild("Zone");
  323. Zone@ zone = zoneNode.CreateComponent("Zone");
  324. zone.boundingBox = BoundingBox(-1000, 1000);
  325. zone.ambientColor = Color(0.15, 0.15, 0.15);
  326. zone.fogColor = Color(0, 0, 0);
  327. zone.fogStart = 10.0;
  328. zone.fogEnd = 100.0;
  329. resourcePreviewCameraNode = resourcePreviewScene.CreateChild("PreviewCamera");
  330. resourcePreviewCameraNode.position = Vector3(0, 0, -1.5);
  331. Camera@ camera = resourcePreviewCameraNode.CreateComponent("Camera");
  332. camera.nearClip = 0.1f;
  333. camera.farClip = 100.0f;
  334. resourcePreviewLightNode = resourcePreviewScene.CreateChild("PreviewLight");
  335. resourcePreviewLightNode.direction = Vector3(0.5, -0.5, 0.5);
  336. resourcePreviewLight = resourcePreviewLightNode.CreateComponent("Light");
  337. resourcePreviewLight.lightType = LIGHT_DIRECTIONAL;
  338. resourcePreviewLight.specularIntensity = 0.5;
  339. resourceBrowserPreview = browserWindow.GetChild("ResourceBrowserPreview", true);
  340. resourceBrowserPreview.SetFixedHeight(200);
  341. resourceBrowserPreview.SetFixedWidth(266);
  342. resourceBrowserPreview.SetView(resourcePreviewScene, camera);
  343. resourceBrowserPreview.autoUpdate = false;
  344. resourcePreviewNode = resourcePreviewScene.CreateChild("PreviewNodeContainer");
  345. SubscribeToEvent(resourceBrowserPreview, "DragMove", "RotateResourceBrowserPreview");
  346. RefreshBrowserPreview();
  347. }
  348. // Opens a contextual menu based on what resource item was actioned
  349. void HandleBrowserFileClick(StringHash eventType, VariantMap& eventData)
  350. {
  351. if (eventData["Button"].GetInt() != MOUSEB_RIGHT)
  352. return;
  353. UIElement@ uiElement = eventData["Item"].GetPtr();
  354. BrowserFile@ file = GetBrowserFileFromUIElement(uiElement);
  355. if (file is null)
  356. return;
  357. Array<UIElement@> actions;
  358. if (file.resourceType == RESOURCE_TYPE_MATERIAL)
  359. {
  360. actions.Push(CreateBrowserFileActionMenu("Edit", "HandleBrowserEditResource", file));
  361. }
  362. else if (file.resourceType == RESOURCE_TYPE_MODEL)
  363. {
  364. actions.Push(CreateBrowserFileActionMenu("Instance Animated Model", "HandleBrowserInstantiateAnimatedModel", file));
  365. actions.Push(CreateBrowserFileActionMenu("Instance Static Model", "HandleBrowserInstantiateStaticModel", file));
  366. }
  367. else if (file.resourceType == RESOURCE_TYPE_PREFAB)
  368. {
  369. actions.Push(CreateBrowserFileActionMenu("Instance Prefab", "HandleBrowserInstantiatePrefab", file));
  370. actions.Push(CreateBrowserFileActionMenu("Instance in Spawner", "HandleBrowserInstantiateInSpawnEditor", file));
  371. }
  372. else if (file.fileType == EXTENSION_TYPE_OBJ ||
  373. file.fileType == EXTENSION_TYPE_COLLADA ||
  374. file.fileType == EXTENSION_TYPE_FBX ||
  375. file.fileType == EXTENSION_TYPE_BLEND)
  376. {
  377. actions.Push(CreateBrowserFileActionMenu("Import Model", "HandleBrowserImportModel", file));
  378. actions.Push(CreateBrowserFileActionMenu("Import Scene", "HandleBrowserImportScene", file));
  379. }
  380. else if (file.resourceType == RESOURCE_TYPE_UIELEMENT)
  381. {
  382. actions.Push(CreateBrowserFileActionMenu("Open UI Layout", "HandleBrowserOpenUILayout", file));
  383. }
  384. else if (file.resourceType == RESOURCE_TYPE_SCENE)
  385. {
  386. actions.Push(CreateBrowserFileActionMenu("Load Scene", "HandleBrowserLoadScene", file));
  387. }
  388. else if (file.resourceType == RESOURCE_TYPE_SCRIPTFILE)
  389. {
  390. actions.Push(CreateBrowserFileActionMenu("Execute Script", "HandleBrowserRunScript", file));
  391. }
  392. else if (file.resourceType == RESOURCE_TYPE_PARTICLEEFFECT)
  393. {
  394. actions.Push(CreateBrowserFileActionMenu("Edit", "HandleBrowserEditResource", file));
  395. }
  396. actions.Push(CreateBrowserFileActionMenu("Open", "HandleBrowserOpenResource", file));
  397. ActivateContextMenu(actions);
  398. }
  399. BrowserDir@ GetBrowserDir(String path)
  400. {
  401. BrowserDir@ browserDir;
  402. browserDirs.Get(path, @browserDir);
  403. return browserDir;
  404. }
  405. // Makes sure the entire directory tree exists and new dir is linked to parent
  406. BrowserDir@ InitBrowserDir(String path)
  407. {
  408. BrowserDir@ browserDir;
  409. if (browserDirs.Get(path, @browserDir))
  410. return browserDir;
  411. Array<String> parts = path.Split('/');
  412. Array<String> finishedParts;
  413. if (parts.length > 0)
  414. {
  415. BrowserDir@ parent = rootDir;
  416. for( uint i = 0; i < parts.length; ++i )
  417. {
  418. finishedParts.Push(parts[i]);
  419. String currentPath = Join(finishedParts, "/");
  420. if (!browserDirs.Get(currentPath, @browserDir))
  421. {
  422. browserDir = BrowserDir(currentPath);
  423. browserDirs.Set(currentPath, @browserDir);
  424. parent.children.Push(browserDir);
  425. }
  426. @parent = browserDir;
  427. }
  428. return browserDir;
  429. }
  430. return null;
  431. }
  432. void ScanResourceDir(uint resourceDirIndex)
  433. {
  434. String resourceDir = cache.resourceDirs[resourceDirIndex];
  435. ScanResourceDirFiles("", resourceDirIndex);
  436. Array<String> dirs = fileSystem.ScanDir(resourceDir, "*", SCAN_DIRS, true);
  437. for (uint i=0; i < dirs.length; ++i)
  438. {
  439. String path = dirs[i];
  440. if (path.EndsWith("."))
  441. continue;
  442. InitBrowserDir(path);
  443. ScanResourceDirFiles(path, resourceDirIndex);
  444. }
  445. }
  446. void ScanResourceDirFiles(String path, uint resourceDirIndex)
  447. {
  448. String fullPath = cache.resourceDirs[resourceDirIndex] + path;
  449. if (!fileSystem.DirExists(fullPath))
  450. return;
  451. BrowserDir@ dir = GetBrowserDir(path);
  452. if (dir is null)
  453. return;
  454. // get files in directory
  455. Array<String> dirFiles = fileSystem.ScanDir(fullPath, "*.*", SCAN_FILES, false);
  456. // add new files
  457. for (uint x=0; x < dirFiles.length; x++)
  458. {
  459. String filename = dirFiles[x];
  460. BrowserFile@ browserFile = dir.AddFile(filename, resourceDirIndex, BROWSER_FILE_SOURCE_RESOURCE_DIR);
  461. browserFiles.Push(browserFile);
  462. browserFilesToScan.Push(browserFile);
  463. }
  464. }
  465. bool ToggleResourceBrowserWindow()
  466. {
  467. if (browserWindow.visible == false)
  468. ShowResourceBrowserWindow();
  469. else
  470. HideResourceBrowserWindow();
  471. return true;
  472. }
  473. void ShowResourceBrowserWindow()
  474. {
  475. browserWindow.visible = true;
  476. browserWindow.BringToFront();
  477. ui.focusElement = browserSearch;
  478. }
  479. void HideResourceBrowserWindow()
  480. {
  481. browserWindow.visible = false;
  482. }
  483. void ToggleResourceFilterWindow()
  484. {
  485. if (browserFilterWindow.visible)
  486. HideResourceFilterWindow();
  487. else
  488. ShowResourceFilterWindow();
  489. }
  490. void HideResourceFilterWindow()
  491. {
  492. browserFilterWindow.visible = false;
  493. }
  494. void ShowResourceFilterWindow()
  495. {
  496. int x = browserWindow.position.x + browserWindow.width - browserFilterWindow.width;
  497. int y = browserWindow.position.y - browserFilterWindow.height - 1;
  498. browserFilterWindow.position = IntVector2(x,y);
  499. browserFilterWindow.visible = true;
  500. browserFilterWindow.BringToFront();
  501. }
  502. void PopulateResourceDirFilters()
  503. {
  504. UIElement@ resourceDirs = browserFilterWindow.GetChild("DirFilters", true);
  505. resourceDirs.RemoveAllChildren();
  506. activeResourceDirFilters.Clear();
  507. for (uint i=0; i < cache.resourceDirs.length; ++i)
  508. {
  509. UIElement@ resourceDirHolder = UIElement();
  510. resourceDirs.AddChild(resourceDirHolder);
  511. resourceDirHolder.layoutMode = LM_HORIZONTAL;
  512. resourceDirHolder.layoutSpacing = 4;
  513. resourceDirHolder.SetFixedHeight(16);
  514. Text@ label = Text();
  515. label.style = "EditorAttributeText";
  516. label.text = cache.resourceDirs[i].Replaced(fileSystem.programDir, "");
  517. CheckBox@ checkbox = CheckBox();
  518. checkbox.name = i;
  519. checkbox.SetStyleAuto();
  520. checkbox.vars[TEXT_VAR_RESOURCE_DIR_ID] = i;
  521. checkbox.checked = true;
  522. SubscribeToEvent(checkbox, "Toggled", "HandleResourceDirFilterToggled");
  523. resourceDirHolder.AddChild(checkbox);
  524. resourceDirHolder.AddChild(label);
  525. }
  526. }
  527. void PopulateBrowserDirectories()
  528. {
  529. browserDirList.RemoveAllItems();
  530. CreateDirList(rootDir);
  531. browserDirList.selection = 0;
  532. }
  533. void PopulateResourceBrowserFilesByDirectory(BrowserDir@ dir)
  534. {
  535. @selectedBrowserDirectory = dir;
  536. browserFileList.RemoveAllItems();
  537. if (dir is null) return;
  538. Array<BrowserFile@> files;
  539. for(uint x=0; x < dir.files.length; x++)
  540. {
  541. BrowserFile@ file = dir.files[x];
  542. if (activeResourceTypeFilters.Find(file.resourceType) == -1)
  543. files.Push(file);
  544. }
  545. // Sort alphetically
  546. browserSearchSortMode = BROWSER_SORT_MODE_ALPHA;
  547. files.Sort();
  548. PopulateResourceBrowserResults(files);
  549. browserResultsMessage.text = localization.Get("Showing files: ") + files.length;
  550. }
  551. void PopulateResourceBrowserBySearch()
  552. {
  553. String query = browserSearch.text;
  554. Array<int> scores;
  555. Array<BrowserFile@> scored;
  556. Array<BrowserFile@> filtered;
  557. {
  558. BrowserFile@ file;
  559. for(uint x=0; x < browserFiles.length; x++)
  560. {
  561. @file = browserFiles[x];
  562. file.sortScore = -1;
  563. if (activeResourceTypeFilters.Find(file.resourceType) > -1)
  564. continue;
  565. if (activeResourceDirFilters.Find(file.resourceSourceIndex) > -1)
  566. continue;
  567. int find = file.fullname.Find(query, 0, false);
  568. if (find > -1)
  569. {
  570. int fudge = query.length - file.fullname.length;
  571. int score = find * int(Abs(fudge*2)) + int(Abs(fudge));
  572. file.sortScore = score;
  573. scored.Push(file);
  574. scores.Push(score);
  575. }
  576. }
  577. }
  578. // cut this down for a faster sort
  579. if (scored.length > BROWSER_SEARCH_LIMIT)
  580. {
  581. scores.Sort();
  582. int scoreThreshold = scores[BROWSER_SEARCH_LIMIT];
  583. BrowserFile@ file;
  584. for(uint x=0;x<scored.length;x++)
  585. {
  586. file = scored[x];
  587. if (file.sortScore <= scoreThreshold)
  588. filtered.Push(file);
  589. }
  590. }
  591. else
  592. filtered = scored;
  593. browserSearchSortMode = BROWSER_SORT_MODE_ALPHA;
  594. filtered.Sort();
  595. PopulateResourceBrowserResults(filtered);
  596. browserResultsMessage.text = "Showing top " + filtered.length + " of " + scored.length + " results";
  597. }
  598. void PopulateResourceBrowserResults(Array<BrowserFile@>@ files)
  599. {
  600. browserFileList.RemoveAllItems();
  601. for(uint i=0; i < files.length; ++i)
  602. CreateFileList(files[i]);
  603. }
  604. void RefreshBrowserResults()
  605. {
  606. if (browserSearch.text.empty)
  607. {
  608. browserDirList.visible = true;
  609. PopulateResourceBrowserFilesByDirectory(selectedBrowserDirectory);
  610. }
  611. else
  612. {
  613. browserDirList.visible = false;
  614. PopulateResourceBrowserBySearch();
  615. }
  616. }
  617. void HandleResourceTypeFilterToggleAllTypesToggled(StringHash eventType, VariantMap& eventData)
  618. {
  619. CheckBox@ checkbox = eventData["Element"].GetPtr();
  620. UIElement@ filterHolder = browserFilterWindow.GetChild("TypeFilters", true);
  621. Array<UIElement@> children = filterHolder.GetChildren(true);
  622. ignoreRefreshBrowserResults = true;
  623. for(uint i=0; i < children.length; ++i)
  624. {
  625. CheckBox@ filter = children[i];
  626. if (filter !is null)
  627. filter.checked = checkbox.checked;
  628. }
  629. ignoreRefreshBrowserResults = false;
  630. RefreshBrowserResults();
  631. }
  632. void HandleResourceTypeFilterToggled(StringHash eventType, VariantMap& eventData)
  633. {
  634. CheckBox@ checkbox = eventData["Element"].GetPtr();
  635. if (!checkbox.vars.Contains(TEXT_VAR_RESOURCE_TYPE))
  636. return;
  637. int resourceType = checkbox.GetVar(TEXT_VAR_RESOURCE_TYPE).GetInt();
  638. int find = activeResourceTypeFilters.Find(resourceType);
  639. if (checkbox.checked && find != -1)
  640. activeResourceTypeFilters.Erase(find);
  641. else if (!checkbox.checked && find == -1)
  642. activeResourceTypeFilters.Push(resourceType);
  643. if (ignoreRefreshBrowserResults == false)
  644. RefreshBrowserResults();
  645. }
  646. void HandleResourceDirFilterToggleAllTypesToggled(StringHash eventType, VariantMap& eventData)
  647. {
  648. CheckBox@ checkbox = eventData["Element"].GetPtr();
  649. UIElement@ filterHolder = browserFilterWindow.GetChild("DirFilters", true);
  650. Array<UIElement@> children = filterHolder.GetChildren(true);
  651. ignoreRefreshBrowserResults = true;
  652. for(uint i=0; i < children.length; ++i)
  653. {
  654. CheckBox@ filter = children[i];
  655. if (filter !is null)
  656. filter.checked = checkbox.checked;
  657. }
  658. ignoreRefreshBrowserResults = false;
  659. RebuildResourceDatabase();
  660. }
  661. void HandleResourceDirFilterToggled(StringHash eventType, VariantMap& eventData)
  662. {
  663. CheckBox@ checkbox = eventData["Element"].GetPtr();
  664. if (!checkbox.vars.Contains(TEXT_VAR_RESOURCE_DIR_ID))
  665. return;
  666. int resourceDir = checkbox.GetVar(TEXT_VAR_RESOURCE_DIR_ID).GetInt();
  667. int find = activeResourceDirFilters.Find(resourceDir);
  668. if (checkbox.checked && find != -1)
  669. activeResourceDirFilters.Erase(find);
  670. else if (!checkbox.checked && find == -1)
  671. activeResourceDirFilters.Push(resourceDir);
  672. if (ignoreRefreshBrowserResults == false)
  673. RebuildResourceDatabase();
  674. }
  675. void HandleRescanResourceBrowserClick(StringHash eventType, VariantMap& eventData)
  676. {
  677. RebuildResourceDatabase();
  678. }
  679. void HandleResourceBrowserDirListSelectionChange(StringHash eventType, VariantMap& eventData)
  680. {
  681. if (browserDirList.selection == M_MAX_UNSIGNED)
  682. return;
  683. UIElement@ uiElement = browserDirList.GetItems()[browserDirList.selection];
  684. BrowserDir@ dir = GetBrowserDir(uiElement.vars[TEXT_VAR_DIR_ID].GetString());
  685. if (dir is null)
  686. return;
  687. PopulateResourceBrowserFilesByDirectory(dir);
  688. }
  689. void HandleResourceBrowserFileListSelectionChange(StringHash eventType, VariantMap& eventData)
  690. {
  691. if (browserFileList.selection == M_MAX_UNSIGNED)
  692. return;
  693. UIElement@ uiElement = browserFileList.GetItems()[browserFileList.selection];
  694. BrowserFile@ file = GetBrowserFileFromUIElement(uiElement);
  695. if (file is null)
  696. return;
  697. if (resourcePreviewNode !is null)
  698. resourcePreviewNode.Remove();
  699. resourcePreviewNode = resourcePreviewScene.CreateChild("PreviewNodeContainer");
  700. CreateResourcePreview(file.GetFullPath(), resourcePreviewNode);
  701. if (resourcePreviewNode !is null)
  702. {
  703. Array<BoundingBox> boxes;
  704. Array<Component@> staticModels = resourcePreviewNode.GetComponents("StaticModel", true);
  705. Array<Component@> animatedModels = resourcePreviewNode.GetComponents("AnimatedModel", true);
  706. for (uint i = 0; i < staticModels.length; ++i)
  707. boxes.Push(cast<StaticModel>(staticModels[i]).worldBoundingBox);
  708. for (uint i = 0; i < animatedModels.length; ++i)
  709. boxes.Push(cast<AnimatedModel>(animatedModels[i]).worldBoundingBox);
  710. if (boxes.length > 0)
  711. {
  712. Vector3 camPosition = Vector3(0.0, 0.0, -1.2);
  713. BoundingBox biggestBox = boxes[0];
  714. for (uint i = 1; i < boxes.length; ++i)
  715. {
  716. if (boxes[i].size.length > biggestBox.size.length)
  717. biggestBox = boxes[i];
  718. }
  719. resourcePreviewCameraNode.position = biggestBox.center + camPosition * biggestBox.size.length;
  720. }
  721. resourcePreviewScene.AddChild(resourcePreviewNode);
  722. RefreshBrowserPreview();
  723. }
  724. }
  725. void HandleResourceBrowserSearchTextChange(StringHash eventType, VariantMap& eventData)
  726. {
  727. RefreshBrowserResults();
  728. }
  729. BrowserFile@ GetBrowserFileFromId(uint id)
  730. {
  731. if (id == 0)
  732. return null;
  733. BrowserFile@ file;
  734. for(uint i=0; i<browserFiles.length; ++i)
  735. {
  736. @file = @browserFiles[i];
  737. if (file.id == id) return file;
  738. }
  739. return null;
  740. }
  741. BrowserFile@ GetBrowserFileFromUIElement(UIElement@ element)
  742. {
  743. if (element is null || !element.vars.Contains(TEXT_VAR_FILE_ID))
  744. return null;
  745. return GetBrowserFileFromId(element.vars[TEXT_VAR_FILE_ID].GetUInt());
  746. }
  747. BrowserFile@ GetBrowserFileFromPath(String path)
  748. {
  749. for (uint i=0; i < browserFiles.length; ++i)
  750. {
  751. BrowserFile@ file = browserFiles[i];
  752. if (path == file.GetFullPath())
  753. return file;
  754. }
  755. return null;
  756. }
  757. void HandleBrowserEditResource(StringHash eventType, VariantMap& eventData)
  758. {
  759. UIElement@ element = eventData["Element"].GetPtr();
  760. BrowserFile@ file = GetBrowserFileFromUIElement(element);
  761. if (file is null)
  762. return;
  763. if (file.resourceType == RESOURCE_TYPE_MATERIAL)
  764. {
  765. Material@ material = cache.GetResource("Material", file.resourceKey);
  766. if (material !is null)
  767. EditMaterial(material);
  768. }
  769. if (file.resourceType == RESOURCE_TYPE_PARTICLEEFFECT)
  770. {
  771. ParticleEffect@ particleEffect = cache.GetResource("ParticleEffect", file.resourceKey);
  772. if (particleEffect !is null)
  773. EditParticleEffect(particleEffect);
  774. }
  775. }
  776. void HandleBrowserOpenResource(StringHash eventType, VariantMap& eventData)
  777. {
  778. UIElement@ element = eventData["Element"].GetPtr();
  779. BrowserFile@ file = GetBrowserFileFromUIElement(element);
  780. if (file !is null)
  781. OpenResource(file.resourceKey);
  782. }
  783. void HandleBrowserImportScene(StringHash eventType, VariantMap& eventData)
  784. {
  785. UIElement@ element = eventData["Element"].GetPtr();
  786. BrowserFile@ file = GetBrowserFileFromUIElement(element);
  787. if (file !is null)
  788. ImportScene(file.GetFullPath());
  789. }
  790. void HandleBrowserImportModel(StringHash eventType, VariantMap& eventData)
  791. {
  792. UIElement@ element = eventData["Element"].GetPtr();
  793. BrowserFile@ file = GetBrowserFileFromUIElement(element);
  794. if (file !is null)
  795. ImportModel(file.GetFullPath());
  796. }
  797. void HandleBrowserOpenUILayout(StringHash eventType, VariantMap& eventData)
  798. {
  799. UIElement@ element = eventData["Element"].GetPtr();
  800. BrowserFile@ file = GetBrowserFileFromUIElement(element);
  801. if (file !is null)
  802. OpenUILayout(file.GetFullPath());
  803. }
  804. void HandleBrowserInstantiateStaticModel(StringHash eventType, VariantMap& eventData)
  805. {
  806. UIElement@ element = eventData["Element"].GetPtr();
  807. BrowserFile@ file = GetBrowserFileFromUIElement(element);
  808. if (file !is null)
  809. CreateModelWithStaticModel(file.resourceKey, editNode);
  810. }
  811. void HandleBrowserInstantiateAnimatedModel(StringHash eventType, VariantMap& eventData)
  812. {
  813. UIElement@ element = eventData["Element"].GetPtr();
  814. BrowserFile@ file = GetBrowserFileFromUIElement(element);
  815. if (file !is null)
  816. CreateModelWithAnimatedModel(file.resourceKey, editNode);
  817. }
  818. void HandleBrowserInstantiatePrefab(StringHash eventType, VariantMap& eventData)
  819. {
  820. UIElement@ element = eventData["Element"].GetPtr();
  821. BrowserFile@ file = GetBrowserFileFromUIElement(element);
  822. if (file !is null)
  823. LoadNode(file.GetFullPath());
  824. }
  825. void HandleBrowserInstantiateInSpawnEditor(StringHash eventType, VariantMap& eventData)
  826. {
  827. UIElement@ element = eventData["Element"].GetPtr();
  828. BrowserFile@ file = GetBrowserFileFromUIElement(element);
  829. if (file !is null)
  830. {
  831. spawnedObjectsNames.Resize(1);
  832. spawnedObjectsNames[0] = VerifySpawnedObjectFile(file.GetPath());
  833. RefreshPickedObjects();
  834. ShowSpawnEditor();
  835. }
  836. }
  837. void HandleBrowserLoadScene(StringHash eventType, VariantMap& eventData)
  838. {
  839. UIElement@ element = eventData["Element"].GetPtr();
  840. BrowserFile@ file = GetBrowserFileFromUIElement(element);
  841. if (file !is null)
  842. LoadScene(file.GetFullPath());
  843. }
  844. void HandleBrowserRunScript(StringHash eventType, VariantMap& eventData)
  845. {
  846. UIElement@ element = eventData["Element"].GetPtr();
  847. BrowserFile@ file = GetBrowserFileFromUIElement(element);
  848. if (file !is null)
  849. ExecuteScript(ExtractFileName(eventData));
  850. }
  851. void HandleBrowserFileDragBegin(StringHash eventType, VariantMap& eventData)
  852. {
  853. UIElement@ uiElement = eventData["Element"].GetPtr();
  854. @browserDragFile = GetBrowserFileFromUIElement(uiElement);
  855. }
  856. void HandleBrowserFileDragEnd(StringHash eventType, VariantMap& eventData)
  857. {
  858. if (@browserDragFile is null)
  859. return;
  860. UIElement@ element = ui.GetElementAt(ui.cursor.screenPosition);
  861. if (element !is null)
  862. return;
  863. if (browserDragFile.resourceType == RESOURCE_TYPE_MATERIAL)
  864. {
  865. StaticModel@ model = cast<StaticModel>(GetDrawableAtMousePostion());
  866. if (model !is null)
  867. {
  868. AssignMaterial(model, browserDragFile.resourceKey);
  869. }
  870. }
  871. else if (browserDragFile.resourceType == RESOURCE_TYPE_PREFAB)
  872. {
  873. LoadNode(browserDragFile.GetFullPath(), null, true);
  874. }
  875. else if (browserDragFile.resourceType == RESOURCE_TYPE_MODEL)
  876. {
  877. Node@ createdNode = CreateNode(REPLICATED, true);
  878. Model@ model = cache.GetResource("Model", browserDragFile.resourceKey);
  879. if (model.skeleton.numBones > 0)
  880. {
  881. AnimatedModel@ am = createdNode.CreateComponent("AnimatedModel");
  882. am.model = model;
  883. }
  884. else
  885. {
  886. StaticModel@ sm = createdNode.CreateComponent("StaticModel");
  887. sm.model = model;
  888. }
  889. AdjustNodePositionByAABB(createdNode);
  890. }
  891. browserDragFile = null;
  892. browserDragComponent = null;
  893. browserDragNode = null;
  894. }
  895. void HandleFileChanged(StringHash eventType, VariantMap& eventData)
  896. {
  897. String filename = eventData["FileName"].GetString();
  898. BrowserFile@ file = GetBrowserFileFromPath(filename);
  899. if (file is null)
  900. {
  901. // TODO: new file logic when watchers are supported
  902. return;
  903. }
  904. else
  905. {
  906. file.FileChanged();
  907. }
  908. }
  909. Menu@ CreateBrowserFileActionMenu(String text, String handler, BrowserFile@ browserFile = null)
  910. {
  911. Menu@ menu = CreateContextMenuItem(text, handler);
  912. if (browserFile !is null)
  913. menu.vars[TEXT_VAR_FILE_ID] = browserFile.id;
  914. return menu;
  915. }
  916. int GetResourceType(String path)
  917. {
  918. StringHash fileType;
  919. return GetResourceType(path, fileType);
  920. }
  921. int GetResourceType(String path, StringHash &out fileType, bool useCache = false)
  922. {
  923. if (GetExtensionType(path, fileType) || GetBinaryType(path, fileType, useCache) || GetXmlType(path, fileType, useCache))
  924. return GetResourceType(fileType);
  925. return RESOURCE_TYPE_UNKNOWN;
  926. }
  927. int GetResourceType(StringHash fileType)
  928. {
  929. // binary fileTypes
  930. if (fileType == BINARY_TYPE_SCENE)
  931. return RESOURCE_TYPE_SCENE;
  932. else if (fileType == BINARY_TYPE_PACKAGE)
  933. return RESOURCE_TYPE_UNUSABLE;
  934. else if (fileType == BINARY_TYPE_COMPRESSED_PACKAGE)
  935. return RESOURCE_TYPE_UNUSABLE;
  936. else if (fileType == BINARY_TYPE_ANGLESCRIPT)
  937. return RESOURCE_TYPE_SCRIPTFILE;
  938. else if (fileType == BINARY_TYPE_MODEL || fileType == BINARY_TYPE_MODEL2)
  939. return RESOURCE_TYPE_MODEL;
  940. else if (fileType == BINARY_TYPE_SHADER)
  941. return RESOURCE_TYPE_UNUSABLE;
  942. else if (fileType == BINARY_TYPE_ANIMATION)
  943. return RESOURCE_TYPE_ANIMATION;
  944. // xml fileTypes
  945. else if (fileType == XML_TYPE_SCENE)
  946. return RESOURCE_TYPE_SCENE;
  947. else if (fileType == XML_TYPE_NODE)
  948. return RESOURCE_TYPE_PREFAB;
  949. else if(fileType == XML_TYPE_MATERIAL)
  950. return RESOURCE_TYPE_MATERIAL;
  951. else if(fileType == XML_TYPE_TECHNIQUE)
  952. return RESOURCE_TYPE_TECHNIQUE;
  953. else if(fileType == XML_TYPE_PARTICLEEFFECT)
  954. return RESOURCE_TYPE_PARTICLEEFFECT;
  955. else if(fileType == XML_TYPE_PARTICLEEMITTER)
  956. return RESOURCE_TYPE_PARTICLEEMITTER;
  957. else if(fileType == XML_TYPE_TEXTURE)
  958. return RESOURCE_TYPE_TEXTURE;
  959. else if(fileType == XML_TYPE_ELEMENT)
  960. return RESOURCE_TYPE_UIELEMENT;
  961. else if(fileType == XML_TYPE_ELEMENTS)
  962. return RESOURCE_TYPE_UIELEMENTS;
  963. else if (fileType == XML_TYPE_ANIMATION_SETTINGS)
  964. return RESOURCE_TYPE_ANIMATION_SETTINGS;
  965. else if (fileType == XML_TYPE_RENDERPATH)
  966. return RESOURCE_TYPE_RENDERPATH;
  967. else if (fileType == XML_TYPE_TEXTURE_ATLAS)
  968. return RESOURCE_TYPE_TEXTURE_ATLAS;
  969. else if (fileType == XML_TYPE_2D_PARTICLE_EFFECT)
  970. return RESOURCE_TYPE_2D_PARTICLE_EFFECT;
  971. else if (fileType == XML_TYPE_TEXTURE_3D)
  972. return RESOURCE_TYPE_TEXTURE_3D;
  973. else if (fileType == XML_TYPE_CUBEMAP)
  974. return RESOURCE_TYPE_CUBEMAP;
  975. else if (fileType == XML_TYPE_SPRITER_DATA)
  976. return RESOURCE_TYPE_2D_ANIMATION_SET;
  977. // JSON fileTypes
  978. else if (fileType == JSON_TYPE_SCENE)
  979. return RESOURCE_TYPE_SCENE;
  980. else if (fileType == JSON_TYPE_NODE)
  981. return RESOURCE_TYPE_PREFAB;
  982. else if(fileType == JSON_TYPE_MATERIAL)
  983. return RESOURCE_TYPE_MATERIAL;
  984. else if(fileType == JSON_TYPE_TECHNIQUE)
  985. return RESOURCE_TYPE_TECHNIQUE;
  986. else if(fileType == JSON_TYPE_PARTICLEEFFECT)
  987. return RESOURCE_TYPE_PARTICLEEFFECT;
  988. else if(fileType == JSON_TYPE_PARTICLEEMITTER)
  989. return RESOURCE_TYPE_PARTICLEEMITTER;
  990. else if(fileType == JSON_TYPE_TEXTURE)
  991. return RESOURCE_TYPE_TEXTURE;
  992. else if(fileType == JSON_TYPE_ELEMENT)
  993. return RESOURCE_TYPE_UIELEMENT;
  994. else if(fileType == JSON_TYPE_ELEMENTS)
  995. return RESOURCE_TYPE_UIELEMENTS;
  996. else if (fileType == JSON_TYPE_ANIMATION_SETTINGS)
  997. return RESOURCE_TYPE_ANIMATION_SETTINGS;
  998. else if (fileType == JSON_TYPE_RENDERPATH)
  999. return RESOURCE_TYPE_RENDERPATH;
  1000. else if (fileType == JSON_TYPE_TEXTURE_ATLAS)
  1001. return RESOURCE_TYPE_TEXTURE_ATLAS;
  1002. else if (fileType == JSON_TYPE_2D_PARTICLE_EFFECT)
  1003. return RESOURCE_TYPE_2D_PARTICLE_EFFECT;
  1004. else if (fileType == JSON_TYPE_TEXTURE_3D)
  1005. return RESOURCE_TYPE_TEXTURE_3D;
  1006. else if (fileType == JSON_TYPE_CUBEMAP)
  1007. return RESOURCE_TYPE_CUBEMAP;
  1008. else if (fileType == JSON_TYPE_SPRITER_DATA)
  1009. return RESOURCE_TYPE_2D_ANIMATION_SET;
  1010. // extension fileTypes
  1011. else if (fileType == EXTENSION_TYPE_TTF)
  1012. return RESOURCE_TYPE_FONT;
  1013. else if (fileType == EXTENSION_TYPE_OTF)
  1014. return RESOURCE_TYPE_FONT;
  1015. else if (fileType == EXTENSION_TYPE_OGG)
  1016. return RESOURCE_TYPE_SOUND;
  1017. else if(fileType == EXTENSION_TYPE_WAV)
  1018. return RESOURCE_TYPE_SOUND;
  1019. else if(fileType == EXTENSION_TYPE_DDS)
  1020. return RESOURCE_TYPE_IMAGE;
  1021. else if(fileType == EXTENSION_TYPE_PNG)
  1022. return RESOURCE_TYPE_IMAGE;
  1023. else if(fileType == EXTENSION_TYPE_JPG)
  1024. return RESOURCE_TYPE_IMAGE;
  1025. else if(fileType == EXTENSION_TYPE_JPEG)
  1026. return RESOURCE_TYPE_IMAGE;
  1027. else if(fileType == EXTENSION_TYPE_HDR)
  1028. return RESOURCE_TYPE_IMAGE;
  1029. else if(fileType == EXTENSION_TYPE_BMP)
  1030. return RESOURCE_TYPE_IMAGE;
  1031. else if(fileType == EXTENSION_TYPE_TGA)
  1032. return RESOURCE_TYPE_IMAGE;
  1033. else if(fileType == EXTENSION_TYPE_KTX)
  1034. return RESOURCE_TYPE_IMAGE;
  1035. else if(fileType == EXTENSION_TYPE_PVR)
  1036. return RESOURCE_TYPE_IMAGE;
  1037. else if(fileType == EXTENSION_TYPE_OBJ)
  1038. return RESOURCE_TYPE_UNUSABLE;
  1039. else if(fileType == EXTENSION_TYPE_FBX)
  1040. return RESOURCE_TYPE_UNUSABLE;
  1041. else if(fileType == EXTENSION_TYPE_COLLADA)
  1042. return RESOURCE_TYPE_UNUSABLE;
  1043. else if(fileType == EXTENSION_TYPE_BLEND)
  1044. return RESOURCE_TYPE_UNUSABLE;
  1045. else if(fileType == EXTENSION_TYPE_ANGELSCRIPT)
  1046. return RESOURCE_TYPE_SCRIPTFILE;
  1047. else if(fileType == EXTENSION_TYPE_LUASCRIPT)
  1048. return RESOURCE_TYPE_SCRIPTFILE;
  1049. else if(fileType == EXTENSION_TYPE_HLSL)
  1050. return RESOURCE_TYPE_UNUSABLE;
  1051. else if(fileType == EXTENSION_TYPE_GLSL)
  1052. return RESOURCE_TYPE_UNUSABLE;
  1053. else if(fileType == EXTENSION_TYPE_FRAGMENTSHADER)
  1054. return RESOURCE_TYPE_UNUSABLE;
  1055. else if(fileType == EXTENSION_TYPE_VERTEXSHADER)
  1056. return RESOURCE_TYPE_UNUSABLE;
  1057. else if(fileType == EXTENSION_TYPE_HTML)
  1058. return RESOURCE_TYPE_UNUSABLE;
  1059. return RESOURCE_TYPE_UNKNOWN;
  1060. }
  1061. bool GetExtensionType(String path, StringHash &out fileType)
  1062. {
  1063. StringHash type = StringHash(GetExtension(path));
  1064. if (type == EXTENSION_TYPE_TTF)
  1065. fileType = EXTENSION_TYPE_TTF;
  1066. else if (type == EXTENSION_TYPE_OTF)
  1067. fileType = EXTENSION_TYPE_OTF;
  1068. else if (type == EXTENSION_TYPE_OGG)
  1069. fileType = EXTENSION_TYPE_OGG;
  1070. else if(type == EXTENSION_TYPE_WAV)
  1071. fileType = EXTENSION_TYPE_WAV;
  1072. else if(type == EXTENSION_TYPE_DDS)
  1073. fileType = EXTENSION_TYPE_DDS;
  1074. else if(type == EXTENSION_TYPE_PNG)
  1075. fileType = EXTENSION_TYPE_PNG;
  1076. else if(type == EXTENSION_TYPE_JPG)
  1077. fileType = EXTENSION_TYPE_JPG;
  1078. else if(type == EXTENSION_TYPE_JPEG)
  1079. fileType = EXTENSION_TYPE_JPEG;
  1080. else if(type == EXTENSION_TYPE_HDR)
  1081. fileType = EXTENSION_TYPE_HDR;
  1082. else if(type == EXTENSION_TYPE_BMP)
  1083. fileType = EXTENSION_TYPE_BMP;
  1084. else if(type == EXTENSION_TYPE_TGA)
  1085. fileType = EXTENSION_TYPE_TGA;
  1086. else if(type == EXTENSION_TYPE_KTX)
  1087. fileType = EXTENSION_TYPE_KTX;
  1088. else if(type == EXTENSION_TYPE_PVR)
  1089. fileType = EXTENSION_TYPE_PVR;
  1090. else if(type == EXTENSION_TYPE_OBJ)
  1091. fileType = EXTENSION_TYPE_OBJ;
  1092. else if(type == EXTENSION_TYPE_FBX)
  1093. fileType = EXTENSION_TYPE_FBX;
  1094. else if(type == EXTENSION_TYPE_COLLADA)
  1095. fileType = EXTENSION_TYPE_COLLADA;
  1096. else if(type == EXTENSION_TYPE_BLEND)
  1097. fileType = EXTENSION_TYPE_BLEND;
  1098. else if(type == EXTENSION_TYPE_ANGELSCRIPT)
  1099. fileType = EXTENSION_TYPE_ANGELSCRIPT;
  1100. else if(type == EXTENSION_TYPE_LUASCRIPT)
  1101. fileType = EXTENSION_TYPE_LUASCRIPT;
  1102. else if(type == EXTENSION_TYPE_HLSL)
  1103. fileType = EXTENSION_TYPE_HLSL;
  1104. else if(type == EXTENSION_TYPE_GLSL)
  1105. fileType = EXTENSION_TYPE_GLSL;
  1106. else if(type == EXTENSION_TYPE_FRAGMENTSHADER)
  1107. fileType = EXTENSION_TYPE_FRAGMENTSHADER;
  1108. else if(type == EXTENSION_TYPE_VERTEXSHADER)
  1109. fileType = EXTENSION_TYPE_VERTEXSHADER;
  1110. else if(type == EXTENSION_TYPE_HTML)
  1111. fileType = EXTENSION_TYPE_HTML;
  1112. else
  1113. return false;
  1114. return true;
  1115. }
  1116. bool GetBinaryType(String path, StringHash &out fileType, bool useCache = false)
  1117. {
  1118. StringHash type;
  1119. if (useCache)
  1120. {
  1121. File@ file = cache.GetFile(path);
  1122. if (file is null)
  1123. return false;
  1124. if (file.size == 0)
  1125. return false;
  1126. type = StringHash(file.ReadFileID());
  1127. }
  1128. else
  1129. {
  1130. File@ file = File();
  1131. if (!file.Open(path))
  1132. return false;
  1133. if (file.size == 0)
  1134. return false;
  1135. type = StringHash(file.ReadFileID());
  1136. }
  1137. if (type == BINARY_TYPE_SCENE)
  1138. fileType = BINARY_TYPE_SCENE;
  1139. else if (type == BINARY_TYPE_PACKAGE)
  1140. fileType = BINARY_TYPE_PACKAGE;
  1141. else if (type == BINARY_TYPE_COMPRESSED_PACKAGE)
  1142. fileType = BINARY_TYPE_COMPRESSED_PACKAGE;
  1143. else if (type == BINARY_TYPE_ANGLESCRIPT)
  1144. fileType = BINARY_TYPE_ANGLESCRIPT;
  1145. else if (type == BINARY_TYPE_MODEL || type == BINARY_TYPE_MODEL2)
  1146. fileType = BINARY_TYPE_MODEL;
  1147. else if (type == BINARY_TYPE_SHADER)
  1148. fileType = BINARY_TYPE_SHADER;
  1149. else if (type == BINARY_TYPE_ANIMATION)
  1150. fileType = BINARY_TYPE_ANIMATION;
  1151. else
  1152. return false;
  1153. return true;
  1154. }
  1155. bool GetXmlType(String path, StringHash &out fileType, bool useCache = false)
  1156. {
  1157. String extension = GetExtension(path);
  1158. if (extension == ".txt" || extension == ".json" || extension == ".icns" || extension == ".atlas")
  1159. return false;
  1160. String name;
  1161. if (useCache)
  1162. {
  1163. XMLFile@ xml = cache.GetResource("XMLFile", path);
  1164. if (xml is null)
  1165. return false;
  1166. name = xml.root.name;
  1167. }
  1168. else
  1169. {
  1170. File@ file = File();
  1171. if (!file.Open(path))
  1172. return false;
  1173. if (file.size == 0)
  1174. return false;
  1175. XMLFile@ xml = XMLFile();
  1176. if (xml.Load(file))
  1177. name = xml.root.name;
  1178. else
  1179. return false;
  1180. }
  1181. bool found = false;
  1182. if (!name.empty)
  1183. {
  1184. found = true;
  1185. StringHash type = StringHash(name);
  1186. if (type == XML_TYPE_SCENE)
  1187. fileType = XML_TYPE_SCENE;
  1188. else if (type == XML_TYPE_NODE)
  1189. fileType = XML_TYPE_NODE;
  1190. else if(type == XML_TYPE_MATERIAL)
  1191. fileType = XML_TYPE_MATERIAL;
  1192. else if(type == XML_TYPE_TECHNIQUE)
  1193. fileType = XML_TYPE_TECHNIQUE;
  1194. else if(type == XML_TYPE_PARTICLEEFFECT)
  1195. fileType = XML_TYPE_PARTICLEEFFECT;
  1196. else if(type == XML_TYPE_PARTICLEEMITTER)
  1197. fileType = XML_TYPE_PARTICLEEMITTER;
  1198. else if(type == XML_TYPE_TEXTURE)
  1199. fileType = XML_TYPE_TEXTURE;
  1200. else if(type == XML_TYPE_ELEMENT)
  1201. fileType = XML_TYPE_ELEMENT;
  1202. else if(type == XML_TYPE_ELEMENTS)
  1203. fileType = XML_TYPE_ELEMENTS;
  1204. else if (type == XML_TYPE_ANIMATION_SETTINGS)
  1205. fileType = XML_TYPE_ANIMATION_SETTINGS;
  1206. else if (type == XML_TYPE_RENDERPATH)
  1207. fileType = XML_TYPE_RENDERPATH;
  1208. else if (type == XML_TYPE_TEXTURE_ATLAS)
  1209. fileType = XML_TYPE_TEXTURE_ATLAS;
  1210. else if (type == XML_TYPE_2D_PARTICLE_EFFECT)
  1211. fileType = XML_TYPE_2D_PARTICLE_EFFECT;
  1212. else if (type == XML_TYPE_TEXTURE_3D)
  1213. fileType = XML_TYPE_TEXTURE_3D;
  1214. else if (type == XML_TYPE_CUBEMAP)
  1215. fileType = XML_TYPE_CUBEMAP;
  1216. else if (type == XML_TYPE_SPRITER_DATA)
  1217. fileType = XML_TYPE_SPRITER_DATA;
  1218. else
  1219. found = false;
  1220. }
  1221. return found;
  1222. }
  1223. String ResourceTypeName(int resourceType)
  1224. {
  1225. if (resourceType == RESOURCE_TYPE_UNUSABLE)
  1226. return "Unusable";
  1227. else if (resourceType == RESOURCE_TYPE_UNKNOWN)
  1228. return "Unknown";
  1229. else if (resourceType == RESOURCE_TYPE_NOTSET)
  1230. return "Uninitialized";
  1231. else if (resourceType == RESOURCE_TYPE_SCENE)
  1232. return "Scene";
  1233. else if (resourceType == RESOURCE_TYPE_SCRIPTFILE)
  1234. return "Script File";
  1235. else if (resourceType == RESOURCE_TYPE_MODEL)
  1236. return "Model";
  1237. else if (resourceType == RESOURCE_TYPE_MATERIAL)
  1238. return "Material";
  1239. else if (resourceType == RESOURCE_TYPE_ANIMATION)
  1240. return "Animation";
  1241. else if (resourceType == RESOURCE_TYPE_IMAGE)
  1242. return "Image";
  1243. else if (resourceType == RESOURCE_TYPE_SOUND)
  1244. return "Sound";
  1245. else if (resourceType == RESOURCE_TYPE_TEXTURE)
  1246. return "Texture";
  1247. else if (resourceType == RESOURCE_TYPE_FONT)
  1248. return "Font";
  1249. else if (resourceType == RESOURCE_TYPE_PREFAB)
  1250. return "Prefab";
  1251. else if (resourceType == RESOURCE_TYPE_TECHNIQUE)
  1252. return "Render Technique";
  1253. else if (resourceType == RESOURCE_TYPE_PARTICLEEFFECT)
  1254. return "Particle Effect";
  1255. else if (resourceType == RESOURCE_TYPE_PARTICLEEMITTER)
  1256. return "Particle Emitter";
  1257. else if (resourceType == RESOURCE_TYPE_UIELEMENT)
  1258. return "UI Element";
  1259. else if (resourceType == RESOURCE_TYPE_UIELEMENTS)
  1260. return "UI Elements";
  1261. else if (resourceType == RESOURCE_TYPE_ANIMATION_SETTINGS)
  1262. return "Animation Settings";
  1263. else if (resourceType == RESOURCE_TYPE_RENDERPATH)
  1264. return "Render Path";
  1265. else if (resourceType == RESOURCE_TYPE_TEXTURE_ATLAS)
  1266. return "Texture Atlas";
  1267. else if (resourceType == RESOURCE_TYPE_2D_PARTICLE_EFFECT)
  1268. return "2D Particle Effect";
  1269. else if (resourceType == RESOURCE_TYPE_TEXTURE_3D)
  1270. return "Texture 3D";
  1271. else if (resourceType == RESOURCE_TYPE_CUBEMAP)
  1272. return "Cubemap";
  1273. else if (resourceType == RESOURCE_TYPE_2D_ANIMATION_SET)
  1274. return "2D Animation Set";
  1275. else
  1276. return "";
  1277. }
  1278. class BrowserDir
  1279. {
  1280. uint id;
  1281. String resourceKey;
  1282. String name;
  1283. Array<BrowserDir@> children;
  1284. Array<BrowserFile@> files;
  1285. BrowserDir(String path_)
  1286. {
  1287. resourceKey = path_;
  1288. String parent = GetParentPath(path_);
  1289. name = path_;
  1290. name.Replace(parent, "");
  1291. id = browserDirIndex++;
  1292. }
  1293. int opCmp(BrowserDir@ b)
  1294. {
  1295. return name.opCmp(b.name);
  1296. }
  1297. BrowserFile@ AddFile(String name, uint resourceSourceIndex, uint sourceType)
  1298. {
  1299. String path = resourceKey + "/" + name;
  1300. BrowserFile@ file = BrowserFile(path, resourceSourceIndex, sourceType);
  1301. files.Push(file);
  1302. return file;
  1303. }
  1304. }
  1305. class BrowserFile
  1306. {
  1307. uint id;
  1308. uint resourceSourceIndex;
  1309. String resourceKey;
  1310. String name;
  1311. String fullname;
  1312. String extension;
  1313. StringHash fileType;
  1314. int resourceType = 0;
  1315. int sourceType = 0;
  1316. int sortScore = 0;
  1317. WeakHandle browserFileListRow;
  1318. BrowserFile(String path_, uint resourceSourceIndex_, int sourceType_)
  1319. {
  1320. sourceType = sourceType_;
  1321. resourceSourceIndex = resourceSourceIndex_;
  1322. resourceKey = path_;
  1323. name = GetFileName(path_);
  1324. extension = GetExtension(path_);
  1325. fullname = GetFileNameAndExtension(path_);
  1326. id = browserFileIndex++;
  1327. }
  1328. int opCmp(BrowserFile@ b)
  1329. {
  1330. if (browserSearchSortMode == 1)
  1331. return fullname.opCmp(b.fullname);
  1332. else
  1333. return sortScore - b.sortScore;
  1334. }
  1335. String GetResourceSource()
  1336. {
  1337. if (sourceType == BROWSER_FILE_SOURCE_RESOURCE_DIR)
  1338. return cache.resourceDirs[resourceSourceIndex];
  1339. else
  1340. return "Unknown";
  1341. }
  1342. String GetFullPath()
  1343. {
  1344. return String(cache.resourceDirs[resourceSourceIndex] + resourceKey);
  1345. }
  1346. String GetPath()
  1347. {
  1348. return resourceKey;
  1349. }
  1350. void DetermainResourceType()
  1351. {
  1352. resourceType = GetResourceType(GetFullPath(), fileType, false);
  1353. Text@ browserFileListRow_ = browserFileListRow.Get();
  1354. if (browserFileListRow_ !is null)
  1355. {
  1356. InitializeBrowserFileListRow(browserFileListRow_, this);
  1357. }
  1358. }
  1359. String ResourceTypeName()
  1360. {
  1361. return ::ResourceTypeName(resourceType);
  1362. }
  1363. void FileChanged()
  1364. {
  1365. if (!fileSystem.FileExists(GetFullPath()))
  1366. {
  1367. }
  1368. else
  1369. {
  1370. }
  1371. }
  1372. }
  1373. void CreateResourcePreview(String path, Node@ previewNode)
  1374. {
  1375. resourceBrowserPreview.autoUpdate = false;
  1376. int resourceType = GetResourceType(path);
  1377. if (resourceType > 0)
  1378. {
  1379. File file;
  1380. file.Open(path);
  1381. if (resourceType == RESOURCE_TYPE_MODEL)
  1382. {
  1383. Model@ model = Model();
  1384. if (model.Load(file))
  1385. {
  1386. StaticModel@ staticModel = previewNode.CreateComponent("StaticModel");
  1387. staticModel.model = model;
  1388. return;
  1389. }
  1390. }
  1391. else if (resourceType == RESOURCE_TYPE_MATERIAL)
  1392. {
  1393. Material@ material = Material();
  1394. if (material.Load(file))
  1395. {
  1396. StaticModel@ staticModel = previewNode.CreateComponent("StaticModel");
  1397. staticModel.model = cache.GetResource("Model", "Models/Sphere.mdl");
  1398. staticModel.material = material;
  1399. return;
  1400. }
  1401. }
  1402. else if (resourceType == RESOURCE_TYPE_IMAGE)
  1403. {
  1404. Image@ image = Image();
  1405. if (image.Load(file))
  1406. {
  1407. StaticModel@ staticModel = previewNode.CreateComponent("StaticModel");
  1408. staticModel.model = cache.GetResource("Model", "Models/Editor/ImagePlane.mdl");
  1409. Material@ material = cache.GetResource("Material", "Materials/Editor/TexturedUnlit.xml");
  1410. Texture2D@ texture = Texture2D();
  1411. texture.SetData(@image, true);
  1412. material.textures[0] = texture;
  1413. staticModel.material = material;
  1414. return;
  1415. }
  1416. }
  1417. else if (resourceType == RESOURCE_TYPE_PREFAB)
  1418. {
  1419. if (GetExtension(path) == ".xml")
  1420. {
  1421. XMLFile xmlFile;
  1422. if(xmlFile.Load(file))
  1423. if(previewNode.LoadXML(xmlFile.root, true) && (previewNode.GetComponents("StaticModel", true).length > 0 || previewNode.GetComponents("AnimatedModel", true).length > 0))
  1424. {
  1425. return;
  1426. }
  1427. }
  1428. else if(previewNode.Load(file, true) && (previewNode.GetComponents("StaticModel", true).length > 0 || previewNode.GetComponents("AnimatedModel", true).length > 0))
  1429. return;
  1430. previewNode.RemoveAllChildren();
  1431. previewNode.RemoveAllComponents();
  1432. }
  1433. else if (resourceType == RESOURCE_TYPE_PARTICLEEFFECT)
  1434. {
  1435. ParticleEffect@ particleEffect = ParticleEffect();
  1436. if (particleEffect.Load(file))
  1437. {
  1438. ParticleEmitter@ particleEmitter = previewNode.CreateComponent("ParticleEmitter");
  1439. particleEmitter.effect = particleEffect;
  1440. particleEffect.activeTime = 0.0;
  1441. particleEmitter.Reset();
  1442. resourceBrowserPreview.autoUpdate = true;
  1443. return;
  1444. }
  1445. }
  1446. }
  1447. StaticModel@ staticModel = previewNode.CreateComponent("StaticModel");
  1448. staticModel.model = cache.GetResource("Model", "Models/Editor/ImagePlane.mdl");
  1449. Material@ material = cache.GetResource("Material", "Materials/Editor/TexturedUnlit.xml");
  1450. Texture2D@ texture = Texture2D();
  1451. Image@ noPreviewImage = cache.GetResource("Image", "Textures/Editor/NoPreviewAvailable.png");
  1452. texture.SetData(noPreviewImage, false);
  1453. material.textures[0] = texture;
  1454. staticModel.material = material;
  1455. return;
  1456. }
  1457. void RotateResourceBrowserPreview(StringHash eventType, VariantMap& eventData)
  1458. {
  1459. int elemX = eventData["ElementX"].GetInt();
  1460. int elemY = eventData["ElementY"].GetInt();
  1461. if (resourceBrowserPreview.height > 0 && resourceBrowserPreview.width > 0)
  1462. {
  1463. float yaw = ((resourceBrowserPreview.height / 2) - elemY) * (90.0 / resourceBrowserPreview.height);
  1464. float pitch = ((resourceBrowserPreview.width / 2) - elemX) * (90.0 / resourceBrowserPreview.width);
  1465. resourcePreviewNode.rotation = resourcePreviewNode.rotation.Slerp(Quaternion(yaw, pitch, 0), 0.1);
  1466. RefreshBrowserPreview();
  1467. }
  1468. }
  1469. void RefreshBrowserPreview()
  1470. {
  1471. resourceBrowserPreview.QueueUpdate();
  1472. }
  1473. class ResourceType
  1474. {
  1475. int id;
  1476. String name;
  1477. ResourceType(int id_, String name_)
  1478. {
  1479. id = id_;
  1480. name = name_;
  1481. }
  1482. int opCmp(ResourceType@ b)
  1483. {
  1484. return name.opCmp(b.name);
  1485. }
  1486. }