                 format = (num) ->
                     Number(num.toFixed 2).toString()
 
-                frame_color = @opts.frame_color.getStyle()
-                add_label = (loc, text) =>
-                    @_frame_labels.push(
+                frameColor = [@frameColor.r, @frameColor.g, @frameColor.b]
+                addLabel = (loc, text) =>
+                    @_frameLabels.push(
                         @add_text
                             loc           : loc
                             text          : text
-                            fontsize      : @opts.label_fontsize
-                            color         : frame_color
+                            fontsize      : @frameOpts.fontsize
                             constant_size : false
                             in_frame      : false
+                            material:
+                                color   : frameColor
+                                opacity : 1
                         )
 
                 offset = 0.075
 
                 e = (max.y - min.y)*offset
-                add_label [max.x, min.y-e, min.z], format(min.z)
-                add_label [max.x, min.y-e, avg.z], "z = #{format avg.z}"
-                add_label [max.x, min.y-e, max.z], format(max.z)
+                addLabel [max.x, min.y-e, min.z], format(min.z)
+                addLabel [max.x, min.y-e, avg.z], "z = #{format avg.z}"
+                addLabel [max.x, min.y-e, max.z], format(max.z)
 
                 e = (max.x - min.x)*offset
-                add_label [max.x+e, min.y, min.z], format(min.y)
-                add_label [max.x+e, avg.y, min.z], "y = #{format avg.y}"
-                add_label [max.x+e, max.y, min.z], format(max.y)
+                addLabel [max.x+e, min.y, min.z], format(min.y)
+                addLabel [max.x+e, avg.y, min.z], "y = #{format avg.y}"
+                addLabel [max.x+e, max.y, min.z], format(max.y)
 
                 e = (max.y - min.y)*offset
-                add_label [max.x, max.y+e, min.z], format(max.x)
-                add_label [avg.x, max.y+e, min.z], "x = #{format avg.x}"
-                add_label [min.x, max.y+e, min.z], format(min.x)
+                addLabel [max.x, max.y+e, min.z], format(max.x)
+                addLabel [avg.x, max.y+e, min.z], "x = #{format avg.x}"
+                addLabel [min.x, max.y+e, min.z], format(min.x)
 
         @camera.lookAt @_center
         if @controls?
             @controls.target = @_center
-        @render_scene()
 
     add_obj: (opts) ->
         opts = defaults opts,
             obj       : required
             wireframe : undefined
-            set_frame : undefined
 
         switch opts.obj.type
             when 'group'

            else
                console.log "ERROR: bad object type #{opts.obj.type}"

        @render_scene true

    animate: (opts = {}) ->
        opts = defaults opts,
            fps       : undefined

        @light = new THREE.PointLight color
        @light.position.set 0, d, 0

    updateBoundingBox: (obj) ->
        if not obj.geometry.boundingBox?
            obj.geometry.computeBoundingBox()
        if @boundingBox?
            @boundingBox.geometry.boundingBox.union obj.geometry.boundingBox
        else
            @boundingBox = new THREE.BoxHelper()
            @boundingBox.geometry.boundingBox = obj.geometry.boundingBox.clone()
        @boundingBox.update @boundingBox

    add_text: (opts) ->
        opts = defaults opts,
