@@ -10252,6 +10252,7 @@ function isEqualVec3(a, b) {
1025210252var registerComponent = (__webpack_require__(/*! ../core/component */ "./src/core/component.js").registerComponent);
1025310253var registerShader = (__webpack_require__(/*! ../core/shader */ "./src/core/shader.js").registerShader);
1025410254var THREE = __webpack_require__(/*! ../lib/three */ "./src/lib/three.js");
10255+ var DEFAULT_PREVIEW_DISTANCE = 15.0;
1025510256
1025610257/**
1025710258 * Link component. Connect experiences and traverse between them in VR
@@ -10313,6 +10314,8 @@ module.exports.Component = registerComponent('link', {
1031310314 if (!data.visualAspectEnabled) {
1031410315 return;
1031510316 }
10317+ var elScale = this.el.getAttribute('scale');
10318+ this.previewDistance = DEFAULT_PREVIEW_DISTANCE * (elScale.x + elScale.y) / 2;
1031610319 this.initVisualAspect();
1031710320 backgroundColor = data.highlighted ? data.highlightedColor : data.backgroundColor;
1031810321 strokeColor = data.highlighted ? data.highlightedColor : data.borderColor;
@@ -10387,7 +10390,8 @@ module.exports.Component = registerComponent('link', {
1038710390 el.setAttribute('material', {
1038810391 shader: 'portal',
1038910392 pano: this.data.image,
10390- side: 'double'
10393+ side: 'double',
10394+ previewDistance: this.previewDistance
1039110395 });
1039210396
1039310397 // Set text that displays the link title and URL.
@@ -10416,7 +10420,8 @@ module.exports.Component = registerComponent('link', {
1041610420 shader: 'portal',
1041710421 borderEnabled: 0.0,
1041810422 pano: this.data.image,
10419- side: 'back'
10423+ side: 'back',
10424+ previewDistance: this.previewDistance
1042010425 });
1042110426 semiSphereEl.setAttribute('rotation', '0 180 0');
1042210427 semiSphereEl.setAttribute('position', '0 0 0');
@@ -10434,7 +10439,8 @@ module.exports.Component = registerComponent('link', {
1043410439 shader: 'portal',
1043510440 borderEnabled: 0.0,
1043610441 pano: this.data.image,
10437- side: 'back'
10442+ side: 'back',
10443+ previewDistance: this.previewDistance
1043810444 });
1043910445 sphereEl.setAttribute('visible', false);
1044010446 el.appendChild(sphereEl);
@@ -10474,7 +10480,7 @@ module.exports.Component = registerComponent('link', {
1047410480 elWorldPosition.setFromMatrixPosition(object3D.matrixWorld);
1047510481 cameraWorldPosition.setFromMatrixPosition(camera.matrixWorld);
1047610482 distance = elWorldPosition.distanceTo(cameraWorldPosition);
10477- if (distance > 20 ) {
10483+ if (distance > this.previewDistance * 1.33333 ) {
1047810484 // Store original orientation to be restored when the portal stops facing the camera.
1047910485 if (!this.previousQuaternion) {
1048010486 this.quaternionClone.copy(quaternion);
@@ -10617,10 +10623,15 @@ registerShader('portal', {
1061710623 default: 'white',
1061810624 type: 'color',
1061910625 is: 'uniform'
10626+ },
10627+ previewDistance: {
10628+ default: DEFAULT_PREVIEW_DISTANCE,
10629+ type: 'float',
10630+ is: 'uniform'
1062010631 }
1062110632 },
1062210633 vertexShader: ['vec3 portalPosition;', 'varying vec3 vWorldPosition;', 'varying float vDistanceToCenter;', 'varying float vDistance;', 'void main() {', 'vDistanceToCenter = clamp(length(position - vec3(0.0, 0.0, 0.0)), 0.0, 1.0);', 'portalPosition = (modelMatrix * vec4(0.0, 0.0, 0.0, 1.0)).xyz;', 'vDistance = length(portalPosition - cameraPosition);', 'vWorldPosition = (modelMatrix * vec4(position, 1.0)).xyz;', 'gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);', '}'].join('\n'),
10623- fragmentShader: ['#define RECIPROCAL_PI2 0.15915494', 'uniform sampler2D pano;', 'uniform vec3 strokeColor;', 'uniform vec3 backgroundColor;', 'uniform float borderEnabled;', 'varying float vDistanceToCenter;', 'varying float vDistance;', 'varying vec3 vWorldPosition;', 'void main() {', 'vec3 direction = normalize(vWorldPosition - cameraPosition);', 'vec2 sampleUV;', 'float borderThickness = clamp(exp(-vDistance / 50.0), 0.6, 0.95);', 'sampleUV.y = clamp(direction.y * 0.5 + 0.5, 0.0, 1.0);', 'sampleUV.x = atan(direction.z, -direction.x) * -RECIPROCAL_PI2 + 0.5;', 'if (vDistanceToCenter > borderThickness && borderEnabled == 1.0) {', 'gl_FragColor = vec4(strokeColor, 1.0);', '} else {', 'gl_FragColor = mix(texture2D(pano, sampleUV), vec4(backgroundColor, 1.0), clamp(pow((vDistance / 15.0 ), 2.0), 0.0, 1.0));', '}', '}'].join('\n')
10634+ fragmentShader: ['#define RECIPROCAL_PI2 0.15915494', 'uniform sampler2D pano;', 'uniform vec3 strokeColor;', 'uniform vec3 backgroundColor;', 'uniform float borderEnabled;', 'uniform float previewDistance;', ' varying float vDistanceToCenter;', 'varying float vDistance;', 'varying vec3 vWorldPosition;', 'void main() {', 'vec3 direction = normalize(vWorldPosition - cameraPosition);', 'vec2 sampleUV;', 'float borderThickness = clamp(exp(-vDistance / 50.0), 0.6, 0.95);', 'sampleUV.y = clamp(direction.y * 0.5 + 0.5, 0.0, 1.0);', 'sampleUV.x = atan(direction.z, -direction.x) * -RECIPROCAL_PI2 + 0.5;', 'if (vDistanceToCenter > borderThickness && borderEnabled == 1.0) {', 'gl_FragColor = vec4(strokeColor, 1.0);', '} else {', 'gl_FragColor = mix(texture2D(pano, sampleUV), vec4(backgroundColor, 1.0), clamp(pow((vDistance / previewDistance ), 2.0), 0.0, 1.0));', '}', '}'].join('\n')
1062410635});
1062510636/* eslint-enable */
1062610637
@@ -24547,7 +24558,7 @@ __webpack_require__(/*! ./core/a-mixin */ "./src/core/a-mixin.js");
2454724558// Extras.
2454824559__webpack_require__(/*! ./extras/components/ */ "./src/extras/components/index.js");
2454924560__webpack_require__(/*! ./extras/primitives/ */ "./src/extras/primitives/index.js");
24550- console.log('A-Frame Version: 1.6.0 (Date 2024-11-21, Commit #4f711a4e )');
24561+ console.log('A-Frame Version: 1.6.0 (Date 2024-11-21, Commit #81634786 )');
2455124562console.log('THREE Version (https://github.com/supermedium/three.js):', THREE.REVISION);
2455224563
2455324564// Wait for ready state, unless user asynchronously initializes A-Frame.
0 commit comments