| // sample BGLView app from the Be Book |
| |
| |
| #include <stdio.h> |
| #include <Application.h> |
| #include <Window.h> |
| #include <GLView.h> |
| |
| |
| class SampleGLView : public BGLView |
| { |
| public: |
| SampleGLView(BRect frame, uint32 type); |
| virtual void AttachedToWindow(void); |
| virtual void FrameResized(float newWidth, float newHeight); |
| virtual void ErrorCallback(GLenum which); |
| |
| void Render(void); |
| |
| private: |
| void gInit(void); |
| void gDraw(void); |
| void gReshape(int width, int height); |
| |
| float width; |
| float height; |
| }; |
| |
| |
| |
| class SampleGLWindow : public BWindow |
| { |
| public: |
| SampleGLWindow(BRect frame, uint32 type); |
| virtual bool QuitRequested() { be_app->PostMessage(B_QUIT_REQUESTED); return true; } |
| |
| private: |
| SampleGLView *theView; |
| }; |
| |
| |
| class SampleGLApp : public BApplication |
| { |
| public: |
| SampleGLApp(); |
| private: |
| SampleGLWindow *theWindow; |
| }; |
| |
| |
| SampleGLApp::SampleGLApp() |
| : BApplication("application/x-vnd.sample") |
| { |
| BRect windowRect; |
| uint32 type = BGL_RGB|BGL_DOUBLE; |
| |
| windowRect.Set(50, 50, 350, 350); |
| |
| theWindow = new SampleGLWindow(windowRect, type); |
| } |
| |
| |
| |
| SampleGLWindow::SampleGLWindow(BRect frame, uint32 type) |
| : BWindow(frame, "OpenGL Test", B_TITLED_WINDOW, 0) |
| { |
| theView = new SampleGLView(Bounds(), type); |
| AddChild(theView); |
| Show(); |
| theView->Render(); |
| } |
| |
| |
| |
| SampleGLView::SampleGLView(BRect frame, uint32 type) |
| : BGLView(frame, "SampleGLView", B_FOLLOW_ALL_SIDES, 0, type) |
| { |
| width = frame.right-frame.left; |
| height = frame.bottom-frame.top; |
| } |
| |
| |
| void SampleGLView::AttachedToWindow(void) |
| { |
| LockGL(); |
| BGLView::AttachedToWindow(); |
| gInit(); |
| gReshape(width, height); |
| UnlockGL(); |
| } |
| |
| |
| void SampleGLView::FrameResized(float newWidth, float newHeight) |
| { |
| BGLView::FrameResized(newWidth, newHeight); |
| |
| LockGL(); |
| |
| width = newWidth; |
| height = newHeight; |
| |
| gReshape(width,height); |
| |
| UnlockGL(); |
| Render(); |
| } |
| |
| |
| void SampleGLView::ErrorCallback(GLenum whichError) |
| { |
| // fprintf(stderr, "Unexpected error occured (%d):\\n", whichError); |
| // fprintf(stderr, " %s\\n", gluErrorString(whichError)); |
| } |
| |
| |
| |
| // globals |
| GLenum use_stipple_mode; // GL_TRUE to use dashed lines |
| GLenum use_smooth_mode; // GL_TRUE to use anti-aliased lines |
| GLint linesize; // Line width |
| GLint pointsize; // Point diameter |
| |
| float pntA[3] = { |
| -160.0, 0.0, 0.0 |
| }; |
| float pntB[3] = { |
| -130.0, 0.0, 0.0 |
| }; |
| |
| |
| |
| void SampleGLView::gInit(void) |
| { |
| glClearColor(0.0, 0.0, 0.0, 0.0); |
| glLineStipple(1, 0xF0E0); |
| glBlendFunc(GL_SRC_ALPHA, GL_ONE); |
| use_stipple_mode = GL_FALSE; |
| use_smooth_mode = GL_TRUE; |
| linesize = 2; |
| pointsize = 6; |
| } |
| |
| |
| |
| void SampleGLView::gDraw(void) |
| { |
| GLint i; |
| |
| glClear(GL_COLOR_BUFFER_BIT); |
| glLineWidth(linesize); |
| |
| /* |
| |
| if (use_stipple_mode) { |
| glEnable(GL_LINE_STIPPLE); |
| } else { |
| glDisable(GL_LINE_STIPPLE); |
| } |
| */ |
| |
| glDisable(GL_POINT_SMOOTH); |
| |
| |
| glPushMatrix(); |
| |
| glPointSize(pointsize); // Set size for point |
| |
| for (i = 0; i < 360; i += 5) { |
| glRotatef(5.0, 0,0,1); // Rotate right 5 degrees |
| |
| if (use_smooth_mode) { |
| glEnable(GL_LINE_SMOOTH); |
| glEnable(GL_BLEND); |
| } else { |
| glDisable(GL_LINE_SMOOTH); |
| glDisable(GL_BLEND); |
| } |
| |
| glColor3f(1.0, 1.0, 0.0); // Set color for line |
| glBegin(GL_LINE_STRIP); // And create the line |
| glVertex3fv(pntA); |
| glVertex3fv(pntB); |
| glEnd(); |
| |
| glDisable(GL_POINT_SMOOTH); |
| glDisable(GL_BLEND); |
| |
| glColor3f(0.0, 1.0, 0.0); // Set color for point |
| glBegin(GL_POINTS); |
| glVertex3fv(pntA); // Draw point at one end |
| glVertex3fv(pntB); // Draw point at other end |
| glEnd(); |
| } |
| |
| glPopMatrix(); // Done with matrix |
| } |
| |
| |
| void SampleGLView::gReshape(int width, int height) |
| { |
| glViewport(0, 0, width, height); |
| glMatrixMode(GL_PROJECTION); |
| glLoadIdentity(); |
| glOrtho(-175, 175, -175, 175, -1, 1); |
| glMatrixMode(GL_MODELVIEW); |
| } |
| |
| |
| void SampleGLView::Render(void) |
| { |
| LockGL(); |
| gDraw(); |
| SwapBuffers(); |
| UnlockGL(); |
| } |
| |
| |
| |
| int main(int argc, char *argv[]) |
| { |
| SampleGLApp *app = new SampleGLApp; |
| app->Run(); |
| delete app; |
| return 0; |
| } |