public SDLWindow2DGl() { screen_ = new Screen2DGl(); // screen.beginDrawDelegate // SDLWindowを用いるときは、つねにウィンドゥはひとつ描画されているはずなので // ↑は何も設定しなくていい。 Screen.EndDrawDelegate = delegate { SDL.SDL_GL_SwapBuffers(); }; }
// This method is called when the control is redrawn protected override void OnPaint(PaintEventArgs eventArgs) { // Visual Studioのデザインモードのとき。 if (DesignMode) { Screen2DGl scr = window.Screen; scr.Select(); scr.SetClearColor(100, 200, 100); scr.Clear(); scr.DrawString("Open GL", 5, 10, 10); scr.DrawString("Control", 5, 30, 10); scr.Update(); } // 描画用のメソッドはここに書いて。 }
/// <summary> /// 描画メソッド。 /// Screen2DGlの線の太さを変更しているので注意。 /// </summary> public void OnDraw(Screen2DGl screen, int x, int y) { if (fpstimer == null) { return; } int fps = (int)fpstimer.Fps; int realfps = fpstimer.RealFpsInt; screen.SetLineWidth((int)((float)size) / 6 + 1); // string txt = realfps.ToString("D6"); string txt = StringConv.ToDecZeroSuppress(realfps, 6) + "FPS"; int r, g, b; screen.GetColor(out r, out g, out b); // 色を保存 screen.SetColor(0, 120, 0); screen.DrawString(txt, x, y, size); screen.SetColor(r, g, b); // 色を復帰 }
/// <summary> /// 描画メソッド。 /// Screen2DGlの線の太さを変更しているので注意。 /// </summary> public void OnDraw(Screen2DGl screen,int x,int y) { if (fpstimer == null) return ; int fps = (int)fpstimer.Fps; int realfps = fpstimer.RealFpsInt; screen.SetLineWidth((int)((float)size)/6 + 1); // string txt = realfps.ToString("D6"); string txt = StringConv.ToDecZeroSuppress(realfps,6) + "FPS"; int r,g,b; screen.GetColor(out r, out g, out b); // 色を保存 screen.SetColor(0,120,0); screen.DrawString(txt,x,y,size); screen.SetColor(r,g,b); // 色を復帰 }
// IntPtr oldContext; // ↑ // Win32WindowのSelectのネストが出来るようにしようと考えたのだが、 // 前のコンテキストを保存しておいても、 // Select // Select // Update ←このあと、1つ目のSelectのViewに設定しなおす必要があるのだが、 // このための復帰処理が難しい // Update // ので、こういう実装は現実的ではないと判断する。 // 初期化用のhelper関数 private YanesdkResult InitByHdc_(IntPtr hDc) { this.hDC = hDc; screen_ = new Screen2DGl(); screen_.BeginDrawDelegate = delegate { hDC = GetDC(this.hWnd); // oldContext = opengl32.wglGetCurrentContext(); Opengl32.wglMakeCurrent(this.hDC , this.hRC); // テクスチャー描画が基本なのでテクスチャーを有効にしておかねば }; screen_.EndDrawDelegate = delegate { SwapBuffers(this.hDC); Opengl32.wglMakeCurrent(this.hDC,IntPtr.Zero); ReleaseDC(this.hWnd, this.hDC); }; // 描画を行なわないdelegateを渡す。 // なぜなら、テクスチャの読み込みは、 // wglMakeCurrentが実行されていないと // 正しく読み込まれないので、beginDrawDelegateを行なってから // 読み込み、それが終わり次第この // delegateを呼び出して、openglのassignを解放してやる必要がある。 screen_.QuitDrawDelegate = delegate { Opengl32.wglMakeCurrent(this.hDC , IntPtr.Zero); // opengl32.wglMakeCurrent(this.hDC , oldContext); ReleaseDC(this.hWnd, this.hDC); }; YanesdkResult result = CreatePixelFormat(this.hDC); if ( result != YanesdkResult.NoError ) return result; // Create a new OpenGL rendering contex this.hRC = Opengl32.wglCreateContext(this.hDC); // context共有を利用する。 // 0番は常に生きていると仮定。 // opengl32.wglShareLists(Singleton<GlInitializer>.Instance.hNullRC,this.hRC); // ↑これをやるとthreadが終了しなくなるので // 一つ目のRendering Contextだけ解放しないことにする。 if ( theFirstHRc != IntPtr.Zero ) Opengl32.wglShareLists(theFirstHRc , this.hRC); else theFirstHRc = this.hRC; ReleaseDC(this.hWnd, this.hDC); RECT32 rect = new RECT32(); // GetWindowRect((IntPtr)this.hWnd, out rect); GetClientRect((IntPtr)this.hWnd, out rect); Screen.UpdateView(rect.left - rect.right, rect.bottom - rect.top); return YanesdkResult.NoError; }
// IntPtr oldContext; // ↑ // Win32WindowのSelectのネストが出来るようにしようと考えたのだが、 // 前のコンテキストを保存しておいても、 // Select // Select // Update ←このあと、1つ目のSelectのViewに設定しなおす必要があるのだが、 // このための復帰処理が難しい // Update // ので、こういう実装は現実的ではないと判断する。 // 初期化用のhelper関数 private YanesdkResult InitByHdc_(IntPtr hDc) { this.hDC = hDc; screen_ = new Screen2DGl(); screen_.BeginDrawDelegate = delegate { hDC = GetDC(this.hWnd); // oldContext = opengl32.wglGetCurrentContext(); Opengl32.wglMakeCurrent(this.hDC, this.hRC); // テクスチャー描画が基本なのでテクスチャーを有効にしておかねば }; screen_.EndDrawDelegate = delegate { SwapBuffers(this.hDC); Opengl32.wglMakeCurrent(this.hDC, IntPtr.Zero); ReleaseDC(this.hWnd, this.hDC); }; // 描画を行なわないdelegateを渡す。 // なぜなら、テクスチャの読み込みは、 // wglMakeCurrentが実行されていないと // 正しく読み込まれないので、beginDrawDelegateを行なってから // 読み込み、それが終わり次第この // delegateを呼び出して、openglのassignを解放してやる必要がある。 screen_.QuitDrawDelegate = delegate { Opengl32.wglMakeCurrent(this.hDC, IntPtr.Zero); // opengl32.wglMakeCurrent(this.hDC , oldContext); ReleaseDC(this.hWnd, this.hDC); }; YanesdkResult result = CreatePixelFormat(this.hDC); if (result != YanesdkResult.NoError) { return(result); } // Create a new OpenGL rendering contex this.hRC = Opengl32.wglCreateContext(this.hDC); // context共有を利用する。 // 0番は常に生きていると仮定。 // opengl32.wglShareLists(Singleton<GlInitializer>.Instance.hNullRC,this.hRC); // ↑これをやるとthreadが終了しなくなるので // 一つ目のRendering Contextだけ解放しないことにする。 if (theFirstHRc != IntPtr.Zero) { Opengl32.wglShareLists(theFirstHRc, this.hRC); } else { theFirstHRc = this.hRC; } ReleaseDC(this.hWnd, this.hDC); RECT32 rect = new RECT32(); // GetWindowRect((IntPtr)this.hWnd, out rect); GetClientRect((IntPtr)this.hWnd, out rect); Screen.UpdateView(rect.left - rect.right, rect.bottom - rect.top); return(YanesdkResult.NoError); }