Rashmistrz Temat założony przez niniejszego użytkownika |
Rozbijanie kodu na parę plików. » 2016-06-10 22:51:32 Ostatnio bawię się z OpenGL'em. Jako, że kod coraz bardziej rośnie, a nie chcę szukać czegoś w całym gąszczu funkcji, więc postanowiłem, że przeniosę większość funkcji do osobnych plików *.cpp, jednakże po zrobieniu tego wywalane są błędy do tych jakbym nie załączył odpowiednich nagłówków do projektu... (Pliki zostały dodane do projektu po utworzeniu.) Tu przykładowy kod: #include <windows.h> #include <gl\gl.h> #include <gl\glu.h>
HGLRC hRC = NULL; HDC hDC = NULL; HWND hWnd = NULL; HINSTANCE hInstance;
bool keys[ 256 ]; bool active = TRUE; bool fullscreen = FALSE;
GLfloat rtri = 0.0f; GLfloat rquad = 0.0f;
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
GLvoid ReSizeGLScene( GLsizei width, GLsizei height ) { if( height == 0 ) height = 1; glViewport( 0, 0, width, height ); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluPerspective( 45.0f,( GLfloat ) width /( GLfloat ) height, 0.1f, 100.0f ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); }
GLint InitGL( void ) { glShadeModel( GL_SMOOTH ); glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); glClearDepth( 1.0f ); glEnable( GL_DEPTH_TEST ); glDepthFunc( GL_LEQUAL ); glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); return TRUE; }
GLint DrawGLScene( void ) { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glLoadIdentity(); glTranslatef( - 1.5f, 0.0f, - 6.0f ); glRotatef( rtri, 0.0f, 1.0f, 0.0f ); glBegin( GL_TRIANGLES ); glColor3f( 1.0f, 0.0f, 0.0f ); glVertex3f( 0.0f, 1.0f, 0.0f ); glColor3f( 0.0f, 1.0f, 0.0f ); glVertex3f( - 1.0f, - 1.0f, 1.0f ); glColor3f( 0.0f, 0.0f, 1.0f ); glVertex3f( 1.0f, - 1.0f, 1.0f ); glColor3f( 1.0f, 0.0f, 0.0f ); glVertex3f( 0.0f, 1.0f, 0.0f ); glColor3f( 0.0f, 0.0f, 1.0f ); glVertex3f( 1.0f, - 1.0f, 1.0f ); glColor3f( 0.0f, 1.0f, 0.0f ); glVertex3f( 1.0f, - 1.0f, - 1.0f ); glColor3f( 1.0f, 0.0f, 0.0f ); glVertex3f( 0.0f, 1.0f, 0.0f ); glColor3f( 0.0f, 1.0f, 0.0f ); glVertex3f( 1.0f, - 1.0f, - 1.0f ); glColor3f( 0.0f, 0.0f, 1.0f ); glVertex3f( - 1.0f, - 1.0f, - 1.0f ); glColor3f( 1.0f, 0.0f, 0.0f ); glVertex3f( 0.0f, 1.0f, 0.0f ); glColor3f( 0.0f, 0.0f, 1.0f ); glVertex3f( - 1.0f, - 1.0f, - 1.0f ); glColor3f( 0.0f, 1.0f, 0.0f ); glVertex3f( - 1.0f, - 1.0f, 1.0f ); glEnd(); glLoadIdentity(); glTranslatef( 1.5f, 0.0f, - 7.0f ); glRotatef( rquad, 1.0f, 1.0f, 1.0f ); glBegin( GL_QUADS ); glColor3f( 0.0f, 1.0f, 0.0f ); glVertex3f( 1.0f, 1.0f, - 1.0f ); glVertex3f( - 1.0f, 1.0f, - 1.0f ); glVertex3f( - 1.0f, 1.0f, 1.0f ); glVertex3f( 1.0f, 1.0f, 1.0f ); glColor3f( 1.0f, 0.5f, 0.0f ); glVertex3f( 1.0f, - 1.0f, 1.0f ); glVertex3f( - 1.0f, - 1.0f, 1.0f ); glVertex3f( - 1.0f, - 1.0f, - 1.0f ); glVertex3f( 1.0f, - 1.0f, - 1.0f ); glColor3f( 1.0f, 0.0f, 0.0f ); glVertex3f( 1.0f, 1.0f, 1.0f ); glVertex3f( - 1.0f, 1.0f, 1.0f ); glVertex3f( - 1.0f, - 1.0f, 1.0f ); glVertex3f( 1.0f, - 1.0f, 1.0f ); glColor3f( 1.0f, 1.0f, 0.0f ); glVertex3f( 1.0f, - 1.0f, - 1.0f ); glVertex3f( - 1.0f, - 1.0f, - 1.0f ); glVertex3f( - 1.0f, 1.0f, - 1.0f ); glVertex3f( 1.0f, 1.0f, - 1.0f ); glColor3f( 0.0f, 0.0f, 1.0f ); glVertex3f( - 1.0f, 1.0f, 1.0f ); glVertex3f( - 1.0f, 1.0f, - 1.0f ); glVertex3f( - 1.0f, - 1.0f, - 1.0f ); glVertex3f( - 1.0f, - 1.0f, 1.0f ); glColor3f( 1.0f, 0.0f, 1.0f ); glVertex3f( 1.0f, 1.0f, - 1.0f ); glVertex3f( 1.0f, 1.0f, 1.0f ); glVertex3f( 1.0f, - 1.0f, 1.0f ); glVertex3f( 1.0f, - 1.0f, - 1.0f ); glEnd(); rtri += 0.125f; rquad -= 0.0625f; return TRUE; }
GLvoid KillGLWindow( void ) { if( fullscreen ) { ChangeDisplaySettings( NULL, 0 ); ShowCursor( TRUE ); } if( hRC ) { if( !wglMakeCurrent( NULL, NULL ) ) MessageBox( NULL, "Nie można zwolnić hDC lub hRC!", "BŁĄD ZAMYKANIA", MB_OK | MB_ICONINFORMATION ); if( !wglDeleteContext( hRC ) ) MessageBox( NULL, "Nie można usunąć kontekstu renderowania", "BŁĄD ZAMYKANIA", MB_OK | MB_ICONINFORMATION ); hRC = NULL; } if( hDC && !ReleaseDC( hWnd, hDC ) ) { MessageBox( NULL, "Nie można zwolnić kontekstu urządzenia (DC)", "BŁĄD ZAMYKANIA", MB_OK | MB_ICONINFORMATION ); hDC = NULL; } if( hWnd && !DestroyWindow( hWnd ) ) { MessageBox( NULL, "Nie można zwolnić hWnd", "BŁĄD ZAMYKANIA", MB_OK | MB_ICONINFORMATION ); hWnd = NULL; } if( !UnregisterClass( "OpenGL", hInstance ) ) { MessageBox( NULL, "Nie można wyrejstrować klasy okna", "BŁĄD ZAMYKANIA", MB_OK | MB_ICONINFORMATION ); hInstance = NULL; } }
GLboolean CreateGLWindow( char * title, int width, int height, int bits, bool fullscreenflag ) { GLuint PixelFormat; WNDCLASS wc; DWORD dwExStyle; DWORD dwStyle; RECT WindowRect; WindowRect.left =( long ) 0; WindowRect.right =( long ) width; WindowRect.top =( long ) 0; WindowRect.bottom =( long ) height; fullscreen = fullscreenflag; hInstance = GetModuleHandle( NULL ); wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wc.lpfnWndProc =( WNDPROC ) WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon( NULL, IDI_WINLOGO ); wc.hCursor = LoadCursor( NULL, IDC_ARROW ); wc.hbrBackground = NULL; wc.lpszMenuName = NULL; wc.lpszClassName = "OpenGL"; if( !RegisterClass( & wc ) ) { MessageBox( NULL, "Nie udało się zarejstrować klasy okna", "BŁĄD", MB_OK | MB_ICONEXCLAMATION ); return FALSE; } if( fullscreen ) { DEVMODE dmScreenSettings; memset( & dmScreenSettings, 0, sizeof( dmScreenSettings ) ); dmScreenSettings.dmSize = sizeof( dmScreenSettings ); dmScreenSettings.dmPelsWidth = width; dmScreenSettings.dmPelsHeight = height; dmScreenSettings.dmBitsPerPel = bits; dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; if( ChangeDisplaySettings( & dmScreenSettings, CDS_FULLSCREEN ) != DISP_CHANGE_SUCCESSFUL ) { if( MessageBox( NULL, "Tryb graficzny nie jest obsługiwany przez twoją" " kartę graf. Czy użyć zamiast niego okna?", "NeHe PL", MB_YESNO | MB_ICONEXCLAMATION ) == IDYES ) fullscreen = FALSE; else { MessageBox( NULL, "Program teraz się zamknie.", "BŁĄD", MB_OK | MB_ICONSTOP ); return FALSE; } } } if( fullscreen ) { dwExStyle = WS_EX_APPWINDOW; dwStyle = WS_POPUP; ShowCursor( FALSE ); } else { dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; dwStyle = WS_OVERLAPPEDWINDOW; } AdjustWindowRectEx( & WindowRect, dwStyle, FALSE, dwExStyle ); if( !( hWnd = CreateWindowEx( dwExStyle, "OpenGL", title, WS_CLIPSIBLINGS | WS_CLIPCHILDREN | dwStyle, 0, 0, WindowRect.right - WindowRect.left, WindowRect.bottom - WindowRect.top, NULL, NULL, hInstance, NULL ) ) ) { KillGLWindow(); MessageBox( NULL, "Nie można stworzyć okna.", "BŁĄD", MB_OK | MB_ICONEXCLAMATION ); return FALSE; } static PIXELFORMATDESCRIPTOR pfd = { sizeof( PIXELFORMATDESCRIPTOR ), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, bits, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0 }; if( !( hDC = GetDC( hWnd ) ) ) { KillGLWindow(); MessageBox( NULL, "Nie można stworzyć kontekstu urządzenia.", "BŁĄD", MB_OK | MB_ICONEXCLAMATION ); return FALSE; } if( !( PixelFormat = ChoosePixelFormat( hDC, & pfd ) ) ) { KillGLWindow(); MessageBox( NULL, "Nie można znaleźć żądanego formatu piksela.", "BŁĄD", MB_OK | MB_ICONEXCLAMATION ); return FALSE; } if( !SetPixelFormat( hDC, PixelFormat, & pfd ) ) { KillGLWindow(); MessageBox( NULL, "Nie można ustawić żądanego formatu piksela.", "BŁĄD", MB_OK | MB_ICONEXCLAMATION ); return FALSE; } if( !( hRC = wglCreateContext( hDC ) ) ) { KillGLWindow(); MessageBox( NULL, "Nie można stworzyć kontekstu renderowania.", "BŁĄD", MB_OK | MB_ICONEXCLAMATION ); return FALSE; } if( !wglMakeCurrent( hDC, hRC ) ) { KillGLWindow(); MessageBox( NULL, "Nie można aktywować kontekstu renderowania.", "BŁĄD", MB_OK | MB_ICONEXCLAMATION ); return FALSE; } ShowWindow( hWnd, SW_SHOW ); SetForegroundWindow( hWnd ); SetFocus( hWnd ); ReSizeGLScene( width, height ); if( !InitGL() ) { KillGLWindow(); MessageBox( NULL, "Inicjacja niepomyślna.", "BŁĄD", MB_OK | MB_ICONEXCLAMATION ); return FALSE; } return TRUE; }
LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch( uMsg ) { case WM_ACTIVATE: if( !HIWORD( wParam ) ) active = TRUE; else active = FALSE; return 0; case WM_SYSCOMMAND: switch( wParam ) { case SC_SCREENSAVE: case SC_MONITORPOWER: return 0; } break; case WM_CLOSE: PostQuitMessage( 0 ); return 0; case WM_KEYDOWN: keys[ wParam ] = TRUE; return 0; case WM_KEYUP: keys[ wParam ] = FALSE; return 0; case WM_SIZE: ReSizeGLScene( LOWORD( lParam ), HIWORD( lParam ) ); return 0; } return DefWindowProc( hWnd, uMsg, wParam, lParam ); }
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MSG msg; BOOL done = FALSE; if( !CreateGLWindow( "OpynGeeL", 640, 480, 16, fullscreen ) ) return 0; while( !done ) { if( PeekMessage( & msg, NULL, 0, 0, PM_REMOVE ) ) { if( msg.message == WM_QUIT ) done = TRUE; else { TranslateMessage( & msg ); DispatchMessage( & msg ); } } else { if( active ) { if( keys[ VK_ESCAPE ] ) done = TRUE; else { DrawGLScene(); SwapBuffers( hDC ); } } if( keys[ VK_F1 ] ) { keys[ VK_F1 ] = FALSE; KillGLWindow(); fullscreen = !fullscreen; if( !CreateGLWindow( "OpynGeeL", 640, 480, 16, fullscreen ) ) return 0; } } } KillGLWindow(); return( msg.wParam ); } Po rozdzieleniu funkcji np. ReSizeGLScene do nowego pliku: GLvoid ReSizeGLScene( GLsizei width, GLsizei height ) { if( height == 0 ) height = 1; glViewport( 0, 0, width, height ); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluPerspective( 45.0f,( GLfloat ) width /( GLfloat ) height, 0.1f, 100.0f ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); } Wywala takie błędy: E:\CACHE\014\lessons\lesson06\asdf.cpp|1|error: 'GLvoid' does not name a type| E:\CACHE\014\lessons\lesson06\asdf.cpp|1|error: 'GLsizei' was not declared in this scope| E:\CACHE\014\lessons\lesson06\asdf.cpp|1|error: 'GLsizei' was not declared in this scope| (po zmianie deklaracji funkcji na: void ReSizeGLScene( int width, int height ) ) ||=== Build: Release in lesson (compiler: GNU GCC Compiler) ===| E:\CACHE\014\lessons\lesson06\asdf.cpp||In function 'void ReSizeGLScene(int, int)':| E:\CACHE\014\lessons\lesson06\asdf.cpp|6|error: 'glViewport' was not declared in this scope| E:\CACHE\014\lessons\lesson06\asdf.cpp|7|error: 'GL_PROJECTION' was not declared in this scope| E:\CACHE\014\lessons\lesson06\asdf.cpp|7|error: 'glMatrixMode' was not declared in this scope| E:\CACHE\014\lessons\lesson06\asdf.cpp|8|error: 'glLoadIdentity' was not declared in this scope| E:\CACHE\014\lessons\lesson06\asdf.cpp|11|error: 'GLfloat' was not declared in this scope| E:\CACHE\014\lessons\lesson06\asdf.cpp|11|error: 'gluPerspective' was not declared in this scope| E:\CACHE\014\lessons\lesson06\asdf.cpp|12|error: 'GL_MODELVIEW' was not declared in this scope| ||=== Build failed: 7 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
|