Browse Source

Getting ScriptCompiler to work
Making path relative properly cleans up node and device properly
Properly register plain text and script code importer

Marko Pintera 10 years ago
parent
commit
e6b22c9586

+ 1 - 0
BansheeEditor/Source/BsBuildManager.cpp

@@ -9,6 +9,7 @@ namespace BansheeEngine
 		:activePlatform(PlatformType::Windows)
 		:activePlatform(PlatformType::Windows)
 	{
 	{
 		platformData.resize((UINT32)PlatformType::Count);
 		platformData.resize((UINT32)PlatformType::Count);
+		platformData[0] = bs_shared_ptr<WinPlatformInfo>();
 	}
 	}
 
 
 	RTTITypeBase* BuildData::getRTTIStatic()
 	RTTITypeBase* BuildData::getRTTIStatic()

+ 4 - 0
BansheeEditor/Source/BsEditorApplication.cpp

@@ -14,6 +14,7 @@
 #include "BsGizmoManager.h"
 #include "BsGizmoManager.h"
 #include "BsCodeEditor.h"
 #include "BsCodeEditor.h"
 #include "BsBuildManager.h"
 #include "BsBuildManager.h"
+#include "BsScriptCodeImporter.h"
 
 
 // DEBUG ONLY
 // DEBUG ONLY
 #include "DbgEditorWidget1.h"
 #include "DbgEditorWidget1.h"
@@ -81,6 +82,9 @@ namespace BansheeEngine
 			inputConfig->registerButton("Delete", BC_DELETE);
 			inputConfig->registerButton("Delete", BC_DELETE);
 		}
 		}
 
 
+		ScriptCodeImporter* scriptCodeImporter = bs_new<ScriptCodeImporter>();
+		Importer::instance()._registerAssetImporter(scriptCodeImporter);
+
 		ResourceImporter* resourceImporter = bs_new<ResourceImporter>();
 		ResourceImporter* resourceImporter = bs_new<ResourceImporter>();
 		Importer::instance()._registerAssetImporter(resourceImporter);
 		Importer::instance()._registerAssetImporter(resourceImporter);
 
 

+ 1 - 1
BansheeEditor/Source/BsProjectLibrary.cpp

@@ -347,7 +347,7 @@ namespace BansheeEngine
 		metaPath.setFilename(metaPath.getWFilename() + L".meta");
 		metaPath.setFilename(metaPath.getWFilename() + L".meta");
 
 
 		ext = ext.substr(1, ext.size() - 1); // Remove the .
 		ext = ext.substr(1, ext.size() - 1); // Remove the .
-		if(!Importer::instance().supportsFileType(ext))
+		if (!Importer::instance().supportsFileType(ext))
 			return;
 			return;
 
 
 		if(resource->meta == nullptr)
 		if(resource->meta == nullptr)

+ 5 - 0
BansheeEngine/Source/BsApplication.cpp

@@ -13,6 +13,8 @@
 #include "BsCursor.h"
 #include "BsCursor.h"
 #include "BsCoreThread.h"
 #include "BsCoreThread.h"
 #include "BsFileSystem.h"
 #include "BsFileSystem.h"
