             return
 
         # rescale all text in scene
-        if (new_pos or force) and @_center?
-            s = @camera.position.distanceTo(@_center) / 3
-            if @_text?
-                for sprite in @_text
-                    sprite.scale.set(s,s,s)
-            if @_frame_labels?
-                for sprite in @_frame_labels
-                    sprite.scale.set(s,s,s)
+        @rescale_objects()
 
         @renderer.render(@scene, @camera)
 
+    rescale_objects: () =>
+        if not @_center?
+            return
+        s = @camera.position.distanceTo(@_center) / 3
+        if Math.abs(@_last_scale - s) < 0.000001
+            return
+        @_last_scale = s
+        if @_text?
+            for sprite in @_text
+                sprite.scale.set(s,s,s)
+        if @_frame_labels?
+            for sprite in @_frame_labels
+                sprite.scale.set(s,s,s)
+        if @_points?
+            for z in @_points
+                c = z[1]
+                z[0].scale.set(s*c,s*c,s*c)
 
 
 $.fn.salvus_threejs = (opts={}) ->

            sizeAttenuation : false
        @show_canvas()

        material = new THREE.PointCloudMaterial
            color           : o.color
            size            : o.size
            sizeAttenuation : o.sizeAttenuation
        switch dynamic_renderer_type
            when 'webgl'
                geometry = new THREE.Geometry()
                geometry.vertices.push(@vector(o.loc))
                particle = new THREE.PointCloud(geometry, material)
            #when 'canvas'
            #    geometry = new THREE.Geometry()
            #    geometry.vertices.push(@vector(o.loc))
            #    particle = new THREE.PointCloud(geometry, material)
            when 'canvas'
                particle = new THREE.Particle(material)
                particle.position.set(@aspect_ratio_scale(o.loc))
                if @_frame_params?
                    p = @_frame_params
                    w = Math.min(Math.min(p.xmax-p.xmin, p.ymax-p.ymin),p.zmax-p.zmin)
                else
                    w = 5 # little to go on
                #console.log("w=",w)
                particle.scale.x = particle.scale.y = Math.max(50/@opts.width, o.size * 5 * w / @opts.width)
                #console.log(particle)
            else
                throw "bug -- uknown dynamic_renderer_type = #{dynamic_renderer_type}"


        # make an HTML5 2d canvas on which to draw text
        width   = 300  # this determines max text width; beyond this, text is cut off.
        height  = 150
        canvas = document.createElement( 'canvas' )
        canvas.width = width
        canvas.height = height
        context = canvas.getContext("2d")  # get the drawing context

        # set the fontsize and fix for our text.
        context.font = "Normal " + o.fontsize + "px " + o.fontface
