From 68786debc80a91bafefea1da17c3727d46d087da Mon Sep 17 00:00:00 2001 From: fabiao <fabio.difrancesco@gmail.com> Date: Fri, 1 Mar 2019 15:57:56 +0100 Subject: [PATCH] added sdl2_gears demo --- recipes/freeciv/recipe.sh | 1 + recipes/sdl2_gears/gears.c | 359 +++++++++++++++++++++++++++++++++++ recipes/sdl2_gears/recipe.sh | 42 ++++ 3 files changed, 402 insertions(+) create mode 100644 recipes/sdl2_gears/gears.c create mode 100644 recipes/sdl2_gears/recipe.sh diff --git a/recipes/freeciv/recipe.sh b/recipes/freeciv/recipe.sh index 70765e96a..2b5d4925c 100644 --- a/recipes/freeciv/recipe.sh +++ b/recipes/freeciv/recipe.sh @@ -22,6 +22,7 @@ function recipe_build { --host="$HOST" \ --prefix='' \ --disable-server \ + --enable-ipv6=no \ --enable-client=sdl \ --enable-fcmp=cli \ --with-sdl-prefix="$sysroot" \ diff --git a/recipes/sdl2_gears/gears.c b/recipes/sdl2_gears/gears.c new file mode 100644 index 000000000..ffa67d083 --- /dev/null +++ b/recipes/sdl2_gears/gears.c @@ -0,0 +1,359 @@ +/* gears.c */ + +/* + * 3-D gear wheels. This program is in the public domain. + * + * Brian Paul + */ + +/* Conversion to GLUT by Mark J. Kilgard */ + +#include <math.h> +#include <stdlib.h> +#include <GL/gl.h> +#include <GL/glu.h> +#include <SDL2/SDL.h> + +#ifndef M_PI +#define M_PI 3.14159265 +#endif + +/** + + 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 int width = 800; +static int height = 600; + +static SDL_Window *window = NULL; +static SDL_GLContext context = NULL; + +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 GLfloat delta = 2.0f; + +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(); + + glFinish(); +} + +static void +idle(void) +{ + angle += delta; + if (angle > 360.0f) + angle -= 360.0f; + + draw(); + + SDL_GL_SwapWindow(window); +} + +/* new window size or exposure */ +static void +reshape(int width, int height) +{ + GLfloat h = (GLfloat)height / (GLfloat)width; + + glViewport(0, 0, (GLint)width, (GLint)height); + 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); +} + +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); +} + +void CheckSDLError(int line) +{ + const char* error = SDL_GetError(); + if (error != "") + { + printf("SLD Error: %s\n", error); + + if (line != -1) + printf("\nLine: %d\n", line); + + SDL_ClearError(); + } +} + +int main(int argc, char *argv[]) +{ + printf("Initializing SDL\n"); + if (SDL_Init(SDL_INIT_VIDEO) < 0) + { + printf("Failed to init SDL\n"); + CheckSDLError(__LINE__); + return -1; + } + + printf("Creating SDL window\n"); + window = SDL_CreateWindow( + "Gears", + -1, + -1, + width, + height, + SDL_WINDOW_OPENGL + ); + if (window == NULL) + { + printf("Unable to create window\n"); + CheckSDLError(__LINE__); + return -1; + } + printf("SDL window created %p\n", window); + + printf("Creating SDL GL context\n"); + context = SDL_GL_CreateContext(window); + if (context == NULL) + { + printf("Unable to create SDL GL context\n"); + CheckSDLError(__LINE__); + return -1; + } + printf("SDL GL context created %p\n", context); + + init(); + + reshape(width, height); + + int running = 1; + SDL_Event event; + while (running) + { + idle(); + + while (SDL_PollEvent(&event)) + { + if (event.type == SDL_QUIT) + running = 0; + + if (event.type == SDL_KEYDOWN) + { + switch (event.key.keysym.sym) + { + case SDLK_a: + delta += 1.0f; + break; + case SDLK_s: + delta -= 1.0f; + break; + case SDLK_ESCAPE: + running = 0; + break; + default: + break; + } + } + } + } + + SDL_GL_DeleteContext(context); + + SDL_DestroyWindow(window); + + // Shutdown SDL 2 + SDL_Quit(); + + return 0; +} diff --git a/recipes/sdl2_gears/recipe.sh b/recipes/sdl2_gears/recipe.sh new file mode 100644 index 000000000..3a7c139a5 --- /dev/null +++ b/recipes/sdl2_gears/recipe.sh @@ -0,0 +1,42 @@ +BUILD_DEPENDS=(sdl2 liborbital llvm mesa mesa_glu zlib) + +function recipe_version { + printf "1.0.0" + skip=1 +} + +function recipe_update { + echo "skipping update" + skip=1 +} + +function recipe_prepare { + rm -rf source + mkdir source + cp gears.c source +} + +function recipe_build { + sysroot="$(realpath ../sysroot)" + set -x + "${CXX}" -O2 -I "$sysroot/include" -L "$sysroot/lib" gears.c -o sdl2_gears -lSDL2 -lorbital $("${PKG_CONFIG}" --libs glu) -lglapi -lz + set +x + skip=1 +} + +function recipe_test { + echo "skipping test" + skip=1 +} + +function recipe_clean { + make clean + skip=1 +} + +function recipe_stage { + dest="$(realpath $1)" + mkdir -pv "$dest/bin" + cp -v "sdl2_gears" "$dest/bin/sdl2_gears" + skip=1 +} -- GitLab