diff options
Diffstat (limited to 'demos/modules')
| -rw-r--r-- | demos/modules/gwin/gl3d-gears/demo.mk | 3 | ||||
| -rw-r--r-- | demos/modules/gwin/gl3d-gears/gfxconf.h | 51 | ||||
| -rw-r--r-- | demos/modules/gwin/gl3d-gears/main.c | 287 | 
3 files changed, 341 insertions, 0 deletions
| diff --git a/demos/modules/gwin/gl3d-gears/demo.mk b/demos/modules/gwin/gl3d-gears/demo.mk new file mode 100644 index 00000000..a7833a1b --- /dev/null +++ b/demos/modules/gwin/gl3d-gears/demo.mk @@ -0,0 +1,3 @@ +DEMODIR = $(GFXLIB)/demos/modules/gwin/gl3d-gears +GFXINC +=   $(DEMODIR) +GFXSRC +=	$(DEMODIR)/main.c diff --git a/demos/modules/gwin/gl3d-gears/gfxconf.h b/demos/modules/gwin/gl3d-gears/gfxconf.h new file mode 100644 index 00000000..d0375a19 --- /dev/null +++ b/demos/modules/gwin/gl3d-gears/gfxconf.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2012, 2013, Joel Bodenmann aka Tectu <joel@unormal.org> + * Copyright (c) 2012, 2013, Andrew Hannam aka inmarket + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + *    * Redistributions of source code must retain the above copyright + *      notice, this list of conditions and the following disclaimer. + *    * Redistributions in binary form must reproduce the above copyright + *      notice, this list of conditions and the following disclaimer in the + *      documentation and/or other materials provided with the distribution. + *    * Neither the name of the <organization> nor the + *      names of its contributors may be used to endorse or promote products + *      derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _GFXCONF_H +#define _GFXCONF_H + +/* The operating system to use. One of these must be defined - preferably in your Makefile */ +//#define GFX_USE_OS_CHIBIOS	FALSE +//#define GFX_USE_OS_WIN32		FALSE +//#define GFX_USE_OS_LINUX		FALSE +//#define GFX_USE_OS_OSX		FALSE + +/* GFX sub-systems to turn on */ +#define GFX_USE_GDISP			TRUE +#define GFX_USE_GWIN			TRUE + +/* Features for the GDISP sub-system. */ +#define GDISP_NEED_VALIDATION	TRUE +#define GDISP_NEED_CLIP			TRUE + +/* Features for the GWIN subsystem. */ +#define GWIN_NEED_GL3D          TRUE + +#endif /* _GFXCONF_H */ + diff --git a/demos/modules/gwin/gl3d-gears/main.c b/demos/modules/gwin/gl3d-gears/main.c new file mode 100644 index 00000000..4ee189af --- /dev/null +++ b/demos/modules/gwin/gl3d-gears/main.c @@ -0,0 +1,287 @@ +/* + * Copyright (c) 2012, 2013, Joel Bodenmann aka Tectu <joel@unormal.org> + * Copyright (c) 2012, 2013, Andrew Hannam aka inmarket + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + *    * Redistributions of source code must retain the above copyright + *      notice, this list of conditions and the following disclaimer. + *    * Redistributions in binary form must reproduce the above copyright + *      notice, this list of conditions and the following disclaimer in the + *      documentation and/or other materials provided with the distribution. + *    * Neither the name of the <organization> nor the + *      names of its contributors may be used to endorse or promote products + *      derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "gfx.h" + +#include <math.h> +#ifndef M_PI +#  define M_PI 3.14159265 +#endif + +/* The handle for our Window */ +GHandle gh; + +/* + * Draw a gear wheel.  You'll probably want to call this function when + * building a display list since we do a lot of trig here. + * + * Input:  inner_radius - radius of hole at center + *         outer_radius - radius at center of teeth + *         width - width of gear + *         teeth - number of teeth + *         tooth_depth - depth of tooth + */ +static void gear( GLfloat inner_radius, GLfloat outer_radius, GLfloat width, +		  GLint teeth, GLfloat tooth_depth ) +{ +   GLint i; +   GLfloat r0, r1, r2; +   GLfloat angle, da; +   GLfloat u, v, len; + +   r0 = inner_radius; +   r1 = outer_radius - tooth_depth/2.0; +   r2 = outer_radius + tooth_depth/2.0; + +   da = 2.0*M_PI / teeth / 4.0; + +   glShadeModel( GL_FLAT ); + +   glNormal3f( 0.0, 0.0, 1.0 ); + +   /* draw front face */ +   glBegin( GL_QUAD_STRIP ); +   for (i=0;i<=teeth;i++) { +      angle = i * 2.0*M_PI / teeth; +      glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 ); +      glVertex3f( r1*cos(angle), r1*sin(angle), width*0.5 ); +      glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 ); +      glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 ); +   } +   glEnd(); + +   /* draw front sides of teeth */ +   glBegin( GL_QUADS ); +   da = 2.0*M_PI / teeth / 4.0; +   for (i=0;i<teeth;i++) { +      angle = i * 2.0*M_PI / teeth; + +      glVertex3f( r1*cos(angle),      r1*sin(angle),      width*0.5 ); +      glVertex3f( r2*cos(angle+da),   r2*sin(angle+da),   width*0.5 ); +      glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), width*0.5 ); +      glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 ); +   } +   glEnd(); + + +   glNormal3f( 0.0, 0.0, -1.0 ); + +   /* draw back face */ +   glBegin( GL_QUAD_STRIP ); +   for (i=0;i<=teeth;i++) { +      angle = i * 2.0*M_PI / teeth; +      glVertex3f( r1*cos(angle), r1*sin(angle), -width*0.5 ); +      glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 ); +      glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 ); +      glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 ); +   } +   glEnd(); + +   /* draw back sides of teeth */ +   glBegin( GL_QUADS ); +   da = 2.0*M_PI / teeth / 4.0; +   for (i=0;i<teeth;i++) { +      angle = i * 2.0*M_PI / teeth; + +      glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 ); +      glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), -width*0.5 ); +      glVertex3f( r2*cos(angle+da),   r2*sin(angle+da),   -width*0.5 ); +      glVertex3f( r1*cos(angle),      r1*sin(angle),      -width*0.5 ); +   } +   glEnd(); + + +   /* draw outward faces of teeth */ +   glBegin( GL_QUAD_STRIP ); +   for (i=0;i<teeth;i++) { +      angle = i * 2.0*M_PI / teeth; + +      glVertex3f( r1*cos(angle),      r1*sin(angle),       width*0.5 ); +      glVertex3f( r1*cos(angle),      r1*sin(angle),      -width*0.5 ); +      u = r2*cos(angle+da) - r1*cos(angle); +      v = r2*sin(angle+da) - r1*sin(angle); +      len = sqrt( u*u + v*v ); +      u /= len; +      v /= len; +      glNormal3f( v, -u, 0.0 ); +      glVertex3f( r2*cos(angle+da),   r2*sin(angle+da),    width*0.5 ); +      glVertex3f( r2*cos(angle+da),   r2*sin(angle+da),   -width*0.5 ); +      glNormal3f( cos(angle), sin(angle), 0.0 ); +      glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da),  width*0.5 ); +      glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), -width*0.5 ); +      u = r1*cos(angle+3*da) - r2*cos(angle+2*da); +      v = r1*sin(angle+3*da) - r2*sin(angle+2*da); +      glNormal3f( v, -u, 0.0 ); +      glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da),  width*0.5 ); +      glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 ); +      glNormal3f( cos(angle), sin(angle), 0.0 ); +   } + +   glVertex3f( r1*cos(0), r1*sin(0), width*0.5 ); +   glVertex3f( r1*cos(0), r1*sin(0), -width*0.5 ); + +   glEnd(); + + +   glShadeModel( GL_SMOOTH ); + +   /* draw inside radius cylinder */ +   glBegin( GL_QUAD_STRIP ); +   for (i=0;i<=teeth;i++) { +      angle = i * 2.0*M_PI / teeth; +      glNormal3f( -cos(angle), -sin(angle), 0.0 ); +      glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 ); +      glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 ); +   } +   glEnd(); + +} + + +static GLfloat view_rotx=20.0, view_roty=30.0, view_rotz=0.0; +static GLint gear1, gear2, gear3; +static GLfloat angle = 0.0; + +static void draw( void ) +{ +   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + +   glPushMatrix(); +   glRotatef( view_rotx, 1.0, 0.0, 0.0 ); +   glRotatef( view_roty, 0.0, 1.0, 0.0 ); +   glRotatef( view_rotz, 0.0, 0.0, 1.0 ); + +   glPushMatrix(); +   glTranslatef( -3.0, -2.0, 0.0 ); +   glRotatef( angle, 0.0, 0.0, 1.0 ); +   glCallList(gear1); +   glPopMatrix(); + +   glPushMatrix(); +   glTranslatef( 3.1, -2.0, 0.0 ); +   glRotatef( -2.0*angle-9.0, 0.0, 0.0, 1.0 ); +   glCallList(gear2); +   glPopMatrix(); + +   glPushMatrix(); +   glTranslatef( -3.1, 4.2, 0.0 ); +   glRotatef( -2.0*angle-25.0, 0.0, 0.0, 1.0 ); +   glCallList(gear3); +   glPopMatrix(); + +   glPopMatrix(); + +   gwinRedraw(gh); +} + + +static void spin( void ) +{ +   angle += 2.0; +   draw(); +} + +/* new window size or exposure */ +static void setup(void) +{ +   GLfloat  h = (GLfloat) gwinGetWidth(gh) / (GLfloat) gwinGetHeight(gh); + +   glMatrixMode(GL_PROJECTION); +   glLoadIdentity(); +   glFrustum( -1.0, 1.0, -h, h, 5.0, 60.0 ); +   glMatrixMode(GL_MODELVIEW); +   glLoadIdentity(); +   glTranslatef( 0.0, 0.0, -40.0 ); +   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); +} + + +static void init( void ) +{ +   static GLfloat pos[4] = {5.0, 5.0, 10.0, 0.0 }; +   static GLfloat red[4] = {0.8, 0.1, 0.0, 1.0 }; +   static GLfloat green[4] = {0.0, 0.8, 0.2, 1.0 }; +   static GLfloat blue[4] = {0.2, 0.2, 1.0, 1.0 }; + +   glLightfv( GL_LIGHT0, GL_POSITION, pos ); +   glEnable( GL_CULL_FACE ); +   glEnable( GL_LIGHTING ); +   glEnable( GL_LIGHT0 ); +   glEnable( GL_DEPTH_TEST ); + +   /* make the gears */ +   gear1 = glGenLists(1); +   glNewList(gear1, GL_COMPILE); +   glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red ); +   gear( 1.0, 4.0, 1.0, 20, 0.7 ); +   glEndList(); + +   gear2 = glGenLists(1); +   glNewList(gear2, GL_COMPILE); +   glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green ); +   gear( 0.5, 2.0, 2.0, 10, 0.7 ); +   glEndList(); + +   gear3 = glGenLists(1); +   glNewList(gear3, GL_COMPILE); +   glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue ); +   gear( 1.3, 2.0, 0.5, 10, 0.7 ); +   glEndList(); + +   glEnable( GL_NORMALIZE ); +} + +int main(void) { +    /* Initialize and clear the display */ +    gfxInit(); +    gdispClear(White); + +    /* Create the 3D window */ +    { +    	GWindowInit	wi; + +		gwinClearInit(&wi); +    	wi.show = TRUE; wi.x = 8; wi.y = 8; wi.width = gdispGetWidth()-16; wi.height = gdispGetHeight()-16; +        gh = gwinGL3DCreate(0, &wi); +    } + +    /* Init the 3D stuff */ +    setup(); +    init(); + +    while(TRUE) { + +    	// rate control +    	gfxSleepMilliseconds(10); + +    	// move and redraw +    	spin(); +    }    +} + | 
