-static GLushort vertIdxsSolid[GLUT_SOLID_TEAPOT_N_TRI*3];
-static GLfloat normsSolid [GLUT_SOLID_TEAPOT_N_VERT*3];
-static GLfloat vertsSolid [GLUT_SOLID_TEAPOT_N_VERT*3];
-static GLfloat texcsSolid [GLUT_SOLID_TEAPOT_N_VERT*2];
-static GLfloat lastScaleSolid = 0.f;
-static GLboolean initedSolid = GL_FALSE;
-
-static GLushort vertIdxsWire [GLUT_WIRE_TEAPOT_N_VERT*2];
-static GLfloat normsWire [GLUT_WIRE_TEAPOT_N_VERT*3];
-static GLfloat vertsWire [GLUT_WIRE_TEAPOT_N_VERT*3];
-static GLfloat lastScaleWire = 0.f;
-static GLboolean initedWire = GL_FALSE;
+static GLushort vertIdxsTeacupS[GLUT_SOLID_TEACUP_N_TRI*3];
+static GLfloat normsTeacupS [GLUT_SOLID_TEACUP_N_VERT*3];
+static GLfloat vertsTeacupS [GLUT_SOLID_TEACUP_N_VERT*3];
+static GLfloat texcsTeacupS [GLUT_SOLID_TEACUP_N_VERT*2];
+static GLfloat lastScaleTeacupS = 0.f;
+static GLboolean initedTeacupS = GL_FALSE;
+
+static GLushort vertIdxsTeacupW[GLUT_WIRE_TEACUP_N_VERT*2];
+static GLfloat normsTeacupW [GLUT_WIRE_TEACUP_N_VERT*3];
+static GLfloat vertsTeacupW [GLUT_WIRE_TEACUP_N_VERT*3];
+static GLfloat lastScaleTeacupW = 0.f;
+static GLboolean initedTeacupW = GL_FALSE;
+
+
+/* Teaspoon defs */
+#define GLUT_TEASPOON_N_PATCHES GLUT_TEASPOON_N_INPUT_PATCHES
+#define GLUT_SOLID_TEASPOON_N_VERT GLUT_SOLID_N_SUBDIV*GLUT_SOLID_N_SUBDIV * GLUT_TEASPOON_N_PATCHES /* N_SUBDIV^2 vertices per patch */
+#define GLUT_SOLID_TEASPOON_N_TRI (GLUT_SOLID_N_SUBDIV-1)*(GLUT_SOLID_N_SUBDIV-1) * GLUT_TEASPOON_N_PATCHES * 2 /* if e.g. 7x7 vertices for each patch, there are 6*6 squares for each patch. Each square is decomposed into 2 triangles */
+
+#define GLUT_WIRE_TEASPOON_N_VERT GLUT_WIRE_N_SUBDIV*GLUT_WIRE_N_SUBDIV * GLUT_TEASPOON_N_PATCHES /* N_SUBDIV^2 vertices per patch */
+
+/* Bit of caching:
+ * vertex indices and normals only need to be generated once for
+ * a given number of subdivisions as they don't change with scale.
+ * Vertices can be cached and reused if scale didn't change.
+ */
+static GLushort vertIdxsTeaspoonS[GLUT_SOLID_TEASPOON_N_TRI*3];
+static GLfloat normsTeaspoonS [GLUT_SOLID_TEASPOON_N_VERT*3];
+static GLfloat vertsTeaspoonS [GLUT_SOLID_TEASPOON_N_VERT*3];
+static GLfloat texcsTeaspoonS [GLUT_SOLID_TEASPOON_N_VERT*2];
+static GLfloat lastScaleTeaspoonS = 0.f;
+static GLboolean initedTeaspoonS = GL_FALSE;
+
+static GLushort vertIdxsTeaspoonW[GLUT_WIRE_TEASPOON_N_VERT*2];
+static GLfloat normsTeaspoonW [GLUT_WIRE_TEASPOON_N_VERT*3];
+static GLfloat vertsTeaspoonW [GLUT_WIRE_TEASPOON_N_VERT*3];
+static GLfloat lastScaleTeaspoonW = 0.f;
+static GLboolean initedTeaspoonW = GL_FALSE;
+
+