mesa/progs/beos/demo.cpp

147 lines
2.3 KiB
C++

// Simple BeOS GLView demo
// Written by Brian Paul
// Changes by Philippe Houdoin
// This file is in the public domain.
#include <stdio.h>
#include <Application.h>
#include <Window.h>
#include <GLView.h>
class MyGL : public BGLView
{
public:
MyGL(BRect rect, char *name, ulong options);
virtual void AttachedToWindow();
virtual void Pulse();
virtual void FrameResized(float w, float h);
private:
void Render();
void Reshape(float w, float h);
float mAngle;
};
class MyWindow : public BWindow
{
public:
MyWindow(BRect frame);
virtual bool QuitRequested();
};
MyWindow::MyWindow(BRect frame)
: BWindow(frame, "demo", B_TITLED_WINDOW, B_NOT_ZOOMABLE)
{
// Make OpenGL view and put it in the window
BRect r = Bounds();
r.InsetBy(5, 5);
MyGL *gl = new MyGL(r, "GL", BGL_RGB | BGL_DOUBLE);
AddChild(gl);
SetPulseRate(1000000 / 30);
}
bool MyWindow::QuitRequested()
{
be_app->PostMessage(B_QUIT_REQUESTED);
return true;
}
MyGL::MyGL(BRect rect, char *name, ulong options)
: BGLView(rect, name, B_FOLLOW_ALL_SIDES, B_PULSE_NEEDED, options)
{
mAngle = 0.0;
}
void MyGL::AttachedToWindow()
{
BGLView::AttachedToWindow();
LockGL();
glClearColor(0.7, 0.7, 0, 0);
Reshape(Bounds().Width(), Bounds().Height());
UnlockGL();
}
void MyGL::FrameResized(float w, float h)
{
BGLView::FrameResized(w, h);
LockGL();
Reshape(w, h);
UnlockGL();
Render();
}
void MyGL::Pulse()
{
mAngle += 1.0;
Render();
}
void MyGL::Render()
{
LockGL();
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glRotated(mAngle, 0, 0, 1);
glColor3f(0, 0, 1);
glBegin(GL_POLYGON);
glVertex2f(-1, -1);
glVertex2f( 1, -1);
glVertex2f( 1, 1);
glVertex2f(-1, 1);
glEnd();
glPopMatrix();
SwapBuffers();
UnlockGL();
}
void MyGL::Reshape(float w, float h)
{
glViewport(0, 0, (int) (w + 1), (int) (h + 1));
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1, 1, -1, 1, 10, 30);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0, 0, -18);
}
int main(int argc, char *argv[])
{
BApplication *app = new BApplication("application/demo");
// make top-level window
MyWindow *win = new MyWindow(BRect(100, 100, 500, 500));
win->Show();
app->Run();
delete app;
return 0;
}