Index: sasmodels/jitter.py
===================================================================
--- sasmodels/jitter.py	(revision 9ec9c6783ddf6bd132145b844747f0b634f88643)
+++ sasmodels/jitter.py	(revision 3d7f364f8c2fa2b1c8ffd719d42355e765114256)
@@ -77,6 +77,6 @@
     # TODO: draw endcaps on beam
     ## Draw tiny balls on the end will work
-    #draw_sphere(axes, radius=0.02, center=(0, 0, 1.3), color='yellow')
-    #draw_sphere(axes, radius=0.02, center=(0, 0, -1.3), color='yellow')
+    draw_sphere(axes, radius=0.02, center=(0, 0, 1.3), color='yellow')
+    draw_sphere(axes, radius=0.02, center=(0, 0, -1.3), color='yellow')
     ## The following does not work
     #triangles = [(0, i+1, i+2) for i in range(steps-2)]
@@ -295,5 +295,5 @@
     Represent jitter as a set of shapes at different orientations.
     """
-    project, weight = get_projection(projection)
+    project, project_weight = get_projection(projection)
 
     # set max diagonal to 0.95
@@ -304,19 +304,13 @@
     base = {'gaussian':3, 'rectangle':sqrt(3), 'uniform':1}[dist]
     def steps(delta):
-        limit = base*delta
         if views is None:
             n = max(3, min(25, 2*int(base*delta/5)))
         else:
             n = views
-        s = base*delta*np.linspace(-1, 1, n) if delta > 0 else [0]
-        return s
-    stheta = steps(dtheta)
-    sphi = steps(dphi)
-    spsi = steps(dpsi)
-    #print(stheta, sphi, spsi)
-    for theta in stheta:
-        for phi in sphi:
-            for psi in spsi:
-                w = weight(theta, phi, 1.0, 1.0)
+        return base*delta*np.linspace(-1, 1, n) if delta > 0 else [0.]
+    for theta in steps(dtheta):
+        for phi in steps(dphi):
+            for psi in steps(dpsi):
+                w = project_weight(theta, phi, 1.0, 1.0)
                 if w > 0:
                     dview = project(theta, phi, psi)
@@ -782,4 +776,5 @@
         vmin = vmax*10**-7
         #vmin, vmax = clipped_range(Iqxy, portion=portion, mode='top')
+    #vmin, vmax = Iqxy.min(), Iqxy.max()
     #print("range",(vmin,vmax))
     #qx, qy = np.meshgrid(qx, qy)
@@ -791,4 +786,6 @@
         #colors = cm.coolwarm(level)
         #colors = cm.gist_yarg(level)
+        #colors = cm.Wistia(level)
+        colors[level<=0, 3] = 0.  # set floor to transparent
         x, y = np.meshgrid(qx/qx.max(), qy/qy.max())
         axes.plot_surface(x, y, -1.1*np.ones_like(x), facecolors=colors)
@@ -955,5 +952,5 @@
 
     # set up calculator
-    calculator, size = select_calculator(model_name, n=100, size=size)
+    calculator, size = select_calculator(model_name, n=150, size=size)
     draw_shape = DRAW_SHAPES.get(model_name, draw_parallelepiped)
     #draw_shape = draw_fcc
@@ -1118,4 +1115,10 @@
         color = kw['color']
         #TODO: convert color to [r, g, b, a] if not already
+        if isinstance(color, (tuple, list)):
+            if len(color) == 3:
+                color = (color[0], color[1], color[2], alpha)
+            else:
+                color = (color[0], color[1], color[2], alpha*color[3])
+            color = np.array(color)
         if isinstance(color, np.ndarray) and color.shape[-1] == 4:
             color[..., 3] = alpha
@@ -1157,4 +1160,5 @@
             h = ipv.plot_surface(x, y, z, **kw)
             ipv_set_transparency(kw, h)
+            #h.material.side = "DoubleSide"
             return h
         def plot_trisurf(self, x, y, triangles=None, Z=None, **kw):
@@ -1189,4 +1193,5 @@
             h = ipv.plot_mesh(x, y, z, u=u, v=v, texture=image, wireframe=False)
             ipv_set_transparency(kw, h)
+            h.material.side = "DoubleSide"
             return h
         def text(self, *args, **kw):
@@ -1231,8 +1236,9 @@
 
         ## Move shape and draw scattering
-        draw_beam(axes, (0, 0))
-        draw_jitter(axes, view, jitter, dist=dist, size=size,
+        draw_beam(axes, (0, 0), steps=25)
+        draw_jitter(axes, view, jitter, dist=dist, size=size, alpha=1.0,
                     draw_shape=draw_shape, projection=projection)
-        draw_mesh(axes, view, jitter, dist=dist, n=mesh, radius=0.95, projection=projection)
+        draw_mesh(axes, view, jitter, dist=dist, n=mesh, radius=0.95,
+                  projection=projection)
         draw_scattering(calculator, axes, view, jitter, dist=dist)
 
