Demos (master): bezier: add a menu to select the number of subdivisions at runtime

Zack Rusin zack at kemper.freedesktop.org
Sat Jul 10 23:19:07 UTC 2010


Module: Demos
Branch: master
Commit: ae76d81a2737d926af47ae8b56b756107b2bd672
URL:    http://cgit.freedesktop.org/mesa/demos/commit/?id=ae76d81a2737d926af47ae8b56b756107b2bd672

Author: Zack Rusin <zack at kde.org>
Date:   Sat Jul 10 19:22:17 2010 -0400

bezier: add a menu to select the number of subdivisions at runtime

---

 src/glsl/bezier.c    |   66 ++++++++++++++++++++++++++++++++++++++++++++++---
 src/glsl/bezier.geom |    4 ++-
 2 files changed, 65 insertions(+), 5 deletions(-)

diff --git a/src/glsl/bezier.c b/src/glsl/bezier.c
index 1e2c7b8..a4b7777 100644
--- a/src/glsl/bezier.c
+++ b/src/glsl/bezier.c
@@ -9,8 +9,10 @@
 #include <stdlib.h>
 #include <math.h>
 #define GL_GLEXT_PROTOTYPES
+#include <GL/glew.h>
 #include <GL/glut.h>
 #include <GL/glext.h>
+#include "shaderutil.h"
 
 static const char *filename = "bezier.geom";
 
@@ -19,19 +21,26 @@ static GLuint vertShader;
 static GLuint geoShader;
 static GLuint program;
 
+#define QUIT 9999
+
 GLfloat vertices[][3] =
    { {  -0.9, -0.9, 0.0 },
      {  -0.5,  0.9, 0.0 },
      {   0.5,  0.9, 0.0 },
      {   0.9, -0.9, 0.0 } };
 
-GLfloat color[][4] = 
+GLfloat color[][4] =
 { { 1, 1, 1, 1 },
   { 1, 1, 1, 1 },
   { 1, 1, 1, 1 },
   { 1, 1, 1, 1 } };
 
 
+static struct uniform_info Uniforms[] = {
+   { "NumSubdivisions", 1, GL_INT, { 50, 0, 0, 0 }, -1 },
+   END_OF_UNIFORMS
+};
+
 static void usage( char *name )
 {
    fprintf(stderr, "usage: %s\n", name);
@@ -89,7 +98,43 @@ static void check_link(GLuint prog)
    }
 }
 
-static void prepare_shaders(void)
+static void menu_selected(int entry)
+{
+   switch (entry) {
+   case QUIT:
+      exit(0);
+      break;
+   default:
+      Uniforms[0].value[0] = entry;
+   }
+
+   SetUniformValues(program, Uniforms);
+   glutPostRedisplay();
+}
+
+
+static void menu_init(void)
+{
+   glutCreateMenu(menu_selected);
+
+   glutAddMenuEntry("1 Subdivision",  1);
+   glutAddMenuEntry("2 Subdivisions", 2);
+   glutAddMenuEntry("3 Subdivisions", 3);
+   glutAddMenuEntry("4 Subdivisions", 4);
+   glutAddMenuEntry("5 Subdivisions", 5);
+   glutAddMenuEntry("6 Subdivisions", 6);
+   glutAddMenuEntry("7 Subdivisions", 7);
+   glutAddMenuEntry("10 Subdivisions", 10);
+   glutAddMenuEntry("50 Subdivisions", 50);
+   glutAddMenuEntry("100 Subdivisions", 100);
+   glutAddMenuEntry("500 Subdivisions", 500);
+
+   glutAddMenuEntry("Quit", QUIT);
+
+   glutAttachMenu(GLUT_RIGHT_BUTTON);
+}
+
+static void init(void)
 {
    static const char *fragShaderText =
       "void main() {\n"
@@ -112,6 +157,13 @@ static void prepare_shaders(void)
       "    EmitVertex();\n"
       "  }\n"
       "}\n";
+
+
+   if (!ShadersSupported())
+      exit(1);
+
+   menu_init();
+
    fragShader = glCreateShader(GL_FRAGMENT_SHADER);
    load_and_compile_shader(fragShader, fragShaderText);
 
@@ -145,6 +197,11 @@ static void prepare_shaders(void)
    check_link(program);
    glUseProgram(program);
 
+   SetUniformValues(program, Uniforms);
+   PrintUniforms(Uniforms);
+
+   assert(glGetError() == 0);
+
    glEnableClientState( GL_VERTEX_ARRAY );
    glEnableClientState( GL_COLOR_ARRAY );
 
@@ -214,11 +271,12 @@ int main( int argc, char *argv[] )
    glutInitWindowSize( 250, 250 );
    glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH );
    glutCreateWindow(argv[0]);
+   glewInit();
    glutReshapeFunc( Reshape );
    glutKeyboardFunc( Key );
    glutDisplayFunc( Display );
-   args( argc, argv );
-   prepare_shaders();
+   args(argc, argv);
+   init();
    glutMainLoop();
    return 0;
 }
diff --git a/src/glsl/bezier.geom b/src/glsl/bezier.geom
index 4ef75f4..0a11af5 100644
--- a/src/glsl/bezier.geom
+++ b/src/glsl/bezier.geom
@@ -1,12 +1,14 @@
 #version 120
 #extension GL_EXT_geometry_shader4: enable
 
+uniform int NumSubdivisions;
+
 void main()
 {
    /* num is the number of subdivisions
     * can be anything between 1 and infinity
     */
-   const int num = 3;
+   const int num = NumSubdivisions;
 
    float dt = 1. / float(num);
    float t = 0.;




More information about the mesa-commit mailing list