+#include "BsPlainTextImporter.h"
+#include "BsImporter.h"
 
 
 namespace BansheeEngine
 namespace BansheeEngine
 {
 {
@@ -35,6 +37,9 @@ namespace BansheeEngine
 		:CoreApplication(createStartUpDesc(primaryWindowDesc, getLibNameForRenderSystem(renderSystem), getLibNameForRenderer(renderer))),
 		:CoreApplication(createStartUpDesc(primaryWindowDesc, getLibNameForRenderSystem(renderSystem), getLibNameForRenderer(renderer))),
 		mMonoPlugin(nullptr), mSBansheeEnginePlugin(nullptr)
 		mMonoPlugin(nullptr), mSBansheeEnginePlugin(nullptr)
 	{
 	{
+		PlainTextImporter* importer = bs_new<PlainTextImporter>();
+		Importer::instance()._registerAssetImporter(importer);
+
 		VirtualInput::startUp();
 		VirtualInput::startUp();
 		ScriptManager::startUp();
 		ScriptManager::startUp();
 		BuiltinResources::startUp(renderSystem);
 		BuiltinResources::startUp(renderSystem);

+ 4 - 4
BansheeMono/Source/BsMonoManager.cpp

@@ -248,15 +248,15 @@ namespace BansheeEngine
 
 
 	Path MonoManager::getCompilerPath() const
 	Path MonoManager::getCompilerPath() const
 	{
 	{
-		Path assembliesFolder = FileSystem::getWorkingDirectoryPath();
-		assembliesFolder.append(MONO_COMPILER_DIR);
+		Path compilerPath = FileSystem::getWorkingDirectoryPath();
+		compilerPath.append(MONO_COMPILER_DIR);
 
 
 #if BS_PLATFORM == BS_PLATFORM_WIN32
 #if BS_PLATFORM == BS_PLATFORM_WIN32
-		assembliesFolder.append("mcs.exe");
+		compilerPath.append("mcs.exe");
 #else
 #else
 		static_assert("Not implemented");
 		static_assert("Not implemented");
 #endif
 #endif
 
 
-		return assembliesFolder;
+		return compilerPath;
 	}
 	}
 }
 }

+ 2 - 0
BansheeUtility/Source/BsPath.cpp

@@ -266,6 +266,8 @@ namespace BansheeEngine
 			return *this;
 			return *this;
 
 
 		mDirectories.erase(mDirectories.begin(), mDirectories.begin() + base.mDirectories.size());
 		mDirectories.erase(mDirectories.begin(), mDirectories.begin() + base.mDirectories.size());
+		mDevice = L"";
+		mNode = L"";
 		mIsAbsolute = false;
 		mIsAbsolute = false;
 
 
 		return *this;
 		return *this;

+ 24 - 0
MBansheeEditor/DebugWindow.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Linq;
 using System.Runtime.CompilerServices;
 using System.Runtime.CompilerServices;
 using System.Text;
 using System.Text;
+using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 using BansheeEngine;
 using BansheeEngine;
 
 
@@ -15,7 +16,11 @@ namespace BansheeEditor
             GUIButton refreshAssembly = new GUIButton("Refresh assembly");
             GUIButton refreshAssembly = new GUIButton("Refresh assembly");
             refreshAssembly.OnClick += RefreshAssembly_OnClick;
             refreshAssembly.OnClick += RefreshAssembly_OnClick;
 
 
+            GUIButton compileGame = new GUIButton("Compile game assembly");
+            compileGame.OnClick += CompileGame_OnClick;
+
             GUI.layout.AddElement(refreshAssembly);
             GUI.layout.AddElement(refreshAssembly);
+            GUI.layout.AddElement(compileGame);
         }
         }
 
 
         void RefreshAssembly_OnClick()
         void RefreshAssembly_OnClick()
@@ -23,6 +28,25 @@ namespace BansheeEditor
             Internal_RefreshAssembly();
             Internal_RefreshAssembly();
         }
         }
 
 
+        void CompileGame_OnClick()
+        {
+            CompilerInstance ci = ScriptCompiler.CompileAsync(ScriptAssemblyType.Game, PlatformType.Windows, true, "D:\\AssemblyOutput");
+
+            while (!ci.IsDone)
+            {
+                Debug.Log("Compiling...");
+                Thread.Sleep(50);
+            }
+
+            Debug.Log("COMPILATION DONE!");
+
+            for(int i = 0; i < ci.ErrorMessages.Length; i++)
+                Debug.Log("ERROR: " + ci.ErrorMessages[i].file + ": " + ci.ErrorMessages[i].line + " - " + ci.ErrorMessages[i].message);
+
+            for (int i = 0; i < ci.WarningMessages.Length; i++)
+                Debug.Log("WARNING: " + ci.WarningMessages[i].file + ": " + ci.WarningMessages[i].line + " - " + ci.WarningMessages[i].message);
+        }
+
         [MethodImpl(MethodImplOptions.InternalCall)]
         [MethodImpl(MethodImplOptions.InternalCall)]
         internal static extern void Internal_RefreshAssembly();
         internal static extern void Internal_RefreshAssembly();
     }
     }

+ 5 - 28
MBansheeEditor/ScriptCompiler.cs

@@ -7,20 +7,10 @@ using System.Text;
 using System.Text.RegularExpressions;
 using System.Text.RegularExpressions;
 using System.Threading;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
