mirror of
https://github.com/aharabada/glitchy-engine-beef.git
synced 2026-09-05 13:01:52 +00:00
Start of Create Asset Context Menu
+ Asset Hierarchy: Fixed Assets in Folder-Root not being shown
This commit is contained in:
@@ -248,15 +248,7 @@ class AssetHierarchy
|
|||||||
fsw.OnRenamed.Add(new (oldName, newName) => {
|
fsw.OnRenamed.Add(new (oldName, newName) => {
|
||||||
Log.EngineLogger.Trace($"File renamed (From \"{oldName}\" to \"{newName}\")");
|
Log.EngineLogger.Trace($"File renamed (From \"{oldName}\" to \"{newName}\")");
|
||||||
|
|
||||||
//_fileSystemDirty = true;
|
|
||||||
FileRenamed(oldName, newName);
|
FileRenamed(oldName, newName);
|
||||||
/*String contentFilePath = scope String();
|
|
||||||
|
|
||||||
Path.InternalCombine(contentFilePath, ContentDirectory, oldName);
|
|
||||||
|
|
||||||
//_fileSystemDirty = true;
|
|
||||||
TreeNode<AssetNode> fileNode = GetNodeFromPath(contentFilePath);
|
|
||||||
fileNode->*/
|
|
||||||
});
|
});
|
||||||
|
|
||||||
fsw.StartRaisingEvents();
|
fsw.StartRaisingEvents();
|
||||||
@@ -473,6 +465,9 @@ class AssetHierarchy
|
|||||||
|
|
||||||
AddDirectoryToTree(directoryNameBuffer, _assetsDirectoryNode);
|
AddDirectoryToTree(directoryNameBuffer, _assetsDirectoryNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RemoveOrphanedEntries(_assetsDirectoryNode);
|
||||||
|
AddFilesOfDirectory(_assetsDirectoryNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ResourcesDirectory.IsWhiteSpace)
|
if (!ResourcesDirectory.IsWhiteSpace)
|
||||||
@@ -487,8 +482,9 @@ class AssetHierarchy
|
|||||||
|
|
||||||
AddDirectoryToTree(directoryNameBuffer, _resourcesDirectoryNode);
|
AddDirectoryToTree(directoryNameBuffer, _resourcesDirectoryNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
RemoveOrphanedEntries(_assetRootNode);
|
RemoveOrphanedEntries(_resourcesDirectoryNode);
|
||||||
|
AddFilesOfDirectory(_resourcesDirectoryNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
//*String filter = scope $"{AssetsDirectory}/*";
|
//*String filter = scope $"{AssetsDirectory}/*";
|
||||||
|
|||||||
@@ -13,8 +13,35 @@ namespace GlitchyEditor.EditWindows
|
|||||||
{
|
{
|
||||||
using internal GlitchyEditor.EditorContentManager;
|
using internal GlitchyEditor.EditorContentManager;
|
||||||
|
|
||||||
|
class AssetCreator
|
||||||
|
{
|
||||||
|
private String _name ~ delete _;
|
||||||
|
private String _defaultFileName ~ delete _;
|
||||||
|
private CreateAssetFunc _doCreateAsset ~ delete _;
|
||||||
|
|
||||||
|
public delegate void CreateAssetFunc(StringView outputPath);
|
||||||
|
|
||||||
|
public StringView Name => _name;
|
||||||
|
public StringView DefaultFileName => _defaultFileName;
|
||||||
|
|
||||||
|
public CreateAssetFunc CreateAsset => _doCreateAsset;
|
||||||
|
|
||||||
|
public this(StringView name, StringView defaultFileName, CreateAssetFunc createAsset)
|
||||||
|
{
|
||||||
|
_name = new String(name);
|
||||||
|
_defaultFileName = new String(defaultFileName);
|
||||||
|
_doCreateAsset = createAsset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class ContentBrowserWindow : EditorWindow
|
class ContentBrowserWindow : EditorWindow
|
||||||
{
|
{
|
||||||
|
private append List<AssetCreator> _assetCreators = .() ~ ClearAndDeleteItems!(_);
|
||||||
|
|
||||||
|
private typealias AssetCreatorTree = TreeNode<(StringView Name, AssetCreator Creator)>;
|
||||||
|
|
||||||
|
private AssetCreatorTree _creatorTree = new AssetCreatorTree(("Create new Asset", null)) ~ delete _;
|
||||||
|
|
||||||
public const String s_WindowTitle = "Content Browser";
|
public const String s_WindowTitle = "Content Browser";
|
||||||
|
|
||||||
private append String _currentDirectory = .();
|
private append String _currentDirectory = .();
|
||||||
@@ -33,6 +60,28 @@ namespace GlitchyEditor.EditWindows
|
|||||||
_manager = contentManager;
|
_manager = contentManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void RegisterAssetCreator(AssetCreator assetCreator)
|
||||||
|
{
|
||||||
|
_assetCreators.Add(assetCreator);
|
||||||
|
|
||||||
|
AssetCreatorTree tree = _creatorTree;
|
||||||
|
|
||||||
|
for (StringView entryName in assetCreator.Name.Split('/'))
|
||||||
|
{
|
||||||
|
AssetCreatorTree nextNode = tree.Children.Where(scope (node) => node->Name == entryName).FirstOrDefault();
|
||||||
|
|
||||||
|
// Create new node if we didn't find it
|
||||||
|
nextNode ??= tree.AddChild((entryName, null));
|
||||||
|
|
||||||
|
tree = nextNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tree->Creator == null)
|
||||||
|
{
|
||||||
|
tree->Creator = assetCreator;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected override void InternalShow()
|
protected override void InternalShow()
|
||||||
{
|
{
|
||||||
_manager.Update();
|
_manager.Update();
|
||||||
@@ -121,6 +170,63 @@ namespace GlitchyEditor.EditWindows
|
|||||||
if (Path.OpenFolder(_currentDirectory) case .Err)
|
if (Path.OpenFolder(_currentDirectory) case .Err)
|
||||||
Log.EngineLogger.Error("Failed to open directory in file browser.");
|
Log.EngineLogger.Error("Failed to open directory in file browser.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ImGui.Separator();
|
||||||
|
|
||||||
|
ShowCreateContextMenu(_creatorTree);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Shows the menu for the given asset creator tree.
|
||||||
|
private void ShowCreateContextMenu(AssetCreatorTree subtree)
|
||||||
|
{
|
||||||
|
if (subtree.Children.Count == 0)
|
||||||
|
{
|
||||||
|
if (ImGui.MenuItem(subtree->Name.ToScopeCStr!()))
|
||||||
|
{
|
||||||
|
CreateAsset(subtree->Creator);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (ImGui.BeginMenu(subtree->Name.ToScopeCStr!()))
|
||||||
|
{
|
||||||
|
for (let node in subtree.Children)
|
||||||
|
{
|
||||||
|
ShowCreateContextMenu(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui.EndMenu();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Creates a new asset with the given creator
|
||||||
|
private void CreateAsset(AssetCreator creator)
|
||||||
|
{
|
||||||
|
if (!Directory.Exists(_currentDirectory))
|
||||||
|
{
|
||||||
|
Log.EngineLogger.Error($"Directory {_currentDirectory} doesn't exist.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String currentFile = scope String();
|
||||||
|
Path.Combine(currentFile, _currentDirectory, creator.DefaultFileName);
|
||||||
|
|
||||||
|
String fileExtension = scope String();
|
||||||
|
Path.GetExtension(currentFile, fileExtension);
|
||||||
|
|
||||||
|
StringView fileWithoutExtension = currentFile[0...^(fileExtension.Length + 1)];
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
while (File.Exists(currentFile))
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
currentFile.Set(fileWithoutExtension);
|
||||||
|
currentFile.AppendF($"({i})");
|
||||||
|
currentFile.Append(fileExtension);
|
||||||
|
}
|
||||||
|
|
||||||
|
creator.CreateAsset(currentFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Renders a sidebar that shows a tree of all directories in the asset folder.
|
/// Renders a sidebar that shows a tree of all directories in the asset folder.
|
||||||
|
|||||||
@@ -120,6 +120,8 @@ namespace GlitchyEditor
|
|||||||
|
|
||||||
InitEditor();
|
InitEditor();
|
||||||
|
|
||||||
|
RegisterAssetCreators();
|
||||||
|
|
||||||
if (args.Count >= 1)
|
if (args.Count >= 1)
|
||||||
{
|
{
|
||||||
Result<void> result = OpenProject(args[0]);
|
Result<void> result = OpenProject(args[0]);
|
||||||
@@ -137,6 +139,17 @@ namespace GlitchyEditor
|
|||||||
NewScene();
|
NewScene();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void RegisterAssetCreators()
|
||||||
|
{
|
||||||
|
Editor.Instance.ContentBrowserWindow.RegisterAssetCreator(new AssetCreator("Scene", "New Scene.scene", new (path) =>
|
||||||
|
{
|
||||||
|
using (Scene newScene = CreateNewScene())
|
||||||
|
{
|
||||||
|
SaveScene(newScene, path);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
private void InitGraphics()
|
private void InitGraphics()
|
||||||
{
|
{
|
||||||
_context = Application.Get().Window.Context..AddRef();
|
_context = Application.Get().Window.Context..AddRef();
|
||||||
@@ -893,12 +906,12 @@ namespace GlitchyEditor
|
|||||||
|
|
||||||
SceneFilePath = null;
|
SceneFilePath = null;
|
||||||
|
|
||||||
using (Scene newScene = new Scene())
|
using (Scene newScene = CreateNewScene())
|
||||||
{
|
{
|
||||||
_camera.Position = .(-1.5f, 1.5f, -2.5f);
|
_camera.Position = .(-1.5f, 1.5f, -2.5f);
|
||||||
_camera.RotationEuler = .(MathHelper.ToRadians(25), MathHelper.ToRadians(35), 0);
|
_camera.RotationEuler = .(MathHelper.ToRadians(25), MathHelper.ToRadians(35), 0);
|
||||||
|
|
||||||
// Create a default camera
|
/*// Create a default camera
|
||||||
{
|
{
|
||||||
let cameraEntity = newScene.CreateEntity("Camera");
|
let cameraEntity = newScene.CreateEntity("Camera");
|
||||||
let transform = cameraEntity.Transform;
|
let transform = cameraEntity.Transform;
|
||||||
@@ -922,13 +935,46 @@ namespace GlitchyEditor
|
|||||||
let light = lightEntity.AddComponent<LightComponent>();
|
let light = lightEntity.AddComponent<LightComponent>();
|
||||||
light.SceneLight.Illuminance = 10.0f;
|
light.SceneLight.Illuminance = 10.0f;
|
||||||
light.SceneLight.Color = .(1.0f, 0.95f, 0.8f);
|
light.SceneLight.Color = .(1.0f, 0.95f, 0.8f);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
SetReference!(_editorScene, newScene);
|
SetReference!(_editorScene, newScene);
|
||||||
_editor.CurrentScene = _editorScene;
|
_editor.CurrentScene = _editorScene;
|
||||||
SetReference!(_activeScene, _editorScene);
|
SetReference!(_activeScene, _editorScene);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Scene CreateNewScene()
|
||||||
|
{
|
||||||
|
Scene newScene = new Scene();
|
||||||
|
|
||||||
|
// Create a default camera
|
||||||
|
{
|
||||||
|
let cameraEntity = newScene.CreateEntity("Camera");
|
||||||
|
let transform = cameraEntity.Transform;
|
||||||
|
transform.Position = float3(0, 2, -5);
|
||||||
|
transform.RotationEuler = float3(0, MathHelper.ToRadians(25), 0);
|
||||||
|
|
||||||
|
let camera = cameraEntity.AddComponent<CameraComponent>();
|
||||||
|
camera.Primary = true;
|
||||||
|
camera.Camera.ProjectionType = .InfinitePerspective;
|
||||||
|
camera.Camera.PerspectiveFovY = MathHelper.ToRadians(75);
|
||||||
|
camera.Camera.PerspectiveNearPlane = 0.1f;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a default light source
|
||||||
|
{
|
||||||
|
let lightEntity = newScene.CreateEntity("Light");
|
||||||
|
let transform = lightEntity.Transform;
|
||||||
|
transform.Position = .(-3, 4, -1.5f);
|
||||||
|
transform.RotationEuler = .(MathHelper.ToRadians(20), MathHelper.ToRadians(75), MathHelper.ToRadians(20));
|
||||||
|
|
||||||
|
let light = lightEntity.AddComponent<LightComponent>();
|
||||||
|
light.SceneLight.Illuminance = 10.0f;
|
||||||
|
light.SceneLight.Color = .(1.0f, 0.95f, 0.8f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return newScene;
|
||||||
|
}
|
||||||
|
|
||||||
/// Saves the scene in the file that is was loaded from or saved to last. If there is no such path (i.e. it is a new scene) the save file dialog will open.
|
/// Saves the scene in the file that is was loaded from or saved to last. If there is no such path (i.e. it is a new scene) the save file dialog will open.
|
||||||
private void SaveScene()
|
private void SaveScene()
|
||||||
@@ -942,6 +988,12 @@ namespace GlitchyEditor
|
|||||||
SceneSerializer serializer = scope .(_editorScene);
|
SceneSerializer serializer = scope .(_editorScene);
|
||||||
serializer.Serialize(SceneFilePath);
|
serializer.Serialize(SceneFilePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void SaveScene(Scene scene, StringView fileName)
|
||||||
|
{
|
||||||
|
SceneSerializer serializer = scope .(scene);
|
||||||
|
serializer.Serialize(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
/// Opens a save file dialog and saves the scene at the user specified location.
|
/// Opens a save file dialog and saves the scene at the user specified location.
|
||||||
private void SaveSceneAs()
|
private void SaveSceneAs()
|
||||||
@@ -1009,7 +1061,7 @@ namespace GlitchyEditor
|
|||||||
|
|
||||||
if (ImGui.MenuItem(scope $"{i}: {name} ({path})"))
|
if (ImGui.MenuItem(scope $"{i}: {name} ({path})"))
|
||||||
{
|
{
|
||||||
LoadSceneFile(path);
|
//LoadSceneFile(path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1020,25 +1072,27 @@ namespace GlitchyEditor
|
|||||||
|
|
||||||
if(ImGui.BeginMenu("File", true))
|
if(ImGui.BeginMenu("File", true))
|
||||||
{
|
{
|
||||||
if (ImGui.MenuItem("Create new Project...", "Ctrl+N"))
|
if (ImGui.MenuItem("New Scene...", "Ctrl+N"))
|
||||||
_openCreateProjectModal = true;
|
|
||||||
|
|
||||||
if (ImGui.MenuItem("Open Project...", "Ctrl+O"))
|
|
||||||
ShowOpenProjectDialog();
|
|
||||||
|
|
||||||
if (ImGui.MenuItem("New", "Ctrl+N"))
|
|
||||||
NewScene();
|
NewScene();
|
||||||
|
|
||||||
if (ImGui.MenuItem("Save", "Ctrl+S"))
|
if (ImGui.MenuItem("Save Scene", "Ctrl+S"))
|
||||||
SaveScene();
|
SaveScene();
|
||||||
|
|
||||||
if (ImGui.MenuItem("Save as...", "Ctrl+Shift+S"))
|
if (ImGui.MenuItem("Save Scene as...", "Ctrl+Shift+S"))
|
||||||
SaveSceneAs();
|
SaveSceneAs();
|
||||||
|
|
||||||
if (ImGui.MenuItem("Open...", "Ctrl+O"))
|
if (ImGui.MenuItem("Open Scene...", "Ctrl+O"))
|
||||||
OpenScene();
|
OpenScene();
|
||||||
|
|
||||||
|
ImGui.Separator();
|
||||||
|
|
||||||
if (ImGui.BeginMenu("Open Recent"))
|
if (ImGui.MenuItem("Create new Project...", "Ctrl+ALT+N"))
|
||||||
|
_openCreateProjectModal = true;
|
||||||
|
|
||||||
|
if (ImGui.MenuItem("Open Project...", "Ctrl+ALT+O"))
|
||||||
|
ShowOpenProjectDialog();
|
||||||
|
|
||||||
|
if (ImGui.BeginMenu("Open recent project"))
|
||||||
{
|
{
|
||||||
DrawOpenRecentProjectMenu();
|
DrawOpenRecentProjectMenu();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user