code: function (oldData) {
      var data = this.data;
      var el = this.el;
      var raycaster = this.raycaster;
  
      // Set raycaster properties.
      raycaster.far = data.far;
      raycaster.near = data.near;
  
      // Draw line.
      if (data.showLine &&
          (data.far !== oldData.far || data.origin !== oldData.origin ||
           data.direction !== oldData.direction || !oldData.showLine)) {
        // Calculate unit vector for line direction. Can be multiplied via scalar to performantly
        // adjust line length.
        this.unitLineEndVec3.copy(data.origin).add(data.direction).normalize();
        this.drawLine();
      }
  
      if (!data.showLine && oldData.showLine) {
        el.removeAttribute('line');
      }
  
      if (data.objects !== oldData.objects && !OBSERVER_SELECTOR_RE.test(data.objects)) {
        warn('[raycaster] Selector "' + data.objects +
             '" may not update automatically with DOM changes.');
      }
  
      if (!data.objects) {
        warn('[raycaster] For performance, please define raycaster.objects when using ' +
             'raycaster or cursor components to whitelist which entities to intersect with. ' +
             'e.g., raycaster="objects: [data-raycastable]".');
      }
  
      if (data.autoRefresh !== oldData.autoRefresh && el.isPlaying) {
        data.autoRefresh
          ? this.addEventListeners()
          : this.removeEventListeners();
      }
  
      if (oldData.enabled && !data.enabled) { this.clearAllIntersections(); }
  
      this.setDirty();
    }
docs: Create or update raycaster object.