Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Tree: 53b492c3b6
Fetching contributors…

Cannot retrieve contributors at this time

executable file 312 lines (250 sloc) 10.223 kB
//
// This code was created by Jeff Molofee '99 (ported to Linux/GLUT by Richard Campbell '99)
//
// If you've found this code useful, please let me know.
//
// Visit me at www.demonews.com/hosted/nehe
// (email Richard Campbell at ulmont@bellsouth.net)
//
#include <GL/glut.h> // Header File For The GLUT Library
#include <GL/gl.h> // Header File For The OpenGL32 Library
#include <GL/glu.h> // Header File For The GLu32 Library
#include <unistd.h> // needed to sleep
#include <stdlib.h>
#include "wiimote.h"
#include <pthread.h>
#include <math.h>
/* ASCII code for the escape key. */
#define ESCAPE 27
/* The number of our GLUT window */
int window;
/* rotation angle for the triangle. */
float rtri = 0.0f;
/* rotation angle for the quadrilateral. */
float rquad = 0.0f;
float phi = 0;
float theta = 0;
float psi = 0;
float motionplus_matrix[16];
typedef struct {
float phi;
float theta;
float psi;
} motionplus_rotation_t;
#define MAX_ROTATIONS 100
motionplus_rotation_t motionplus_rotations[MAX_ROTATIONS];
int motionplus_rotation_count = 0;
pthread_mutex_t motionplus_rotation_mutex;
int motionplus_reset_rotation = 1;
/* A general OpenGL initialization function. Sets all of the initial parameters. */
void InitGL(int Width, int Height) // We call this right after our OpenGL window is created.
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // This Will Clear The Background Color To Black
glClearDepth(1.0); // Enables Clearing Of The Depth Buffer
glDepthFunc(GL_LESS); // The Type Of Depth Test To Do
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glShadeModel(GL_SMOOTH); // Enables Smooth Color Shading
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); // Reset The Projection Matrix
gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); // Calculate The Aspect Ratio Of The Window
glMatrixMode(GL_MODELVIEW);
}
/* The function called when our window is resized (which shouldn't happen, because we're fullscreen) */
void ReSizeGLScene(int Width, int Height)
{
if (Height==0) // Prevent A Divide By Zero If The Window Is Too Small
Height=1;
glViewport(0, 0, Width, Height); // Reset The Current Viewport And Perspective Transformation
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
}
/* The main drawing function. */
void DrawGLScene()
{
int i;
motionplus_rotation_t *rotation;
pthread_mutex_lock(&motionplus_rotation_mutex);
if (motionplus_reset_rotation)
{
glPushMatrix();
glLoadIdentity();
glRotatef(-90.0, 1.0f, 0.0f, 0.0f);
glGetFloatv(GL_MODELVIEW_MATRIX, motionplus_matrix);
glPopMatrix();
motionplus_reset_rotation = 0;
} else {
for (i=0; i<motionplus_rotation_count; i++)
{
rotation = &motionplus_rotations[i];
glPushMatrix();
glLoadMatrixf(motionplus_matrix);
glRotatef(-rotation->phi / 100.0, 1.0f, 0.0f, 0.0f);
glRotatef(-rotation->theta / 100.0, 0.0f, 1.0f, 0.0f);
glRotatef(rotation->psi / 100.0, 0.0f, 0.0f, 1.0f);
glGetFloatv(GL_MODELVIEW_MATRIX, motionplus_matrix);
glPopMatrix();
}
motionplus_rotation_count = 0;
}
pthread_mutex_unlock(&motionplus_rotation_mutex);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); // Clear The Screen And The Depth Buffer
glLoadIdentity(); // Reset The View
glTranslatef(-1.5f,0.0f,-6.0f); // Move Left 1.5 Units And Into The Screen 6.0
glMultMatrixf(motionplus_matrix);
// draw a pyramid (in smooth coloring mode)
glBegin(GL_POLYGON); // start drawing a pyramid
// front face of pyramid
glColor3f(1.0f,0.0f,0.0f); // Set The Color To Red
glVertex3f(0.0f, 1.0f, 0.0f); // Top of triangle (front)
glColor3f(0.0f,1.0f,0.0f); // Set The Color To Green
glVertex3f(-0.1f,0.0f, 0.1f); // left of triangle (front)
glVertex3f(0.1f,0.0f, 0.1f); // right of traingle (front)
// right face of pyramid
glColor3f(1.0f,0.0f,0.0f); // Red
glVertex3f( 0.0f, 1.0f, 0.0f); // Top Of Triangle (Right)
glColor3f(0.0f,1.0f,0.0f); // Green
glVertex3f( 0.1f,0.0f, 0.1f); // Left Of Triangle (Right)
glColor3f(0.0f,0.0f,1.0f); // Blue
glVertex3f( 0.1f,0.0f, -0.1f); // Right Of Triangle (Right)
// back face of pyramid
glColor3f(1.0f,0.0f,0.0f); // Red
glVertex3f( 0.0f, 1.0f, 0.0f); // Top Of Triangle (Back)
glColor3f(0.0f,0.0f,1.0f); // Blue
glVertex3f( 0.1f,0.0f, -0.1f); // Left Of Triangle (Back)
glVertex3f(-0.1f,0.0f, -0.1f); // Right Of Triangle (Back)
// left face of pyramid.
glColor3f(1.0f,0.0f,0.0f); // Red
glVertex3f( 0.0f, 1.0f, 0.0f); // Top Of Triangle (Left)
glColor3f(0.0f,0.0f,1.0f); // Blue
glVertex3f(-0.1f,0.0f,-0.1f); // Left Of Triangle (Left)
glColor3f(0.0f,1.0f,0.0f); // Green
glVertex3f(-0.1f,0.0f, 0.1f); // Right Of Triangle (Left)
glEnd(); // Done Drawing The Pyramid
glLoadIdentity(); // make sure we're no longer rotated.
glTranslatef(1.5f,0.0f,-7.0f); // Move Right 3 Units, and back into the screen 7
glMultMatrixf(motionplus_matrix);
//glRotatef(rquad,1.0f,1.0f,1.0f); // Rotate The Cube On X, Y, and Z
// draw a cube (6 quadrilaterals)
glBegin(GL_QUADS); // start drawing the cube.
// top of cube
glColor3f(0.0f,1.0f,0.0f); // Set The Color To Blue
glVertex3f( 1.0f, 1.0f,-1.0f); // Top Right Of The Quad (Top)
glVertex3f(-1.0f, 1.0f,-1.0f); // Top Left Of The Quad (Top)
glVertex3f(-1.0f, 1.0f, 1.0f); // Bottom Left Of The Quad (Top)
glVertex3f( 1.0f, 1.0f, 1.0f); // Bottom Right Of The Quad (Top)
// bottom of cube
glColor3f(1.0f,0.5f,0.0f); // Set The Color To Orange
glVertex3f( 1.0f,-1.0f, 1.0f); // Top Right Of The Quad (Bottom)
glVertex3f(-1.0f,-1.0f, 1.0f); // Top Left Of The Quad (Bottom)
glVertex3f(-1.0f,-1.0f,-1.0f); // Bottom Left Of The Quad (Bottom)
glVertex3f( 1.0f,-1.0f,-1.0f); // Bottom Right Of The Quad (Bottom)
// front of cube
glColor3f(1.0f,0.0f,0.0f); // Set The Color To Red
glVertex3f( 1.0f, 1.0f, 1.0f); // Top Right Of The Quad (Front)
glVertex3f(-1.0f, 1.0f, 1.0f); // Top Left Of The Quad (Front)
glVertex3f(-1.0f,-1.0f, 1.0f); // Bottom Left Of The Quad (Front)
glVertex3f( 1.0f,-1.0f, 1.0f); // Bottom Right Of The Quad (Front)
// back of cube.
glColor3f(1.0f,1.0f,0.0f); // Set The Color To Yellow
glVertex3f( 1.0f,-1.0f,-1.0f); // Top Right Of The Quad (Back)
glVertex3f(-1.0f,-1.0f,-1.0f); // Top Left Of The Quad (Back)
glVertex3f(-1.0f, 1.0f,-1.0f); // Bottom Left Of The Quad (Back)
glVertex3f( 1.0f, 1.0f,-1.0f); // Bottom Right Of The Quad (Back)
// left of cube
glColor3f(0.0f,0.0f,1.0f); // Blue
glVertex3f(-1.0f, 1.0f, 1.0f); // Top Right Of The Quad (Left)
glVertex3f(-1.0f, 1.0f,-1.0f); // Top Left Of The Quad (Left)
glVertex3f(-1.0f,-1.0f,-1.0f); // Bottom Left Of The Quad (Left)
glVertex3f(-1.0f,-1.0f, 1.0f); // Bottom Right Of The Quad (Left)
// Right of cube
glColor3f(1.0f,0.0f,1.0f); // Set The Color To Violet
glVertex3f( 1.0f, 1.0f,-1.0f); // Top Right Of The Quad (Right)
glVertex3f( 1.0f, 1.0f, 1.0f); // Top Left Of The Quad (Right)
glVertex3f( 1.0f,-1.0f, 1.0f); // Bottom Left Of The Quad (Right)
glVertex3f( 1.0f,-1.0f,-1.0f); // Bottom Right Of The Quad (Right)
glEnd(); // Done Drawing The Cube
/*
rtri+=1.0f; // Increase The Rotation Variable For The Pyramid
rquad-=1.0f; // Decrease The Rotation Variable For The Cube
*/
// swap the buffers to display, since double buffering is used.
glutSwapBuffers();
}
/* The function called whenever a key is pressed. */
void keyPressed(unsigned char key, int x, int y)
{
/* avoid thrashing this call */
usleep(100);
/* If escape is pressed, kill everything. */
if (key == ESCAPE)
{
/* shut down our window */
glutDestroyWindow(window);
/* exit the program...normal termination. */
exit(0);
}
}
int main(int argc, char **argv)
{
wiimote_init();
pthread_mutex_init(&motionplus_rotation_mutex, NULL);
/* Initialize GLUT state - glut will take any command line arguments that pertain to it or
X Windows - look at its documentation at http://reality.sgi.com/mjk/spec3/spec3.html */
glutInit(&argc, argv);
/* Select type of Display mode:
Double buffer
RGBA color
Alpha components supported
Depth buffered for automatic clipping */
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH);
/* get a 640 x 480 window */
glutInitWindowSize(640, 480);
/* the window starts at the upper left corner of the screen */
glutInitWindowPosition(0, 0);
/* Open a window */
window = glutCreateWindow("Jeff Molofee's GL Code Tutorial ... NeHe '99");
/* Register the function to do all our OpenGL drawing. */
glutDisplayFunc(&DrawGLScene);
/* Go fullscreen. This is as soon as possible. */
glutFullScreen();
/* Even if there are no events, redraw our gl scene. */
glutIdleFunc(&DrawGLScene);
/* Register the function called when our window is resized. */
glutReshapeFunc(&ReSizeGLScene);
/* Register the function called when the keyboard is pressed. */
glutKeyboardFunc(&keyPressed);
/* Initialize our window. */
InitGL(640, 480);
/* Start Event Processing Engine */
glutMainLoop();
wiimote_close();
return 1;
}
void motionplus_motion(double mphi, double mtheta, double mpsi)
{
motionplus_rotation_t rotation = {mphi, mtheta, mpsi};
pthread_mutex_lock(&motionplus_rotation_mutex);
if (motionplus_reset_rotation >= MAX_ROTATIONS)
printf("rotations overflow\n");
else
motionplus_rotations[motionplus_rotation_count++] = rotation;
pthread_mutex_unlock(&motionplus_rotation_mutex);
}
void button_event(cwiid_wiimote_t *wiimote, int buttons)
{
static int rumble = 0;
if (buttons & CWIID_BTN_B)
{
reset_motionplus = 1;
pthread_mutex_lock(&motionplus_rotation_mutex);
motionplus_reset_rotation = 1;
pthread_mutex_unlock(&motionplus_rotation_mutex);
}
if (buttons & CWIID_BTN_A)
{
rumble = !rumble;
cwiid_set_rumble(wiimote, rumble);
}
}
Jump to Line
Something went wrong with that request. Please try again.