daily update on 20231217 by nitload youmu
This commit is contained in:
@@ -24,31 +24,29 @@ namespace StgSharp.Graphics
|
||||
internal LinkedList<Control> allControl;
|
||||
internal Vector4 color;
|
||||
internal Thread formThread;
|
||||
internal IglFunc GL;
|
||||
internal int height;
|
||||
internal IntPtr monitor;
|
||||
internal string name;
|
||||
internal FormRenderBuffer RenderBuffer;
|
||||
internal Form sharedForm;
|
||||
internal FrameUpdateTimer timer = new FrameUpdateTimer();
|
||||
internal FormUpdateBuffer UpdateBuffer;
|
||||
internal int width;
|
||||
internal IntPtr windowID;
|
||||
|
||||
internal IglFunc GL;
|
||||
internal FormUpdateBuffer UpdateBuffer;
|
||||
internal FormRenderBuffer RenderBuffer;
|
||||
private bool alignAtRender;
|
||||
private bool alignAtUpdate;
|
||||
private bool isSingleThread;
|
||||
|
||||
internal FrameUpdateTimer timer = new FrameUpdateTimer();
|
||||
private Action OnRender;
|
||||
private Action OnUpdate;
|
||||
|
||||
#region thread sync
|
||||
internal readonly SemaphoreSlim ouetrPong = new SemaphoreSlim(0, 1);
|
||||
private SemaphoreSlim ping = new SemaphoreSlim(1, 1);
|
||||
private SemaphoreSlim pong = new SemaphoreSlim(0, 1);
|
||||
internal readonly SemaphoreSlim ouetrPong = new SemaphoreSlim(0, 1);
|
||||
|
||||
/// <summary>
|
||||
/// Height of this form, represent in <see cref="int"/>
|
||||
/// </summary>
|
||||
public int Height
|
||||
{
|
||||
get => height;
|
||||
set => height = value;
|
||||
}
|
||||
#endregion
|
||||
|
||||
private Form()
|
||||
{
|
||||
@@ -59,6 +57,22 @@ namespace StgSharp.Graphics
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Height of this form, represent in <see cref="int"/>
|
||||
/// </summary>
|
||||
public int Height
|
||||
{
|
||||
get => height;
|
||||
set => height = value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Representing
|
||||
/// </summary>
|
||||
public bool IsDoubleRendering
|
||||
{
|
||||
get { return isSingleThread; }
|
||||
}
|
||||
/// <summary>
|
||||
/// Width of this form, represent in <see cref="int"/>
|
||||
/// </summary>
|
||||
@@ -94,9 +108,13 @@ namespace StgSharp.Graphics
|
||||
/// <param name="args"></param>
|
||||
public abstract void Init(object[] args);
|
||||
|
||||
public abstract void OnRenderFrame(object[] args);
|
||||
/// <summary>
|
||||
/// Behaviour of current form when in a render cycle.
|
||||
/// When this form
|
||||
/// </summary>
|
||||
/// <param name="args"></param>
|
||||
public abstract void Main(object[] args);
|
||||
|
||||
public abstract void OnUpdateFrame(object[] args);
|
||||
|
||||
/// <summary>
|
||||
/// Init this form and render it on screen, and respond with operation
|
||||
@@ -145,17 +163,15 @@ namespace StgSharp.Graphics
|
||||
Init((object[])args);
|
||||
}
|
||||
|
||||
|
||||
internal void InternalRenderFrame(object args)
|
||||
internal void InternalRenderFrame()
|
||||
{
|
||||
while (InternalIO.glfw.WindowShouldClose(windowID) != 0)
|
||||
{
|
||||
ping.Wait();
|
||||
try
|
||||
{
|
||||
OnRenderFrame((object[])args);
|
||||
OnRender();
|
||||
timer.WaitNextFrame();
|
||||
|
||||
pong.Release();
|
||||
}
|
||||
catch (NullReferenceException)
|
||||
@@ -166,16 +182,15 @@ namespace StgSharp.Graphics
|
||||
}
|
||||
}
|
||||
|
||||
internal void InternalUpdateFrame(object args)
|
||||
internal void InternalUpdateFrame()
|
||||
{
|
||||
while (InternalIO.glfw.WindowShouldClose(windowID) != 0)
|
||||
{
|
||||
pong.Wait();
|
||||
try
|
||||
{
|
||||
OnUpdateFrame((object[])args);
|
||||
OnUpdate();
|
||||
timer.WaitNextFrame();
|
||||
throw new Exception("Forget to reload GL apis");
|
||||
ping.Release();
|
||||
}
|
||||
catch (NullReferenceException)
|
||||
@@ -186,6 +201,26 @@ namespace StgSharp.Graphics
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Define how current form render in one frame.
|
||||
/// </summary>
|
||||
/// <param name="totalThread">
|
||||
///
|
||||
/// Please define
|
||||
/// </param>
|
||||
protected void SetRenderThreads(bool requireDoubleRendering)
|
||||
{
|
||||
switch (requireDoubleRendering)
|
||||
{
|
||||
case true:
|
||||
isSingleThread = false;
|
||||
OnUpdate = new Action(() => { });
|
||||
break;
|
||||
case false:
|
||||
isSingleThread = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
@@ -232,13 +267,14 @@ namespace StgSharp.Graphics
|
||||
{
|
||||
windowID = windowPtr;
|
||||
}
|
||||
GLonRender glRender = new GLonRender();
|
||||
GLcontext glContext = new GLcontext();
|
||||
IntPtr ptr = Marshal.AllocHGlobal(sizeof(GLcontextIO));
|
||||
contextID = (GLcontextIO*)ptr;
|
||||
*contextID = new GLcontextIO();
|
||||
InternalIO.InternalWriteLog("Successfully create a context binded to current form. " +
|
||||
$"Its ID is {(ulong)ptr}", LogType.Info);
|
||||
GLonRender glRender = new GLonRender(glContext);
|
||||
GLonUpdate glUpdate = new GLonUpdate(glContext);
|
||||
}
|
||||
InternalIO.InternalSetCurrentGLContext(windowID, (IntPtr)contextID);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user