private void BuildIR(IRBuildTasks tasks) { var goalLoader = new IRGenerator(Compiler.Context); while (tasks.Inputs.TryDequeue(out GoalScript script)) { using (var stream = new MemoryStream(script.ScriptBody)) { var ast = goalLoader.ParseGoal(script.Path, stream); if (ast != null) { var ir = goalLoader.GenerateGoalIR(ast); ir.Name = script.Name; tasks.IRs.Enqueue(ir); } else { var msg = new Diagnostic(goalLoader.LastLocation, MessageLevel.Error, "X00", $"Could not parse goal file " + script.Name); Logger.CompilationDiagnostic(msg); HasErrors = true; } } } }
public int GetFieldIndexFromName(string name, IRGenerator generator, Range position) { for (int i = 0; i < FieldNames.Length; i++) { if (FieldNames[i] == name) { return(i); } } generator.Error(position, "Undeclared field `", name, "`"); throw new(); }
private string InitialiseImage() { string messages = ""; MapOutputMode imageMode = new MapOutputMode(); imageMode.XRes = FSize.Width; imageMode.YRes = FSize.Height; imageMode.FPS = 30; if (Mode == ImageNodeMode.RGB) { if (FIRGenerator != null) { FIRGenerator.StopGenerating(); FIRGenerator.Dispose(); } FRGBGenerator = new ImageGenerator(FState.Context); FRGBGenerator.MapOutputMode = imageMode; Image.Image.Initialise(FSize, TColorFormat.RGB8); if (FState.DepthGenerator.AlternativeViewpointCapability.IsViewpointSupported(FRGBGenerator)) { FState.DepthGenerator.AlternativeViewpointCapability.SetViewpoint(FRGBGenerator); } else { messages += "AlternativeViewportCapability not supported\n"; } FRGBGenerator.StartGenerating(); } else { if (FRGBGenerator != null) { FRGBGenerator.StopGenerating(); FRGBGenerator.Dispose(); } FIRGenerator = new IRGenerator(FState.Context); FIRGenerator.MapOutputMode = imageMode; FIRGenerator.StartGenerating(); Image.Image.Initialise(FSize, TColorFormat.L16); } return(messages); }
public CompilationUnit(string path, bool isMainModule, bool throwerror) { if (!File.Exists(path)) { if (throwerror) { CompilationErrors.Throw($"Unable to open path: `{path}`"); } FailedOpeningPath = true; } else { IRGenerator = new(path, File.ReadAllText(path), isMainModule); } }
private void Initialise() { try { FMode = FPinInMode[0]; Size size = new Size(640, 480); if (FMode == ImageNodeMode.RGB) { FImageGenerator = new ImageGenerator(FState.Context); FImageImage.Image.Initialise(size, TColourFormat.RGB8); FState.DepthGenerator.AlternativeViewpointCapability.SetViewpoint(FImageGenerator); FImageGenerator.StartGenerating(); } else { FIRGenerator = new IRGenerator(FState.Context); FImageImage.Image.Initialise(size, TColourFormat.L16); FIRGenerator.StartGenerating(); } FImageDepth.Image.Initialise(size, TColourFormat.L16); FImageWorld.Image.Initialise(size, TColourFormat.RGB32F); FPinOutImageImage[0] = FImageImage.Link; FPinOutImageDepth[0] = FImageDepth.Link; FPinOutImageWorld[0] = FImageWorld.Link; for (int x = 0; x < 640; x++) { for (int y = 0; y < 480; y++) { FProjective[x + y * 640].X = x; FProjective[x + y * 640].Y = y; } } FState.Update += new EventHandler(FState_Update); FStatus = "OK"; } catch (StatusException e) { FStatus = e.Message; } }
public override bool Initialize() { // string dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase); var dir = GTPath.GetLocalApplicationDataPath(); DirectoryInfo dirInfo = new DirectoryInfo(new Uri(dir).LocalPath); this.context = new Context(dirInfo.FullName + Path.DirectorySeparatorChar + configFile); this.ir = context.FindExistingNode(NodeType.IR) as IRGenerator; if (this.ir != null) { return(true); } else { return(false); } }
public bool Compile(string outputPath, string debugInfoPath, List <string> mods) { Logger.CompilationStarted(); HasErrors = false; Compiler.Game = Game; Compiler.AllowTypeCoercion = AllowTypeCoercion; if (mods.Count > 0) { Logger.TaskStarted("Discovering module files"); var visitor = new ModPathVisitor(Mods) { Game = Game, CollectStoryGoals = true, CollectGlobals = CheckGameObjects, CollectLevels = CheckGameObjects, LoadPackages = LoadPackages }; visitor.Discover(GameDataPath); Logger.TaskFinished(); Logger.TaskStarted("Loading module files"); if (CheckGameObjects) { var nullGameObject = new GameObjectInfo { Name = "NULL_00000000-0000-0000-0000-000000000000", Type = Compiler.Context.LookupType("GUIDSTRING") }; Compiler.Context.GameObjects.Add("00000000-0000-0000-0000-000000000000", nullGameObject); } foreach (var modName in mods) { LoadMod(modName); } AbstractFileInfo storyHeaderFile = null; AbstractFileInfo typeCoercionWhitelistFile = null; var modsSearchPath = mods.ToList(); modsSearchPath.Reverse(); foreach (var modName in modsSearchPath) { if (storyHeaderFile == null && Mods.Mods[modName].StoryHeaderFile != null) { storyHeaderFile = Mods.Mods[modName].StoryHeaderFile; } if (typeCoercionWhitelistFile == null && Mods.Mods[modName].TypeCoercionWhitelistFile != null) { typeCoercionWhitelistFile = Mods.Mods[modName].TypeCoercionWhitelistFile; } } if (storyHeaderFile != null) { var storyStream = storyHeaderFile.MakeStream(); LoadStoryHeaders(storyStream); storyHeaderFile.ReleaseStream(); } else { Logger.CompilationDiagnostic(new Diagnostic(null, MessageLevel.Error, "X00", "Unable to locate story header file (story_header.div)")); HasErrors = true; } if (typeCoercionWhitelistFile != null) { var typeCoercionStream = typeCoercionWhitelistFile.MakeStream(); LoadTypeCoercionWhitelist(typeCoercionStream); typeCoercionWhitelistFile.ReleaseStream(); Compiler.TypeCoercionWhitelist = TypeCoercionWhitelist; } Logger.TaskFinished(); } if (CheckGameObjects) { Logger.TaskStarted("Loading game objects"); LoadGlobals(); Logger.TaskFinished(); } else { Compiler.Context.Log.WarningSwitches[DiagnosticCode.UnresolvedGameObjectName] = false; } if (OsiExtender) { Logger.TaskStarted("Precompiling scripts"); ParallelPreprocess(); Logger.TaskFinished(); } var asts = new Dictionary <String, ASTGoal>(); var goalLoader = new IRGenerator(Compiler.Context); Logger.TaskStarted("Generating IR"); var orderedGoalAsts = ParallelBuildIR(); foreach (var goal in orderedGoalAsts) { Compiler.AddGoal(goal); } Logger.TaskFinished(); bool updated; var iter = 1; do { Logger.TaskStarted($"Propagating rule types {iter}"); updated = Compiler.PropagateRuleTypes(); Logger.TaskFinished(); if (iter++ > 10) { Compiler.Context.Log.Error(null, DiagnosticCode.InternalError, "Maximal number of rule propagation retries exceeded"); break; } } while (updated); Logger.TaskStarted("Checking for unresolved references"); Compiler.VerifyIR(); Logger.TaskFinished(); foreach (var message in Compiler.Context.Log.Log) { Logger.CompilationDiagnostic(message); if (message.Level == MessageLevel.Error) { HasErrors = true; } } if (!HasErrors && !CheckOnly) { Logger.TaskStarted("Generating story nodes"); var emitter = new StoryEmitter(Compiler.Context); if (debugInfoPath != null) { emitter.EnableDebugInfo(); } var story = emitter.EmitStory(); Logger.TaskFinished(); Logger.TaskStarted("Saving story binary"); using (var file = new FileStream(outputPath, FileMode.Create, FileAccess.Write)) { var writer = new StoryWriter(); writer.Write(file, story); } Logger.TaskFinished(); if (debugInfoPath != null) { Logger.TaskStarted("Saving debug info"); using (var file = new FileStream(debugInfoPath, FileMode.Create, FileAccess.Write)) { var writer = new DebugInfoSaver(); writer.Save(file, emitter.DebugInfo); } Logger.TaskFinished(); } } Logger.CompilationFinished(!HasErrors); return(!HasErrors); }
public MugValueType GetFieldTypeFromName(string name, IRGenerator generator, Range position) { return(FieldTypes[GetFieldIndexFromName(name, generator, position)]); }
public bool Compile(string outputPath, string debugInfoPath, List <string> mods) { Logger.CompilationStarted(); HasErrors = false; Compiler.Game = Game; Mods.Game = Game; if (mods.Count > 0) { Logger.TaskStarted("Discovering module files"); Mods.CollectNames = CheckGameObjects; Mods.LoadPackages = LoadPackages; Mods.Discover(GameDataPath); Logger.TaskFinished(); Logger.TaskStarted("Loading module files"); if (CheckGameObjects) { var nullGameObject = new GameObjectInfo { Name = "NULL_00000000-0000-0000-0000-000000000000", Type = Compiler.Context.LookupType("GUIDSTRING") }; Compiler.Context.GameObjects.Add("00000000-0000-0000-0000-000000000000", nullGameObject); } foreach (var modName in mods) { LoadMod(modName); } Logger.TaskFinished(); } var stream = Mods.StoryHeaderFile.MakeStream(); LoadStoryHeaders(stream); Mods.StoryHeaderFile.ReleaseStream(); if (CheckGameObjects) { Logger.TaskStarted("Loading game objects"); LoadGlobals(); Logger.TaskFinished(); } else { Compiler.Context.Log.WarningSwitches[DiagnosticCode.UnresolvedGameObjectName] = false; } var asts = new Dictionary <String, ASTGoal>(); var goalLoader = new IRGenerator(Compiler.Context); Logger.TaskStarted("Generating IR"); var orderedGoalAsts = ParallelBuildIR(); foreach (var goal in orderedGoalAsts) { Compiler.AddGoal(goal); } Logger.TaskFinished(); Logger.TaskStarted("Propagating rule types"); // TODO - this should be changed to dynamic pass count detection Compiler.PropagateRuleTypes(); Compiler.PropagateRuleTypes(); Compiler.PropagateRuleTypes(); Logger.TaskFinished(); Logger.TaskStarted("Checking for unresolved references"); Compiler.VerifyIR(); Logger.TaskFinished(); foreach (var message in Compiler.Context.Log.Log) { Logger.CompilationDiagnostic(message); if (message.Level == MessageLevel.Error) { HasErrors = true; } } if (!HasErrors && !CheckOnly) { Logger.TaskStarted("Generating story nodes"); var emitter = new StoryEmitter(Compiler.Context); if (debugInfoPath != null) { emitter.EnableDebugInfo(); } var story = emitter.EmitStory(); Logger.TaskFinished(); Logger.TaskStarted("Saving story binary"); using (var file = new FileStream(outputPath, FileMode.Create, FileAccess.Write)) { var writer = new StoryWriter(); writer.Write(file, story); } Logger.TaskFinished(); if (debugInfoPath != null) { Logger.TaskStarted("Saving debug info"); using (var file = new FileStream(debugInfoPath, FileMode.Create, FileAccess.Write)) { var writer = new DebugInfoSaver(); writer.Save(file, emitter.DebugInfo); } Logger.TaskFinished(); } } Logger.CompilationFinished(!HasErrors); return(!HasErrors); }
public CompilationUnit(string moduleName, string source, bool isMainModule) { IRGenerator = new(moduleName, source, isMainModule); }