226 lines
4.2 KiB
C++
226 lines
4.2 KiB
C++
|
// 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;
|
||
|
}
|