BsBuiltinEditorResources.cpp 30 KB

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