+using BansheeEngine;
 
 
 namespace BansheeEditor
 namespace BansheeEditor
 {
 {
-//MonoCompiler::StartCompile
-// - Finds all code files for the specified assembly using ProjectLibrary
-// - Starts a Process with specified parameters:
-//  - default: -target:library -out: [name]
-//  - references: -r: [filename]
-//  - library folder: -lib: [path], [path2]
-//  - defines: -d: [define]
-//  - optimization: -o [+/-]
-//  - debug: -debug [+/-]
-//  - followed by a list of files (space separated I guess)
-
     public enum ScriptAssemblyType
     public enum ScriptAssemblyType
     {
     {
         Game, Editor
         Game, Editor
@@ -46,19 +36,7 @@ namespace BansheeEditor
             bool debugBuild, string outputFile)
             bool debugBuild, string outputFile)
         {
         {
             ProcessStartInfo procStartInfo = new ProcessStartInfo();
             ProcessStartInfo procStartInfo = new ProcessStartInfo();
-
-            String executable;
-            switch (EditorApplication.EditorPlatform)
-            {
-                case EditorPlatformType.Windows:
-                    executable = Path.Combine(EditorApplication.CompilerPath, "mcs.exe");
-                    break;
-                default:
-                    throw new NotImplementedException("Mono compilation not supported on this platform.");
-            }
-
             StringBuilder argumentsBuilder = new StringBuilder();
             StringBuilder argumentsBuilder = new StringBuilder();
-            argumentsBuilder.Append(executable);
 
 
             if (!string.IsNullOrEmpty(defines))
             if (!string.IsNullOrEmpty(defines))
                 argumentsBuilder.Append(" -d:" + defines);
                 argumentsBuilder.Append(" -d:" + defines);
@@ -95,7 +73,7 @@ namespace BansheeEditor
 
 
             procStartInfo.Arguments = argumentsBuilder.ToString();
             procStartInfo.Arguments = argumentsBuilder.ToString();
             procStartInfo.CreateNoWindow = true;
             procStartInfo.CreateNoWindow = true;
-            procStartInfo.FileName = executable;
+            procStartInfo.FileName = EditorApplication.CompilerPath;
             procStartInfo.RedirectStandardError = true;
             procStartInfo.RedirectStandardError = true;
             procStartInfo.RedirectStandardOutput = false;
             procStartInfo.RedirectStandardOutput = false;
             procStartInfo.UseShellExecute = false;
             procStartInfo.UseShellExecute = false;
@@ -106,6 +84,7 @@ namespace BansheeEditor
             process.Start();
             process.Start();
 
 
             readErrorsThread = new Thread(ReadErrorStream);
             readErrorsThread = new Thread(ReadErrorStream);
+            readErrorsThread.Start();
         }
         }
 
 
         private void ReadErrorStream()
         private void ReadErrorStream()
@@ -115,9 +94,7 @@ namespace BansheeEditor
                 if (process == null || process.HasExited)
                 if (process == null || process.HasExited)
                     return;
                     return;
 
 
-                string line = process.StandardOutput.ReadLine();
-                if (line == null)
-                    continue;
+                string line = process.StandardError.ReadLine();
 
 
                 CompilerMessage message;
                 CompilerMessage message;
                 if (TryParseCompilerMessage(line, out message))
                 if (TryParseCompilerMessage(line, out message))
@@ -155,7 +132,7 @@ namespace BansheeEditor
 
 
         public bool IsDone
         public bool IsDone
         {
         {
-            get { return process.HasExited; }
+            get { return process.HasExited && readErrorsThread.ThreadState == System.Threading.ThreadState.Stopped; }
         }
         }
 
 
         public bool HasErrors
         public bool HasErrors

+ 1 - 3
SBansheeEditor/Include/BsScriptImportOptions.h

@@ -30,9 +30,7 @@ namespace BansheeEngine
 		static MonoObject* create(const SPtr<ImportOptions>& importOptions);
 		static MonoObject* create(const SPtr<ImportOptions>& importOptions);
 
 
 	private:
 	private:
-		ScriptImportOptions(MonoObject* instance)
-			:ScriptObject(instance)
-		{ }
+		ScriptImportOptions(MonoObject* instance);
 	};
 	};
 
 
 	class BS_SCR_BED_EXPORT ScriptTextureImportOptions : public ScriptObject<ScriptTextureImportOptions, ScriptImportOptionsBase>
 	class BS_SCR_BED_EXPORT ScriptTextureImportOptions : public ScriptObject<ScriptTextureImportOptions, ScriptImportOptionsBase>

+ 9 - 9
SBansheeEditor/Source/BsScriptBuildManager.cpp

