BsBuiltinEditorResources.cpp 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Utility/BsBuiltinEditorResources.h"
  4. #include "Resources/BsBuiltinResources.h"
  5. #include "GUI/BsGUIElementStyle.h"
  6. #include "GUI/BsGUILabel.h"
  7. #include "GUI/BsGUITexture.h"
  8. #include "GUI/BsGUIButton.h"
  9. #include "GUI/BsGUIInputBox.h"
  10. #include "GUI/BsGUIToggle.h"
  11. #include "GUI/BsGUIColor.h"
  12. #include "2D/BsTextSprite.h"
  13. #include "2D/BsSpriteTexture.h"
  14. #include "GUI/BsGUITreeViewEditBox.h"
  15. #include "GUI/BsGUIIntField.h"
  16. #include "GUI/BsGUIFloatField.h"
  17. #include "GUI/BsGUIColorField.h"
  18. #include "GUI/BsGUITextField.h"
  19. #include "GUI/BsGUIToggleField.h"
  20. #include "GUI/BsGUIVector2Field.h"
  21. #include "GUI/BsGUIVector3Field.h"
  22. #include "GUI/BsGUIVector4Field.h"
  23. #include "GUI/BsGUIListBoxField.h"
  24. #include "GUI/BsGUISliderField.h"
  25. #include "GUI/BsGUIProgressBar.h"
  26. #include "GUI/BsGUISlider.h"
  27. #include "GUI/BsGUIDropDownContent.h"
  28. #include "GUI/BsGUIStatusBar.h"
  29. #include "GUI/BsGUIMenuBar.h"
  30. #include "GUI/BsGUIListBox.h"
  31. #include "GUI/BsGUIScrollBar.h"
  32. #include "CoreThread/BsCoreThread.h"
  33. #include "Text/BsFont.h"
  34. #include "Image/BsTexture.h"
  35. #include "Material/BsShader.h"
  36. #include "Material/BsMaterial.h"
  37. #include "Resources/BsResources.h"
  38. #include "FileSystem/BsFileSystem.h"
  39. #include "Resources/BsResourceManifest.h"
  40. #include "FileSystem/BsDataStream.h"
  41. #include "GUI/BsGUITooltip.h"
  42. #include "Resources/BsBuiltinResourcesHelper.h"
  43. #include "Importer/BsImporter.h"
  44. #include "Importer/BsTextureImportOptions.h"
  45. #include "Serialization/BsFileSerializer.h"
  46. #include "BsEditorApplication.h"
  47. using json = nlohmann::json;
  48. namespace bs
  49. {
  50. const String BuiltinEditorResources::ObjectFieldStyleName = "GUIObjectField";
  51. const String BuiltinEditorResources::ObjectFieldLabelStyleName = "EditorFieldLabel";
  52. const String BuiltinEditorResources::ObjectFieldDropBtnStyleName = "DropButton";
  53. const String BuiltinEditorResources::ObjectFieldClearBtnStyleName = "ObjectClearButton";
  54. const String BuiltinEditorResources::TextureFieldStyleName = "GUITextureField";
  55. const String BuiltinEditorResources::TextureFieldLabelStyleName = "TextureFieldLabel";
  56. const String BuiltinEditorResources::TextureFieldDropStyleName = "TextureDrop";
  57. const String BuiltinEditorResources::TextureFieldClearBtnStyleName = "TextureClearButton";
  58. const String BuiltinEditorResources::DefaultFontFilename = "arial.ttf";
  59. const String BuiltinEditorResources::DefaultAAFontFilename = "arialAA.ttf";
  60. const UINT32 BuiltinEditorResources::DefaultFontSize = 8;
  61. const UINT32 BuiltinEditorResources::TitleFontSize = 16;
  62. const Color BuiltinEditorResources::TextNormalColor = Color(0.7f, 0.7f, 0.7f);
  63. const Color BuiltinEditorResources::TextActiveColor = Color(0.0f, 0.0f, 0.0f);
  64. const String BuiltinEditorResources::GUISkinFile = "GUISkin";
  65. const char* BuiltinEditorResources::ShaderFolder = "Shaders/";
  66. const char* BuiltinEditorResources::SkinFolder = "Skin/";
  67. const char* BuiltinEditorResources::IconFolder = "Icons/";
  68. const char* BuiltinEditorResources::ShaderIncludeFolder = "Shaders/Includes/";
  69. const char* BuiltinEditorResources::SpriteSubFolder = "Sprites/";
  70. const String BuiltinEditorResources::FolderIconTex = u8"FolderIcon.psd";
  71. const String BuiltinEditorResources::MeshIconTex = u8"MeshIcon.psd";
  72. const String BuiltinEditorResources::TextureIconTex = u8"TextureIcon.psd";
  73. const String BuiltinEditorResources::FontIconTex = u8"FontIcon.psd";
  74. const String BuiltinEditorResources::PlainTextIconTex = u8"TextIcon.psd";
  75. const String BuiltinEditorResources::ScriptCodeIconTex = u8"CSharpIcon.psd";
  76. const String BuiltinEditorResources::ShaderIconTex = u8"ShaderIcon.psd";
  77. const String BuiltinEditorResources::ShaderIncludeIconTex = u8"ShaderIncludeIcon.psd";
  78. const String BuiltinEditorResources::MaterialIconTex = u8"MaterialIcon.psd";
  79. const String BuiltinEditorResources::SpriteTextureIconTex = u8"SpriteIcon.psd";
  80. const String BuiltinEditorResources::PrefabIconTex = u8"PrefabIcon.psd";
  81. const String BuiltinEditorResources::GUISkinIconTex = u8"GUISkinIcon.psd";
  82. const String BuiltinEditorResources::PhysicsMaterialIconTex = u8"PhysicsMaterialIcon.psd";
  83. const String BuiltinEditorResources::PhysicsMeshIconTex = u8"PhysicsMeshIcon.psd";
  84. const String BuiltinEditorResources::AudioClipIconTex = u8"AudioClipIcon.psd";
  85. const String BuiltinEditorResources::AnimationClipIconTex = u8"AnimationClipIcon.psd";
  86. const char* BuiltinEditorResources::SplashScreenName = u8"SplashScreen.png";
  87. const String BuiltinEditorResources::XButtonNormalTex = u8"XBtnNormal.png";
  88. /************************************************************************/
  89. /* SHADERS */
  90. /************************************************************************/
  91. const String BuiltinEditorResources::ShaderDockOverlayFile = u8"DockDropOverlay.bsl";
  92. const String BuiltinEditorResources::ShaderSceneGridFile = u8"SceneGrid.bsl";
  93. const String BuiltinEditorResources::ShaderPickingCullNoneFile = u8"PickingCullNone.bsl";
  94. const String BuiltinEditorResources::ShaderPickingCullCWFile = u8"PickingCullCW.bsl";
  95. const String BuiltinEditorResources::ShaderPickingCullCCWFile = u8"PickingCullCCW.bsl";
  96. const String BuiltinEditorResources::ShaderPickingAlphaCullNoneFile = u8"PickingAlphaCullNone.bsl";
  97. const String BuiltinEditorResources::ShaderPickingAlphaCullCWFile = u8"PickingAlphaCullCW.bsl";
  98. const String BuiltinEditorResources::ShaderPickingAlphaCullCCWFile = u8"PickingAlphaCullCCW.bsl";
  99. const String BuiltinEditorResources::ShaderLineGizmoFile = u8"LineGizmo.bsl";
  100. const String BuiltinEditorResources::ShaderWireGizmoFile = u8"WireGizmo.bsl";
  101. const String BuiltinEditorResources::ShaderSolidGizmoFile = u8"SolidGizmo.bsl";
  102. const String BuiltinEditorResources::ShaderLineHandleFile = u8"LineHandle.bsl";
  103. const String BuiltinEditorResources::ShaderSolidHandleFile = u8"SolidHandle.bsl";
  104. const String BuiltinEditorResources::ShaderHandleClearAlphaFile = u8"ClearHandleAlpha.bsl";
  105. const String BuiltinEditorResources::ShaderIconGizmoFile = u8"IconGizmo.bsl";
  106. const String BuiltinEditorResources::ShaderGizmoPickingFile = u8"GizmoPicking.bsl";
  107. const String BuiltinEditorResources::ShaderGizmoPickingAlphaFile = u8"GizmoPickingAlpha.bsl";
  108. const String BuiltinEditorResources::ShaderTextGizmoFile = u8"TextGizmo.bsl";
  109. const String BuiltinEditorResources::ShaderSelectionFile = u8"Selection.bsl";
  110. /************************************************************************/
  111. /* OTHER */
  112. /************************************************************************/
  113. const String BuiltinEditorResources::EmptyShaderCodeFile = u8"EmptyShaderText.txt";
  114. const String BuiltinEditorResources::EmptyCSScriptCodeFile = u8"EmptyCSScriptText.txt";
  115. BuiltinEditorResources::BuiltinEditorResources()
  116. {
  117. // Set up paths
  118. BuiltinRawDataFolder = gEditorApplication().getDataPath() + "Raw/";
  119. EditorRawSkinFolder = BuiltinRawDataFolder + SkinFolder;
  120. EditorRawIconsFolder = BuiltinRawDataFolder + IconFolder;
  121. EditorRawShaderFolder = BuiltinRawDataFolder + ShaderFolder;
  122. EditorRawShaderIncludeFolder = BuiltinRawDataFolder + ShaderIncludeFolder;
  123. BuiltinDataFolder = gEditorApplication().getDataPath();
  124. EditorSkinFolder = BuiltinDataFolder + SkinFolder;
  125. EditorSkinSpritesFolder = EditorSkinFolder + SpriteSubFolder;
  126. EditorIconFolder = BuiltinDataFolder + IconFolder;
  127. EditorIconSpritesFolder = EditorIconFolder + SpriteSubFolder;
  128. EditorShaderFolder = BuiltinDataFolder + ShaderFolder;
  129. EditorShaderIncludeFolder = BuiltinDataFolder + ShaderIncludeFolder;
  130. ResourceManifestPath = BuiltinDataFolder + "ResourceManifest.asset";
  131. // Update from raw assets if needed
  132. if (FileSystem::exists(BuiltinRawDataFolder))
  133. {
  134. time_t lastUpdateTime;
  135. UINT32 modifications = BuiltinResourcesHelper::checkForModifications(BuiltinRawDataFolder,
  136. BuiltinDataFolder + "Timestamp.asset", lastUpdateTime);
  137. // Check if manifest needs to be rebuilt
  138. if (modifications == 0 && !FileSystem::exists(ResourceManifestPath))
  139. modifications = 1;
  140. if (modifications > 0)
  141. {
  142. bool forceReimport = modifications == 2;
  143. SPtr<ResourceManifest> oldResourceManifest;
  144. if (!forceReimport && FileSystem::exists(ResourceManifestPath))
  145. {
  146. oldResourceManifest = ResourceManifest::load(ResourceManifestPath, BuiltinDataFolder);
  147. if (oldResourceManifest != nullptr)
  148. gResources().registerResourceManifest(oldResourceManifest);
  149. }
  150. if (oldResourceManifest)
  151. mResourceManifest = oldResourceManifest;
  152. else
  153. {
  154. mResourceManifest = ResourceManifest::create("BuiltinResources");
  155. gResources().registerResourceManifest(mResourceManifest);
  156. }
  157. preprocess(modifications == 2, lastUpdateTime);
  158. BuiltinResourcesHelper::writeTimestamp(BuiltinDataFolder + "Timestamp.asset");
  159. ResourceManifest::save(mResourceManifest, ResourceManifestPath, BuiltinDataFolder);
  160. }
  161. }
  162. // Load manifest
  163. if (mResourceManifest == nullptr)
  164. {
  165. if (FileSystem::exists(ResourceManifestPath))
  166. mResourceManifest = ResourceManifest::load(ResourceManifestPath, BuiltinDataFolder);
  167. if (mResourceManifest == nullptr)
  168. mResourceManifest = ResourceManifest::create("BuiltinResources");
  169. gResources().registerResourceManifest(mResourceManifest);
  170. }
  171. // Load basic resources
  172. mShaderDockOverlay = getShader(ShaderDockOverlayFile);
  173. mShaderSceneGrid = getShader(ShaderSceneGridFile);
  174. mShaderPicking[(int)CULL_NONE] = getShader(ShaderPickingCullNoneFile);
  175. mShaderPicking[(int)CULL_CLOCKWISE] = getShader(ShaderPickingCullCWFile);
  176. mShaderPicking[(int)CULL_COUNTERCLOCKWISE] = getShader(ShaderPickingCullCCWFile);
  177. mShaderPickingAlpha[(int)CULL_NONE] = getShader(ShaderPickingAlphaCullNoneFile);
  178. mShaderPickingAlpha[(int)CULL_CLOCKWISE] = getShader(ShaderPickingAlphaCullCWFile);
  179. mShaderPickingAlpha[(int)CULL_COUNTERCLOCKWISE] = getShader(ShaderPickingAlphaCullCCWFile);
  180. mShaderGizmoSolid = getShader(ShaderSolidGizmoFile);
  181. mShaderGizmoLine = getShader(ShaderLineGizmoFile);
  182. mShaderGizmoWire = getShader(ShaderWireGizmoFile);
  183. mShaderGizmoIcon = getShader(ShaderIconGizmoFile);
  184. mShaderGizmoPicking = getShader(ShaderGizmoPickingFile);
  185. mShaderGizmoAlphaPicking = getShader(ShaderGizmoPickingAlphaFile);
  186. mShaderGizmoText = getShader(ShaderTextGizmoFile);
  187. mShaderHandleSolid = getShader(ShaderSolidHandleFile);
  188. mShaderHandleClearAlpha = getShader(ShaderHandleClearAlphaFile);
  189. mShaderHandleLine = getShader(ShaderLineHandleFile);
  190. mShaderSelection = getShader(ShaderSelectionFile);
  191. mDefaultFont = gResources().load<Font>(BuiltinDataFolder + (DefaultFontFilename + ".asset"));
  192. mDefaultAAFont = gResources().load<Font>(BuiltinDataFolder + (DefaultAAFontFilename + ".asset"));
  193. mSkin = gResources().load<GUISkin>(BuiltinDataFolder + (GUISkinFile + ".asset"));
  194. }
  195. void BuiltinEditorResources::preprocess(bool forceImport, time_t lastUpdateTime)
  196. {
  197. Resources::instance().unloadAllUnused();
  198. Path dataListsFilePath = BuiltinRawDataFolder + DATA_LIST_JSON;
  199. SPtr<DataStream> dataListStream = FileSystem::openFile(dataListsFilePath);
  200. json dataListJSON = json::parse(dataListStream->getAsString().c_str());
  201. json skinJSON = dataListJSON["Skin"];
  202. json iconsJSON = dataListJSON["Icons"];
  203. json includesJSON = dataListJSON["Includes"];
  204. json shadersJSON = dataListJSON["Shaders"];
  205. // Update DataList.json if needed
  206. bool updatedDataLists = false;
  207. updatedDataLists |= BuiltinResourcesHelper::updateJSON(
  208. EditorRawIconsFolder,
  209. BuiltinResourcesHelper::AssetType::Sprite,
  210. iconsJSON);
  211. updatedDataLists |= BuiltinResourcesHelper::updateJSON(
  212. EditorRawShaderIncludeFolder,
  213. BuiltinResourcesHelper::AssetType::Normal,
  214. includesJSON);
  215. updatedDataLists |= BuiltinResourcesHelper::updateJSON(
  216. EditorRawShaderFolder,
  217. BuiltinResourcesHelper::AssetType::Normal,
  218. shadersJSON);
  219. updatedDataLists |= BuiltinResourcesHelper::updateJSON(
  220. EditorRawSkinFolder,
  221. BuiltinResourcesHelper::AssetType::Sprite,
  222. skinJSON);
  223. dataListStream->close();
  224. if (updatedDataLists)
  225. {
  226. FileSystem::remove(dataListsFilePath);
  227. dataListJSON["Skin"] = skinJSON;
  228. dataListJSON["Icons"] = iconsJSON;
  229. dataListJSON["Includes"] = includesJSON;
  230. dataListJSON["Shaders"] = shadersJSON;
  231. String jsonString = dataListJSON.dump(4).c_str();
  232. dataListStream = FileSystem::createAndOpenFile(dataListsFilePath);
  233. dataListStream->writeString(jsonString);
  234. dataListStream->close();
  235. }
  236. // If forcing import, clear all data folders since everything will be recreated anyway
  237. Path shaderDependenciesFile = BuiltinDataFolder + "ShaderDependencies.json";
  238. if(forceImport)
  239. {
  240. FileSystem::remove(EditorIconFolder);
  241. FileSystem::remove(EditorShaderIncludeFolder);
  242. FileSystem::remove(EditorShaderFolder);
  243. FileSystem::remove(EditorSkinFolder);
  244. FileSystem::remove(shaderDependenciesFile);
  245. }
  246. // Read shader dependencies JSON
  247. json shaderDependenciesJSON;
  248. if(FileSystem::exists(shaderDependenciesFile))
  249. {
  250. SPtr<DataStream> stream = FileSystem::openFile(shaderDependenciesFile);
  251. shaderDependenciesJSON = json::parse(stream->getAsString().c_str());
  252. stream->close();
  253. }
  254. // Import icons
  255. {
  256. BuiltinResourcesHelper::updateManifest(
  257. EditorIconFolder,
  258. iconsJSON,
  259. mResourceManifest,
  260. BuiltinResourcesHelper::AssetType::Sprite);
  261. Vector<bool> importFlags = BuiltinResourcesHelper::generateImportFlags(
  262. iconsJSON,
  263. EditorRawIconsFolder,
  264. lastUpdateTime,
  265. forceImport);
  266. BuiltinResourcesHelper::importAssets(
  267. iconsJSON,
  268. importFlags,
  269. EditorRawIconsFolder,
  270. EditorIconFolder,
  271. mResourceManifest,
  272. BuiltinResourcesHelper::AssetType::Sprite);
  273. }
  274. // Import shaders
  275. {
  276. BuiltinResourcesHelper::updateManifest(
  277. EditorShaderIncludeFolder,
  278. includesJSON,
  279. mResourceManifest,
  280. BuiltinResourcesHelper::AssetType::Normal);
  281. BuiltinResourcesHelper::updateManifest(
  282. EditorShaderFolder,
  283. shadersJSON,
  284. mResourceManifest,
  285. BuiltinResourcesHelper::AssetType::Normal);
  286. Vector<bool> includeImportFlags = BuiltinResourcesHelper::generateImportFlags(
  287. includesJSON,
  288. EditorRawShaderIncludeFolder,
  289. lastUpdateTime,
  290. forceImport);
  291. Vector<bool> shaderImportFlags = BuiltinResourcesHelper::generateImportFlags(
  292. shadersJSON,
  293. EditorRawShaderFolder,
  294. lastUpdateTime,
  295. forceImport,
  296. &shaderDependenciesJSON,
  297. EditorRawShaderIncludeFolder);
  298. // Hidden dependency: Includes must be imported before shaders, but import flags for shaders must be generated
  299. // before includes are imported, since the process checks if imports changed
  300. BuiltinResourcesHelper::importAssets(
  301. includesJSON,
  302. includeImportFlags,
  303. EditorRawShaderIncludeFolder,
  304. EditorShaderIncludeFolder,
  305. mResourceManifest,
  306. BuiltinResourcesHelper::AssetType::Normal);
  307. BuiltinResourcesHelper::importAssets(
  308. shadersJSON,
  309. shaderImportFlags,
  310. EditorRawShaderFolder,
  311. EditorShaderFolder,
  312. mResourceManifest,
  313. BuiltinResourcesHelper::AssetType::Normal,
  314. &shaderDependenciesJSON);
  315. }
  316. // Import GUI sprites
  317. {
  318. BuiltinResourcesHelper::updateManifest(
  319. EditorSkinFolder,
  320. skinJSON,
  321. mResourceManifest,
  322. BuiltinResourcesHelper::AssetType::Sprite);
  323. Vector<bool> includeImportFlags = BuiltinResourcesHelper::generateImportFlags(
  324. skinJSON,
  325. EditorRawSkinFolder,
  326. lastUpdateTime,
  327. forceImport);
  328. BuiltinResourcesHelper::importAssets(
  329. skinJSON,
  330. includeImportFlags,
  331. EditorRawSkinFolder,
  332. EditorSkinFolder,
  333. mResourceManifest,
  334. BuiltinResourcesHelper::AssetType::Sprite);
  335. }
  336. // Update shader dependencies JSON
  337. {
  338. String jsonString = shaderDependenciesJSON.dump(4).c_str();
  339. dataListStream = FileSystem::createAndOpenFile(shaderDependenciesFile);
  340. dataListStream->writeString(jsonString);
  341. dataListStream->close();
  342. }
  343. // Import fonts
  344. BuiltinResourcesHelper::importFont(
  345. BuiltinRawDataFolder + DefaultFontFilename,
  346. DefaultFontFilename,
  347. BuiltinDataFolder,
  348. { DefaultFontSize },
  349. true,
  350. UUID("6ce69053-00d7-4c60-a229-249b8d8fd60e"),
  351. mResourceManifest);
  352. BuiltinResourcesHelper::importFont(
  353. BuiltinRawDataFolder + DefaultFontFilename,
  354. DefaultAAFontFilename,
  355. BuiltinDataFolder,
  356. { TitleFontSize },
  357. true,
  358. UUID("10999b74-d976-4116-9f72-21e489a7a8e4"),
  359. mResourceManifest);
  360. // Import splash screen
  361. {
  362. Path inputPath = BuiltinRawDataFolder + String(SplashScreenName);
  363. Path outputPath = BuiltinDataFolder + (String(SplashScreenName) + ".asset");
  364. auto textureIO = gImporter().createImportOptions<TextureImportOptions>(inputPath);
  365. textureIO->setCPUCached(true);
  366. textureIO->setGenerateMipmaps(false);
  367. HTexture splashTexture = gImporter().import<Texture>(inputPath, textureIO);
  368. SPtr<PixelData> splashPixelData = splashTexture->getProperties().allocBuffer(0, 0);
  369. splashTexture->readCachedData(*splashPixelData);
  370. FileEncoder fe(outputPath);
  371. fe.encode(splashPixelData.get());
  372. }
  373. // Generate & save GUI skin
  374. {
  375. SPtr<GUISkin> skin = generateGUISkin();
  376. Path outputPath = BuiltinDataFolder + (GUISkinFile + ".asset");
  377. HResource skinResource = gResources()._createResourceHandle(skin, UUID("ec0ea68d-efa5-4a3b-a6fc-b15aaec9689f"));
  378. gResources().save(skinResource, outputPath, true);
  379. mResourceManifest->registerResource(skinResource.getUUID(), outputPath);
  380. }
  381. Resources::instance().unloadAllUnused();
  382. }
  383. SPtr<GUISkin> BuiltinEditorResources::generateGUISkin()
  384. {
  385. BuiltinResourceGUIElementStyleLoader loader(BuiltinDataFolder, EditorSkinSpritesFolder);
  386. Path guiSkinPath = BuiltinRawDataFolder + GUI_SKIN_JSON;
  387. SPtr<DataStream> guiSkinStream = FileSystem::openFile(guiSkinPath);
  388. json guiSkinJSON = json::parse(guiSkinStream->getAsString().c_str());
  389. SPtr<GUISkin> skin = GUISkin::_createPtr();
  390. for (auto& entry : guiSkinJSON)
  391. {
  392. std::string name = entry["name"];
  393. GUIElementStyle style = BuiltinResourcesHelper::loadGUIStyleFromJSON(entry, loader);
  394. skin->setStyle(name.c_str(), style);
  395. }
  396. return skin;
  397. }
  398. HSpriteTexture BuiltinEditorResources::getGUIIcon(const String& name) const
  399. {
  400. Path texturePath = EditorIconSpritesFolder;
  401. texturePath.append("sprite_" + name + ".asset");
  402. return gResources().load<SpriteTexture>(texturePath);
  403. }
  404. HShader BuiltinEditorResources::getShader(const String& name) const
  405. {
  406. Path programPath = EditorShaderFolder;
  407. programPath.append(name + ".asset");
  408. HShader shader = gResources().load<Shader>(programPath);
  409. #if BS_DEBUG_MODE
  410. BuiltinResourcesHelper::verifyAndReportShader(shader);
  411. #endif
  412. return shader;
  413. }
  414. HMaterial BuiltinEditorResources::createDockDropOverlayMaterial() const
  415. {
  416. return Material::create(mShaderDockOverlay);
  417. }
  418. HMaterial BuiltinEditorResources::createSceneGridMaterial() const
  419. {
  420. return Material::create(mShaderSceneGrid);
  421. }
  422. HMaterial BuiltinEditorResources::createPicking(CullingMode cullMode) const
  423. {
  424. UINT32 modeIdx = (UINT32)cullMode;
  425. return Material::create(mShaderPicking[modeIdx]);
  426. }
  427. HMaterial BuiltinEditorResources::createPickingAlpha(CullingMode cullMode) const
  428. {
  429. UINT32 modeIdx = (UINT32)cullMode;
  430. return Material::create(mShaderPickingAlpha[modeIdx]);
  431. }
  432. HMaterial BuiltinEditorResources::createLineGizmoMat() const
  433. {
  434. return Material::create(mShaderGizmoLine);
  435. }
  436. HMaterial BuiltinEditorResources::createSolidGizmoMat() const
  437. {
  438. return Material::create(mShaderGizmoSolid);
  439. }
  440. HMaterial BuiltinEditorResources::createWireGizmoMat() const
  441. {
  442. return Material::create(mShaderGizmoWire);
  443. }
  444. HMaterial BuiltinEditorResources::createIconGizmoMat() const
  445. {
  446. return Material::create(mShaderGizmoIcon);
  447. }
  448. HMaterial BuiltinEditorResources::createGizmoPickingMat() const
  449. {
  450. return Material::create(mShaderGizmoPicking);
  451. }
  452. HMaterial BuiltinEditorResources::createAlphaGizmoPickingMat() const
  453. {
  454. return Material::create(mShaderGizmoAlphaPicking);
  455. }
  456. HMaterial BuiltinEditorResources::createLineHandleMat() const
  457. {
  458. return Material::create(mShaderHandleLine);
  459. }
  460. HMaterial BuiltinEditorResources::createTextGizmoMat() const
  461. {
  462. return Material::create(mShaderGizmoText);
  463. }
  464. HMaterial BuiltinEditorResources::createSolidHandleMat() const
  465. {
  466. return Material::create(mShaderHandleSolid);
  467. }
  468. HMaterial BuiltinEditorResources::createHandleClearAlphaMat() const
  469. {
  470. return Material::create(mShaderHandleClearAlpha);
  471. }
  472. HMaterial BuiltinEditorResources::createSelectionMat() const
  473. {
  474. return Material::create(mShaderSelection);
  475. }
  476. HSpriteTexture BuiltinEditorResources::getLibraryIcon(ProjectIcon icon, int size) const
  477. {
  478. String iconName;
  479. switch (icon)
  480. {
  481. case ProjectIcon::Folder:
  482. iconName = FolderIconTex;
  483. break;
  484. case ProjectIcon::Font:
  485. iconName = FontIconTex;
  486. break;
  487. case ProjectIcon::Mesh:
  488. iconName = MeshIconTex;
  489. break;
  490. case ProjectIcon::Texture:
  491. iconName = TextureIconTex;
  492. break;
  493. case ProjectIcon::PlainText:
  494. iconName = PlainTextIconTex;
  495. break;
  496. case ProjectIcon::ScriptCode:
  497. iconName = ScriptCodeIconTex;
  498. break;
  499. case ProjectIcon::Shader:
  500. iconName = ShaderIconTex;
  501. break;
  502. case ProjectIcon::ShaderInclude:
  503. iconName = ShaderIncludeIconTex;
  504. break;
  505. case ProjectIcon::Material:
  506. iconName = MaterialIconTex;
  507. break;
  508. case ProjectIcon::SpriteTexture:
  509. iconName = SpriteTextureIconTex;
  510. break;
  511. case ProjectIcon::Prefab:
  512. iconName = PrefabIconTex;
  513. break;
  514. case ProjectIcon::GUISkin:
  515. iconName = GUISkinIconTex;
  516. break;
  517. case ProjectIcon::PhysicsMaterial:
  518. iconName = PhysicsMaterialIconTex;
  519. break;
  520. case ProjectIcon::PhysicsMesh:
  521. iconName = PhysicsMeshIconTex;
  522. break;
  523. case ProjectIcon::AudioClip:
  524. iconName = AudioClipIconTex;
  525. break;
  526. case ProjectIcon::AnimationClip:
  527. iconName = AnimationClipIconTex;
  528. break;
  529. }
  530. if (iconName.empty())
  531. return HSpriteTexture();
  532. if (size <= 16)
  533. iconName += "16";
  534. else if (size <= 32)
  535. iconName += "32";
  536. else if (size <= 48)
  537. iconName += "48";
  538. return getGUIIcon(iconName);
  539. }
  540. HSpriteTexture BuiltinEditorResources::getToolbarIcon(ToolbarIcon icon) const
  541. {
  542. switch (icon)
  543. {
  544. case ToolbarIcon::NewCamera:
  545. return getGUIIcon("ToolbarNewCameraIcon.png");
  546. case ToolbarIcon::NewRenderable:
  547. return getGUIIcon("ToolbarNewRenderableIcon.png");
  548. case ToolbarIcon::NewPointLight:
  549. return getGUIIcon("ToolbarNewPointLightIcon.png");
  550. case ToolbarIcon::NewDirLight:
  551. return getGUIIcon("ToolbarNewDirectionalLightIcon.png");
  552. case ToolbarIcon::NewSpotLight:
  553. return getGUIIcon("ToolbarNewSpotLightIcon.png");
  554. case ToolbarIcon::NewSceneObject:
  555. return getGUIIcon("ToolbarNewSceneObjectIcon.png");
  556. case ToolbarIcon::NewCube:
  557. return getGUIIcon("ToolbarNewCubeIcon.png");
  558. case ToolbarIcon::NewSphere:
  559. return getGUIIcon("ToolbarNewSphereIcon.png");
  560. case ToolbarIcon::NewCone:
  561. return getGUIIcon("ToolbarNewConeIcon.png");
  562. case ToolbarIcon::NewQuad:
  563. return getGUIIcon("ToolbarNewQuadIcon.png");
  564. case ToolbarIcon::NewMat:
  565. return getGUIIcon("ToolbarNewMaterialIcon.png");
  566. case ToolbarIcon::NewCSScript:
  567. return getGUIIcon("ToolbarNewCSScriptIcon.png");
  568. case ToolbarIcon::NewShader:
  569. return getGUIIcon("ToolbarNewShaderIcon.png");
  570. case ToolbarIcon::NewSpriteTex:
  571. return getGUIIcon("ToolbarNewSpriteTextureIcon.png");
  572. case ToolbarIcon::Pause:
  573. return getGUIIcon("ToolbarPauseIcon.png");
  574. case ToolbarIcon::Play:
  575. return getGUIIcon("ToolbarPlayIcon.png");
  576. case ToolbarIcon::Step:
  577. return getGUIIcon("ToolbarStepIcon.png");
  578. case ToolbarIcon::Undo:
  579. return getGUIIcon("ToolbarUndoIcon.png");
  580. case ToolbarIcon::Redo:
  581. return getGUIIcon("ToolbarRedoIcon.png");
  582. case ToolbarIcon::OpenProject:
  583. return getGUIIcon("ToolbarOpenProjectIcon.png");
  584. case ToolbarIcon::SaveProject:
  585. return getGUIIcon("ToolbarSaveProjectIcon.png");
  586. case ToolbarIcon::SaveScene:
  587. return getGUIIcon("ToolbarSaveSceneIcon.png");
  588. }
  589. return HSpriteTexture();
  590. }
  591. GUIContentImages BuiltinEditorResources::getSceneWindowIcon(SceneWindowIcon icon) const
  592. {
  593. HSpriteTexture off;
  594. HSpriteTexture on;
  595. switch (icon)
  596. {
  597. case SceneWindowIcon::View:
  598. off = getGUIIcon("SceneViewIcon.png");
  599. on = getGUIIcon("SceneViewIconOn.png");
  600. break;
  601. case SceneWindowIcon::Move:
  602. off = getGUIIcon("SceneMoveIcon.png");
  603. on = getGUIIcon("SceneMoveIconOn.png");
  604. break;
  605. case SceneWindowIcon::Rotate:
  606. off = getGUIIcon("SceneRotateIcon.png");
  607. on = getGUIIcon("SceneRotateIconOn.png");
  608. break;
  609. case SceneWindowIcon::Scale:
  610. off = getGUIIcon("SceneScaleIcon.png");
  611. on = getGUIIcon("SceneScaleIconOn.png");
  612. break;
  613. case SceneWindowIcon::Pivot:
  614. off = getGUIIcon("ScenePivotIcon.png");
  615. on = getGUIIcon("ScenePivotIconOn.png");
  616. break;
  617. case SceneWindowIcon::Center:
  618. off = getGUIIcon("SceneCenterIcon.png");
  619. on = getGUIIcon("SceneCenterIconOn.png");
  620. break;
  621. case SceneWindowIcon::Local:
  622. off = getGUIIcon("SceneLocalIcon.png");
  623. on = getGUIIcon("SceneLocalIconOn.png");
  624. break;
  625. case SceneWindowIcon::World:
  626. off = getGUIIcon("SceneWorldIcon.png");
  627. on = getGUIIcon("SceneWorldIconOn.png");
  628. break;
  629. case SceneWindowIcon::MoveSnap:
  630. off = getGUIIcon("SceneMoveSnapIcon.png");
  631. on = getGUIIcon("SceneMoveSnapIconOn.png");
  632. break;
  633. case SceneWindowIcon::RotateSnap:
  634. off = getGUIIcon("SceneRotateSnapIcon.png");
  635. on = getGUIIcon("SceneRotateSnapIconOn.png");
  636. break;
  637. }
  638. GUIContentImages output;
  639. output.normal = off;
  640. output.hover = off;
  641. output.active = on;
  642. output.focused = off;
  643. output.normalOn = on;
  644. output.hoverOn = on;
  645. output.activeOn = on;
  646. output.focusedOn = on;
  647. return output;
  648. }
  649. HSpriteTexture BuiltinEditorResources::getLibraryWindowIcon(LibraryWindowIcon icon) const
  650. {
  651. switch (icon)
  652. {
  653. case LibraryWindowIcon::Home:
  654. return getGUIIcon("LibraryHomeIcon.png");
  655. case LibraryWindowIcon::Up:
  656. return getGUIIcon("LibraryUpIcon.png");
  657. case LibraryWindowIcon::Clear:
  658. return getGUIIcon("LibraryClearSearchIcon.png");
  659. case LibraryWindowIcon::Options:
  660. return getGUIIcon("LibraryOptionsIcon.png");
  661. }
  662. return HSpriteTexture();
  663. }
  664. HSpriteTexture BuiltinEditorResources::getInspectorWindowIcon(InspectorWindowIcon icon) const
  665. {
  666. switch (icon)
  667. {
  668. case InspectorWindowIcon::Create:
  669. return getGUIIcon("InspectorCreateIcon.png");
  670. case InspectorWindowIcon::Clone:
  671. return getGUIIcon("InspectorCloneIcon.png");
  672. case InspectorWindowIcon::Clear:
  673. return getGUIIcon("InspectorClearIcon.png");
  674. case InspectorWindowIcon::Resize:
  675. return getGUIIcon("InspectorResizeIcon.png");
  676. case InspectorWindowIcon::Delete:
  677. return getGUIIcon("InspectorDeleteIcon.png");
  678. case InspectorWindowIcon::MoveUp:
  679. return getGUIIcon("InspectorMoveUpIcon.png");
  680. case InspectorWindowIcon::MoveDown:
  681. return getGUIIcon("InspectorMoveDownIcon.png");
  682. case InspectorWindowIcon::Edit:
  683. return getGUIIcon("InspectorEditIcon.png");
  684. case InspectorWindowIcon::Apply:
  685. return getGUIIcon("InspectorApplyIcon.png");
  686. case InspectorWindowIcon::Add:
  687. return getGUIIcon("InspectorAddIcon.png");
  688. case InspectorWindowIcon::Cancel:
  689. return getGUIIcon("InspectorCancelIcon.png");
  690. }
  691. return HSpriteTexture();
  692. }
  693. GUIContentImages BuiltinEditorResources::getAnimationWindowIcon(AnimationWindowIcon icon) const
  694. {
  695. HSpriteTexture off;
  696. HSpriteTexture on;
  697. switch (icon)
  698. {
  699. case AnimationWindowIcon::Play:
  700. off = getGUIIcon("AnimationPlayIcon.png");
  701. on = getGUIIcon("AnimationPlayIconOn.png");
  702. break;
  703. case AnimationWindowIcon::Record:
  704. off = getGUIIcon("AnimationRecordIcon.png");
  705. on = getGUIIcon("AnimationRecordIconOn.png");
  706. break;
  707. case AnimationWindowIcon::FrameForward:
  708. off = getGUIIcon("AnimationFrameForwardIcon.png");
  709. on = getGUIIcon("AnimationFrameForwardIconOn.png");
  710. break;
  711. case AnimationWindowIcon::FrameBack:
  712. off = getGUIIcon("AnimationFrameBackIcon.png");
  713. on = getGUIIcon("AnimationFrameBackIconOn.png");
  714. break;
  715. case AnimationWindowIcon::AddEvent:
  716. off = getGUIIcon("AnimationAddEventIcon.png");
  717. on = getGUIIcon("AnimationAddEventIconOn.png");
  718. break;
  719. case AnimationWindowIcon::AddKeyframe:
  720. off = getGUIIcon("AnimationAddKeyframeIcon.png");
  721. on = getGUIIcon("AnimationAddKeyframeIconOn.png");
  722. break;
  723. case AnimationWindowIcon::Event:
  724. off = getGUIIcon("AnimationEventIcon.png");
  725. on = off;
  726. break;
  727. case AnimationWindowIcon::Keyframe:
  728. off = getGUIIcon("AnimationKeyframeIcon.png");
  729. on = off;
  730. break;
  731. }
  732. GUIContentImages output;
  733. output.normal = off;
  734. output.hover = off;
  735. output.active = on;
  736. output.focused = off;
  737. output.normalOn = on;
  738. output.hoverOn = on;
  739. output.activeOn = on;
  740. output.focusedOn = on;
  741. return output;
  742. }
  743. HSpriteTexture BuiltinEditorResources::getIcon(EditorIcon icon) const
  744. {
  745. switch (icon)
  746. {
  747. case EditorIcon::X:
  748. return getGUIIcon(XButtonNormalTex);
  749. case EditorIcon::Component:
  750. return getGUIIcon("IconComponent.png");
  751. case EditorIcon::SceneObject:
  752. return getGUIIcon("IconSceneObject.png");
  753. }
  754. return HSpriteTexture();
  755. }
  756. HSpriteTexture BuiltinEditorResources::getLogMessageIcon(LogMessageIcon icon, UINT32 size, bool dark) const
  757. {
  758. if (size < 24) // Round to 16
  759. {
  760. if (dark)
  761. {
  762. switch (icon)
  763. {
  764. case LogMessageIcon::Info:
  765. return getGUIIcon("IconInfoDark.png");
  766. case LogMessageIcon::Warning:
  767. return getGUIIcon("IconWarningDark.png");
  768. case LogMessageIcon::Error:
  769. return getGUIIcon("IconErrorDark.png");
  770. }
  771. }
  772. else
  773. {
  774. switch (icon)
  775. {
  776. case LogMessageIcon::Info:
  777. return getGUIIcon("IconInfo.png");
  778. case LogMessageIcon::Warning:
  779. return getGUIIcon("IconWarning.png");
  780. case LogMessageIcon::Error:
  781. return getGUIIcon("IconError.png");
  782. }
  783. }
  784. }
  785. else // Round to 32
  786. {
  787. switch (icon)
  788. {
  789. case LogMessageIcon::Info:
  790. return getGUIIcon("IconInfo32.png");
  791. case LogMessageIcon::Warning:
  792. return getGUIIcon("IconWarning32.png");
  793. case LogMessageIcon::Error:
  794. return getGUIIcon("IconError32.png");
  795. }
  796. }
  797. return HSpriteTexture();
  798. }
  799. SPtr<PixelData> BuiltinEditorResources::getSplashScreen()
  800. {
  801. Path splashScreenPath = gEditorApplication().getDataPath() + (String(SplashScreenName) + ".asset");
  802. FileDecoder fd(splashScreenPath);
  803. return std::static_pointer_cast<PixelData>(fd.decode());
  804. }
  805. String BuiltinEditorResources::getEmptyShaderCode() const
  806. {
  807. Path filePath = BuiltinDataFolder;
  808. filePath.append(EmptyShaderCodeFile);
  809. SPtr<DataStream> fileStream = FileSystem::openFile(filePath);
  810. if (fileStream != nullptr)
  811. return fileStream->getAsString();
  812. return StringUtil::BLANK;
  813. }
  814. String BuiltinEditorResources::getEmptyCSScriptCode() const
  815. {
  816. Path filePath = BuiltinDataFolder;
  817. filePath.append(EmptyCSScriptCodeFile);
  818. SPtr<DataStream> fileStream = FileSystem::openFile(filePath);
  819. if (fileStream != nullptr)
  820. return fileStream->getAsString();
  821. return StringUtil::BLANK;
  822. }
  823. Path BuiltinEditorResources::getShaderIncludeFolder()
  824. {
  825. return gEditorApplication().getDataPath() + ShaderIncludeFolder;
  826. }
  827. Path BuiltinEditorResources::getDefaultWidgetLayoutPath()
  828. {
  829. return gEditorApplication().getDataPath() + "Layout.asset";
  830. }
  831. }