EditorResourceBrowser.as 56 KB

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