#define UNIT_CUBE #include #include #include #include #include #include long WndProc ( HWND hwnd, UINT message, DWORD wParam, LONG lParam ); void DrawGlStuff( ); void InitGL( HWND hWnd ); #include #define TERMINATE DbgPrint("%s (%d)\n", __FILE__, __LINE__), ExitProcess(0) #define WINDSIZEX(Rect) (Rect.right - Rect.left) #define WINDSIZEY(Rect) (Rect.bottom - Rect.top) // Default Logical Palette indexes #define BLACK_INDEX 0 #define WHITE_INDEX 19 #define RED_INDEX 13 #define GREEN_INDEX 14 #define BLUE_INDEX 16 #define YELLOW_INDEX 15 #define MAGENTA_INDEX 17 #define CYAN_INDEX 18 // Globals HDC hDc; HGLRC hRc; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { static char szAppName[] = "TriRast"; HWND hwnd; MSG msg; RECT Rect; WNDCLASS wndclass; if ( !hPrevInstance ) { wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wndclass.lpfnWndProc = (WNDPROC)WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; RegisterClass(&wndclass); } /* * Make the windows a reasonable size and pick a * position for it. */ Rect.left = 50; Rect.top = 200; Rect.right = 150; Rect.bottom = 300; AdjustWindowRect( &Rect, WS_OVERLAPPEDWINDOW, FALSE ); DbgPrint("CreateWindow in app\n"); hwnd = CreateWindow ( szAppName, // window class name "The TriRast Program", // window caption WS_OVERLAPPEDWINDOW, // window style Rect.left, // initial x position Rect.top, // initial y position WINDSIZEX(Rect), // initial x size WINDSIZEY(Rect), // initial y size NULL, // parent window handle NULL, // window menu handle hInstance, // program instance handle NULL // creation parameter ); DbgPrint("Back CreateWindow in app\n"); hDc = GetDC(hwnd); DbgPrint("hDc in app is 0x%x\n", hDc); ShowWindow( hwnd, nCmdShow ); UpdateWindow( hwnd ); while ( GetMessage( &msg, NULL, 0, 0 )) { TranslateMessage( &msg ); DispatchMessage( &msg ); } return( msg.wParam ); } long WndProc ( HWND hWnd, UINT message, DWORD wParam, LONG lParam ) { PAINTSTRUCT ps; HDC paintdc; switch ( message ) { case WM_PAINT: DbgPrint("WM_PAINT\n"); if (hRc == NULL) InitGL(hWnd); paintdc = BeginPaint( hWnd, &ps ); DbgPrint("paintdc is 0x%x\n", paintdc); DrawGlStuff(); EndPaint( hWnd, &ps ); return(0); case WM_DESTROY: wglDeleteContext( hRc ); PostQuitMessage( 0 ); return( 0 ); } return( DefWindowProc( hWnd, message, wParam, lParam ) ); } void InitGL( HWND hWnd ) { RECT Rect; DbgPrint("InitGL"); /* Get the size of the client area */ GetClientRect( hWnd, &Rect ); DbgPrint("GetClientRect: hdc 0x%x (%d, %d) (%d, %d)\n", hDc, Rect.left, Rect.top, Rect.right, Rect.bottom ); /* Create a Rendering Context */ hRc = wglCreateContext( hDc ); /* Make it Current */ wglMakeCurrent( hDc, hRc ); /* Set up the projection matrix */ //Ortho2D(0, WINDSIZEX(Rect), 0, WINDSIZEY(Rect)); #ifdef SIMPLE_ORTHO glOrtho(0, WINDSIZEX(Rect), 0, WINDSIZEY(Rect), -1, 1); #endif // the following should be the default #ifdef X_UNIT_CUBE glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); #endif glViewport(0, 0, WINDSIZEX(Rect), WINDSIZEY(Rect)); /* Set the clear color */ glClearIndex(BLACK_INDEX); glClearDepth(1.0); glEnable(GL_DEPTH_TEST); glDisable(GL_DITHER); /* Turn off dithering */ glShadeModel(GL_FLAT); /* Flat shaded */ } void DrawGlStuff( ) { int i; DbgPrint("trirast: drawGLstuff\n"); /* Clear the color buffer */ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); /* Draw a single point */ glBegin(GL_TRIANGLES); #ifdef SIMPLE_ORTHO /* Set the color */ glIndexi(RED_INDEX); glVertex2f( (GLfloat)10, (GLfloat)10 ); glVertex2f( (GLfloat)50, (GLfloat)20 ); glVertex2f( (GLfloat)40, (GLfloat)60 ); #endif #ifdef UNIT_CUBE glIndexi(RED_INDEX); glVertex3f( (GLfloat)-.5, (GLfloat)-.5, (GLfloat).5 ); glVertex3f( (GLfloat).5, (GLfloat)-.5, (GLfloat).5 ); glVertex3f( (GLfloat).0, (GLfloat).5, (GLfloat)-.5 ); glIndexi(GREEN_INDEX); glVertex3f( (GLfloat)-.5, (GLfloat)-.5, (GLfloat)-.5 ); glVertex3f( (GLfloat).5, (GLfloat)-.5, (GLfloat)-.5 ); glVertex3f( (GLfloat).0, (GLfloat).5, (GLfloat).5 ); #endif glEnd(); glFlush(); }