/* =============================================================================== Teapot.mc : OpenGL で、ユタ・ティーポット( Utah Teapot )を描画 =============================================================================== Copyright (C) 2010 Masahiko Watanabe Edition History: Ver.1.00 2010.11.30( GK Library: Rev.2010.11.20 使用 ) -----------------------------------------------------------------------------*/ /*****/ // GK Library のモジュールをロードする場合 #include #include #include if( ::Module.Include( "GkLibrary" ) > 0 ) Main( argc, argv ); return; /*****/ /****** // GK Library のソースをインクルードする場合 #include Main( argc, argv ); return; /*****/ //----------------------------------------------------------------------------- // デバッグプリント無効化(リリース時) #set pc #comment #set pv // デバッグプリント有効化(デバッグ時) //#set pc print //#set pv print #set p print //----------------------------------------------------------------------------- /// マクロ定義 /// #set MAIN_TITLE "OpenGL: ユタ・ティーポット( Utah Teapot )" #set Wnd_Xo // ウィンドウの左端位置(空白はデフォールト) #set Wnd_Yo // ウィンドウの上端位置(空白はデフォールト) #set FigXd 640 // 図形描画領域の幅 #set FigYd 480 // 図形描画領域の高さ #set VF_Timer 101 // 画面更新タイマー識別値 #set VF_Rate 30 // 画面更新回数/秒 #set PI 3.14159265358979 #set RAD ( #PI / 180 ) // === OpenGL 関連マクロ定義 === #set PFD_TYPE_RGBA 0 #set PFD_MAIN_PLANE 0 #set PFD_DOUBLEBUFFER 0x00000001 #set PFD_DRAW_TO_WINDOW 0x00000004 #set PFD_SUPPORT_OPENGL 0x00000020 #set GL_AMBIENT 0x1200 #set GL_AUTO_NORMAL 0x0D80 #set GL_BACK 0x0405 #set GL_CCW 0x0901 #set GL_COLOR_BUFFER_BIT 0x00004000 #set GL_DEPTH_BUFFER_BIT 0x00000100 #set GL_DEPTH_TEST 0x0B71 #set GL_DIFFUSE 0x1201 #set GL_FILL 0x1B02 #set GL_FRONT_AND_BACK 0x0408 #set GL_LESS 0x0201 #set GL_LIGHT0 0x4000 #set GL_LIGHT_MODEL_AMBIENT 0x0B53 #set GL_LIGHT_MODEL_TWO_SIDE 0x0B52 #set GL_LIGHTING 0x0B50 #set GL_LINES 0x0001 #set GL_MAP2_VERTEX_3 0x0DB7 #set GL_MODELVIEW 0x1700 #set GL_NORMALIZE 0x0BA1 #set GL_POSITION 0x1203 #set GL_PROJECTION 0x1701 #set GL_SHININESS 0x1601 #set GL_SMOOTH 0x1D01 #set GL_SPECULAR 0x1202 #set GL_TRUE 1 //============================================================================= function Main( argc, argv ) { #pc "開始"; ^DefValue = null; if( SetupOpenGL() == #OK ) { class ^MainWindow : ::GK.Window {} R = ::GK.Rect( 0, 0, #FigXd, #FigYd ); ::GK.Window.GetAdjRect( R ); ^MainWindow.Construct( #MAIN_TITLE, #Wnd_Xo, #Wnd_Yo, R.Xd, R.Yd ); ^MainWindow.Open(); ^MainWindow.StartTimer( #VF_Timer, 1000 / #VF_Rate ); ::GK.WindowMsgLoop(); delete ^MainWindow; } DeleteOpenGL(); #pc "終了"; } //----------------------------------------------------------------------------- function ^MainWindow.OnCreate() { #pc "OnCreate"; if( .InizOpenGL() != #OK ) { print "OpenGL 初期設定エラー!"; .Close(); } .InizFigData(); // 描画データの設定 .InizLighting( ); // 光源の初期設定 } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function ^MainWindow.OnDestroy() { #pc "OnDestroy"; .StopTimer( #VF_Rate ); .TermFigData(); .TermOpenGL(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function ^MainWindow.OnSize() { #pc "OnSize", .gc.Xd, .gc.Yd, .Min?(); if( .gc.Xd <= 0 || .gc.Yd <= 0 ) return; .ResizeFigArea(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function ^MainWindow.OnPaint() { #pc "OnPaint"; .GetHotRect( R'STRUCT ); if( ! .FigRect.Out?( R ) ) { .DrawFigArea(); .ToUpdate? = #FALSE; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function ^MainWindow.OnTimer( id ) { //#pc "OnTimer: ", id; if( id == #VF_Timer ) { if( .AutoRot? ) { .Theta = ( .Theta + 1.0 ) % 360.0; .ToUpdate? = #TRUE; } if( .ToUpdate? ) { .DrawFigArea(); .ToUpdate? = #FALSE; } } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function ^MainWindow.OnMouseMove( x, y, ks ) { //#pc "OnMouseMove: ", x, y, ks'x; if( ks & #MK_LBUTTON ) { #pc "OnMouseDragA: ", x, y, ks'x; .Alpha = ( .Alpha + ( x - .Mx )) % 360.0; .Beta = ( .Beta + ( y - .My )) % 360.0; ( .Mx, .My ) = ( x, y ); .ToUpdate? = #TRUE; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function ^MainWindow.OnMouseButton( x, y, ks ) { #pc "OnMouseButton: ", x, y, ks'x; if( ks & #MK_LBUTTON ) { ( .Mx, .My ) = ( x, y ); .AutoRot? = #FALSE; } if( ks & #MK_RBUTTON ) .AutoRot? = ! .AutoRot?; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function ^MainWindow.OnMouseWheel( x, y, d ) { #pc "OnMouseWheel: ", x, y, d; .LidUp = ( .LidUp + d / 1000.0 )'cut( 0.0, 2.0 ); .ToUpdate? = #TRUE; } //============================================================================= function ^MainWindow.InizOpenGL() { #pc "InizOpenGL"; PIXELFORMATDESCRIPTOR ::= { .nSize 'USHORT; .nVersion 'USHORT = 1; .dwFlags 'ULONG = #PFD_DRAW_TO_WINDOW | #PFD_SUPPORT_OPENGL | #PFD_DOUBLEBUFFER; .iPixelType 'UBYTE = #PFD_TYPE_RGBA; .cColorBits 'UBYTE = 24; // 24-bit color depth .cRedBits 'UBYTE = 0; // color bits ignored .cRedShift 'UBYTE = 0; // 〃 .cGreenBits 'UBYTE = 0; // 〃 .cGreenShift 'UBYTE = 0; // 〃 .cBlueBits 'UBYTE = 0; // 〃 .cBlueShift 'UBYTE = 0; // 〃 .cAlphaBits 'UBYTE = 0; // no alpha buffer .cAlphaShift 'UBYTE = 0; // shift bit ignored .cAccumBits 'UBYTE = 0; // accum bits ignored .cAccumRedBits 'UBYTE = 0; // 〃 .cAccumGreenBits'UBYTE = 0; // 〃 .cAccumBlueBits 'UBYTE = 0; // 〃 .cAccumAlphaBits'UBYTE = 0; // 〃 .cDepthBits 'UBYTE = 32; // 32-bit z-buffer .cStencilBits 'UBYTE = 0; // no stencil buffer .cAuxBuffers 'UBYTE = 0; // no auxiliary buffer .iLayerType 'UBYTE = #PFD_MAIN_PLANE; // main layer .bReserved 'UBYTE = 0; .dwLayerMask 'ULONG = 0; // layer masks ignored .dwVisibleMask 'ULONG = 0; // 〃 .dwDamageMask 'ULONG = 0; // 〃 } PIXELFORMATDESCRIPTOR.nSize = PIXELFORMATDESCRIPTOR'size; pfd = ::Buffer( PIXELFORMATDESCRIPTOR.nSize ); pfd.Write( PIXELFORMATDESCRIPTOR ); pfd.Seek(0); if(( i = ^ChoosePixelFormat( .gc.hdc, pfd )) <= 0 ) return #NG; if( ^SetPixelFormat( .gc.hdc, i, pfd ) == #FALSE ) return #NG; if(( .hRC = ^wglCreateContext( .gc.hdc )) == #NULL ) return #NG; if( ^wglMakeCurrent( .gc.hdc, .hRC ) == #FALSE ) return #NG; return #OK; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function ^MainWindow.TermOpenGL() { #pc "TermOpenGL"; ^wglMakeCurrent( #NULL, #NULL ); ^wglDeleteContext( .hRC ); } //----------------------------------------------------------------------------- function ^MainWindow.InizFigData() { // ティーポットの 32 面分のベジエ曲面の 16 個の制御点のインデックス I'USHORT( 32, 16 ) = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 4, 17, 18, 19, 8, 20, 21, 22, 12, 23, 24, 25, 16, 26, 27, 28, 19, 29, 30, 31, 22, 32, 33, 34, 25, 35, 36, 37, 28, 38, 39, 40, 31, 41, 42, 1, 34, 43, 44, 5, 37, 45, 46, 9, 40, 47, 48, 13, 13, 14, 15, 16, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 16, 26, 27, 28, 52, 61, 62, 63, 56, 64, 65, 66, 60, 67, 68, 69, 28, 38, 39, 40, 63, 70, 71, 72, 66, 73, 74, 75, 69, 76, 77, 78, 40, 47, 48, 13, 72, 79, 80, 49, 75, 81, 82, 53, 78, 83, 84, 57, 57, 58, 59, 60, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 60, 67, 68, 69, 88, 97, 98, 99, 92, 100, 101, 102, 96, 103, 104, 105, 69, 76, 77, 78, 99, 106, 107, 108, 102, 109, 110, 111, 105, 112, 113, 114, 78, 83, 84, 57, 108, 115, 116, 85, 111, 117, 118, 89, 114, 119, 120, 93, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 124, 137, 138, 121, 128, 139, 140, 125, 132, 141, 142, 129, 136, 143, 144, 133, 133, 134, 135, 136, 145, 146, 147, 148, 149, 150, 151, 152, 69, 153, 154, 155, 136, 143, 144, 133, 148, 156, 157, 145, 152, 158, 159, 149, 155, 160, 161, 69, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 165, 178, 179, 162, 169, 180, 181, 166, 173, 182, 183, 170, 177, 184, 185, 174, 174, 175, 176, 177, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 177, 184, 185, 174, 189, 198, 199, 186, 193, 200, 201, 190, 197, 202, 203, 194, 204, 204, 204, 204, 207, 208, 209, 210, 211, 211, 211, 211, 212, 213, 214, 215, 204, 204, 204, 204, 210, 217, 218, 219, 211, 211, 211, 211, 215, 220, 221, 222, 204, 204, 204, 204, 219, 224, 225, 226, 211, 211, 211, 211, 222, 227, 228, 229, 204, 204, 204, 204, 226, 230, 231, 207, 211, 211, 211, 211, 229, 232, 233, 212, 212, 213, 214, 215, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 215, 220, 221, 222, 237, 246, 247, 248, 241, 249, 250, 251, 245, 252, 253, 254, 222, 227, 228, 229, 248, 255, 256, 257, 251, 258, 259, 260, 254, 261, 262, 263, 229, 232, 233, 212, 257, 264, 265, 234, 260, 266, 267, 238, 263, 268, 269, 242, 270, 270, 270, 270, 279, 280, 281, 282, 275, 276, 277, 278, 271, 272, 273, 274, 270, 270, 270, 270, 282, 289, 290, 291, 278, 286, 287, 288, 274, 283, 284, 285, 270, 270, 270, 270, 291, 298, 299, 300, 288, 295, 296, 297, 285, 292, 293, 294, 270, 270, 270, 270, 300, 305, 306, 279, 297, 303, 304, 275, 294, 301, 302, 271, }; // ティーポットのベジエ曲面の制御点群 P'DOUBLE( 306, 3 ) = { 1.4, 0.0, 2.4, 1.4, -0.784, 2.4, 0.784, -1.4, 2.4, 0.0, -1.4, 2.4, 1.3375, 0.0, 2.53125, 1.3375, -0.749, 2.53125, 0.749, -1.3375, 2.53125, 0.0, -1.3375, 2.53125, 1.4375, 0.0, 2.53125, 1.4375, -0.805, 2.53125, 0.805, -1.4375, 2.53125, 0.0, -1.4375, 2.53125, 1.5, 0.0, 2.4, 1.5, -0.84, 2.4, 0.84, -1.5, 2.4, 0.0, -1.5, 2.4, -0.784, -1.4, 2.4, -1.4, -0.784, 2.4, -1.4, 0.0, 2.4, -0.749, -1.3375, 2.53125, -1.3375, -0.749, 2.53125, -1.3375, 0.0, 2.53125, -0.805, -1.4375, 2.53125, -1.4375, -0.805, 2.53125, -1.4375, 0.0, 2.53125, -0.84, -1.5, 2.4, -1.5, -0.84, 2.4, -1.5, 0.0, 2.4, -1.4, 0.784, 2.4, -0.784, 1.4, 2.4, 0.0, 1.4, 2.4, -1.3375, 0.749, 2.53125, -0.749, 1.3375, 2.53125, 0.0, 1.3375, 2.53125, -1.4375, 0.805, 2.53125, -0.805, 1.4375, 2.53125, 0.0, 1.4375, 2.53125, -1.5, 0.84, 2.4, -0.84, 1.5, 2.4, 0.0, 1.5, 2.4, 0.784, 1.4, 2.4, 1.4, 0.784, 2.4, 0.749, 1.3375, 2.53125, 1.3375, 0.749, 2.53125, 0.805, 1.4375, 2.53125, 1.4375, 0.805, 2.53125, 0.84, 1.5, 2.4, 1.5, 0.84, 2.4, 1.75, 0.0, 1.875, 1.75, -0.98, 1.875, 0.98, -1.75, 1.875, 0.0, -1.75, 1.875, 2.0, 0.0, 1.35, 2.0, -1.12, 1.35, 1.12, -2.0, 1.35, 0.0, -2.0, 1.35, 2.0, 0.0, 0.9, 2.0, -1.12, 0.9, 1.12, -2.0, 0.9, 0.0, -2.0, 0.9, -0.98, -1.75, 1.875, -1.75, -0.98, 1.875, -1.75, 0.0, 1.875, -1.12, -2.0, 1.35, -2.0, -1.12, 1.35, -2.0, 0.0, 1.35, -1.12, -2.0, 0.9, -2.0, -1.12, 0.9, -2.0, 0.0, 0.9, -1.75, 0.98, 1.875, -0.98, 1.75, 1.875, 0.0, 1.75, 1.875, -2.0, 1.12, 1.35, -1.12, 2.0, 1.35, 0.0, 2.0, 1.35, -2.0, 1.12, 0.9, -1.12, 2.0, 0.9, 0.0, 2.0, 0.9, 0.98, 1.75, 1.875, 1.75, 0.98, 1.875, 1.12, 2.0, 1.35, 2.0, 1.12, 1.35, 1.12, 2.0, 0.9, 2.0, 1.12, 0.9, 2.0, 0.0, 0.45, 2.0, -1.12, 0.45, 1.12, -2.0, 0.45, 0.0, -2.0, 0.45, 1.5, 0.0, 0.225, 1.5, -0.84, 0.225, 0.84, -1.5, 0.225, 0.0, -1.5, 0.225, 1.5, 0.0, 0.15, 1.5, -0.84, 0.15, 0.84, -1.5, 0.15, 0.0, -1.5, 0.15, -1.12, -2.0, 0.45, -2.0, -1.12, 0.45, -2.0, 0.0, 0.45, -0.84, -1.5, 0.225, -1.5, -0.84, 0.225, -1.5, 0.0, 0.225, -0.84, -1.5, 0.15, -1.5, -0.84, 0.15, -1.5, 0.0, 0.15, -2.0, 1.12, 0.45, -1.12, 2.0, 0.45, 0.0, 2.0, 0.45, -1.5, 0.84, 0.225, -0.84, 1.5, 0.225, 0.0, 1.5, 0.225, -1.5, 0.84, 0.15, -0.84, 1.5, 0.15, 0.0, 1.5, 0.15, 1.12, 2.0, 0.45, 2.0, 1.12, 0.45, 0.84, 1.5, 0.225, 1.5, 0.84, 0.225, 0.84, 1.5, 0.15, 1.5, 0.84, 0.15, -1.6, 0.0, 2.025, -1.6, -0.3, 2.025, -1.5, -0.3, 2.25, -1.5, 0.0, 2.25, -2.3, 0.0, 2.025, -2.3, -0.3, 2.025, -2.5, -0.3, 2.25, -2.5, 0.0, 2.25, -2.7, 0.0, 2.025, -2.7, -0.3, 2.025, -3.0, -0.3, 2.25, -3.0, 0.0, 2.25, -2.7, 0.0, 1.8, -2.7, -0.3, 1.8, -3.0, -0.3, 1.8, -3.0, 0.0, 1.8, -1.5, 0.3, 2.25, -1.6, 0.3, 2.025, -2.5, 0.3, 2.25, -2.3, 0.3, 2.025, -3.0, 0.3, 2.25, -2.7, 0.3, 2.025, -3.0, 0.3, 1.8, -2.7, 0.3, 1.8, -2.7, 0.0, 1.575, -2.7, -0.3, 1.575, -3.0, -0.3, 1.35, -3.0, 0.0, 1.35, -2.5, 0.0, 1.125, -2.5, -0.3, 1.125, -2.65, -0.3, 0.9375, -2.65, 0.0, 0.9375, -2.0, -0.3, 0.9, -1.9, -0.3, 0.6, -1.9, 0.0, 0.6, -3.0, 0.3, 1.35, -2.7, 0.3, 1.575, -2.65, 0.3, 0.9375, -2.5, 0.3, 1.125, -1.9, 0.3, 0.6, -2.0, 0.3, 0.9, 1.7, 0.0, 1.425, 1.7, -0.66, 1.425, 1.7, -0.66, 0.6, 1.7, 0.0, 0.6, 2.6, 0.0, 1.425, 2.6, -0.66, 1.425, 3.1, -0.66, 0.825, 3.1, 0.0, 0.825, 2.3, 0.0, 2.1, 2.3, -0.25, 2.1, 2.4, -0.25, 2.025, 2.4, 0.0, 2.025, 2.7, 0.0, 2.4, 2.7, -0.25, 2.4, 3.3, -0.25, 2.4, 3.3, 0.0, 2.4, 1.7, 0.66, 0.6, 1.7, 0.66, 1.425, 3.1, 0.66, 0.825, 2.6, 0.66, 1.425, 2.4, 0.25, 2.025, 2.3, 0.25, 2.1, 3.3, 0.25, 2.4, 2.7, 0.25, 2.4, 2.8, 0.0, 2.475, 2.8, -0.25, 2.475, 3.525, -0.25, 2.49375, 3.525, 0.0, 2.49375, 2.9, 0.0, 2.475, 2.9, -0.15, 2.475, 3.45, -0.15, 2.5125, 3.45, 0.0, 2.5125, 2.8, 0.0, 2.4, 2.8, -0.15, 2.4, 3.2, -0.15, 2.4, 3.2, 0.0, 2.4, 3.525, 0.25, 2.49375, 2.8, 0.25, 2.475, 3.45, 0.15, 2.5125, 2.9, 0.15, 2.475, 3.2, 0.15, 2.4, 2.8, 0.15, 2.4, 0.0, 0.0, 3.15, 0.0, -0.002, 3.15, 0.002, 0.0, 3.15, 0.8, 0.0, 3.15, 0.8, -0.45, 3.15, 0.45, -0.8, 3.15, 0.0, -0.8, 3.15, 0.0, 0.0, 2.85, 0.2, 0.0, 2.7, 0.2, -0.112, 2.7, 0.112, -0.2, 2.7, 0.0, -0.2, 2.7, -0.002, 0.0, 3.15, -0.45, -0.8, 3.15, -0.8, -0.45, 3.15, -0.8, 0.0, 3.15, -0.112, -0.2, 2.7, -0.2, -0.112, 2.7, -0.2, 0.0, 2.7, 0.0, 0.002, 3.15, -0.8, 0.45, 3.15, -0.45, 0.8, 3.15, 0.0, 0.8, 3.15, -0.2, 0.112, 2.7, -0.112, 0.2, 2.7, 0.0, 0.2, 2.7, 0.45, 0.8, 3.15, 0.8, 0.45, 3.15, 0.112, 0.2, 2.7, 0.2, 0.112, 2.7, 0.4, 0.0, 2.55, 0.4, -0.224, 2.55, 0.224, -0.4, 2.55, 0.0, -0.4, 2.55, 1.3, 0.0, 2.55, 1.3, -0.728, 2.55, 0.728, -1.3, 2.55, 0.0, -1.3, 2.55, 1.3, 0.0, 2.4, 1.3, -0.728, 2.4, 0.728, -1.3, 2.4, 0.0, -1.3, 2.4, -0.224, -0.4, 2.55, -0.4, -0.224, 2.55, -0.4, 0.0, 2.55, -0.728, -1.3, 2.55, -1.3, -0.728, 2.55, -1.3, 0.0, 2.55, -0.728, -1.3, 2.4, -1.3, -0.728, 2.4, -1.3, 0.0, 2.4, -0.4, 0.224, 2.55, -0.224, 0.4, 2.55, 0.0, 0.4, 2.55, -1.3, 0.728, 2.55, -0.728, 1.3, 2.55, 0.0, 1.3, 2.55, -1.3, 0.728, 2.4, -0.728, 1.3, 2.4, 0.0, 1.3, 2.4, 0.224, 0.4, 2.55, 0.4, 0.224, 2.55, 0.728, 1.3, 2.55, 1.3, 0.728, 2.55, 0.728, 1.3, 2.4, 1.3, 0.728, 2.4, 0.0, 0.0, 0.0, 1.5, 0.0, 0.15, 1.5, 0.84, 0.15, 0.84, 1.5, 0.15, 0.0, 1.5, 0.15, 1.5, 0.0, 0.075, 1.5, 0.84, 0.075, 0.84, 1.5, 0.075, 0.0, 1.5, 0.075, 1.425, 0.0, 0.0, 1.425, 0.798, 0.0, 0.798, 1.425, 0.0, 0.0, 1.425, 0.0, -0.84, 1.5, 0.15, -1.5, 0.84, 0.15, -1.5, 0.0, 0.15, -0.84, 1.5, 0.075, -1.5, 0.84, 0.075, -1.5, 0.0, 0.075, -0.798, 1.425, 0.0, -1.425, 0.798, 0.0, -1.425, 0.0, 0.0, -1.5, -0.84, 0.15, -0.84, -1.5, 0.15, 0.0, -1.5, 0.15, -1.5, -0.84, 0.075, -0.84, -1.5, 0.075, 0.0, -1.5, 0.075, -1.425, -0.798, 0.0, -0.798, -1.425, 0.0, 0.0, -1.425, 0.0, 0.84, -1.5, 0.15, 1.5, -0.84, 0.15, 0.84, -1.5, 0.075, 1.5, -0.84, 0.075, 0.798, -1.425, 0.0, 1.425, -0.798, 0.0, }; // ティーポットの 32 面分のベジエ曲面の 16 個の制御点 .CP'DOUBLE( 32, 16, 3 ); for( i = 0 ; i < 32 ; i++ ) { for( j = 0 ; j < 16 ; j++ ) { k = I( i, j ) - 1; .CP( i, j, 0 ) = P( k, 0 ); .CP( i, j, 1 ) = P( k, 1 ); .CP( i, j, 2 ) = P( k, 2 ); } } // ティーポットの材質 .PotAmbient 'FLOAT(4) = { 0.30, 0.30, 0.30, 1.0 }; // 環境光反射係数 .PotDiffuse 'FLOAT(4) = { 0.80, 0.80, 0.70, 1.0 }; // 拡散光反射係数 .PotSpecular'FLOAT(4) = { 0.10, 0.10, 0.10, 1.0 }; // 鏡面光反射係数 .PotShininess = 20.0; // 鏡面係数 .Divs = 12; // ベジエ曲面の縦横の分割数(解像度) .AutoRot? = #TRUE; // 自動回転 ON/OFF フラグ .Theta = 0.0; // 自動回転角度(単位:°) .Alpha = 0.0; // 手動左右回転角度(単位:°) .Beta = 0.0; // 手動上下回転角度(単位:°) .LidUp = 0.0; // ティーポットのふたを上げる距離 .ToUpdate? = #TRUE; // 画面更新をタイマーで行なうか? } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function ^MainWindow.TermFigData() { } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function ^MainWindow.ResizeFigArea() { .FigRect = ::GK.Rect( 0, 0, .gc.Xd, .gc.Yd ); ^glViewport( 0, 0, .gc.Xd, .gc.Yd ); ^glMatrixMode( #GL_PROJECTION ); ^glLoadIdentity(); Xd = 5.0 * .gc.Xd / #FigXd; Yd = 5.0 * .gc.Yd / #FigXd; ^glOrtho( -Xd, Xd, -Yd, Yd, -100.0, 100.0 ); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function ^MainWindow.DrawFigArea() { ^glClearColor( 0.0'sfv, 0.4'sfv, 0.4'sfv, 1.0'sfv ); // 背景色 ^glClearDepth( 1.0 ); ^glClear( #GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT ); ^glEnable( #GL_DEPTH_TEST ); ^glDepthFunc( #GL_LESS ); ^glDepthMask( #GL_TRUE ); ^glFrontFace( #GL_CCW ); ^glCullFace( #GL_BACK ); ^glEnable( #GL_NORMALIZE ); ^glEnable( #GL_AUTO_NORMAL ); ^glMatrixMode( #GL_MODELVIEW ); ^glPushMatrix(); { ^glLoadIdentity(); ^gluLookAt( 0.0, -50.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0 ); ^glRotated( .Beta , 1.0, 0.0, 0.0 ); ^glRotated( .Alpha, 0.0, 0.0, 1.0 ); ^glRotated( .Theta, 1.0, 0.0, 0.0 ); //^glRotated( .Theta, 0.0, 1.0, 0.0 ); ^glRotated( .Theta, 0.0, 0.0, 1.0 ); ^glTranslated( 0.0, 0.0, -2.0 ); // 座標軸の描画 /*@@@@@ ^glBegin( #GL_LINES ); //^glColor3d( 1.0, 0.0, 1.0 ); ^glVertex3d( 0.0, 0.0, 0.0 ); ^glVertex3d( 5.0, 0.0, 0.0 ); //^glColor3d( 1.0, 1.0, 0.0 ); ^glVertex3d( 0.0, 0.0, 0.0 ); ^glVertex3d( 0.0, 5.0, 0.0 ); //^glColor3d( 0.0, 1.0, 1.0 ); ^glVertex3d( 0.0, 0.0, 0.0 ); ^glVertex3d( 0.0, 0.0, 5.0 ); ^glEnd(); /*@@@@@*/ // ティーポットのベジエ曲面を描画 ^glEnable( #GL_MAP2_VERTEX_3 ); ^glShadeModel( #GL_SMOOTH ); ^glMapGrid2d( .Divs, 0.0, 1.0, .Divs, 0.0, 1.0 ); ^glMaterialfv( #GL_FRONT_AND_BACK, #GL_AMBIENT , .PotAmbient ); ^glMaterialfv( #GL_FRONT_AND_BACK, #GL_DIFFUSE , .PotDiffuse ); ^glMaterialfv( #GL_FRONT_AND_BACK, #GL_SPECULAR, .PotSpecular ); ^glMaterialf( #GL_FRONT_AND_BACK, #GL_SHININESS, .PotShininess'sfv ); for( i = 0 ; i < 32 ; i++ ) { ^glMap2d( #GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4, .CP( i, 0, 0 )'addr ); ^glPushMatrix(); { if( i >= 20 && i <= 27 ) // ふたの部分? ^glTranslated( 0.0, 0.0, .LidUp ); ^glEvalMesh2( #GL_FILL, 0, .Divs, 0, .Divs ); } ^glPopMatrix(); } // 0〜11: 本体の側面 // 12〜15: 取手 // 16〜19: 注ぎ口(くちばし) // 20〜23: ふたのつまみ // 24〜27: ふたの本体 // 28〜31: 本体の底面 } ^glPopMatrix(); ^glFinish(); ^SwapBuffers( ^wglGetCurrentDC() ); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function ^MainWindow.InizLighting() // 光源の初期設定 { ^glEnable( #GL_LIGHTING ); // 共通光 BaseAmbient'FLOAT(4) = { 0.5, 0.5, 0.5, 1.0 }; // 環境光係数 ^glLightModelfv( #GL_LIGHT_MODEL_AMBIENT, BaseAmbient ); ^glLightModeli( #GL_LIGHT_MODEL_TWO_SIDE, #GL_TRUE ); // 光源0の設定 ^glEnable( #GL_LIGHT0 ); Position'FLOAT(4) = { 10.0, -10.0, -20.0, 0.0 }; // 方向(ベクトル) ^glLightfv( #GL_LIGHT0 , #GL_POSITION, Position ); Ambient 'FLOAT(4) = { 0.8, 0.8, 0.8, 1.0 }; // 環境光係数 Diffuse 'FLOAT(4) = { 0.8, 0.8, 0.8, 1.0 }; // 拡散光係数 Specular'FLOAT(4) = { 0.8, 0.8, 0.8, 1.0 }; // 鏡面光係数 ^glLightfv( #GL_LIGHT0 , #GL_AMBIENT , Ambient ); ^glLightfv( #GL_LIGHT0 , #GL_DIFFUSE , Diffuse ); ^glLightfv( #GL_LIGHT0 , #GL_SPECULAR, Specular ); } //============================================================================= function SetupOpenGL() // OpenGL のAPIを取得(必要分のみ) { #pv ^ChoosePixelFormat = ::GK.Gdi32.GetEntry( "ChoosePixelFormat" ); #pv ^SetPixelFormat = ::GK.Gdi32.GetEntry( "SetPixelFormat" ); #pv ^GetPixelFormat = ::GK.Gdi32.GetEntry( "GetPixelFormat" ); #pv ^DescribePixelFormat = ::GK.Gdi32.GetEntry( "DescribePixelFormat" ); #pv ^SwapBuffers = ::GK.Gdi32.GetEntry( "SwapBuffers" ); #pv ^GetEnhMetaFilePixelFormat = ::GK.Gdi32.GetEntry( "GetEnhMetaFilePixelFormat" ); #pv ^GL = ::DLL.Link( "OPENGL32", "sys" ); if( ^GL == null ) { #p "OPENGL32.DLL not found!"; return #NG; } #pv ^GLU = ::DLL.Link( "GLU32", "sys" ); if( ^GLU == null ) { #p "GLU32.DLL not found!"; return #NG; } #pv ^glBegin = ^GL.GetEntry( "glBegin" ); #pv ^glClear = ^GL.GetEntry( "glClear" ); #pv ^glClearColor = ^GL.GetEntry( "glClearColor" ); #pv ^glClearDepth = ^GL.GetEntry( "glClearDepth" ); #pv ^glColor3d = ^GL.GetEntry( "glColor3d" ); #pv ^glCullFace = ^GL.GetEntry( "glCullFace" ); #pv ^glDepthFunc = ^GL.GetEntry( "glDepthFunc" ); #pv ^glDepthMask = ^GL.GetEntry( "glDepthMask" ); #pv ^glEnable = ^GL.GetEntry( "glEnable" ); #pv ^glEnd = ^GL.GetEntry( "glEnd" ); #pv ^glEvalMesh2 = ^GL.GetEntry( "glEvalMesh2" ); #pv ^glFinish = ^GL.GetEntry( "glFinish" ); #pv ^glFrontFace = ^GL.GetEntry( "glFrontFace" ); #pv ^glLightfv = ^GL.GetEntry( "glLightfv" ); #pv ^glLightModelfv = ^GL.GetEntry( "glLightModelfv" ); #pv ^glLightModeli = ^GL.GetEntry( "glLightModeli" ); #pv ^glLoadIdentity = ^GL.GetEntry( "glLoadIdentity" ); #pv ^glMap2d = ^GL.GetEntry( "glMap2d" ); #pv ^glMapGrid2d = ^GL.GetEntry( "glMapGrid2d" ); #pv ^glMaterialf = ^GL.GetEntry( "glMaterialf" ); #pv ^glMaterialfv = ^GL.GetEntry( "glMaterialfv" ); #pv ^glMatrixMode = ^GL.GetEntry( "glMatrixMode" ); #pv ^glOrtho = ^GL.GetEntry( "glOrtho" ); #pv ^glPopMatrix = ^GL.GetEntry( "glPopMatrix" ); #pv ^glPushMatrix = ^GL.GetEntry( "glPushMatrix" ); #pv ^glRotated = ^GL.GetEntry( "glRotated" ); #pv ^glShadeModel = ^GL.GetEntry( "glShadeModel" ); #pv ^glTranslated = ^GL.GetEntry( "glTranslated" ); #pv ^gluLookAt = ^GLU.GetEntry( "gluLookAt" ); #pv ^glVertex3d = ^GL.GetEntry( "glVertex3d" ); #pv ^glViewport = ^GL.GetEntry( "glViewport" ); #pv ^wglCreateContext = ^GL.GetEntry( "wglCreateContext" ); #pv ^wglDeleteContext = ^GL.GetEntry( "wglDeleteContext" ); #pv ^wglGetCurrentDC = ^GL.GetEntry( "wglGetCurrentDC" ); #pv ^wglMakeCurrent = ^GL.GetEntry( "wglMakeCurrent" ); return #OK; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function DeleteOpenGL() { delete ^GL; delete ^GLU; } //-----------------------------------------------------------------------------