public void Start(int width, int height, string wintitle, LuminalFlags f = 0, IImGuiTheme theme = null) { if (Engine == null) { ConstructEngine(); } Started = true; theme ??= new LuminalTheme(); Engine.StartRenderer(width, height, wintitle, typeof(EnginePlayer), f, theme); }
public static string GetFlagString(this LuminalFlags t) { var features = new List<string>(); foreach (var e in Enum.GetNames(typeof(LuminalFlags))) { var val = Enum.Parse(typeof(LuminalFlags), e); var present = t.Has((LuminalFlags)val); if (present) features.Add(e); } return string.Join(" | ", features); }
public static bool Has(this LuminalFlags a, LuminalFlags b) { return (a & b) > 0; }
public void StartRenderer(int WindowWidth, int WindowHeight, string WindowTitle, Type executingType, LuminalFlags Flags = 0, IImGuiTheme theme = null) { Log.Info($"--- Luminal Engine ---\nStarting at {WindowWidth} x {WindowHeight} (\"{WindowTitle}\")\nExecuting application: {executingType.Name}\n"); Width = WindowWidth; Height = WindowHeight; EngineFlags = Flags; var config = LuminalConfigLoader.LoadConfig("Luminal.json"); AudioEngineManager.LoadEngine(config.AudioPlugin); sceneManager = new SceneManager(executingType); //sceneManager.SwitchScene("Dummy"); SDL.SDL_GL_SetAttribute(SDL.SDL_GLattr.SDL_GL_CONTEXT_MAJOR_VERSION, 2); SDL.SDL_GL_SetAttribute(SDL.SDL_GLattr.SDL_GL_CONTEXT_MINOR_VERSION, 1); Window = SDL.SDL_CreateWindow(WindowTitle, 200, 200, WindowWidth, WindowHeight, SDL.SDL_WindowFlags.SDL_WINDOW_SHOWN | SDL.SDL_WindowFlags.SDL_WINDOW_OPENGL); //Renderer = SDL.SDL_CreateRenderer(Window, 0, SDL.SDL_RendererFlags.SDL_RENDERER_ACCELERATED); var winid = SDL.SDL_GetWindowID(Window); SDL_GPU.GPU_SetInitWindow(winid); Context.SetColour(255, 255, 255, 255); Log.Info("Loading SDL2_ttf"); SDL_ttf.TTF_Init(); Log.Info("Loading SDL2_image"); SDL_image.IMG_Init(SDL_image.IMG_InitFlags.IMG_INIT_JPG | SDL_image.IMG_InitFlags.IMG_INIT_PNG | SDL_image.IMG_InitFlags.IMG_INIT_TIF | SDL_image.IMG_InitFlags.IMG_INIT_WEBP); SDL_GPU.GPU_SetPreInitFlags(GPU_InitFlagEnum.GPU_INIT_DISABLE_VSYNC); //Screen = SDL_GPU.GPU_Init((uint)Width, (uint)Height, (uint)(SDL.SDL_WindowFlags.SDL_WINDOW_SHOWN | SDL.SDL_WindowFlags.SDL_WINDOW_OPENGL)); var winflags = SDL.SDL_WindowFlags.SDL_WINDOW_SHOWN | SDL.SDL_WindowFlags.SDL_WINDOW_OPENGL; Screen = SDL_GPU.GPU_InitRenderer(GPU_RendererEnum.GPU_RENDERER_OPENGL_3, (uint)Width, (uint)Height, (uint)winflags); SDL_GPU.GPU_SetDefaultAnchor(0, 0); //GlContext = SDL.SDL_GL_CreateContext(Window); if ((Flags | LuminalFlags.ENABLE_USER_OPENGL) > 0) { Log.Info("Enabling user-defined OpenGL and Dear IMGUI."); OpenGLManager.Initialise(); theme ??= new LuminalTheme(); theme.InitTheme(ImGui.GetStyle(), ImGui.GetIO()); OpenGLManager.ImGuiCreateFontAtlas(); } if (OnLoading != null) { OnLoading(this); } //var sdlResult = SDL.SDL_CreateWindowAndRenderer(WindowWidth, WindowHeight, 0, out Renderer, out Window); //Console.WriteLine($"{sdlResult}"); //SDL.SDL_SetWindowTitle(Window, WindowTitle); //Window.SetFramerateLimit(500); if (OnFinishedLoad != null) { OnFinishedLoad(this); } WindowOpen = true; sfClock = new Clock(); while (WindowOpen) { //SDL.SDL_SetRenderDrawColor(Renderer, 0, 0, 0, 255); //SDL.SDL_RenderClear(Renderer); //SDL.SDL_SetRenderDrawColor(Renderer, 255, 255, 255, 255); SDL_GPU.GPU_ClearColor(Screen, Context.MakeColourFromRGBA(0, 0, 0, 255)); GUIManager.Begin(); if ((Flags | LuminalFlags.ENABLE_USER_OPENGL) > 0) { OpenGLManager.BeforeFrame(); } if (OnGUI != null) { OnGUI(this); } if ((Flags | LuminalFlags.ENABLE_USER_OPENGL) > 0) { OpenGLManager.AfterGUI(); } SDL.SDL_Event evt; while (SDL.SDL_PollEvent(out evt) == 1) { if ((Flags | LuminalFlags.ENABLE_USER_OPENGL) > 0) { OpenGLManager.ImGuiHandleEvent(evt); } switch (evt.type) { case SDL.SDL_EventType.SDL_QUIT: WinClose(); break; case SDL.SDL_EventType.SDL_KEYDOWN: var e = evt.key.keysym.scancode; WinKeyDown(e); break; case SDL.SDL_EventType.SDL_KEYUP: var k = evt.key.keysym.scancode; WinKeyUp(k); break; case SDL.SDL_EventType.SDL_MOUSEBUTTONDOWN: var m = evt.button.button; MouseButtonDown(m, evt.button.x, evt.button.y); break; case SDL.SDL_EventType.SDL_MOUSEBUTTONUP: var u = evt.button.button; MouseButtonUp(u, evt.button.x, evt.button.y); break; case SDL.SDL_EventType.SDL_MOUSEMOTION: var d = evt.motion; MouseDrag(d.x, d.y, d.xrel, d.yrel); break; } } var t = sfClock.Restart(); AudioEngineManager.Engine.Update(t.AsSeconds()); if (sceneManager.ActiveScene != null) { sceneManager.ActiveScene.Update(this, t.AsSeconds()); } if (OnUpdate != null) { OnUpdate(this, t.AsSeconds()); } if ((Flags | LuminalFlags.ENABLE_USER_OPENGL) > 0) { OpenGLManager.Update(t.AsSeconds()); } if (OnEarlyDraw != null) { OnEarlyDraw(this); } if ((Flags | LuminalFlags.ENABLE_USER_OPENGL) > 0) { OpenGLManager.EarlyDraw(); } if (OnDraw != null) { OnDraw(this); } if (sceneManager.ActiveScene != null) { sceneManager.ActiveScene.Draw(this); } if (OnLateDraw != null) { OnLateDraw(this); } GUIManager.RenderAll(); SDL_GPU.GPU_ResetRendererState(); //SDL.SDL_RenderPresent(Renderer); if ((Flags | LuminalFlags.ENABLE_USER_OPENGL) > 0) { OpenGLManager.Draw(); } SDL_GPU.GPU_Flip(Screen); GUIManager.End(); //SDL.SDL_Delay(1); } }