EditorResourceBrowser.as 57 KB

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