//----------------------------------------------------------------------- //----------------------------------------------------------------------- // file="glRenderStream.cs" // Project: StgSharp // AuthorGroup: Nitload Space // Copyright (c) Nitload Space. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the “Software”), to deal in the Software without restriction, // including without limitation the rights to use, copy, modify, merge, // publish, distribute, sublicense, and/or sell copies of the Software, // and to permit persons to whom the Software is furnished to do so, // subject to the following conditions: // // The above copyright notice and // this permission notice shall be included in all copies // or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED “AS IS”, // WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, // ARISING FROM, OUT OF OR IN CONNECTION WITH // THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //----------------------------------------------------------------------- //----------------------------------------------------------------------- using StgSharp.Logic; using StgSharp.Math; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace StgSharp.Graphics.GL { public abstract partial class glRenderStream : RenderStream { protected glRenderStream(ViewPort v, (int,int,int) cube) : base(v,cube) { } protected IntPtr glContextHandle { get { return ContextHandle; } } /// /// Init an OpenGl context if current form has not been binded to any context. and set the context binded to /// current form as current OpenGL context. /// /// /// Something goes wrong and StgSharp fails in creating a new OpenGL context. /// public unsafe void MakeAsCurrentContext() { if (ContextHandle == default) { ContextHandle = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(GLcontext))); GLcontext* contextID = (GLcontext*)ContextHandle; contextID->glGetString = (delegate*)IntPtr.Zero; } if (glFunc.CurrentContextHandle != ContextHandle) { glFunc.CurrentContextHandle = ContextHandle; //Console.WriteLine($"context set as {(ulong)glFunc.CurrentContextHandle}"); InternalIO.glfwMakeContextCurrent(CanvasHandle); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public override void SetSizeLimit(int minWidth, int minHeight, int maxWidth, int maxHeight) { InternalIO.glfwSetWindowSizeLimits(this.CanvasHandle, minWidth, minHeight, maxWidth, maxHeight); } internal override sealed void InternalDraw( in Dictionary input, in Dictionary output) { MakeAsCurrentContext(); ProcessInput(); Main(in input, in output); } internal override sealed void InternalInit() { MakeAsCurrentContext(); this.Port.LoadGLapi(); Init(); } internal override sealed void InternalTerminate() { Deinit(); } protected override sealed Uniform NativeCameraUniform(ShaderProgram source, string name) { NativeCamera.GainAllUniforms(source, name); return NativeCamera.convertedUniform; } [MethodImpl(MethodImplOptions.AggressiveInlining)] protected override sealed void NativeCameraViewRange(Radius fieldOfRange, vec2d offset, (float frontDepth, float backDepth) viewDepth) { NativeCamera.SetViewRange(fieldOfRange, this.Size, offset, viewDepth); } protected override sealed void NativeCameraViewTarget(vec3d position, vec3d direction, vec3d up) { NativeCamera.SetViewDirection(position, direction, up); } protected static void PollEvents() { InternalIO.glfwPollEvents(); } protected void SwapBuffers() { InternalIO.glfwSwapBuffers(CanvasHandle); } #region Key Control protected KeyStatus CheckKey(KeyboardKey key) { return InternalIO.glfwGetKey(this.CanvasHandle, (int)key); } protected KeyStatus CheckKey(Mouse key) { return InternalIO.glfwGetKey(this.CanvasHandle, (int)key); } protected KeyStatus CheckKey(Joystick key) { return InternalIO.glfwGetKey(this.CanvasHandle, (int)key); } #endregion } }