@@ -13,14 +13,14 @@ namespace BansheeEngine
 
 
 	void ScriptBuildManager::initRuntimeData()
 	void ScriptBuildManager::initRuntimeData()
 	{
 	{
-		metaData.scriptClass->addInternalCall("internal_GetAvailablePlatforms", &ScriptBuildManager::internal_GetAvailablePlatforms);
-		metaData.scriptClass->addInternalCall("internal_GetActivePlatform", &ScriptBuildManager::internal_GetActivePlatform);
-		metaData.scriptClass->addInternalCall("internal_SetActivePlatform", &ScriptBuildManager::internal_SetActivePlatform);
-		metaData.scriptClass->addInternalCall("internal_GetActivePlatformInfo", &ScriptBuildManager::internal_GetActivePlatformInfo);
-		metaData.scriptClass->addInternalCall("internal_GetPlatformInfo", &ScriptBuildManager::internal_GetPlatformInfo);
-		metaData.scriptClass->addInternalCall("internal_GetFrameworkAssemblies", &ScriptBuildManager::internal_GetFrameworkAssemblies);
-		metaData.scriptClass->addInternalCall("internal_GetMainExecutable", &ScriptBuildManager::internal_GetMainExecutable);
-		metaData.scriptClass->addInternalCall("internal_GetDefines", &ScriptBuildManager::internal_GetDefines);
+		metaData.scriptClass->addInternalCall("Internal_GetAvailablePlatforms", &ScriptBuildManager::internal_GetAvailablePlatforms);
+		metaData.scriptClass->addInternalCall("Internal_GetActivePlatform", &ScriptBuildManager::internal_GetActivePlatform);
+		metaData.scriptClass->addInternalCall("Internal_SetActivePlatform", &ScriptBuildManager::internal_SetActivePlatform);
+		metaData.scriptClass->addInternalCall("Internal_GetActivePlatformInfo", &ScriptBuildManager::internal_GetActivePlatformInfo);
+		metaData.scriptClass->addInternalCall("Internal_GetPlatformInfo", &ScriptBuildManager::internal_GetPlatformInfo);
+		metaData.scriptClass->addInternalCall("Internal_GetFrameworkAssemblies", &ScriptBuildManager::internal_GetFrameworkAssemblies);
+		metaData.scriptClass->addInternalCall("Internal_GetMainExecutable", &ScriptBuildManager::internal_GetMainExecutable);
+		metaData.scriptClass->addInternalCall("Internal_GetDefines", &ScriptBuildManager::internal_GetDefines);
 	}
 	}
 
 
 	MonoArray* ScriptBuildManager::internal_GetAvailablePlatforms()
 	MonoArray* ScriptBuildManager::internal_GetAvailablePlatforms()
@@ -62,7 +62,7 @@ namespace BansheeEngine
 		ScriptArray outArray = ScriptArray::create<WString>((UINT32)frameworkAssemblies.size());
 		ScriptArray outArray = ScriptArray::create<WString>((UINT32)frameworkAssemblies.size());
 		UINT32 idx = 0;
 		UINT32 idx = 0;
 		for (auto& assemblyName : frameworkAssemblies)
 		for (auto& assemblyName : frameworkAssemblies)
-			outArray.set(idx++, assemblyName);
+			outArray.set(idx++, MonoUtil::wstringToMono(MonoManager::instance().getDomain(), assemblyName));
 
 
 		return outArray.getInternal();
 		return outArray.getInternal();
 	}
 	}

+ 14 - 1
SBansheeEditor/Source/BsScriptImportOptions.cpp

@@ -40,9 +40,22 @@ namespace BansheeEngine
 		case TID_GpuProgramImportOptions:
 		case TID_GpuProgramImportOptions:
 			return ScriptGpuProgramImportOptions::create(std::static_pointer_cast<GpuProgramImportOptions>(importOptions));
 			return ScriptGpuProgramImportOptions::create(std::static_pointer_cast<GpuProgramImportOptions>(importOptions));
 			break;
 			break;
+		case TID_ScriptCodeImportOptions:
+			return ScriptScriptCodeImportOptions::create(std::static_pointer_cast<ScriptCodeImportOptions>(importOptions));
+			break;
 		}
 		}
 
 
-		return nullptr;
+		MonoObject* managedInstance = metaData.scriptClass->createInstance();
+		ScriptImportOptions* scriptObj = ScriptImportOptions::toNative(managedInstance);
+		scriptObj->mImportOptions = importOptions;
+
+		return managedInstance;
+	}
+
+	ScriptImportOptions::ScriptImportOptions(MonoObject* instance)
+		:ScriptObject(instance)
+	{ 
+		mImportOptions = bs_shared_ptr<ImportOptions>();
 	}
 	}
 
 
 	ScriptTextureImportOptions::ScriptTextureImportOptions(MonoObject* instance)
 	ScriptTextureImportOptions::ScriptTextureImportOptions(MonoObject* instance)