Skip to content

Commit

Permalink
support streetmix json encoded in url hash
Browse files Browse the repository at this point in the history
  • Loading branch information
kfarr committed Sep 28, 2023
1 parent 9a0b756 commit d35f7be
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 20 deletions.
59 changes: 39 additions & 20 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,49 @@ AFRAME.registerComponent('streetmix-loader', {
streetmixStreetURL: { type: 'string' },
streetmixAPIURL: { type: 'string' },
showBuildings: { default: true },
name: { default: '' }
name: { default: '' },
streetmixJSON: { type: 'string', default: '' }
},
loadFromJSON: function (streetmixResponseObject) {
if (!streetmixResponseObject) {
console.log("No JSON provided")
return;
}
const data = this.data;
const el = this.el;
const streetmixSegments = streetmixResponseObject.data.street.segments;
const streetmixName = streetmixResponseObject.name;
console.log('streetmixName', streetmixName);
el.setAttribute('streetmix-loader', 'name', streetmixName);

const currentSceneTitle = AFRAME.scenes[0].getAttribute('metadata').sceneTitle;
if (!currentSceneTitle) { // only set title from streetmix if none exists
AFRAME.scenes[0].setAttribute('metadata', 'sceneTitle', streetmixName);
console.log('therefore setting metadata sceneTitle as streetmixName', streetmixName);
}

if (data.showBuildings) {
el.setAttribute('street', 'right', streetmixResponseObject.data.street.rightBuildingVariant);
el.setAttribute('street', 'left', streetmixResponseObject.data.street.leftBuildingVariant);
}
el.setAttribute('street', 'type', 'streetmixSegmentsFeet');
// set JSON attribute last or it messes things up
el.setAttribute('street', 'JSON', JSON.stringify({ streetmixSegmentsFeet: streetmixSegments }));
el.emit('streetmix-loader-street-loaded');
},
update: function (oldData) { // fired at start and at each subsequent change of any schema value
// This method may fire a few times when viewing a streetmix street in 3dstreet:
// First to find the proper path, once to actually load the street, and then subsequent updates such as street name
var data = this.data;
var el = this.el;

// load street from provided JSON with streetmix format
if (data.streetmixJSON !== '') {
this.loadFromJSON(data.streetmixJSON);
data.streetmixJSON == '';
return;
}

// if the loader has run once already, and upon update neither URL has changed, do not take action
if ((oldData.streetmixStreetURL === data.streetmixStreetURL) && (oldData.streetmixAPIURL === data.streetmixAPIURL)) {
// console.log('[streetmix-loader]', 'Neither streetmixStreetURL nor streetmixAPIURL have changed in this component data update, not reloading street.')
Expand All @@ -80,30 +115,14 @@ AFRAME.registerComponent('streetmix-loader', {
var request = new XMLHttpRequest();
console.log('[streetmix-loader]', 'GET ' + data.streetmixAPIURL);

// for using inside request callback function
const loadFromJSON = this.loadFromJSON.bind(this);
request.open('GET', data.streetmixAPIURL, true);
request.onload = function () {
if (this.status >= 200 && this.status < 400) {
// Connection success
const streetmixResponseObject = JSON.parse(this.response);
const streetmixSegments = streetmixResponseObject.data.street.segments;
const streetmixName = streetmixResponseObject.name;
console.log('streetmixName', streetmixName);
el.setAttribute('streetmix-loader', 'name', streetmixName);

const currentSceneTitle = AFRAME.scenes[0].getAttribute('metadata').sceneTitle;
if (!currentSceneTitle) { // only set title from streetmix if none exists
AFRAME.scenes[0].setAttribute('metadata', 'sceneTitle', streetmixName);
console.log('therefore setting metadata sceneTitle as streetmixName', streetmixName);
}

if (data.showBuildings) {
el.setAttribute('street', 'right', streetmixResponseObject.data.street.rightBuildingVariant);
el.setAttribute('street', 'left', streetmixResponseObject.data.street.leftBuildingVariant);
}
el.setAttribute('street', 'type', 'streetmixSegmentsFeet');
// set JSON attribute last or it messes things up
el.setAttribute('street', 'JSON', JSON.stringify({ streetmixSegmentsFeet: streetmixSegments }));
el.emit('streetmix-loader-street-loaded');
loadFromJSON(streetmixResponseObject);
} else {
// We reached our target server, but it returned an error
console.log('[streetmix-loader]', 'Loading Error: We reached the target server, but it returned an error');
Expand Down
8 changes: 8 additions & 0 deletions src/json-utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -441,6 +441,14 @@ AFRAME.registerComponent('set-loader-from-hash', {
'streetmixStreetURL',
streetURL
);
} else if (streetURL.startsWith('streetmix-json:')){

const JSONString = decodeURIComponent(streetURL.split('streetmix-json:')[1]);
console.log(JSONString)
const streetmixJSON = JSON.parse(JSONString);
console.log(streetmixJSON);
this.el.setAttribute('streetmix-loader', 'streetmixJSON', streetmixJSON);

} else {
// try to load JSON file from remote resource
console.log(
Expand Down

0 comments on commit d35f7be

Please sign in to comment.