         if opts._basic_material
             material = new THREE.MeshBasicMaterial
                 transparent : opts.texture.opacity < 1
-
-            material.color.setRGB       opts.texture.color...
-
         else
             material = new THREE.MeshPhongMaterial
                 transparent : opts.texture.opacity < 1
                 side        : THREE.DoubleSide
 
-            material.color.setRGB       opts.texture.color...
             material.ambient.setRGB     opts.texture.ambient...
             material.specular.setRGB    opts.texture.specular...
-            material.opacity          = opts.texture.opacity
+        material.color.setRGB       opts.texture.color...
+        material.opacity          = opts.texture.opacity
 
         sphere = new THREE.Mesh geometry, material
-        @rescale sphere.position.set(opts.loc...)
-
-        return @_finalizeObj sphere, opts.in_frame
+        sphere.position.set opts.loc...
+
+        @_finalizeObj sphere, opts.in_frame
+        @rescale sphere.position
+        return sphere
+
+    _addCloudPoint: (opts) ->
+        if not @_cloud
+            @_cloud = {}
+
+        key = opts.size+opts.texture.color+opts.in_frame
+
+        if not (cloud = @_cloud[key])?
+            material = new THREE.PointCloudMaterial
+                size            : opts.size*2
+                sizeAttenuation : false
+            material.color.setRGB opts.texture.color...
+            cloud = @_cloud[key] = new THREE.PointCloud(
+                                        new THREE.Geometry(), material)
+            cloud.scale.copy @aspectRatio
+            @scene.add cloud
+
+        cloud.geometry.vertices.push new THREE.Vector3(opts.loc...)
+
+        if opts.in_frame
+            @updateBoundingBox cloud
+        return cloud
+
+    _initPointHelper: ->
+        if not @_pointHelper?
+            @_pointHelperVec = new THREE.Vector3()
+
+            @_pointHelper = new THREE.Mesh()
+            @_pointHelper.geometry.vertices.push @_pointHelperVec
+
+    _addSpherePoint: (opts) ->
+        if not @_points?
+            @_points = []
+            @changeHooks.push =>
+                for point in @_points
+                    scale = @camera.position.distanceTo point.position
+                    point.scale.set scale, scale, scale
+
+        if opts.in_frame
+            @_initPointHelper()
+            @_pointHelperVec.set(opts.loc...)
+            @updateBoundingBox @_pointHelper
+
+        opts.radius = opts.size/1200
+        opts._basic_material = true
+        opts.in_frame = false
+
+        delete opts.size
+        delete opts.use_cloud
+
+        point = @addSphere opts
+        @_points.push point
+        return point
 
     addPoint: (opts) ->
         opts = defaults opts,

        material.color.setRGB opts.texture.color...

        text = new THREE.Mesh geometry, material
        @rescale text.position.set(opts.loc...)
        text.rotation.set opts.rotation...

        geometry.computeBoundingBox()

        up = new THREE.Vector3()
        @controls.addEventListener 'change', =>
            if @renderer_type is 'dynamic'
                for hook in @changeHooks
                    hook()

                @renderer.render @scene, @camera

