diff --git a/Nerfed.Compiler/Compiler.cs b/Nerfed.Compiler/Compiler.cs index 9433833..aeaf91d 100644 --- a/Nerfed.Compiler/Compiler.cs +++ b/Nerfed.Compiler/Compiler.cs @@ -53,6 +53,7 @@ public static bool Compile(string projectFilePath, string configuration = "Debug } else { + Console.WriteLine($"ERROR: Platform not supported!"); return false; } diff --git a/Nerfed.Compiler/Project.cs b/Nerfed.Compiler/Project.cs index e709622..6c0d74d 100644 --- a/Nerfed.Compiler/Project.cs +++ b/Nerfed.Compiler/Project.cs @@ -9,8 +9,6 @@ public class Project public static bool Create(string path, string name, out Project project) { - project = null; - // Create project file. project = new Project { diff --git a/Nerfed.Editor/Nerfed.Editor.csproj b/Nerfed.Editor/Nerfed.Editor.csproj index 3e76714..d8b0a75 100644 --- a/Nerfed.Editor/Nerfed.Editor.csproj +++ b/Nerfed.Editor/Nerfed.Editor.csproj @@ -23,6 +23,7 @@ + diff --git a/Nerfed.Editor/Project/Project.cs b/Nerfed.Editor/Project/Project.cs index e40f052..395143b 100644 --- a/Nerfed.Editor/Project/Project.cs +++ b/Nerfed.Editor/Project/Project.cs @@ -1,53 +1,25 @@ using Nerfed.Runtime; -using System.Reflection; -using System.Text.Json; namespace Nerfed.Editor.Project; -public class ProjectConfig +internal static class EditorProject { - public string Name { get; set; } - public uint Version { get; set; } - public string RuntimeProject { get; set; } -} + internal static Compiler.Project Project { get; private set; } + internal static string ProjectFilePath { get; private set; } + internal static string ProjectSolutionFilePath { get; private set; } + internal static string ProjectPath { get; private set; } + internal static string ProjectContentPath { get; private set; } + internal static string ProjectTempPath { get; private set; } -internal static class Project -{ - private const string projectFileName = ".project"; - - internal static ProjectConfig LoadedConfig { get; private set; } - internal static string ProjectDirectory { get; private set; } - internal static string ProjectContentDirectory { get; private set; } - internal static string ProjectTempDirectory { get; private set; } - - internal static bool Create(string path, string projectName) + internal static bool Create(string projectFilePath, string projectName) { - // Check if folder is empty. - if (!Directory.Exists(path)) - { - Directory.CreateDirectory(path); - } + Close(); - if(Directory.GetFiles(path).Length != 0) + if (!Compiler.Project.Create(projectFilePath, projectName, out Compiler.Project project)) { - Log.Error($"Directory {path} is not empty!"); return false; } - // Create project file. - ProjectConfig projectConfig = new ProjectConfig - { - Name = projectName, - Version = /*Nerfed.Runtime.Verion*/ 1, - }; - - // Create solution. - GenerateSolution(path, projectConfig); - - string projectFilePath = Path.Combine(path, projectFileName); - SaveProject(projectFilePath, projectConfig); - - // Open the project. Open(projectFilePath); Log.Info($"Succesfully created project."); @@ -56,180 +28,80 @@ internal static bool Create(string path, string projectName) internal static bool Open(string path) { - string projectFilePath = path; + Close(); - if (!File.Exists(projectFilePath)) { - projectFilePath = Path.Combine(path, projectFileName); - if (!File.Exists(projectFilePath)) - { - Log.Error($"Project file not found at {path} or {projectFilePath}"); - return false; - } - } - - // Load from file. - string jsonString = File.ReadAllText(projectFilePath); - ProjectConfig projectConfig = JsonSerializer.Deserialize(jsonString); - - // Check version. - if(projectConfig.Version != /*Nerfed.Runtime.Verion*/ 1) + if(!Compiler.Project.Open(path, out Compiler.Project project)) { - Log.Error($"Project runtime version does not match editor runtime verion!"); return false; } - LoadedConfig = projectConfig; - SetupDefaultFolders(Path.GetDirectoryName(projectFilePath)); - Log.Info($"Opened project: {projectConfig.Name}"); + Project = project; + ProjectFilePath = path; + ProjectPath = Path.GetDirectoryName(path); + + SetupDefaultFolders(); + Compile(); + + Log.Info($"Opened project: {project.Name}"); return true; } - internal static bool SaveProject(string path, ProjectConfig projectConfig) + internal static void Close() { - JsonSerializerOptions options = new JsonSerializerOptions(JsonSerializerOptions.Default) + Project = null; + ProjectFilePath = string.Empty; + ProjectSolutionFilePath = string.Empty; + ProjectPath = string.Empty; + ProjectContentPath = string.Empty; + ProjectTempPath = string.Empty; + } + + internal static bool Save() + { + if(Project == null) { - WriteIndented = true, - }; + return false; + } - string jsonString = JsonSerializer.Serialize(projectConfig, options); - - File.WriteAllText(path, jsonString); - - return true; + return Compiler.Project.Save(Project, ProjectFilePath); } - // Compile the project using the builder. - internal static bool CompileProject() + internal static void Compile() { - //GenerateSolution(); - //dotnet build + if(Project == null) + { + return; + } - return false; + Nerfed.Compiler.Compiler.Compile(ProjectFilePath, "Debug"); } - private static void GenerateSolution(string path, ProjectConfig projectConfig) + internal static void GenerateSolution() { - GenerateCSProjectFiles(path, projectConfig); + if(Project == null) + { + return; + } - Log.Info("Generating solution file"); - string solution = -$@" -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.10.35013.160 -MinimumVisualStudioVersion = 10.0.40219.1 -Project(""{{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}}"") = ""{projectConfig.Name}.Runtime"", ""{projectConfig.Name}.Runtime.csproj"", ""{{B04FAEF8-7D91-43A9-81C5-4BD3217B0C23}}"" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Test|x64 = Test|x64 - Release|x64 = Release|x64 - Debug|x64 = Debug|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {{B04FAEF8-7D91-43A9-81C5-4BD3217B0C23}}.Test|x64.ActiveCfg = Test|x64 - {{B04FAEF8-7D91-43A9-81C5-4BD3217B0C23}}.Test|x64.Build.0 = Test|x64 - {{B04FAEF8-7D91-43A9-81C5-4BD3217B0C23}}.Release|x64.ActiveCfg = Release|x64 - {{B04FAEF8-7D91-43A9-81C5-4BD3217B0C23}}.Release|x64.Build.0 = Release|x64 - {{B04FAEF8-7D91-43A9-81C5-4BD3217B0C23}}.Debug|x64.ActiveCfg = Debug|x64 - {{B04FAEF8-7D91-43A9-81C5-4BD3217B0C23}}.Debug|x64.Build.0 = Debug|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {{117DD74B-A4DC-48CE-B782-C7AE565A9270}} - EndGlobalSection -EndGlobal -"; - - string solutionName = projectConfig.Name + ".sln"; - string filePath = Path.Combine(path, solutionName); - - File.WriteAllText(filePath, solution); + Nerfed.Compiler.Compiler.GenerateSolution(ProjectPath, Project, out string solutionFilePath); + ProjectSolutionFilePath = solutionFilePath; } - // Inspirered by https://github.com/ProwlEngine/Prowl/blob/main/Prowl.Editor/Project.cs - // Maybe the builder should do this? - // When compiling the 'runtimeAssembly.Location' needs to be updated to where ever the one is that is being used. - private static void GenerateCSProjectFiles(string path, ProjectConfig projectConfig) + private static void SetupDefaultFolders() { - Log.Info("Generating CS project files"); + if (Project == null || ProjectPath == null) + { + return; + } - Assembly[] loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); - Assembly runtimeAssembly = loadedAssemblies.FirstOrDefault(assembly => assembly.GetName().Name == "Nerfed.Runtime") ?? throw new Exception("Failed to find Runtime Assembly!"); - - string propertyGroup = -$@" - - net8.0 - enable - disable - true - true - true - false - false - Debug;Test;Release - x64 - - - - TRACE;LOG_INFO;PROFILING - - - - TRACE;LOG_ERROR;PROFILING - true - - - - TRACE;LOG_ERROR - true - -"; - - string runtimeProject = -$@" - - {propertyGroup} - - - - - - - - {runtimeAssembly.Location} - false - - - -"; - - string runtimeProjectName = projectConfig.Name + ".Runtime.csproj"; - string filePath = Path.Combine(path, runtimeProjectName); - - File.WriteAllText(filePath, runtimeProject); - - projectConfig.RuntimeProject = runtimeProjectName; - Log.Info($"Generated runtime at {filePath}"); - - // TODO: Editor project. - } - - private static void SetupDefaultFolders(string path) - { - ProjectDirectory = path; - - string contentPath = Path.Combine(path, "Content"); + string contentPath = Path.Combine(ProjectPath, "Content"); if (!Directory.Exists(contentPath)) { Directory.CreateDirectory(contentPath); } - ProjectContentDirectory = contentPath; - string scriptsPath = Path.Combine(ProjectContentDirectory, "Scripts"); + ProjectContentPath = contentPath; + string scriptsPath = Path.Combine(ProjectContentPath, "Scripts"); if (!Directory.Exists(scriptsPath)) { Directory.CreateDirectory(scriptsPath); @@ -240,11 +112,11 @@ private static void SetupDefaultFolders(string path) Directory.CreateDirectory(scriptsRuntimePath); } - string tempPath = Path.Combine(path, "Temp"); + string tempPath = Path.Combine(ProjectPath, "Temp"); if (!Directory.Exists(tempPath)) { Directory.CreateDirectory(tempPath); } - ProjectTempDirectory = tempPath; + ProjectTempPath = tempPath; } } \ No newline at end of file diff --git a/Nerfed.Editor/Project/ProjectGui.cs b/Nerfed.Editor/Project/ProjectGui.cs index 395ed24..c83ab77 100644 --- a/Nerfed.Editor/Project/ProjectGui.cs +++ b/Nerfed.Editor/Project/ProjectGui.cs @@ -4,38 +4,64 @@ namespace Nerfed.Editor.Project { internal static class ProjectGui { - private static string projectDirectory = string.Empty; + private static string projectPath = string.Empty; private static string projectName = string.Empty; + private static string projectFilePath = string.Empty; internal static void OnGui() { ImGui.Begin("Project"); + ImGui.BeginGroup(); - ImGui.InputText("Project Directory", ref projectDirectory, 512); + ImGui.InputText("Project Path", ref projectPath, 512); ImGui.InputText("Project Name", ref projectName, 512); + string newProjectFilePath = Path.Combine(projectPath, ".project"); + ImGui.Text(newProjectFilePath); + if (ImGui.Button("Create Project")) { - Project.Create(projectDirectory, projectName); + EditorProject.Create(newProjectFilePath, projectName); } - if(ImGui.Button("Open Project")) + ImGui.EndGroup(); + ImGui.BeginGroup(); + + ImGui.InputText("Project File Path", ref projectFilePath, 512); + if (ImGui.Button("Open Project")) { - Project.Open(projectDirectory); + EditorProject.Open(projectFilePath); } ImGui.Text("Loaded project: "); - if(Project.LoadedConfig != null) + if(EditorProject.Project != null) { - ImGui.Text(Project.LoadedConfig.Name); - ImGui.Text(Project.LoadedConfig.Version.ToString()); - ImGui.Text(Project.LoadedConfig.RuntimeProject); + ImGui.Text(EditorProject.Project.Name); + ImGui.Text(EditorProject.ProjectFilePath); + ImGui.Text(EditorProject.ProjectSolutionFilePath); + ImGui.Text(EditorProject.ProjectPath); + ImGui.Text(EditorProject.ProjectContentPath); + ImGui.Text(EditorProject.ProjectTempPath); } else { ImGui.Text("None"); } + ImGui.EndGroup(); + ImGui.BeginGroup(); + + if (ImGui.Button("Generate Solution")) + { + EditorProject.GenerateSolution(); + } + + if (ImGui.Button("Compile")) + { + EditorProject.Compile(); + } + + ImGui.EndGroup(); ImGui.End(); } }