code: function() {
      if (!this.normals) this.addVertexBuffer('normals', 'gl_Normal');
      for (var i = 0; i < this.vertices.length; i++) {
        this.normals[i] = new Vector();
      }
      for (var i = 0; i < this.triangles.length; i++) {
        var t = this.triangles[i];
        var a = Vector.fromArray(this.vertices[t[0]]);
        var b = Vector.fromArray(this.vertices[t[1]]);
        var c = Vector.fromArray(this.vertices[t[2]]);
        var normal = b.subtract(a).cross(c.subtract(a)).unit();
        this.normals[t[0]] = this.normals[t[0]].add(normal);
        this.normals[t[1]] = this.normals[t[1]].add(normal);
        this.normals[t[2]] = this.normals[t[2]].add(normal);
      }
      for (var i = 0; i < this.vertices.length; i++) {
        this.normals[i] = this.normals[i].unit().toArray();
      }
      this.compile();
      return this;
    }
docs: ### .computeNormals()  Computes a new normal for each vertex from the average normal of the neighboring triangles. This means adjacent triangles must share vertices for the resulting normals to be smooth.