Proudly presenting: GLUGG!
GLUGG stands for OpenGL Utilities for Geometry Generation. This is a source-only package, one C file (two with the gluggShapes) and one header file plus demos, or just header only for C++, that will make it easier for you to generate geometry directly from code. You specify one vertex at a time, optionally with normal vector and texture coordinates, and GLUGG will return a VAO that you can use to draw the shape, or get the data for other purposes, like save it to disc. GLUGG supports primitives like triangle fans and triangle strips which will help you by remembering previous vertices to make the actual triangles easier to manage, and can even generate Bézier patches.
Motivation and background
Ever since OpenGL deprecated the immediate mode and display lists, the art of procedural generation of geometry has fallen out of view. Old demos are tedious to port to the new style, and writing new code for procedural geometry generation is totally up to you, OpenGL having no support for it any more.
In order to modernize the old “gears” demo (glutGears, glxGears), I wrote some utility functions for collecting vertices procedurally. This felt quite useful, and I expanded it to dealing with Bézier curves, from which I generated the Utah Teaset from code as well as a demo for fitting Bézier patches together.
Then it sat on my disc for a long time, just being the code for these demos.
But recently, 2021, I got the responsibility to handle the TNM084 course, which is about procedural methods. Hey, how about using GLUGG for that? I have also ran into some cases where I could see how this package could help students with problems in their projects in other courses. PS: It has now been successfully used for a lab about procedural generation of trees!
So I picked it up to dust it off. It needed documentation and at least one simpler demo. Sure thing! But then I got inspired and added multiple demos and, maybe most importantly, extended it to multiple modes which simplifies the generation even further.
It is notable that the package contains a set of shapes that you can build from, and that also makes GLUGG a replacement for the shapes in the old GLUT. These are not in MicroGlut since model creation is beside the point for MicroGlut, but here we can produce them in a more modern way.
Upcoming feature: skinning weights
2022, I made a draft for a brand new version, sporting support for skinning weights as part of the system. This is in development, with a few different options on how to produce and use skinning weights. It is intended for educational use for experiments with the skin&bones concept. As it looks now, I should be able to add this to the existing GLUGG without affecting any of the old functionality.
This is at present not available for download, but I am sending it to project groups who want to try it. Three course projects have been based on this so far.
Downloads
Here is the current package, with demos and documentation, version 1.3 as of 2022-03-20:
Download version 1.3, C++ version, with makefiles, tested on Linux.
Download version 1.3, prelimnary C++ version. (No makefiles yet, only tested on Mac.)
Download version 1.3. (Simplifies the API by using the new struct gluggModel.)
Zipped version of 1.3 in case you can’t unpack tgz.
Download version 1.2. (Adds calls for making it possible to dispose models from GPU memory.)
Download version 1.1. (Adds the matrix stack, color attribute array, the separate gluggShapes and the snowman demo.)
Download version 1.0. (First version as of 2021-05-07)
Demos
All demos are included in the package above.
Triangle
We start with not one but three simple demos, the standard white triangle, now generated from code instead of arrays, plus a color version of it, but also the “gluggModes” demo that demonstrates the four different data collection modes.
The white triangle
Color triangle
This is a small step from the white triangle, with colors given for each vertex.
The color triangle
gluggModes
This is yet another very simple demo, demonstrating the different recording modes in GLUGG.
gluggModes, with GLUGG_TRIANGLES (red), GLUGG_QUADS (green), GLUGG_TRIANGLE_STRIP (yellow) and GLUGG_TRIANGLE_FAN (cyan).
GLUGG shapes
Here you can see how different shapes can be generated with GLUGG. The demo uses the glutShapes unit, more precisely using the parts based on code from FreeGLUT, but converted to GLUGG, and thereby to more modern code.
GLUGG shapes
GLUGG more shapes
The previous demo skipped over a number of shapes that were provided by GLU in those days, so I made these too, this time from scratch, now also in gluggShapes. This includes cylinder, sphere, cone and ellipsoid.
More shapes
Sphere
What, another sphere? Unlike the slice-based sphere above, this is made by tesselating a tetrahedron, another way to generate a sphere. It is based on code that I no longer know the origin of. But what is that red mess? It is what you get when you don’t tesselate enough.
The “sphere” demo
GLUGG gears
glxGears is the standard demo for GLX, that is Mesa on Linux and similar platforms, the one that all Linux users run to check that Mesa has been correctly installed. AFAIK it originated as glutGears, which is nowhere to be found but I recreated it in modernized form, which was the very starting point for GLUGG. GLUGG as such did not exist yet but my glutGears included some routines that would eventually become the first version. That makes this demo the one that I am the most fond of, second to the teaset.
GLUGG gears
Boing
Boing was originally a demo for Amiga, made at a time when 3D animation of this quality was unheard of. Later, it was recreated as GLboing. This demo seems to be lost, but a port of it can be found as a GLFW demo, as very old-fashioned immediate mode code. From that, I ported it to MicroGlut, but it was still old-fashioned. Now, using GLUGG, it is much more modern, uploading the data properly to GPU buffers like all GLUGG code does.
boing!
GLUGG sweeper
GLUGG sweeper shows how you can generate rotation symmetric shapes from a set of points.
GLUGG sweeper
Surface
“surface” demonstrates how you fit together Bézier patches. It makes 4 Bezier patches, with the center vertices kept in a plane to ensure continuity.
surface
Simple snowman
This demo is based on the snowman from Lighthouse3D. It shows how to use the matrix stack, and combining objects from gluggShapes.
Simple snowman
The UTAH Teaset!
And finally, the proud #1 demo, my favorite, the dream for anyone who has been messing around with the Utah Teapot for years without knowing that it was a whole set, the Utah teaset! This is generated from a slightly extended version of the original data (and the changes are documented in the code). The code is also able to save the models as OBJ files.
UTAH Teaset
Note: Several of these demos are based on code from other sources. I have done my best to document this appropriately. Original copyright notices are kept.