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