147 lines
2.3 KiB
C++
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;
|
|
}
|