NB: By higher-genus surface, I mean a closed orientable surface of genus at least 2.
This question has come up before on math.SE, and even MathOverflow, but most posters suggested using either Blender or Inkscape. However, I would like to draw these higher-genus surfaces in Mathematica, because I am trying to create a Manipulate which takes as input a word in the fundamental group of such a surface, and outputs the corresponding geodesic, drawn on the surface.
So, for example, let's say I am trying to draw a genus 2 surface. What I am doing now is the following:
torus = ParametricPlot3D[{(2 + Cos[s]) Cos[t], (2 + Cos[s]) Sin[t], Sin[s]}, {t, 0, 2 Pi}, {s, 0, 2 Pi}, Mesh -> None, Axes -> False, Boxed -> False, PlotStyle -> Opacity[.3], RegionFunction -> Function[{x, y, z, u, v}, x < 2]]; antitorus = Graphics3D[ Translate[ GeometricTransformation[torus[[1]], ReflectionTransform[{1, 0, 0}, {2, 0, 0}]], {1, 0, 0}], Boxed -> False, Axes -> False]; bound = ParametricPlot3D[{{t, (2 + Cos[s]) Sqrt[ 1 - 4/((2 + Cos[s])^2)], Sin[s]}, {t, -(2 + Cos[s]) Sqrt[1 - 4/((2 + Cos[s])^2)], Sin[s]}}, {s, 0, 2 Pi}, {t, 2, 3}, PlotStyle -> {Opacity[.7]}, Axes -> False, Boxed -> False, Mesh -> None, PlotPoints -> 100]; Show[antitorus,torus,bound,Lighting->"Neutral"] This gives me this (not-so-bad!) picture:

I am wondering what other methods there are for creating these surfaces, perhaps with a smoother finished product than the one I currently have.
And of course, ideally, I would eventually draw the two "building blocks" of all such surfaces, the once- and twice-punctured tori. Then I could dynamically build these surfaces on the fly...










ContourPlot3D[(x^4 - x^2 + y^2)^2 + 9 z^2 == .04, {x, -1.2, 1.2}, {y, -1, 1}, {z, -.4, .4}, PlotPoints -> 30, Boxed -> False, Axes -> False, ContourStyle -> Yellow]$\endgroup$