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)
 	{
 		platformData.resize((UINT32)PlatformType::Count);
+		platformData[0] = bs_shared_ptr<WinPlatformInfo>();
 	}
 
 	RTTITypeBase* BuildData::getRTTIStatic()

+ 4 - 0
BansheeEditor/Source/BsEditorApplication.cpp

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

+ 1 - 1
BansheeEditor/Source/BsProjectLibrary.cpp

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

+ 5 - 0
BansheeEngine/Source/BsApplication.cpp

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

+ 4 - 4
BansheeMono/Source/BsMonoManager.cpp

@@ -248,15 +248,15 @@ namespace BansheeEngine
 
 	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
-		assembliesFolder.append("mcs.exe");
+		compilerPath.append("mcs.exe");
 #else
 		static_assert("Not implemented");
 #endif
 
-		return assembliesFolder;
+		return compilerPath;
 	}
 }

+ 2 - 0
BansheeUtility/Source/BsPath.cpp

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

+ 24 - 0
MBansheeEditor/DebugWindow.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Runtime.CompilerServices;
 using System.Text;
+using System.Threading;
 using System.Threading.Tasks;
 using BansheeEngine;
 
@@ -15,7 +16,11 @@ namespace BansheeEditor
             GUIButton refreshAssembly = new GUIButton("Refresh assembly");
             refreshAssembly.OnClick += RefreshAssembly_OnClick;
 
+            GUIButton compileGame = new GUIButton("Compile game assembly");
+            compileGame.OnClick += CompileGame_OnClick;
+
             GUI.layout.AddElement(refreshAssembly);
+            GUI.layout.AddElement(compileGame);
         }
 
         void RefreshAssembly_OnClick()
@@ -23,6 +28,25 @@ namespace BansheeEditor
             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)]
         internal static extern void Internal_RefreshAssembly();
     }

+ 5 - 28
MBansheeEditor/ScriptCompiler.cs

@@ -7,20 +7,10 @@ using System.Text;
 using System.Text.RegularExpressions;
 using System.Threading;
 using System.Threading.Tasks;
+using BansheeEngine;
 
 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
     {
         Game, Editor
@@ -46,19 +36,7 @@ namespace BansheeEditor
             bool debugBuild, string outputFile)
         {
             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();
-            argumentsBuilder.Append(executable);
 
             if (!string.IsNullOrEmpty(defines))
                 argumentsBuilder.Append(" -d:" + defines);
@@ -95,7 +73,7 @@ namespace BansheeEditor
 
             procStartInfo.Arguments = argumentsBuilder.ToString();
             procStartInfo.CreateNoWindow = true;
-            procStartInfo.FileName = executable;
+            procStartInfo.FileName = EditorApplication.CompilerPath;
             procStartInfo.RedirectStandardError = true;
             procStartInfo.RedirectStandardOutput = false;
             procStartInfo.UseShellExecute = false;
@@ -106,6 +84,7 @@ namespace BansheeEditor
             process.Start();
 
             readErrorsThread = new Thread(ReadErrorStream);
+            readErrorsThread.Start();
         }
 
         private void ReadErrorStream()
@@ -115,9 +94,7 @@ namespace BansheeEditor
                 if (process == null || process.HasExited)
                     return;
 
-                string line = process.StandardOutput.ReadLine();
-                if (line == null)
-                    continue;
+                string line = process.StandardError.ReadLine();
 
                 CompilerMessage message;
                 if (TryParseCompilerMessage(line, out message))
@@ -155,7 +132,7 @@ namespace BansheeEditor
 
         public bool IsDone
         {
-            get { return process.HasExited; }
+            get { return process.HasExited && readErrorsThread.ThreadState == System.Threading.ThreadState.Stopped; }
         }
 
         public bool HasErrors

+ 1 - 3
SBansheeEditor/Include/BsScriptImportOptions.h

@@ -30,9 +30,7 @@ namespace BansheeEngine
 		static MonoObject* create(const SPtr<ImportOptions>& importOptions);
 
 	private:
-		ScriptImportOptions(MonoObject* instance)
-			:ScriptObject(instance)
-		{ }
+		ScriptImportOptions(MonoObject* instance);
 	};
 
 	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()
 	{
-		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()
@@ -62,7 +62,7 @@ namespace BansheeEngine
 		ScriptArray outArray = ScriptArray::create<WString>((UINT32)frameworkAssemblies.size());
 		UINT32 idx = 0;
 		for (auto& assemblyName : frameworkAssemblies)
-			outArray.set(idx++, assemblyName);
+			outArray.set(idx++, MonoUtil::wstringToMono(MonoManager::instance().getDomain(), assemblyName));
 
 		return outArray.getInternal();
 	}

+ 14 - 1
SBansheeEditor/Source/BsScriptImportOptions.cpp

@@ -40,9 +40,22 @@ namespace BansheeEngine
 		case TID_GpuProgramImportOptions:
 			return ScriptGpuProgramImportOptions::create(std::static_pointer_cast<GpuProgramImportOptions>(importOptions));
 			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)