CB的global compiler settings -> compiler settings -> Other options 填-fexceptions
#defines填FREEGLUT_STATIC
link libraries加入libFreeGLUT.a libGLUI.a GlU32(GlU32.Lib) Gdi32(Gdi32.Lib) OpenGL32(OpenGL32.Lib) User32(User32.Lib) WinMM(WinMM.Lib)
main.cpp
//#define GLUT_DISABLE_ATEXIT_HACK //出ATEXIT_HACK錯要加
#include "iostream"
#include "math.h"
#include "glui/GL/glui.h"
#define PI 3.141592653
const float deg2Rad = PI / 180.;
const float rad2Deg = 180. / PI;
using namespace std;
//------------------------------------------------------------------------
struct neoColor
{
float r, g, b;
neoColor() {}
neoColor(float r, float g, float b) : r(r), g(g), b(b) {}
void Set(float ri, float gi, float bi) { r = ri; g = gi; b = bi; }
};
struct neoVec2
{
float x, y;
/// Default constructor does nothing (for performance).
neoVec2() {}
/// Construct using coordinates.
neoVec2(float x, float y) : x(x), y(y) {}
/// Set this vector to all zeros.
void SetZero() { x = 0.0f; y = 0.0f; }
/// Set this vector to some specified coordinates.
void Set(float x_, float y_) { x = x_; y = y_; }
/// Negate this vector.
neoVec2 operator -() const { neoVec2 v; v.Set(-x, -y); return v; }
/// Read from and indexed element.
float operator () (int i) const
{
return (&x)[i];
}
/// Write to an indexed element.
float& operator () (int i)
{
return (&x)[i];
}
/// Add a vector to this vector.
void operator += (const neoVec2& v)
{
x += v.x; y += v.y;
}
/// Subtract a vector from this vector.
void operator -= (const neoVec2& v)
{
x -= v.x; y -= v.y;
}
/// Multiply this vector by a scalar.
void operator *= (float a)
{
x *= a; y *= a;
}
/*
neoVec2 operator * (float a)
{
return neoVec2(x *= a, y *= a);
}
*/
/// Get the length of this vector (the norm).
float Length() const
{
return sqrt(x * x + y * y);
}
/// Get the length squared. For performance, use this instead of
/// b2Vec2::Length (if possible).
float LengthSquared() const
{
return x * x + y * y;
}
/// Convert this vector into a unit vector. Returns the length.
float Normalize()
{
float length = Length();
float invLength = 1.0f / length;
x *= invLength;
y *= invLength;
return length;
}
/// Get the skew vector such that dot(skew_vec, other) == cross(vec, other)
neoVec2 Skew() const
{
return neoVec2(-y, x);
}
};
inline neoVec2 operator + (const neoVec2& a, const neoVec2& b)
{
return neoVec2(a.x + b.x, a.y + b.y);
}
inline neoVec2 operator - (const neoVec2& a, const neoVec2& b)
{
return neoVec2(a.x - b.x, a.y - b.y);
}
inline neoVec2 operator * (float s, const neoVec2& a)
{
return neoVec2(s * a.x, s * a.y);
}
inline bool operator == (const neoVec2& a, const neoVec2& b)
{
return a.x == b.x && a.y == b.y;
}
struct neoVec3
{
float x, y, z;
/// Default constructor does nothing (for performance).
neoVec3() {}
/// Construct using coordinates.
neoVec3(float x, float y, float z) : x(x), y(y), z(z) {}
/// Set this vector to all zeros.
void SetZero() { x = 0.0f; y = 0.0f; z = 0.0f; }
/// Set this vector to some specified coordinates.
void Set(float x_, float y_, float z_) { x = x_; y = y_; z = z_; }
/// Negate this vector.
neoVec3 operator -() const {neoVec3 v; v.Set(-x, -y, -z); return v; }
/// Add a vector to this vector.
void operator += (const neoVec3& v)
{
x += v.x; y += v.y; z += v.z;
}
/// Subtract a vector from this vector.
void operator -= (const neoVec3& v)
{
x -= v.x; y -= v.y; z -= v.z;
}
/// Multiply this vector by a scalar.
void operator *= (float s)
{
x *= s; y *= s; z *= s;
}
};
//--------------------------------------------------------------------------------
namespace
{
int mainWindow;
GLint winWidth = 640;
GLint winHeight = 640;
GLUI *glui;
int listboxindx = 0;
int spinnerintegervar = 0;
int checkbox = false; //1=>checked 0=>cancle
float spinnerfloatvar;
neoVec2 mp,pre_mp;
int angToY=0, angToX=0;
bool isMouseRightPressed = false;
bool isMouseLeftPressed = false;
}
//-----------------------------------------------------------------------------
void Keyboard(unsigned char key, int x, int y)
{
switch (key)
{
case 27:
exit(0);
break;
default:
break;
}
}
void KeyboardSpecial(int key, int x, int y)
{
switch (key)
{
case GLUT_ACTIVE_SHIFT:
break;
case GLUT_KEY_LEFT:
cout << checkbox << "," << listboxindx << endl;
break;
case GLUT_KEY_RIGHT:
break;
case GLUT_KEY_DOWN:
break;
case GLUT_KEY_UP:
break;
case GLUT_KEY_HOME:
break;
}
}
void Resize(int newWidth, int newHeight)
{
glViewport(0, 0,(GLsizei) newWidth,(GLsizei) newHeight);
winWidth = newWidth;
winHeight = newHeight;
glClear(GL_COLOR_BUFFER_BIT);
}
void Mouse(int button, int state, int x, int y)
{
// Use the mouse to move things around.
if (button == GLUT_LEFT_BUTTON)
{
int specialKey = glutGetModifiers();
if (state == GLUT_DOWN)
{
if (specialKey == GLUT_ACTIVE_SHIFT)
{
cout << "GLUT_LEFT_BUTTON click with SHIFT" << endl;
}
else
{
cout << "GLUT_LEFT_BUTTON click" << endl;
}
}
if (state == GLUT_UP)
{
cout << "GLUT_LEFT_BUTTON release" << endl;
}
}
else if (button == GLUT_RIGHT_BUTTON)
{
if (state == GLUT_DOWN)
{
isMouseRightPressed = true;
cout << "GLUT_RIGHT_BUTTON click" << endl;
}
if (state == GLUT_UP)
{
isMouseRightPressed = false;
cout << "GLUT_RIGHT_BUTTON release" << endl;
}
}
}
void MouseWheel(int wheel, int direction, int x, int y)
{
if (direction > 0)
{
cout << "wheel in" << endl;
}
else
{
cout << "wheel out" << endl;
}
}
void MouseMotion(int x, int y)
{
if(isMouseRightPressed)
{
int distanceX = x - pre_mp.x;
int distanceY = y - pre_mp.y;
pre_mp.Set(x,y);
angToY += distanceX;
angToX += distanceY;
glutPostRedisplay(); //要求重畫視窗
}
cout << "Mouse clicked and x=" << mp.x << ",y=" << mp.y << endl;
}
//glutPassiveMotionFunc(int x,int y);
//glutEntryFunc(processMouseEntryWindow);
void Exit(int code)
{
#ifndef __APPLE__
glutLeaveMainLoop();
#endif
exit(code);
}
void Timer(int)
{
cout << "time up!" << endl;
glutSetWindow(mainWindow);
glutPostRedisplay(); //要求重畫視窗
glutTimerFunc(16, Timer, 0); //Do Repeat
}
void DrawPoint(const neoVec2& p, float size, const neoColor& color)
{
glPointSize(size);
glBegin(GL_POINTS);
glColor3f(color.r, color.g, color.b);
glVertex2f(p.x, p.y);
glEnd();
glPointSize(1.0f);
}
void DrawCircle(const neoVec2& center, float radius, const neoColor& color)
{
const float k_segments = 16.0f;
const float k_increment = 2.0f * PI / k_segments;
float theta = 0.0f;
glColor3f(color.r, color.g, color.b);
glBegin(GL_LINE_LOOP);
for (int i = 0; i < k_segments; ++i)
{
neoVec2 v = center + radius * neoVec2(cosf(theta), sinf(theta)) ;
glVertex2f(v.x, v.y);
theta += k_increment;
}
glEnd();
}
void DrawSegment(const neoVec2& p1, const neoVec2& p2, const neoColor& color, bool realline)
{
if (!realline)
{
glLineStipple (1, 0x1C47);
glEnable(GL_LINE_STIPPLE);
}
glBegin(GL_LINES);
glColor3f(color.r, color.g, color.b);
glVertex2f(p1.x, p1.y);
glVertex2f(p2.x, p2.y);
glEnd();
if (!realline) glDisable(GL_LINE_STIPPLE);
}
void DrawPolygon(const neoVec2* vertices, int vertexCount, const neoColor& color)
{
glColor3f(color.r, color.g, color.b);
glBegin(GL_LINE_LOOP);
for (int i = 0; i < vertexCount; ++i)
{
glVertex2f(vertices[i].x, vertices[i].y);
}
glEnd();
}
void DrawString(int x, int y, const char *string, ...)
{
char buffer[128];
va_list arg;
va_start(arg, string);
vsprintf(buffer, string, arg);
va_end(arg);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
int w = glutGet(GLUT_WINDOW_WIDTH);
int h = glutGet(GLUT_WINDOW_HEIGHT);
gluOrtho2D(0, w, h, 0);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glColor3f(0.9f, 0.6f, 0.6f);
glRasterPos2i(x, y);
int length = (int)strlen(buffer);
for (int i = 0; i < length; ++i)
{
glutBitmapCharacter(GLUT_BITMAP_8_BY_13, buffer[i]);
}
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
}
void display()
{
//glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angToX, 1.0, 0.0, 0.0);
glRotatef(angToY, 0.0, 1.0, 0.0);
//---------------------------------------------------------------------
DrawSegment(neoVec2(0,0),neoVec2(0.1,0.1),neoColor(0.5,1,1),false);
DrawPoint(neoVec2(0,0),5,neoColor(1,1,1));
DrawPoint(neoVec2(0.1,0.1),5,neoColor(1,0,1));
DrawCircle(neoVec2(0,0),0.1,neoColor(1,1,1));
neoVec2 list[3] = {neoVec2(0,0), neoVec2(-0.1,0.1), neoVec2(-0.1,0)};
DrawPolygon(list,3,neoColor(0.5,1,1));
DrawString(100,200,"abc");
//---------------------------------------------------------------------
glPopMatrix();
glutSwapBuffers();
glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowSize(winWidth, winHeight);
glutInitWindowPosition(200, 50);
gluOrtho2D(0, winWidth,winHeight, 0);
mainWindow = glutCreateWindow( "Neo Glui" );
glClearColor(0.0, 0.0, 0.0, 0.0); //指定填視窗背景的顏色
glViewport(0, 0, (GLsizei) winWidth, (GLsizei) winHeight);
glutDisplayFunc(display);
GLUI_Master.set_glutReshapeFunc(Resize);
GLUI_Master.set_glutKeyboardFunc(Keyboard);
GLUI_Master.set_glutSpecialFunc(KeyboardSpecial);
GLUI_Master.set_glutMouseFunc(Mouse);
glutMouseWheelFunc(MouseWheel);
glutMotionFunc(MouseMotion);
//------------------------------------------------
glui = GLUI_Master.create_glui_subwindow(mainWindow, GLUI_SUBWINDOW_RIGHT );
glui->add_statictext("Text");
GLUI_Listbox* selectbox = glui->add_listbox("", &listboxindx);
selectbox->add_item(0, "One");
selectbox->add_item(1, "Two");
selectbox->add_item(2, "Three");
GLUI_Spinner* spinnerinteger = glui->add_spinner("spin1", GLUI_SPINNER_INT, &spinnerintegervar);
spinnerinteger->set_int_limits(1,10);
GLUI_Spinner* spinnerfloat = glui->add_spinner("spin2", GLUI_SPINNER_FLOAT, &spinnerfloatvar);
spinnerfloat->set_float_limits(5.0f, 10.0f);
glui->add_checkbox("checkbox", &checkbox);
glui->add_separator();
GLUI_Panel* panel = glui->add_panel("panel");
glui->add_checkbox_to_panel(panel,"Panel checkbox",&checkbox);
glui->add_separator();
glui->add_button("Exit", 0, (GLUI_Update_CB)Exit);
glui->set_main_gfx_window( mainWindow );
glutTimerFunc(16, Timer, 0);
glutMainLoop();
cout << "中文!" << endl;
return 0;
沒有留言:
張貼留言