| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692 |
- UIElement@ browserWindow;
- Window@ browserFilterWindow;
- ListView@ browserDirList;
- ListView@ browserFileList;
- LineEdit@ browserSearch;
- BrowserFile@ browserDragFile;
- Node@ browserDragNode;
- Component@ browserDragComponent;
- View3D@ resourceBrowserPreview;
- Scene@ resourcePreviewScene;
- Node@ resourcePreviewNode;
- Node@ resourcePreviewCameraNode;
- Node@ resourcePreviewLightNode;
- Light@ resourcePreviewLight;
- int browserSearchSortMode = 0;
- BrowserDir@ rootDir;
- Array<BrowserFile@> browserFiles;
- Dictionary browserDirs;
- Array<int> activeResourceTypeFilters;
- Array<int> activeResourceDirFilters;
- Array<BrowserFile@> browserFilesToScan;
- const uint BROWSER_WORKER_ITEMS_PER_TICK = 10;
- const uint BROWSER_SEARCH_LIMIT = 50;
- const int BROWSER_SORT_MODE_ALPHA = 1;
- const int BROWSER_SORT_MODE_SEARCH = 2;
- const int RESOURCE_TYPE_UNUSABLE = -2;
- const int RESOURCE_TYPE_UNKNOWN = -1;
- const int RESOURCE_TYPE_NOTSET = 0;
- const int RESOURCE_TYPE_SCENE = 1;
- const int RESOURCE_TYPE_SCRIPTFILE = 2;
- const int RESOURCE_TYPE_MODEL = 3;
- const int RESOURCE_TYPE_MATERIAL = 4;
- const int RESOURCE_TYPE_ANIMATION = 5;
- const int RESOURCE_TYPE_IMAGE = 6;
- const int RESOURCE_TYPE_SOUND = 7;
- const int RESOURCE_TYPE_TEXTURE = 8;
- const int RESOURCE_TYPE_FONT = 9;
- const int RESOURCE_TYPE_PREFAB = 10;
- const int RESOURCE_TYPE_TECHNIQUE = 11;
- const int RESOURCE_TYPE_PARTICLEEFFECT = 12;
- const int RESOURCE_TYPE_UIELEMENT = 13;
- const int RESOURCE_TYPE_UIELEMENTS = 14;
- const int RESOURCE_TYPE_ANIMATION_SETTINGS = 15;
- const int RESOURCE_TYPE_RENDERPATH = 16;
- const int RESOURCE_TYPE_TEXTURE_ATLAS = 17;
- const int RESOURCE_TYPE_2D_PARTICLE_EFFECT = 18;
- const int RESOURCE_TYPE_TEXTURE_3D = 19;
- const int RESOURCE_TYPE_CUBEMAP = 20;
- const int RESOURCE_TYPE_PARTICLEEMITTER = 21;
- const int RESOURCE_TYPE_2D_ANIMATION_SET = 22;
- const int RESOURCE_TYPE_GENERIC_XML = 23;
- const int RESOURCE_TYPE_GENERIC_JSON = 24;
- // any resource type > 0 is valid
- const int NUMBER_OF_VALID_RESOURCE_TYPES = 24;
- const StringHash XML_TYPE_SCENE("scene");
- const StringHash XML_TYPE_NODE("node");
- const StringHash XML_TYPE_MATERIAL("material");
- const StringHash XML_TYPE_TECHNIQUE("technique");
- const StringHash XML_TYPE_PARTICLEEFFECT("particleeffect");
- const StringHash XML_TYPE_PARTICLEEMITTER("particleemitter");
- const StringHash XML_TYPE_TEXTURE("texture");
- const StringHash XML_TYPE_ELEMENT("element");
- const StringHash XML_TYPE_ELEMENTS("elements");
- const StringHash XML_TYPE_ANIMATION_SETTINGS("animation");
- const StringHash XML_TYPE_RENDERPATH("renderpath");
- const StringHash XML_TYPE_TEXTURE_ATLAS("TextureAtlas");
- const StringHash XML_TYPE_2D_PARTICLE_EFFECT("particleEmitterConfig");
- const StringHash XML_TYPE_TEXTURE_3D("texture3d");
- const StringHash XML_TYPE_CUBEMAP("cubemap");
- const StringHash XML_TYPE_SPRITER_DATA("spriter_data");
- const StringHash XML_TYPE_GENERIC("xml");
- const StringHash JSON_TYPE_SCENE("scene");
- const StringHash JSON_TYPE_NODE("node");
- const StringHash JSON_TYPE_MATERIAL("material");
- const StringHash JSON_TYPE_TECHNIQUE("technique");
- const StringHash JSON_TYPE_PARTICLEEFFECT("particleeffect");
- const StringHash JSON_TYPE_PARTICLEEMITTER("particleemitter");
- const StringHash JSON_TYPE_TEXTURE("texture");
- const StringHash JSON_TYPE_ELEMENT("element");
- const StringHash JSON_TYPE_ELEMENTS("elements");
- const StringHash JSON_TYPE_ANIMATION_SETTINGS("animation");
- const StringHash JSON_TYPE_RENDERPATH("renderpath");
- const StringHash JSON_TYPE_TEXTURE_ATLAS("TextureAtlas");
- const StringHash JSON_TYPE_2D_PARTICLE_EFFECT("particleEmitterConfig");
- const StringHash JSON_TYPE_TEXTURE_3D("texture3d");
- const StringHash JSON_TYPE_CUBEMAP("cubemap");
- const StringHash JSON_TYPE_SPRITER_DATA("spriter_data");
- const StringHash JSON_TYPE_GENERIC("json");
- const StringHash BINARY_TYPE_SCENE("USCN");
- const StringHash BINARY_TYPE_PACKAGE("UPAK");
- const StringHash BINARY_TYPE_COMPRESSED_PACKAGE("ULZ4");
- const StringHash BINARY_TYPE_ANGELSCRIPT("ASBC");
- const StringHash BINARY_TYPE_MODEL("UMDL");
- const StringHash BINARY_TYPE_MODEL2("UMD2");
- const StringHash BINARY_TYPE_SHADER("USHD");
- const StringHash BINARY_TYPE_ANIMATION("UANI");
- const StringHash EXTENSION_TYPE_TTF(".ttf");
- const StringHash EXTENSION_TYPE_OTF(".otf");
- const StringHash EXTENSION_TYPE_OGG(".ogg");
- const StringHash EXTENSION_TYPE_WAV(".wav");
- const StringHash EXTENSION_TYPE_DDS(".dds");
- const StringHash EXTENSION_TYPE_PNG(".png");
- const StringHash EXTENSION_TYPE_JPG(".jpg");
- const StringHash EXTENSION_TYPE_JPEG(".jpeg");
- const StringHash EXTENSION_TYPE_HDR(".hdr");
- const StringHash EXTENSION_TYPE_BMP(".bmp");
- const StringHash EXTENSION_TYPE_TGA(".tga");
- const StringHash EXTENSION_TYPE_KTX(".ktx");
- const StringHash EXTENSION_TYPE_PVR(".pvr");
- const StringHash EXTENSION_TYPE_OBJ(".obj");
- const StringHash EXTENSION_TYPE_FBX(".fbx");
- const StringHash EXTENSION_TYPE_COLLADA(".dae");
- const StringHash EXTENSION_TYPE_BLEND(".blend");
- const StringHash EXTENSION_TYPE_ANGELSCRIPT(".as");
- const StringHash EXTENSION_TYPE_LUASCRIPT(".lua");
- const StringHash EXTENSION_TYPE_HLSL(".hlsl");
- const StringHash EXTENSION_TYPE_GLSL(".glsl");
- const StringHash EXTENSION_TYPE_FRAGMENTSHADER(".frag");
- const StringHash EXTENSION_TYPE_VERTEXSHADER(".vert");
- const StringHash EXTENSION_TYPE_HTML(".html");
- const StringHash TEXT_VAR_FILE_ID("browser_file_id");
- const StringHash TEXT_VAR_DIR_ID("browser_dir_id");
- const StringHash TEXT_VAR_RESOURCE_TYPE("resource_type");
- const StringHash TEXT_VAR_RESOURCE_DIR_ID("resource_dir_id");
- const int BROWSER_FILE_SOURCE_RESOURCE_DIR = 1;
- uint browserDirIndex = 1;
- uint browserFileIndex = 1;
- BrowserDir@ selectedBrowserDirectory;
- BrowserFile@ selectedBrowserFile;
- Text@ browserStatusMessage;
- Text@ browserResultsMessage;
- bool ignoreRefreshBrowserResults = false;
- String resourceDirsCache;
- void CreateResourceBrowser()
- {
- if (browserWindow !is null) return;
- CreateResourceBrowserUI();
- InitResourceBrowserPreview();
- RebuildResourceDatabase();
- }
- void RebuildResourceDatabase()
- {
- if (browserWindow is null)
- return;
- String newResourceDirsCache = Join(cache.resourceDirs, ';');
- ScanResourceDirectories();
- if (newResourceDirsCache != resourceDirsCache)
- {
- resourceDirsCache = newResourceDirsCache;
- PopulateResourceDirFilters();
- }
- PopulateBrowserDirectories();
- PopulateResourceBrowserFilesByDirectory(rootDir);
- }
- void ScanResourceDirectories()
- {
- browserDirs.Clear();
- browserFiles.Clear();
- browserFilesToScan.Clear();
- rootDir = BrowserDir("");
- browserDirs.Set("", @rootDir);
- // collect all of the items and sort them afterwards
- for(uint i=0; i < cache.resourceDirs.length; ++i)
- {
- if (activeResourceDirFilters.Find(i) > -1)
- continue;
- ScanResourceDir(i);
- }
- }
- // used to stop ui from blocking while determining file types
- void DoResourceBrowserWork()
- {
- if (browserFilesToScan.length == 0)
- return;
- int counter = 0;
- bool updateBrowserUI = false;
- BrowserFile@ scanItem = browserFilesToScan[0];
- while(counter < BROWSER_WORKER_ITEMS_PER_TICK)
- {
- scanItem.DetermainResourceType();
- // next
- browserFilesToScan.Erase(0);
- if (browserFilesToScan.length > 0)
- @scanItem = browserFilesToScan[0];
- else
- break;
- counter++;
- }
- if (browserFilesToScan.length > 0)
- browserStatusMessage.text = localization.Get("Files left to scan: " )+ browserFilesToScan.length;
- else
- browserStatusMessage.text = localization.Get("Scan complete");
- }
- void CreateResourceBrowserUI()
- {
- browserWindow = LoadEditorUI("UI/EditorResourceBrowser.xml");
- browserDirList = browserWindow.GetChild("DirectoryList", true);
- browserFileList = browserWindow.GetChild("FileList", true);
- browserSearch = browserWindow.GetChild("Search", true);
- browserStatusMessage = browserWindow.GetChild("StatusMessage", true);
- browserResultsMessage = browserWindow.GetChild("ResultsMessage", true);
- // browserWindow.visible = false;
- browserWindow.opacity = uiMaxOpacity;
- browserFilterWindow = LoadEditorUI("UI/EditorResourceFilterWindow.xml");
- CreateResourceFilterUI();
- HideResourceFilterWindow();
- int height = Min(ui.root.height / 4, 300);
- browserWindow.SetSize(900, height);
- browserWindow.SetPosition(35, ui.root.height - height - 25);
- CloseContextMenu();
- ui.root.AddChild(browserWindow);
- ui.root.AddChild(browserFilterWindow);
- SubscribeToEvent(browserWindow.GetChild("CloseButton", true), "Released", "HideResourceBrowserWindow");
- SubscribeToEvent(browserWindow.GetChild("RescanButton", true), "Released", "HandleRescanResourceBrowserClick");
- SubscribeToEvent(browserWindow.GetChild("FilterButton", true), "Released", "ToggleResourceFilterWindow");
- SubscribeToEvent(browserDirList, "SelectionChanged", "HandleResourceBrowserDirListSelectionChange");
- SubscribeToEvent(browserSearch, "TextChanged", "HandleResourceBrowserSearchTextChange");
- SubscribeToEvent(browserFileList, "ItemClicked", "HandleBrowserFileClick");
- SubscribeToEvent(browserFileList, "SelectionChanged", "HandleResourceBrowserFileListSelectionChange");
- SubscribeToEvent(cache, "FileChanged", "HandleFileChanged");
- }
- void CreateResourceFilterUI()
- {
- UIElement@ options = browserFilterWindow.GetChild("TypeOptions", true);
- CheckBox@ toggleAllTypes = browserFilterWindow.GetChild("ToggleAllTypes", true);
- CheckBox@ toggleAllResourceDirs = browserFilterWindow.GetChild("ToggleAllResourceDirs", true);
- SubscribeToEvent(toggleAllTypes, "Toggled", "HandleResourceTypeFilterToggleAllTypesToggled");
- SubscribeToEvent(toggleAllResourceDirs, "Toggled", "HandleResourceDirFilterToggleAllTypesToggled");
- SubscribeToEvent(browserFilterWindow.GetChild("CloseButton", true), "Released", "HideResourceFilterWindow");
- int columns = 2;
- UIElement@ col1 = browserFilterWindow.GetChild("TypeFilterColumn1", true);
- UIElement@ col2 = browserFilterWindow.GetChild("TypeFilterColumn2", true);
- // use array to get sort of items
- Array<ResourceType@> sorted;
- for (int i=1; i <= NUMBER_OF_VALID_RESOURCE_TYPES; ++i)
- sorted.Push(ResourceType(i, ResourceTypeName(i)));
- // 2 unknown types are reserved for the top, the rest are alphabetized
- sorted.Sort();
- sorted.Insert(0, ResourceType(RESOURCE_TYPE_UNKNOWN, ResourceTypeName(RESOURCE_TYPE_UNKNOWN)) );
- sorted.Insert(0, ResourceType(RESOURCE_TYPE_UNUSABLE, ResourceTypeName(RESOURCE_TYPE_UNUSABLE)) );
- uint halfColumns = uint( Ceil( float(sorted.length) / float(columns) ) );
- for (uint i = 0; i < sorted.length; ++i)
- {
- ResourceType@ type = sorted[i];
- UIElement@ resourceTypeHolder = UIElement();
- if (i < halfColumns)
- col1.AddChild(resourceTypeHolder);
- else
- col2.AddChild(resourceTypeHolder);
- resourceTypeHolder.layoutMode = LM_HORIZONTAL;
- resourceTypeHolder.layoutSpacing = 4;
- Text@ label = Text();
- label.style = "EditorAttributeText";
- label.text = type.name;
- CheckBox@ checkbox = CheckBox();
- checkbox.name = type.id;
- checkbox.SetStyleAuto();
- checkbox.vars[TEXT_VAR_RESOURCE_TYPE] = i;
- checkbox.checked = true;
- SubscribeToEvent(checkbox, "Toggled", "HandleResourceTypeFilterToggled");
- resourceTypeHolder.AddChild(checkbox);
- resourceTypeHolder.AddChild(label);
- }
- }
- void CreateDirList(BrowserDir@ dir, UIElement@ parentUI = null)
- {
- Text@ dirText = Text();
- browserDirList.InsertItem(browserDirList.numItems, dirText, parentUI);
- dirText.style = "FileSelectorListText";
- dirText.text = dir.resourceKey.empty ? localization.Get("Root") : dir.name;
- dirText.name = dir.resourceKey;
- dirText.vars[TEXT_VAR_DIR_ID] = dir.resourceKey;
- // Sort directories alphetically
- browserSearchSortMode = BROWSER_SORT_MODE_ALPHA;
- dir.children.Sort();
- for(uint i=0; i<dir.children.length; ++i)
- CreateDirList(dir.children[i], dirText);
- }
- void CreateFileList(BrowserFile@ file)
- {
- Text@ fileText = Text();
- fileText.style = "FileSelectorListText";
- fileText.layoutMode = LM_HORIZONTAL;
- browserFileList.InsertItem(browserFileList.numItems, fileText);
- file.browserFileListRow = fileText;
- InitializeBrowserFileListRow(fileText, file);
- }
- void InitializeBrowserFileListRow(Text@ fileText, BrowserFile@ file)
- {
- fileText.RemoveAllChildren();
- VariantMap params = VariantMap();
- fileText.vars[TEXT_VAR_FILE_ID] = file.id;
- fileText.vars[TEXT_VAR_RESOURCE_TYPE] = file.resourceType;
- if (file.resourceType > 0)
- fileText.dragDropMode = DD_SOURCE;
- {
- Text@ text = Text();
- fileText.AddChild(text);
- text.style = "FileSelectorListText";
- text.text = file.fullname;
- text.name = file.resourceKey;
- }
- {
- Text@ text = Text();
- fileText.AddChild(text);
- text.style = "FileSelectorListText";
- text.text = file.ResourceTypeName();
- }
- if (file.resourceType == RESOURCE_TYPE_MATERIAL ||
- file.resourceType == RESOURCE_TYPE_MODEL ||
- file.resourceType == RESOURCE_TYPE_PARTICLEEFFECT ||
- file.resourceType == RESOURCE_TYPE_PREFAB
- )
- {
- SubscribeToEvent(fileText, "DragBegin", "HandleBrowserFileDragBegin");
- SubscribeToEvent(fileText, "DragEnd", "HandleBrowserFileDragEnd");
- }
- }
- void InitResourceBrowserPreview()
- {
- resourcePreviewScene = Scene("PreviewScene");
- resourcePreviewScene.CreateComponent("Octree");
- PhysicsWorld@ physicsWorld = resourcePreviewScene.CreateComponent("PhysicsWorld");
- physicsWorld.enabled = false;
- physicsWorld.gravity = Vector3(0.0, 0.0, 0.0);
- Node@ zoneNode = resourcePreviewScene.CreateChild("Zone");
- Zone@ zone = zoneNode.CreateComponent("Zone");
- zone.boundingBox = BoundingBox(-1000, 1000);
- zone.ambientColor = Color(0.15, 0.15, 0.15);
- zone.fogColor = Color(0, 0, 0);
- zone.fogStart = 10.0;
- zone.fogEnd = 100.0;
- resourcePreviewCameraNode = resourcePreviewScene.CreateChild("PreviewCamera");
- resourcePreviewCameraNode.position = Vector3(0, 0, -1.5);
- Camera@ camera = resourcePreviewCameraNode.CreateComponent("Camera");
- camera.nearClip = 0.1f;
- camera.farClip = 100.0f;
- resourcePreviewLightNode = resourcePreviewScene.CreateChild("PreviewLight");
- resourcePreviewLightNode.direction = Vector3(0.5, -0.5, 0.5);
- resourcePreviewLight = resourcePreviewLightNode.CreateComponent("Light");
- resourcePreviewLight.lightType = LIGHT_DIRECTIONAL;
- resourcePreviewLight.specularIntensity = 0.5;
- resourceBrowserPreview = browserWindow.GetChild("ResourceBrowserPreview", true);
- resourceBrowserPreview.SetFixedHeight(200);
- resourceBrowserPreview.SetFixedWidth(266);
- resourceBrowserPreview.SetView(resourcePreviewScene, camera);
- resourceBrowserPreview.autoUpdate = false;
- resourcePreviewNode = resourcePreviewScene.CreateChild("PreviewNodeContainer");
- SubscribeToEvent(resourceBrowserPreview, "DragMove", "RotateResourceBrowserPreview");
- RefreshBrowserPreview();
- }
- // Opens a contextual menu based on what resource item was actioned
- void HandleBrowserFileClick(StringHash eventType, VariantMap& eventData)
- {
- if (eventData["Button"].GetInt() != MOUSEB_RIGHT)
- return;
- UIElement@ uiElement = eventData["Item"].GetPtr();
- BrowserFile@ file = GetBrowserFileFromUIElement(uiElement);
- if (file is null)
- return;
- Array<UIElement@> actions;
- if (file.resourceType == RESOURCE_TYPE_MATERIAL)
- {
- actions.Push(CreateBrowserFileActionMenu("Edit", "HandleBrowserEditResource", file));
- }
- else if (file.resourceType == RESOURCE_TYPE_MODEL)
- {
- actions.Push(CreateBrowserFileActionMenu("Instance Animated Model", "HandleBrowserInstantiateAnimatedModel", file));
- actions.Push(CreateBrowserFileActionMenu("Instance Static Model", "HandleBrowserInstantiateStaticModel", file));
- }
- else if (file.resourceType == RESOURCE_TYPE_PREFAB)
- {
- actions.Push(CreateBrowserFileActionMenu("Instance Prefab", "HandleBrowserInstantiatePrefab", file));
- actions.Push(CreateBrowserFileActionMenu("Instance in Spawner", "HandleBrowserInstantiateInSpawnEditor", file));
- }
- else if (file.fileType == EXTENSION_TYPE_OBJ ||
- file.fileType == EXTENSION_TYPE_COLLADA ||
- file.fileType == EXTENSION_TYPE_FBX ||
- file.fileType == EXTENSION_TYPE_BLEND)
- {
- actions.Push(CreateBrowserFileActionMenu("Import Model", "HandleBrowserImportModel", file));
- actions.Push(CreateBrowserFileActionMenu("Import Scene", "HandleBrowserImportScene", file));
- }
- else if (file.resourceType == RESOURCE_TYPE_UIELEMENT)
- {
- actions.Push(CreateBrowserFileActionMenu("Open UI Layout", "HandleBrowserOpenUILayout", file));
- }
- else if (file.resourceType == RESOURCE_TYPE_SCENE)
- {
- actions.Push(CreateBrowserFileActionMenu("Load Scene", "HandleBrowserLoadScene", file));
- }
- else if (file.resourceType == RESOURCE_TYPE_SCRIPTFILE)
- {
- actions.Push(CreateBrowserFileActionMenu("Execute Script", "HandleBrowserRunScript", file));
- }
- else if (file.resourceType == RESOURCE_TYPE_PARTICLEEFFECT)
- {
- actions.Push(CreateBrowserFileActionMenu("Edit", "HandleBrowserEditResource", file));
- }
- actions.Push(CreateBrowserFileActionMenu("Open", "HandleBrowserOpenResource", file));
- ActivateContextMenu(actions);
- }
- BrowserDir@ GetBrowserDir(String path)
- {
- BrowserDir@ browserDir;
- browserDirs.Get(path, @browserDir);
- return browserDir;
- }
- // Makes sure the entire directory tree exists and new dir is linked to parent
- BrowserDir@ InitBrowserDir(String path)
- {
- BrowserDir@ browserDir;
- if (browserDirs.Get(path, @browserDir))
- return browserDir;
- Array<String> parts = path.Split('/');
- Array<String> finishedParts;
- if (parts.length > 0)
- {
- BrowserDir@ parent = rootDir;
- for( uint i = 0; i < parts.length; ++i )
- {
- finishedParts.Push(parts[i]);
- String currentPath = Join(finishedParts, "/");
- if (!browserDirs.Get(currentPath, @browserDir))
- {
- browserDir = BrowserDir(currentPath);
- browserDirs.Set(currentPath, @browserDir);
- parent.children.Push(browserDir);
- }
- @parent = browserDir;
- }
- return browserDir;
- }
- return null;
- }
- void ScanResourceDir(uint resourceDirIndex)
- {
- String resourceDir = cache.resourceDirs[resourceDirIndex];
- ScanResourceDirFiles("", resourceDirIndex);
- Array<String> dirs = fileSystem.ScanDir(resourceDir, "*", SCAN_DIRS, true);
- for (uint i=0; i < dirs.length; ++i)
- {
- String path = dirs[i];
- if (path.EndsWith("."))
- continue;
- InitBrowserDir(path);
- ScanResourceDirFiles(path, resourceDirIndex);
- }
- }
- void ScanResourceDirFiles(String path, uint resourceDirIndex)
- {
- String fullPath = cache.resourceDirs[resourceDirIndex] + path;
- if (!fileSystem.DirExists(fullPath))
- return;
- BrowserDir@ dir = GetBrowserDir(path);
- if (dir is null)
- return;
- // get files in directory
- Array<String> dirFiles = fileSystem.ScanDir(fullPath, "*.*", SCAN_FILES, false);
- // add new files
- for (uint x=0; x < dirFiles.length; x++)
- {
- String filename = dirFiles[x];
- BrowserFile@ browserFile = dir.AddFile(filename, resourceDirIndex, BROWSER_FILE_SOURCE_RESOURCE_DIR);
- browserFiles.Push(browserFile);
- browserFilesToScan.Push(browserFile);
- }
- }
- bool ToggleResourceBrowserWindow()
- {
- if (browserWindow.visible == false)
- ShowResourceBrowserWindow();
- else
- HideResourceBrowserWindow();
- return true;
- }
- void ShowResourceBrowserWindow()
- {
- browserWindow.visible = true;
- browserWindow.BringToFront();
- ui.focusElement = browserSearch;
- }
- void HideResourceBrowserWindow()
- {
- browserWindow.visible = false;
- }
- void ToggleResourceFilterWindow()
- {
- if (browserFilterWindow.visible)
- HideResourceFilterWindow();
- else
- ShowResourceFilterWindow();
- }
- void HideResourceFilterWindow()
- {
- browserFilterWindow.visible = false;
- }
- void ShowResourceFilterWindow()
- {
- int x = browserWindow.position.x + browserWindow.width - browserFilterWindow.width;
- int y = browserWindow.position.y - browserFilterWindow.height - 1;
- browserFilterWindow.position = IntVector2(x,y);
- browserFilterWindow.visible = true;
- browserFilterWindow.BringToFront();
- }
- void PopulateResourceDirFilters()
- {
- UIElement@ resourceDirs = browserFilterWindow.GetChild("DirFilters", true);
- resourceDirs.RemoveAllChildren();
- activeResourceDirFilters.Clear();
- for (uint i=0; i < cache.resourceDirs.length; ++i)
- {
- UIElement@ resourceDirHolder = UIElement();
- resourceDirs.AddChild(resourceDirHolder);
- resourceDirHolder.layoutMode = LM_HORIZONTAL;
- resourceDirHolder.layoutSpacing = 4;
- resourceDirHolder.SetFixedHeight(16);
- Text@ label = Text();
- label.style = "EditorAttributeText";
- label.text = cache.resourceDirs[i].Replaced(fileSystem.programDir, "");
- CheckBox@ checkbox = CheckBox();
- checkbox.name = i;
- checkbox.SetStyleAuto();
- checkbox.vars[TEXT_VAR_RESOURCE_DIR_ID] = i;
- checkbox.checked = true;
- SubscribeToEvent(checkbox, "Toggled", "HandleResourceDirFilterToggled");
- resourceDirHolder.AddChild(checkbox);
- resourceDirHolder.AddChild(label);
- }
- }
- void PopulateBrowserDirectories()
- {
- browserDirList.RemoveAllItems();
- CreateDirList(rootDir);
- browserDirList.selection = 0;
- }
- void PopulateResourceBrowserFilesByDirectory(BrowserDir@ dir)
- {
- @selectedBrowserDirectory = dir;
- browserFileList.RemoveAllItems();
- if (dir is null) return;
- Array<BrowserFile@> files;
- for(uint x=0; x < dir.files.length; x++)
- {
- BrowserFile@ file = dir.files[x];
- if (activeResourceTypeFilters.Find(file.resourceType) == -1)
- files.Push(file);
- }
- // Sort alphetically
- browserSearchSortMode = BROWSER_SORT_MODE_ALPHA;
- files.Sort();
- PopulateResourceBrowserResults(files);
- browserResultsMessage.text = localization.Get("Showing files: ") + files.length;
- }
- void PopulateResourceBrowserBySearch()
- {
- String query = browserSearch.text;
- Array<int> scores;
- Array<BrowserFile@> scored;
- Array<BrowserFile@> filtered;
- {
- BrowserFile@ file;
- for(uint x=0; x < browserFiles.length; x++)
- {
- @file = browserFiles[x];
- file.sortScore = -1;
- if (activeResourceTypeFilters.Find(file.resourceType) > -1)
- continue;
- if (activeResourceDirFilters.Find(file.resourceSourceIndex) > -1)
- continue;
- int find = file.fullname.Find(query, 0, false);
- if (find > -1)
- {
- int fudge = query.length - file.fullname.length;
- int score = find * int(Abs(fudge*2)) + int(Abs(fudge));
- file.sortScore = score;
- scored.Push(file);
- scores.Push(score);
- }
- }
- }
- // cut this down for a faster sort
- if (scored.length > BROWSER_SEARCH_LIMIT)
- {
- scores.Sort();
- int scoreThreshold = scores[BROWSER_SEARCH_LIMIT];
- BrowserFile@ file;
- for(uint x=0;x<scored.length;x++)
- {
- file = scored[x];
- if (file.sortScore <= scoreThreshold)
- filtered.Push(file);
- }
- }
- else
- filtered = scored;
- browserSearchSortMode = BROWSER_SORT_MODE_ALPHA;
- filtered.Sort();
- PopulateResourceBrowserResults(filtered);
- browserResultsMessage.text = "Showing top " + filtered.length + " of " + scored.length + " results";
- }
- void PopulateResourceBrowserResults(Array<BrowserFile@>@ files)
- {
- browserFileList.RemoveAllItems();
- for(uint i=0; i < files.length; ++i)
- CreateFileList(files[i]);
- }
- void RefreshBrowserResults()
- {
- if (browserSearch.text.empty)
- {
- browserDirList.visible = true;
- PopulateResourceBrowserFilesByDirectory(selectedBrowserDirectory);
- }
- else
- {
- browserDirList.visible = false;
- PopulateResourceBrowserBySearch();
- }
- }
- void HandleResourceTypeFilterToggleAllTypesToggled(StringHash eventType, VariantMap& eventData)
- {
- CheckBox@ checkbox = eventData["Element"].GetPtr();
- UIElement@ filterHolder = browserFilterWindow.GetChild("TypeFilters", true);
- Array<UIElement@> children = filterHolder.GetChildren(true);
- ignoreRefreshBrowserResults = true;
- for(uint i=0; i < children.length; ++i)
- {
- CheckBox@ filter = children[i];
- if (filter !is null)
- filter.checked = checkbox.checked;
- }
- ignoreRefreshBrowserResults = false;
- RefreshBrowserResults();
- }
- void HandleResourceTypeFilterToggled(StringHash eventType, VariantMap& eventData)
- {
- CheckBox@ checkbox = eventData["Element"].GetPtr();
- if (!checkbox.vars.Contains(TEXT_VAR_RESOURCE_TYPE))
- return;
- int resourceType = checkbox.GetVar(TEXT_VAR_RESOURCE_TYPE).GetInt();
- int find = activeResourceTypeFilters.Find(resourceType);
- if (checkbox.checked && find != -1)
- activeResourceTypeFilters.Erase(find);
- else if (!checkbox.checked && find == -1)
- activeResourceTypeFilters.Push(resourceType);
- if (ignoreRefreshBrowserResults == false)
- RefreshBrowserResults();
- }
- void HandleResourceDirFilterToggleAllTypesToggled(StringHash eventType, VariantMap& eventData)
- {
- CheckBox@ checkbox = eventData["Element"].GetPtr();
- UIElement@ filterHolder = browserFilterWindow.GetChild("DirFilters", true);
- Array<UIElement@> children = filterHolder.GetChildren(true);
- ignoreRefreshBrowserResults = true;
- for(uint i=0; i < children.length; ++i)
- {
- CheckBox@ filter = children[i];
- if (filter !is null)
- filter.checked = checkbox.checked;
- }
- ignoreRefreshBrowserResults = false;
- RebuildResourceDatabase();
- }
- void HandleResourceDirFilterToggled(StringHash eventType, VariantMap& eventData)
- {
- CheckBox@ checkbox = eventData["Element"].GetPtr();
- if (!checkbox.vars.Contains(TEXT_VAR_RESOURCE_DIR_ID))
- return;
- int resourceDir = checkbox.GetVar(TEXT_VAR_RESOURCE_DIR_ID).GetInt();
- int find = activeResourceDirFilters.Find(resourceDir);
- if (checkbox.checked && find != -1)
- activeResourceDirFilters.Erase(find);
- else if (!checkbox.checked && find == -1)
- activeResourceDirFilters.Push(resourceDir);
- if (ignoreRefreshBrowserResults == false)
- RebuildResourceDatabase();
- }
- void HandleRescanResourceBrowserClick(StringHash eventType, VariantMap& eventData)
- {
- RebuildResourceDatabase();
- }
- void HandleResourceBrowserDirListSelectionChange(StringHash eventType, VariantMap& eventData)
- {
- if (browserDirList.selection == M_MAX_UNSIGNED)
- return;
- UIElement@ uiElement = browserDirList.GetItems()[browserDirList.selection];
- BrowserDir@ dir = GetBrowserDir(uiElement.vars[TEXT_VAR_DIR_ID].GetString());
- if (dir is null)
- return;
- PopulateResourceBrowserFilesByDirectory(dir);
- }
- void HandleResourceBrowserFileListSelectionChange(StringHash eventType, VariantMap& eventData)
- {
- if (browserFileList.selection == M_MAX_UNSIGNED)
- return;
- UIElement@ uiElement = browserFileList.GetItems()[browserFileList.selection];
- BrowserFile@ file = GetBrowserFileFromUIElement(uiElement);
- if (file is null)
- return;
- if (resourcePreviewNode !is null)
- resourcePreviewNode.Remove();
- resourcePreviewNode = resourcePreviewScene.CreateChild("PreviewNodeContainer");
- CreateResourcePreview(file.GetFullPath(), resourcePreviewNode);
- if (resourcePreviewNode !is null)
- {
- Array<BoundingBox> boxes;
- Array<Component@> staticModels = resourcePreviewNode.GetComponents("StaticModel", true);
- Array<Component@> animatedModels = resourcePreviewNode.GetComponents("AnimatedModel", true);
- for (uint i = 0; i < staticModels.length; ++i)
- boxes.Push(cast<StaticModel>(staticModels[i]).worldBoundingBox);
- for (uint i = 0; i < animatedModels.length; ++i)
- boxes.Push(cast<AnimatedModel>(animatedModels[i]).worldBoundingBox);
- if (boxes.length > 0)
- {
- Vector3 camPosition = Vector3(0.0, 0.0, -1.2);
- BoundingBox biggestBox = boxes[0];
- for (uint i = 1; i < boxes.length; ++i)
- {
- if (boxes[i].size.length > biggestBox.size.length)
- biggestBox = boxes[i];
- }
- resourcePreviewCameraNode.position = biggestBox.center + camPosition * biggestBox.size.length;
- }
- resourcePreviewScene.AddChild(resourcePreviewNode);
- RefreshBrowserPreview();
- }
- }
- void HandleResourceBrowserSearchTextChange(StringHash eventType, VariantMap& eventData)
- {
- RefreshBrowserResults();
- }
- BrowserFile@ GetBrowserFileFromId(uint id)
- {
- if (id == 0)
- return null;
- BrowserFile@ file;
- for(uint i=0; i<browserFiles.length; ++i)
- {
- @file = @browserFiles[i];
- if (file.id == id) return file;
- }
- return null;
- }
- BrowserFile@ GetBrowserFileFromUIElement(UIElement@ element)
- {
- if (element is null || !element.vars.Contains(TEXT_VAR_FILE_ID))
- return null;
- return GetBrowserFileFromId(element.vars[TEXT_VAR_FILE_ID].GetUInt());
- }
- BrowserFile@ GetBrowserFileFromPath(String path)
- {
- for (uint i=0; i < browserFiles.length; ++i)
- {
- BrowserFile@ file = browserFiles[i];
- if (path == file.GetFullPath())
- return file;
- }
- return null;
- }
- void HandleBrowserEditResource(StringHash eventType, VariantMap& eventData)
- {
- UIElement@ element = eventData["Element"].GetPtr();
- BrowserFile@ file = GetBrowserFileFromUIElement(element);
- if (file is null)
- return;
- if (file.resourceType == RESOURCE_TYPE_MATERIAL)
- {
- Material@ material = cache.GetResource("Material", file.resourceKey);
- if (material !is null)
- EditMaterial(material);
- }
- if (file.resourceType == RESOURCE_TYPE_PARTICLEEFFECT)
- {
- ParticleEffect@ particleEffect = cache.GetResource("ParticleEffect", file.resourceKey);
- if (particleEffect !is null)
- EditParticleEffect(particleEffect);
- }
- }
- void HandleBrowserOpenResource(StringHash eventType, VariantMap& eventData)
- {
- UIElement@ element = eventData["Element"].GetPtr();
- BrowserFile@ file = GetBrowserFileFromUIElement(element);
- if (file !is null)
- OpenResource(file.resourceKey);
- }
- void HandleBrowserImportScene(StringHash eventType, VariantMap& eventData)
- {
- UIElement@ element = eventData["Element"].GetPtr();
- BrowserFile@ file = GetBrowserFileFromUIElement(element);
- if (file !is null)
- ImportScene(file.GetFullPath());
- }
- void HandleBrowserImportModel(StringHash eventType, VariantMap& eventData)
- {
- UIElement@ element = eventData["Element"].GetPtr();
- BrowserFile@ file = GetBrowserFileFromUIElement(element);
- if (file !is null)
- ImportModel(file.GetFullPath());
- }
- void HandleBrowserOpenUILayout(StringHash eventType, VariantMap& eventData)
- {
- UIElement@ element = eventData["Element"].GetPtr();
- BrowserFile@ file = GetBrowserFileFromUIElement(element);
- if (file !is null)
- OpenUILayout(file.GetFullPath());
- }
- void HandleBrowserInstantiateStaticModel(StringHash eventType, VariantMap& eventData)
- {
- UIElement@ element = eventData["Element"].GetPtr();
- BrowserFile@ file = GetBrowserFileFromUIElement(element);
- if (file !is null)
- CreateModelWithStaticModel(file.resourceKey, editNode);
- }
- void HandleBrowserInstantiateAnimatedModel(StringHash eventType, VariantMap& eventData)
- {
- UIElement@ element = eventData["Element"].GetPtr();
- BrowserFile@ file = GetBrowserFileFromUIElement(element);
- if (file !is null)
- CreateModelWithAnimatedModel(file.resourceKey, editNode);
- }
- void HandleBrowserInstantiatePrefab(StringHash eventType, VariantMap& eventData)
- {
- UIElement@ element = eventData["Element"].GetPtr();
- BrowserFile@ file = GetBrowserFileFromUIElement(element);
- if (file !is null)
- LoadNode(file.GetFullPath());
- }
- void HandleBrowserInstantiateInSpawnEditor(StringHash eventType, VariantMap& eventData)
- {
- UIElement@ element = eventData["Element"].GetPtr();
- BrowserFile@ file = GetBrowserFileFromUIElement(element);
- if (file !is null)
- {
- spawnedObjectsNames.Resize(1);
- spawnedObjectsNames[0] = VerifySpawnedObjectFile(file.GetPath());
- RefreshPickedObjects();
- ShowSpawnEditor();
- }
- }
- void HandleBrowserLoadScene(StringHash eventType, VariantMap& eventData)
- {
- UIElement@ element = eventData["Element"].GetPtr();
- BrowserFile@ file = GetBrowserFileFromUIElement(element);
- if (file !is null)
- LoadScene(file.GetFullPath());
- }
- void HandleBrowserRunScript(StringHash eventType, VariantMap& eventData)
- {
- UIElement@ element = eventData["Element"].GetPtr();
- BrowserFile@ file = GetBrowserFileFromUIElement(element);
- if (file !is null)
- ExecuteScript(ExtractFileName(eventData));
- }
- void HandleBrowserFileDragBegin(StringHash eventType, VariantMap& eventData)
- {
- UIElement@ uiElement = eventData["Element"].GetPtr();
- @browserDragFile = GetBrowserFileFromUIElement(uiElement);
- }
- void HandleBrowserFileDragEnd(StringHash eventType, VariantMap& eventData)
- {
- if (@browserDragFile is null)
- return;
- UIElement@ element = ui.GetElementAt(ui.cursor.screenPosition);
- if (element !is null)
- return;
- if (browserDragFile.resourceType == RESOURCE_TYPE_MATERIAL)
- {
- StaticModel@ model = cast<StaticModel>(GetDrawableAtMousePostion());
- if (model !is null)
- {
- AssignMaterial(model, browserDragFile.resourceKey);
- }
- }
- else if (browserDragFile.resourceType == RESOURCE_TYPE_PREFAB)
- {
- LoadNode(browserDragFile.GetFullPath(), null, true);
- }
- else if (browserDragFile.resourceType == RESOURCE_TYPE_MODEL)
- {
- Node@ createdNode = CreateNode(REPLICATED, true);
- Model@ model = cache.GetResource("Model", browserDragFile.resourceKey);
- if (model.skeleton.numBones > 0)
- {
- AnimatedModel@ am = createdNode.CreateComponent("AnimatedModel");
- am.model = model;
- }
- else
- {
- StaticModel@ sm = createdNode.CreateComponent("StaticModel");
- sm.model = model;
- }
- AdjustNodePositionByAABB(createdNode);
- }
- browserDragFile = null;
- browserDragComponent = null;
- browserDragNode = null;
- }
- void HandleFileChanged(StringHash eventType, VariantMap& eventData)
- {
- String filename = eventData["FileName"].GetString();
- BrowserFile@ file = GetBrowserFileFromPath(filename);
- if (file is null)
- {
- // TODO: new file logic when watchers are supported
- return;
- }
- else
- {
- file.FileChanged();
- }
- }
- Menu@ CreateBrowserFileActionMenu(String text, String handler, BrowserFile@ browserFile = null)
- {
- Menu@ menu = CreateContextMenuItem(text, handler);
- if (browserFile !is null)
- menu.vars[TEXT_VAR_FILE_ID] = browserFile.id;
- return menu;
- }
- int GetResourceType(String path)
- {
- StringHash fileType;
- return GetResourceType(path, fileType);
- }
- int GetResourceType(String path, StringHash &out fileType, bool useCache = false)
- {
- if (GetExtensionType(path, fileType) || GetBinaryType(path, fileType, useCache) || GetXmlType(path, fileType, useCache))
- return GetResourceType(fileType);
- return RESOURCE_TYPE_UNKNOWN;
- }
- int GetResourceType(StringHash fileType)
- {
- // Binary filetypes
- if (fileType == BINARY_TYPE_SCENE)
- return RESOURCE_TYPE_SCENE;
- else if (fileType == BINARY_TYPE_PACKAGE)
- return RESOURCE_TYPE_UNUSABLE;
- else if (fileType == BINARY_TYPE_COMPRESSED_PACKAGE)
- return RESOURCE_TYPE_UNUSABLE;
- else if (fileType == BINARY_TYPE_ANGELSCRIPT)
- return RESOURCE_TYPE_SCRIPTFILE;
- else if (fileType == BINARY_TYPE_MODEL || fileType == BINARY_TYPE_MODEL2)
- return RESOURCE_TYPE_MODEL;
- else if (fileType == BINARY_TYPE_SHADER)
- return RESOURCE_TYPE_UNUSABLE;
- else if (fileType == BINARY_TYPE_ANIMATION)
- return RESOURCE_TYPE_ANIMATION;
- // XML filetypes
- else if (fileType == XML_TYPE_SCENE)
- return RESOURCE_TYPE_SCENE;
- else if (fileType == XML_TYPE_NODE)
- return RESOURCE_TYPE_PREFAB;
- else if(fileType == XML_TYPE_MATERIAL)
- return RESOURCE_TYPE_MATERIAL;
- else if(fileType == XML_TYPE_TECHNIQUE)
- return RESOURCE_TYPE_TECHNIQUE;
- else if(fileType == XML_TYPE_PARTICLEEFFECT)
- return RESOURCE_TYPE_PARTICLEEFFECT;
- else if(fileType == XML_TYPE_PARTICLEEMITTER)
- return RESOURCE_TYPE_PARTICLEEMITTER;
- else if(fileType == XML_TYPE_TEXTURE)
- return RESOURCE_TYPE_TEXTURE;
- else if(fileType == XML_TYPE_ELEMENT)
- return RESOURCE_TYPE_UIELEMENT;
- else if(fileType == XML_TYPE_ELEMENTS)
- return RESOURCE_TYPE_UIELEMENTS;
- else if (fileType == XML_TYPE_ANIMATION_SETTINGS)
- return RESOURCE_TYPE_ANIMATION_SETTINGS;
- else if (fileType == XML_TYPE_RENDERPATH)
- return RESOURCE_TYPE_RENDERPATH;
- else if (fileType == XML_TYPE_TEXTURE_ATLAS)
- return RESOURCE_TYPE_TEXTURE_ATLAS;
- else if (fileType == XML_TYPE_2D_PARTICLE_EFFECT)
- return RESOURCE_TYPE_2D_PARTICLE_EFFECT;
- else if (fileType == XML_TYPE_TEXTURE_3D)
- return RESOURCE_TYPE_TEXTURE_3D;
- else if (fileType == XML_TYPE_CUBEMAP)
- return RESOURCE_TYPE_CUBEMAP;
- else if (fileType == XML_TYPE_SPRITER_DATA)
- return RESOURCE_TYPE_2D_ANIMATION_SET;
- else if (fileType == XML_TYPE_GENERIC)
- return RESOURCE_TYPE_GENERIC_XML;
- // JSON filetypes
- else if (fileType == JSON_TYPE_SCENE)
- return RESOURCE_TYPE_SCENE;
- else if (fileType == JSON_TYPE_NODE)
- return RESOURCE_TYPE_PREFAB;
- else if(fileType == JSON_TYPE_MATERIAL)
- return RESOURCE_TYPE_MATERIAL;
- else if(fileType == JSON_TYPE_TECHNIQUE)
- return RESOURCE_TYPE_TECHNIQUE;
- else if(fileType == JSON_TYPE_PARTICLEEFFECT)
- return RESOURCE_TYPE_PARTICLEEFFECT;
- else if(fileType == JSON_TYPE_PARTICLEEMITTER)
- return RESOURCE_TYPE_PARTICLEEMITTER;
- else if(fileType == JSON_TYPE_TEXTURE)
- return RESOURCE_TYPE_TEXTURE;
- else if(fileType == JSON_TYPE_ELEMENT)
- return RESOURCE_TYPE_UIELEMENT;
- else if(fileType == JSON_TYPE_ELEMENTS)
- return RESOURCE_TYPE_UIELEMENTS;
- else if (fileType == JSON_TYPE_ANIMATION_SETTINGS)
- return RESOURCE_TYPE_ANIMATION_SETTINGS;
- else if (fileType == JSON_TYPE_RENDERPATH)
- return RESOURCE_TYPE_RENDERPATH;
- else if (fileType == JSON_TYPE_TEXTURE_ATLAS)
- return RESOURCE_TYPE_TEXTURE_ATLAS;
- else if (fileType == JSON_TYPE_2D_PARTICLE_EFFECT)
- return RESOURCE_TYPE_2D_PARTICLE_EFFECT;
- else if (fileType == JSON_TYPE_TEXTURE_3D)
- return RESOURCE_TYPE_TEXTURE_3D;
- else if (fileType == JSON_TYPE_CUBEMAP)
- return RESOURCE_TYPE_CUBEMAP;
- else if (fileType == JSON_TYPE_SPRITER_DATA)
- return RESOURCE_TYPE_2D_ANIMATION_SET;
- else if (fileType == JSON_TYPE_GENERIC)
- return RESOURCE_TYPE_GENERIC_JSON;
- // Extension filetypes
- else if (fileType == EXTENSION_TYPE_TTF)
- return RESOURCE_TYPE_FONT;
- else if (fileType == EXTENSION_TYPE_OTF)
- return RESOURCE_TYPE_FONT;
- else if (fileType == EXTENSION_TYPE_OGG)
- return RESOURCE_TYPE_SOUND;
- else if(fileType == EXTENSION_TYPE_WAV)
- return RESOURCE_TYPE_SOUND;
- else if(fileType == EXTENSION_TYPE_DDS)
- return RESOURCE_TYPE_IMAGE;
- else if(fileType == EXTENSION_TYPE_PNG)
- return RESOURCE_TYPE_IMAGE;
- else if(fileType == EXTENSION_TYPE_JPG)
- return RESOURCE_TYPE_IMAGE;
- else if(fileType == EXTENSION_TYPE_JPEG)
- return RESOURCE_TYPE_IMAGE;
- else if(fileType == EXTENSION_TYPE_HDR)
- return RESOURCE_TYPE_IMAGE;
- else if(fileType == EXTENSION_TYPE_BMP)
- return RESOURCE_TYPE_IMAGE;
- else if(fileType == EXTENSION_TYPE_TGA)
- return RESOURCE_TYPE_IMAGE;
- else if(fileType == EXTENSION_TYPE_KTX)
- return RESOURCE_TYPE_IMAGE;
- else if(fileType == EXTENSION_TYPE_PVR)
- return RESOURCE_TYPE_IMAGE;
- else if(fileType == EXTENSION_TYPE_OBJ)
- return RESOURCE_TYPE_UNUSABLE;
- else if(fileType == EXTENSION_TYPE_FBX)
- return RESOURCE_TYPE_UNUSABLE;
- else if(fileType == EXTENSION_TYPE_COLLADA)
- return RESOURCE_TYPE_UNUSABLE;
- else if(fileType == EXTENSION_TYPE_BLEND)
- return RESOURCE_TYPE_UNUSABLE;
- else if(fileType == EXTENSION_TYPE_ANGELSCRIPT)
- return RESOURCE_TYPE_SCRIPTFILE;
- else if(fileType == EXTENSION_TYPE_LUASCRIPT)
- return RESOURCE_TYPE_SCRIPTFILE;
- else if(fileType == EXTENSION_TYPE_HLSL)
- return RESOURCE_TYPE_UNUSABLE;
- else if(fileType == EXTENSION_TYPE_GLSL)
- return RESOURCE_TYPE_UNUSABLE;
- else if(fileType == EXTENSION_TYPE_FRAGMENTSHADER)
- return RESOURCE_TYPE_UNUSABLE;
- else if(fileType == EXTENSION_TYPE_VERTEXSHADER)
- return RESOURCE_TYPE_UNUSABLE;
- else if(fileType == EXTENSION_TYPE_HTML)
- return RESOURCE_TYPE_UNUSABLE;
- return RESOURCE_TYPE_UNKNOWN;
- }
- bool GetExtensionType(String path, StringHash &out fileType)
- {
- StringHash type = StringHash(GetExtension(path));
- if (type == EXTENSION_TYPE_TTF)
- fileType = EXTENSION_TYPE_TTF;
- else if (type == EXTENSION_TYPE_OTF)
- fileType = EXTENSION_TYPE_OTF;
- else if (type == EXTENSION_TYPE_OGG)
- fileType = EXTENSION_TYPE_OGG;
- else if(type == EXTENSION_TYPE_WAV)
- fileType = EXTENSION_TYPE_WAV;
- else if(type == EXTENSION_TYPE_DDS)
- fileType = EXTENSION_TYPE_DDS;
- else if(type == EXTENSION_TYPE_PNG)
- fileType = EXTENSION_TYPE_PNG;
- else if(type == EXTENSION_TYPE_JPG)
- fileType = EXTENSION_TYPE_JPG;
- else if(type == EXTENSION_TYPE_JPEG)
- fileType = EXTENSION_TYPE_JPEG;
- else if(type == EXTENSION_TYPE_HDR)
- fileType = EXTENSION_TYPE_HDR;
- else if(type == EXTENSION_TYPE_BMP)
- fileType = EXTENSION_TYPE_BMP;
- else if(type == EXTENSION_TYPE_TGA)
- fileType = EXTENSION_TYPE_TGA;
- else if(type == EXTENSION_TYPE_KTX)
- fileType = EXTENSION_TYPE_KTX;
- else if(type == EXTENSION_TYPE_PVR)
- fileType = EXTENSION_TYPE_PVR;
- else if(type == EXTENSION_TYPE_OBJ)
- fileType = EXTENSION_TYPE_OBJ;
- else if(type == EXTENSION_TYPE_FBX)
- fileType = EXTENSION_TYPE_FBX;
- else if(type == EXTENSION_TYPE_COLLADA)
- fileType = EXTENSION_TYPE_COLLADA;
- else if(type == EXTENSION_TYPE_BLEND)
- fileType = EXTENSION_TYPE_BLEND;
- else if(type == EXTENSION_TYPE_ANGELSCRIPT)
- fileType = EXTENSION_TYPE_ANGELSCRIPT;
- else if(type == EXTENSION_TYPE_LUASCRIPT)
- fileType = EXTENSION_TYPE_LUASCRIPT;
- else if(type == EXTENSION_TYPE_HLSL)
- fileType = EXTENSION_TYPE_HLSL;
- else if(type == EXTENSION_TYPE_GLSL)
- fileType = EXTENSION_TYPE_GLSL;
- else if(type == EXTENSION_TYPE_FRAGMENTSHADER)
- fileType = EXTENSION_TYPE_FRAGMENTSHADER;
- else if(type == EXTENSION_TYPE_VERTEXSHADER)
- fileType = EXTENSION_TYPE_VERTEXSHADER;
- else if(type == EXTENSION_TYPE_HTML)
- fileType = EXTENSION_TYPE_HTML;
- else
- return false;
- return true;
- }
- bool GetBinaryType(String path, StringHash &out fileType, bool useCache = false)
- {
- StringHash type;
- if (useCache)
- {
- File@ file = cache.GetFile(path);
- if (file is null)
- return false;
- if (file.size == 0)
- return false;
- type = StringHash(file.ReadFileID());
- }
- else
- {
- File@ file = File();
- if (!file.Open(path))
- return false;
- if (file.size == 0)
- return false;
- type = StringHash(file.ReadFileID());
- }
- if (type == BINARY_TYPE_SCENE)
- fileType = BINARY_TYPE_SCENE;
- else if (type == BINARY_TYPE_PACKAGE)
- fileType = BINARY_TYPE_PACKAGE;
- else if (type == BINARY_TYPE_COMPRESSED_PACKAGE)
- fileType = BINARY_TYPE_COMPRESSED_PACKAGE;
- else if (type == BINARY_TYPE_ANGELSCRIPT)
- fileType = BINARY_TYPE_ANGELSCRIPT;
- else if (type == BINARY_TYPE_MODEL || type == BINARY_TYPE_MODEL2)
- fileType = BINARY_TYPE_MODEL;
- else if (type == BINARY_TYPE_SHADER)
- fileType = BINARY_TYPE_SHADER;
- else if (type == BINARY_TYPE_ANIMATION)
- fileType = BINARY_TYPE_ANIMATION;
- else
- return false;
- return true;
- }
- bool GetXmlType(String path, StringHash &out fileType, bool useCache = false)
- {
- if (GetFileName(path).length == 0)
- return false; // .gitignore etc.
- String extension = GetExtension(path);
- if (extension == ".txt" || extension == ".json" || extension == ".icns" || extension == ".atlas")
- return false;
- String name;
- if (useCache)
- {
- XMLFile@ xml = cache.GetResource("XMLFile", path);
- if (xml is null)
- return false;
- name = xml.root.name;
- }
- else
- {
- File@ file = File();
- if (!file.Open(path))
- return false;
- if (file.size == 0)
- return false;
- XMLFile@ xml = XMLFile();
- if (xml.Load(file))
- name = xml.root.name;
- else
- return false;
- }
- bool found = false;
- if (!name.empty)
- {
- found = true;
- StringHash type = StringHash(name);
- if (type == XML_TYPE_SCENE)
- fileType = XML_TYPE_SCENE;
- else if (type == XML_TYPE_NODE)
- fileType = XML_TYPE_NODE;
- else if(type == XML_TYPE_MATERIAL)
- fileType = XML_TYPE_MATERIAL;
- else if(type == XML_TYPE_TECHNIQUE)
- fileType = XML_TYPE_TECHNIQUE;
- else if(type == XML_TYPE_PARTICLEEFFECT)
- fileType = XML_TYPE_PARTICLEEFFECT;
- else if(type == XML_TYPE_PARTICLEEMITTER)
- fileType = XML_TYPE_PARTICLEEMITTER;
- else if(type == XML_TYPE_TEXTURE)
- fileType = XML_TYPE_TEXTURE;
- else if(type == XML_TYPE_ELEMENT)
- fileType = XML_TYPE_ELEMENT;
- else if(type == XML_TYPE_ELEMENTS)
- fileType = XML_TYPE_ELEMENTS;
- else if (type == XML_TYPE_ANIMATION_SETTINGS)
- fileType = XML_TYPE_ANIMATION_SETTINGS;
- else if (type == XML_TYPE_RENDERPATH)
- fileType = XML_TYPE_RENDERPATH;
- else if (type == XML_TYPE_TEXTURE_ATLAS)
- fileType = XML_TYPE_TEXTURE_ATLAS;
- else if (type == XML_TYPE_2D_PARTICLE_EFFECT)
- fileType = XML_TYPE_2D_PARTICLE_EFFECT;
- else if (type == XML_TYPE_TEXTURE_3D)
- fileType = XML_TYPE_TEXTURE_3D;
- else if (type == XML_TYPE_CUBEMAP)
- fileType = XML_TYPE_CUBEMAP;
- else if (type == XML_TYPE_SPRITER_DATA)
- fileType = XML_TYPE_SPRITER_DATA;
- else
- fileType = XML_TYPE_GENERIC;
- }
- return found;
- }
- String ResourceTypeName(int resourceType)
- {
- if (resourceType == RESOURCE_TYPE_UNUSABLE)
- return "Unusable";
- else if (resourceType == RESOURCE_TYPE_UNKNOWN)
- return "Unknown";
- else if (resourceType == RESOURCE_TYPE_NOTSET)
- return "Uninitialized";
- else if (resourceType == RESOURCE_TYPE_SCENE)
- return "Scene";
- else if (resourceType == RESOURCE_TYPE_SCRIPTFILE)
- return "Script File";
- else if (resourceType == RESOURCE_TYPE_MODEL)
- return "Model";
- else if (resourceType == RESOURCE_TYPE_MATERIAL)
- return "Material";
- else if (resourceType == RESOURCE_TYPE_ANIMATION)
- return "Animation";
- else if (resourceType == RESOURCE_TYPE_IMAGE)
- return "Image";
- else if (resourceType == RESOURCE_TYPE_SOUND)
- return "Sound";
- else if (resourceType == RESOURCE_TYPE_TEXTURE)
- return "Texture";
- else if (resourceType == RESOURCE_TYPE_FONT)
- return "Font";
- else if (resourceType == RESOURCE_TYPE_PREFAB)
- return "Prefab";
- else if (resourceType == RESOURCE_TYPE_TECHNIQUE)
- return "Render Technique";
- else if (resourceType == RESOURCE_TYPE_PARTICLEEFFECT)
- return "Particle Effect";
- else if (resourceType == RESOURCE_TYPE_PARTICLEEMITTER)
- return "Particle Emitter";
- else if (resourceType == RESOURCE_TYPE_UIELEMENT)
- return "UI Element";
- else if (resourceType == RESOURCE_TYPE_UIELEMENTS)
- return "UI Elements";
- else if (resourceType == RESOURCE_TYPE_ANIMATION_SETTINGS)
- return "Animation Settings";
- else if (resourceType == RESOURCE_TYPE_RENDERPATH)
- return "Render Path";
- else if (resourceType == RESOURCE_TYPE_TEXTURE_ATLAS)
- return "Texture Atlas";
- else if (resourceType == RESOURCE_TYPE_2D_PARTICLE_EFFECT)
- return "2D Particle Effect";
- else if (resourceType == RESOURCE_TYPE_TEXTURE_3D)
- return "Texture 3D";
- else if (resourceType == RESOURCE_TYPE_CUBEMAP)
- return "Cubemap";
- else if (resourceType == RESOURCE_TYPE_2D_ANIMATION_SET)
- return "2D Animation Set";
- else
- return "";
- }
- class BrowserDir
- {
- uint id;
- String resourceKey;
- String name;
- Array<BrowserDir@> children;
- Array<BrowserFile@> files;
- BrowserDir(String path_)
- {
- resourceKey = path_;
- String parent = GetParentPath(path_);
- name = path_;
- name.Replace(parent, "");
- id = browserDirIndex++;
- }
- int opCmp(BrowserDir@ b)
- {
- return name.opCmp(b.name);
- }
- BrowserFile@ AddFile(String name, uint resourceSourceIndex, uint sourceType)
- {
- String path = resourceKey.length > 0 ? (resourceKey + "/" + name) : name;
- BrowserFile@ file = BrowserFile(path, resourceSourceIndex, sourceType);
- files.Push(file);
- return file;
- }
- }
- class BrowserFile
- {
- uint id;
- uint resourceSourceIndex;
- String resourceKey;
- String name;
- String fullname;
- String extension;
- StringHash fileType;
- int resourceType = 0;
- int sourceType = 0;
- int sortScore = 0;
- WeakHandle browserFileListRow;
- BrowserFile(String path_, uint resourceSourceIndex_, int sourceType_)
- {
- sourceType = sourceType_;
- resourceSourceIndex = resourceSourceIndex_;
- resourceKey = path_;
- name = GetFileName(path_);
- extension = GetExtension(path_);
- fullname = GetFileNameAndExtension(path_);
- id = browserFileIndex++;
- }
- int opCmp(BrowserFile@ b)
- {
- if (browserSearchSortMode == 1)
- return fullname.opCmp(b.fullname);
- else
- return sortScore - b.sortScore;
- }
- String GetResourceSource()
- {
- if (sourceType == BROWSER_FILE_SOURCE_RESOURCE_DIR)
- return cache.resourceDirs[resourceSourceIndex];
- else
- return "Unknown";
- }
- String GetFullPath()
- {
- return String(cache.resourceDirs[resourceSourceIndex] + resourceKey);
- }
- String GetPath()
- {
- return resourceKey;
- }
- void DetermainResourceType()
- {
- resourceType = GetResourceType(GetFullPath(), fileType, false);
- Text@ browserFileListRow_ = browserFileListRow.Get();
- if (browserFileListRow_ !is null)
- {
- InitializeBrowserFileListRow(browserFileListRow_, this);
- }
- }
- String ResourceTypeName()
- {
- return ::ResourceTypeName(resourceType);
- }
- void FileChanged()
- {
- if (!fileSystem.FileExists(GetFullPath()))
- {
- }
- else
- {
- }
- }
- }
- void CreateResourcePreview(String path, Node@ previewNode)
- {
- resourceBrowserPreview.autoUpdate = false;
- int resourceType = GetResourceType(path);
- if (resourceType > 0)
- {
- File file;
- file.Open(path);
- if (resourceType == RESOURCE_TYPE_MODEL)
- {
- Model@ model = Model();
- if (model.Load(file))
- {
- StaticModel@ staticModel = previewNode.CreateComponent("StaticModel");
- staticModel.model = model;
- return;
- }
- }
- else if (resourceType == RESOURCE_TYPE_MATERIAL)
- {
- Material@ material = Material();
- if (material.Load(file))
- {
- StaticModel@ staticModel = previewNode.CreateComponent("StaticModel");
- staticModel.model = cache.GetResource("Model", "Models/Sphere.mdl");
- staticModel.material = material;
- return;
- }
- }
- else if (resourceType == RESOURCE_TYPE_IMAGE)
- {
- Image@ image = Image();
- if (image.Load(file))
- {
- StaticModel@ staticModel = previewNode.CreateComponent("StaticModel");
- staticModel.model = cache.GetResource("Model", "Models/Editor/ImagePlane.mdl");
- Material@ material = cache.GetResource("Material", "Materials/Editor/TexturedUnlit.xml");
- Texture2D@ texture = Texture2D();
- texture.SetData(@image, true);
- material.textures[TextureUnit(0)] = texture;
- staticModel.material = material;
- return;
- }
- }
- else if (resourceType == RESOURCE_TYPE_PREFAB)
- {
- if (GetExtension(path) == ".xml")
- {
- XMLFile xmlFile;
- if(xmlFile.Load(file))
- if(previewNode.LoadXML(xmlFile.root) && (previewNode.GetComponents("StaticModel", true).length > 0 || previewNode.GetComponents("AnimatedModel", true).length > 0))
- {
- return;
- }
- }
- else if(previewNode.Load(file) && (previewNode.GetComponents("StaticModel", true).length > 0 || previewNode.GetComponents("AnimatedModel", true).length > 0))
- return;
- previewNode.RemoveAllChildren();
- previewNode.RemoveAllComponents();
- }
- else if (resourceType == RESOURCE_TYPE_PARTICLEEFFECT)
- {
- ParticleEffect@ particleEffect = ParticleEffect();
- if (particleEffect.Load(file))
- {
- ParticleEmitter@ particleEmitter = previewNode.CreateComponent("ParticleEmitter");
- particleEmitter.effect = particleEffect;
- particleEffect.activeTime = 0.0;
- particleEmitter.Reset();
- resourceBrowserPreview.autoUpdate = true;
- return;
- }
- }
- }
- StaticModel@ staticModel = previewNode.CreateComponent("StaticModel");
- staticModel.model = cache.GetResource("Model", "Models/Editor/ImagePlane.mdl");
- Material@ material = cache.GetResource("Material", "Materials/Editor/TexturedUnlit.xml");
- Texture2D@ texture = Texture2D();
- Image@ noPreviewImage = cache.GetResource("Image", "Textures/Editor/NoPreviewAvailable.png");
- texture.SetData(noPreviewImage, false);
- material.textures[TextureUnit(0)] = texture;
- staticModel.material = material;
- return;
- }
- void RotateResourceBrowserPreview(StringHash eventType, VariantMap& eventData)
- {
- int elemX = eventData["ElementX"].GetInt();
- int elemY = eventData["ElementY"].GetInt();
- if (resourceBrowserPreview.height > 0 && resourceBrowserPreview.width > 0)
- {
- float yaw = ((resourceBrowserPreview.height / 2) - elemY) * (90.0 / resourceBrowserPreview.height);
- float pitch = ((resourceBrowserPreview.width / 2) - elemX) * (90.0 / resourceBrowserPreview.width);
- resourcePreviewNode.rotation = resourcePreviewNode.rotation.Slerp(Quaternion(yaw, pitch, 0), 0.1);
- RefreshBrowserPreview();
- }
- }
- void RefreshBrowserPreview()
- {
- resourceBrowserPreview.QueueUpdate();
- }
- class ResourceType
- {
- int id;
- String name;
- ResourceType(int id_, String name_)
- {
- id = id_;
- name = name_;
- }
- int opCmp(ResourceType@ b)
- {
- return name.opCmp(b.name);
- }
- }
|