aframe.js 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094
  1. "use strict";
  2. // VWF & A-Frame model driver
  3. // Copyright 2017 Krestianstvo.org project
  4. //
  5. // Copyright 2012 United States Government, as represented by the Secretary of Defense, Under
  6. // Secretary of Defense (Personnel & Readiness).
  7. //
  8. // Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
  9. // in compliance with the License. You may obtain a copy of the License at
  10. //
  11. // http://www.apache.org/licenses/LICENSE-2.0
  12. //
  13. // Unless required by applicable law or agreed to in writing, software distributed under the License
  14. // is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
  15. // or implied. See the License for the specific language governing permissions and limitations under
  16. // the License.
  17. /// vwf/model/scenejs.js is a placeholder for a 3-D scene manager.
  18. ///
  19. /// @module vwf/model/aframe
  20. /// @requires vwf/model
  21. define(["module", "vwf/model", "vwf/utility"], function (module, model, utility) {
  22. var self;
  23. return model.load(module, {
  24. // == Module Definition ====================================================================
  25. // -- initialize ---------------------------------------------------------------------------
  26. initialize: function () {
  27. self = this;
  28. this.state = {
  29. nodes: {},
  30. scenes: {},
  31. prototypes: {},
  32. createLocalNode: function (nodeID, childID, childExtendsID, childImplementsIDs,
  33. childSource, childType, childIndex, childName, callback) {
  34. return {
  35. "parentID": nodeID,
  36. "ID": childID,
  37. "extendsID": childExtendsID,
  38. "implementsIDs": childImplementsIDs,
  39. "source": childSource,
  40. "type": childType,
  41. "name": childName,
  42. "prototypes": undefined,
  43. "aframeObj": undefined,
  44. "scene": undefined,
  45. "componentName": undefined,
  46. "events": {
  47. "clickable": false
  48. }
  49. };
  50. },
  51. isAFrameClass: function (prototypes, classID) {
  52. if (prototypes) {
  53. for (var i = 0; i < prototypes.length; i++) {
  54. if (prototypes[i] === classID) {
  55. //console.info( "prototypes[ i ]: " + prototypes[ i ] );
  56. return true;
  57. }
  58. }
  59. }
  60. return false;
  61. },
  62. isAFrameComponent: function (prototypes) {
  63. var found = false;
  64. if (prototypes) {
  65. for (var i = 0; i < prototypes.length && !found; i++) {
  66. found = (prototypes[i] === "http://vwf.example.com/aframe/node.vwf");
  67. }
  68. }
  69. return found;
  70. },
  71. setAFrameProperty: function (propertyName, propertyValue, aframeObject) {
  72. if (propertyValue.hasOwnProperty('x')) {
  73. aframeObject.setAttribute(propertyName, propertyValue)
  74. } else
  75. if (Array.isArray(propertyValue)) {
  76. aframeObject.setAttribute(propertyName, { x: propertyValue[0], y: propertyValue[1], z: propertyValue[2] })
  77. } else if (typeof propertyValue === 'string') {
  78. aframeObject.setAttribute(propertyName, AFRAME.utils.coordinates.parse(propertyValue))
  79. }
  80. }
  81. };
  82. this.state.kernel = this.kernel.kernel.kernel;
  83. },
  84. // == Model API ============================================================================
  85. // -- creatingNode -------------------------------------------------------------------------
  86. creatingNode: function (nodeID, childID, childExtendsID, childImplementsIDs,
  87. childSource, childType, childIndex, childName, callback /* ( ready ) */) {
  88. // If the parent nodeID is 0, this node is attached directly to the root and is therefore either
  89. // the scene or a prototype. In either of those cases, save the uri of the new node
  90. var childURI = (nodeID === 0 ? childIndex : undefined);
  91. var appID = this.kernel.application();
  92. // If the node being created is a prototype, construct it and add it to the array of prototypes,
  93. // and then return
  94. var prototypeID = utility.ifPrototypeGetId(appID, this.state.prototypes, nodeID, childID);
  95. if (prototypeID !== undefined) {
  96. this.state.prototypes[prototypeID] = {
  97. parentID: nodeID,
  98. ID: childID,
  99. extendsID: childExtendsID,
  100. implementsID: childImplementsIDs,
  101. source: childSource,
  102. type: childType,
  103. name: childName
  104. };
  105. return;
  106. }
  107. var protos = getPrototypes(this.kernel, childExtendsID);
  108. //var kernel = this.kernel.kernel.kernel;
  109. var node;
  110. if (this.state.isAFrameComponent(protos)) {
  111. // Create the local copy of the node properties
  112. if (this.state.nodes[childID] === undefined) {
  113. this.state.nodes[childID] = this.state.createLocalNode(nodeID, childID, childExtendsID, childImplementsIDs,
  114. childSource, childType, childIndex, childName, callback);
  115. }
  116. node = this.state.nodes[childID];
  117. node.prototypes = protos;
  118. // if (childType == "component") {
  119. // if (nodeID !== undefined) {
  120. // node.aframeObj = setAFrameObjectComponents(node);
  121. // addNodeToHierarchy(node);
  122. // }
  123. // } else {
  124. node.aframeObj = createAFrameObject(node);
  125. addNodeToHierarchy(node);
  126. //notifyDriverOfPrototypeAndBehaviorProps();
  127. // }
  128. //addNodeToHierarchy(node);
  129. }
  130. },
  131. // initializingNode: function( nodeID, childID, childExtendsID, childImplementsIDs,
  132. // childSource, childType, childIndex, childName ) {
  133. // var node = this.state.nodes[childID];
  134. // if ( node && childType == "component" ) {
  135. // }
  136. // },
  137. // -- initializingProperty -----------------------------------------------------------------
  138. initializingProperty: function (nodeID, propertyName, propertyValue) {
  139. var value = undefined;
  140. var node = this.state.nodes[nodeID];
  141. if (node !== undefined) {
  142. value = this.settingProperty(nodeID, propertyName, propertyValue);
  143. }
  144. return value;
  145. },
  146. // -- creatingProperty ---------------------------------------------------------------------
  147. creatingProperty: function (nodeID, propertyName, propertyValue) {
  148. return this.initializingProperty(nodeID, propertyName, propertyValue);
  149. },
  150. // -- deletingNode -------------------------------------------------------------------------
  151. //deletingNode: function( nodeID ) {
  152. //},
  153. // -- deletingNode -------------------------------------------------------------------------
  154. deletingNode: function (nodeID) {
  155. if (this.state.nodes[nodeID] !== undefined) {
  156. var node = this.state.nodes[nodeID];
  157. if (node.aframeObj !== undefined) {
  158. // removes and destroys object
  159. node.aframeObj.parentNode.removeChild(node.aframeObj);
  160. node.aframeObj = undefined;
  161. }
  162. delete this.state.nodes[nodeID];
  163. }
  164. },
  165. // -- settingProperty ----------------------------------------------------------------------
  166. settingProperty: function (nodeID, propertyName, propertyValue) {
  167. var node = this.state.nodes[nodeID];
  168. var value = undefined;
  169. // if (node.componentName == 'line') {
  170. // console.log(node.aframeObj);
  171. // }
  172. if (node && node.aframeObj && utility.validObject(propertyValue)) {
  173. var aframeObject = node.aframeObj;
  174. if (isNodeDefinition(node.prototypes)) {
  175. // 'id' will be set to the nodeID
  176. value = propertyValue;
  177. switch (propertyName) {
  178. default:
  179. value = undefined;
  180. break;
  181. }
  182. }
  183. if (value === undefined && isAEntityDefinition(node.prototypes)) {
  184. value = propertyValue;
  185. switch (propertyName) {
  186. // case "interpolation":
  187. // aframeObject.setAttribute('interpolation', { duration: propertyValue});
  188. // break;
  189. case "worldPosition":
  190. break;
  191. case "position":
  192. this.state.setAFrameProperty('position', propertyValue, aframeObject);
  193. // if (propertyValue.hasOwnProperty('x')) {
  194. // aframeObject.setAttribute('position', propertyValue)
  195. // } else
  196. // if (Array.isArray(propertyValue)) {
  197. // aframeObject.setAttribute('position', { x: propertyValue[0], y: propertyValue[1], z: propertyValue[2] })
  198. // } else if (typeof propertyValue === 'string') {
  199. // aframeObject.setAttribute('position', AFRAME.utils.coordinates.parse(propertyValue))
  200. // }
  201. break;
  202. case "rotation":
  203. this.state.setAFrameProperty('rotation', propertyValue, aframeObject);
  204. // if (Array.isArray(propertyValue)) {
  205. // aframeObject.setAttribute('rotation', { x: propertyValue[0], y: propertyValue[1], z: propertyValue[2] });
  206. // } else {
  207. // aframeObject.setAttribute('rotation', AFRAME.utils.coordinates.parse(propertyValue));
  208. // }
  209. break;
  210. case "scale":
  211. this.state.setAFrameProperty('scale', propertyValue, aframeObject);
  212. // if (Array.isArray(propertyValue)) {
  213. // aframeObject.setAttribute('scale', { x: propertyValue[0], y: propertyValue[1], z: propertyValue[2] });
  214. // } else {
  215. // aframeObject.setAttribute('scale', AFRAME.utils.coordinates.parse(propertyValue));
  216. // }
  217. break;
  218. case "color":
  219. aframeObject.setAttribute('color', propertyValue);
  220. break;
  221. case "transparent":
  222. aframeObject.setAttribute('material', 'transparent', propertyValue);
  223. break;
  224. case "opacity":
  225. aframeObject.setAttribute('material', 'opacity', propertyValue);
  226. break;
  227. case "fog":
  228. aframeObject.setAttribute('material', 'fog', propertyValue);
  229. break;
  230. case "wireframe":
  231. aframeObject.setAttribute('wireframe', propertyValue);
  232. break;
  233. case "wireframe-linewidth":
  234. aframeObject.setAttribute('wireframeLinewidth', propertyValue);
  235. break;
  236. case "clickable":
  237. if (propertyValue) {
  238. aframeObject.setAttribute('class', 'intersectable');
  239. } else {
  240. aframeObject.setAttribute('class', 'nonintersectable');
  241. }
  242. node.events.clickable = propertyValue;
  243. break;
  244. case "visible":
  245. aframeObject.setAttribute('visible', propertyValue);
  246. break;
  247. // case "clickable":
  248. // console.log("set clickable!");
  249. // value = propertyValue;
  250. // break;
  251. // case "clickable":
  252. // if (propertyValue) {
  253. // aframeObject.addEventListener('click', function (evt) {
  254. // console.log("click!");
  255. // vwf_view.kernel.fireEvent(node.ID, "clickEvent",evt.detail.cursorEl.id);
  256. // });
  257. // }
  258. // break;
  259. case "src":
  260. aframeObject.setAttribute('src', propertyValue);
  261. break;
  262. case "repeat":
  263. aframeObject.setAttribute('repeat', propertyValue);
  264. break;
  265. case "look-controls-enabled":
  266. aframeObject.setAttribute('look-controls', 'enabled', propertyValue);
  267. break;
  268. case "wasd-controls":
  269. aframeObject.setAttribute('wasd-controls', 'enabled', propertyValue);
  270. break;
  271. default:
  272. value = undefined;
  273. break;
  274. }
  275. }
  276. if (value === undefined && aframeObject.nodeName == "A-TEXT") {
  277. value = propertyValue;
  278. switch (propertyName) {
  279. case "value":
  280. aframeObject.setAttribute('value', propertyValue);
  281. break;
  282. case "color":
  283. aframeObject.setAttribute('color', propertyValue);
  284. break;
  285. case "side":
  286. aframeObject.setAttribute('side', propertyValue);
  287. break;
  288. default:
  289. value = undefined;
  290. break;
  291. }
  292. }
  293. if (value === undefined && aframeObject.nodeName == "A-SCENE") {
  294. value = propertyValue;
  295. switch (propertyName) {
  296. case "fog":
  297. aframeObject.setAttribute('fog', propertyValue);
  298. break;
  299. case "assets":
  300. var assetsElement = document.createElement('a-assets');
  301. aframeObject.appendChild(assetsElement);
  302. if (propertyValue) {
  303. httpGetJson(propertyValue).then(function (response) {
  304. console.log(JSON.parse(response));
  305. let assets = JSON.parse(response);
  306. for (var prop in assets) {
  307. var elm = document.createElement(assets[prop].tag);
  308. elm.setAttribute('id', prop);
  309. elm.setAttribute('src', assets[prop].src);
  310. assetsElement.appendChild(elm);
  311. }
  312. }).catch(function (error) {
  313. console.log(error);
  314. });
  315. }
  316. break;
  317. default:
  318. value = undefined;
  319. break;
  320. }
  321. }
  322. if (value === undefined && aframeObject.nodeName == "A-BOX") {
  323. value = propertyValue;
  324. switch (propertyName) {
  325. case "depth":
  326. aframeObject.setAttribute('depth', propertyValue);
  327. break;
  328. case "height":
  329. aframeObject.setAttribute('height', propertyValue);
  330. break;
  331. case "width":
  332. aframeObject.setAttribute('width', propertyValue);
  333. break;
  334. default:
  335. value = undefined;
  336. break;
  337. }
  338. }
  339. if (value === undefined && aframeObject.nodeName == "A-LIGHT") {
  340. value = propertyValue;
  341. switch (propertyName) {
  342. //"angle", "color", "decay", "distance", "ground-color", "intensity", "penumbra", "type", "target"
  343. case "color":
  344. aframeObject.setAttribute('color', propertyValue);
  345. break;
  346. case "type":
  347. aframeObject.setAttribute('type', propertyValue);
  348. break;
  349. case "intensity":
  350. aframeObject.setAttribute('intensity', propertyValue);
  351. break;
  352. case "distance":
  353. aframeObject.setAttribute('distance', propertyValue);
  354. break;
  355. default:
  356. value = undefined;
  357. break;
  358. }
  359. }
  360. if (value === undefined && aframeObject.nodeName == "A-GLTF-MODEL") {
  361. value = propertyValue;
  362. switch (propertyName) {
  363. case "src":
  364. aframeObject.setAttribute('src', propertyValue);
  365. break;
  366. default:
  367. value = undefined;
  368. break;
  369. }
  370. }
  371. if (value === undefined && aframeObject.nodeName == "A-COLLADA-MODEL") {
  372. value = propertyValue;
  373. switch (propertyName) {
  374. case "src":
  375. aframeObject.setAttribute('src', propertyValue);
  376. break;
  377. default:
  378. value = undefined;
  379. break;
  380. }
  381. }
  382. if (value === undefined && aframeObject.nodeName == "A-PLANE") {
  383. value = propertyValue;
  384. switch (propertyName) {
  385. case "height":
  386. aframeObject.setAttribute('height', propertyValue);
  387. break;
  388. case "width":
  389. aframeObject.setAttribute('width', propertyValue);
  390. break;
  391. default:
  392. value = undefined;
  393. break;
  394. }
  395. }
  396. if (value === undefined && aframeObject.nodeName == "A-SPHERE") {
  397. value = propertyValue;
  398. switch (propertyName) {
  399. case "radius":
  400. aframeObject.setAttribute('radius', propertyValue);
  401. break;
  402. default:
  403. value = undefined;
  404. break;
  405. }
  406. }
  407. if (value === undefined && aframeObject.nodeName == "A-ANIMATION") {
  408. value = propertyValue;
  409. switch (propertyName) {
  410. // attribute:
  411. // dur:
  412. // from:
  413. // to:
  414. // repeat:
  415. case "dur":
  416. aframeObject.setAttribute('dur', propertyValue);
  417. break;
  418. case "from":
  419. aframeObject.setAttribute('from', propertyValue);
  420. break;
  421. case "to":
  422. aframeObject.setAttribute('to', propertyValue);
  423. break;
  424. case "repeat":
  425. aframeObject.setAttribute('repeat', propertyValue);
  426. break;
  427. case "attribute":
  428. aframeObject.setAttribute('attribute', propertyValue);
  429. break;
  430. case "begin":
  431. aframeObject.setAttribute('begin', propertyValue);
  432. break;
  433. default:
  434. value = undefined;
  435. break;
  436. }
  437. }
  438. if (value === undefined && aframeObject.nodeName == "A-CAMERA") {
  439. value = propertyValue;
  440. switch (propertyName) {
  441. case "userHeight":
  442. aframeObject.setAttribute('camera', 'userHeight', propertyValue);
  443. break;
  444. // case "active":
  445. // aframeObject.setAttribute('camera', 'active', propertyValue);
  446. // break;
  447. default:
  448. value = undefined;
  449. break;
  450. }
  451. }
  452. if (value === undefined && aframeObject.nodeName == "A-SUN-SKY") {
  453. value = propertyValue;
  454. switch (propertyName) {
  455. case "sunPosition":
  456. aframeObject.setAttribute('material', 'sunPosition', propertyValue);
  457. break;
  458. // case "active":
  459. // aframeObject.setAttribute('camera', 'active', propertyValue);
  460. // break;
  461. default:
  462. value = undefined;
  463. break;
  464. }
  465. }
  466. }
  467. return value;
  468. },
  469. // -- gettingProperty ----------------------------------------------------------------------
  470. gettingProperty: function (nodeID, propertyName, propertyValue) {
  471. var node = this.state.nodes[nodeID];
  472. var value = undefined;
  473. if (node && node.aframeObj) {
  474. var aframeObject = node.aframeObj;
  475. if (isNodeDefinition(node.prototypes)) {
  476. switch (propertyName) {
  477. }
  478. }
  479. if (value === undefined && isAEntityDefinition(node.prototypes)) {
  480. switch (propertyName) {
  481. // case "interpolation":
  482. // var interpolation = aframeObject.getAttribute('interpolation');
  483. // if (interpolation !== null && interpolation !== undefined) {
  484. // value = interpolation.duration;
  485. // }
  486. // break;
  487. case "worldPosition":
  488. var pos = aframeObject.object3D.getWorldPosition();
  489. if (pos !== undefined) {
  490. value = pos;
  491. }
  492. break;
  493. case "position":
  494. var pos = aframeObject.getAttribute('position');
  495. if (pos !== undefined) {
  496. value = pos//[pos.x, pos.y, pos.z]//AFRAME.utils.coordinates.stringify(pos);
  497. }
  498. break;
  499. case "scale":
  500. var scale = aframeObject.getAttribute('scale');
  501. if (scale !== undefined) {
  502. value = scale//AFRAME.utils.coordinates.stringify(scale);
  503. }
  504. break;
  505. case "rotation":
  506. var rot = aframeObject.getAttribute('rotation');
  507. if (rot !== undefined) {
  508. value = rot//AFRAME.utils.coordinates.stringify(rot);
  509. }
  510. break;
  511. case "color":
  512. value = aframeObject.getAttribute('color');
  513. break;
  514. case "fog":
  515. if (aframeObject.getAttribute('material')) {
  516. value = aframeObject.getAttribute('material').fog;
  517. }
  518. break;
  519. case "opacity":
  520. if (aframeObject.getAttribute('material')) {
  521. value = aframeObject.getAttribute('material').opacity;
  522. }
  523. break;
  524. case "transparent":
  525. if (aframeObject.getAttribute('material')) {
  526. value = aframeObject.getAttribute('material').transparent;
  527. }
  528. break;
  529. case "wireframe":
  530. value = aframeObject.getAttribute('wireframe');
  531. break;
  532. case "wireframe-linewidth":
  533. value = aframeObject.getAttribute('wireframeLinewidth');
  534. break;
  535. case "clickable":
  536. value = node.events.clickable;
  537. break;
  538. case "src":
  539. value = aframeObject.getAttribute('src');
  540. break;
  541. case "repeat":
  542. value = aframeObject.getAttribute('repeat');
  543. case "look-controls-enabled":
  544. var look = aframeObject.getAttribute('look-controls-enabled');
  545. if (look !== null && look !== undefined) {
  546. value = aframeObject.getAttribute('look-controls').enabled;
  547. }
  548. break;
  549. case "wasd-controls":
  550. var wasd = aframeObject.getAttribute('wasd-controls');
  551. if (wasd !== null && wasd !== undefined) {
  552. value = aframeObject.getAttribute('wasd-controls').enabled;
  553. }
  554. break;
  555. case "visible":
  556. value = aframeObject.getAttribute('visible');
  557. break;
  558. }
  559. }
  560. if (value === undefined && aframeObject.nodeName == "A-SCENE") {
  561. switch (propertyName) {
  562. case "fog":
  563. value = aframeObject.getAttribute('fog');
  564. break;
  565. }
  566. }
  567. if (value === undefined && aframeObject.nodeName == "A-BOX") {
  568. switch (propertyName) {
  569. case "depth":
  570. value = aframeObject.getAttribute('depth');
  571. break;
  572. case "height":
  573. value = aframeObject.getAttribute('height');
  574. break;
  575. case "width":
  576. value = aframeObject.getAttribute('width');
  577. break;
  578. }
  579. }
  580. if (value === undefined && aframeObject.nodeName == "A-LIGHT") {
  581. //"angle", "color", "decay", "distance", "ground-color", "intensity", "penumbra", "type", "target"
  582. switch (propertyName) {
  583. case "color":
  584. value = aframeObject.getAttribute('color');
  585. break;
  586. case "type":
  587. value = aframeObject.getAttribute('type');
  588. break;
  589. case "distance":
  590. value = aframeObject.getAttribute('distance');
  591. break;
  592. case "intensity":
  593. value = aframeObject.getAttribute('intensity');
  594. break;
  595. }
  596. }
  597. if (value === undefined && aframeObject.nodeName == "A-PLANE") {
  598. switch (propertyName) {
  599. case "height":
  600. value = aframeObject.getAttribute('height');
  601. break;
  602. case "width":
  603. value = aframeObject.getAttribute('width');
  604. break;
  605. }
  606. }
  607. if (value === undefined && aframeObject.nodeName == "A-SPHERE") {
  608. switch (propertyName) {
  609. case "radius":
  610. value = aframeObject.getAttribute('radius');
  611. break;
  612. }
  613. }
  614. if (value === undefined && aframeObject.nodeName == "A-TEXT") {
  615. switch (propertyName) {
  616. case "value":
  617. value = aframeObject.getAttribute('value');
  618. break;
  619. case "color":
  620. value = aframeObject.getAttribute('color');
  621. break;
  622. case "side":
  623. value = aframeObject.getAttribute('side');
  624. break;
  625. }
  626. }
  627. if (value === undefined && aframeObject.nodeName == "A-ANIMATION") {
  628. switch (propertyName) {
  629. case "attribute":
  630. value = aframeObject.getAttribute('attribute');
  631. break;
  632. case "dur":
  633. value = aframeObject.getAttribute('dur');
  634. break;
  635. case "from":
  636. value = aframeObject.getAttribute('from');
  637. break;
  638. case "to":
  639. value = aframeObject.getAttribute('to');
  640. break;
  641. case "repeat":
  642. value = aframeObject.getAttribute('repeat');
  643. break;
  644. case "begin":
  645. value = aframeObject.getAttribute('begin');
  646. break;
  647. }
  648. }
  649. if (value === undefined && aframeObject.nodeName == "A-CAMERA") {
  650. switch (propertyName) {
  651. case "userHeight":
  652. value = aframeObject.getAttribute('camera').userHeight;
  653. break;
  654. }
  655. // switch (propertyName) {
  656. // case "active":
  657. // value = aframeObject.getAttribute('camera').active;
  658. // break;
  659. // }
  660. }
  661. if (value === undefined && aframeObject.nodeName == "A-SUN-SKY") {
  662. switch (propertyName) {
  663. case "sunPosition":
  664. value = aframeObject.getAttribute('material').sunPosition;
  665. break;
  666. }
  667. // switch (propertyName) {
  668. // case "active":
  669. // value = aframeObject.getAttribute('camera').active;
  670. // break;
  671. // }
  672. }
  673. if (value === undefined && aframeObject.nodeName == "A-COLLADA-MODEL") {
  674. switch (propertyName) {
  675. case "src":
  676. value = aframeObject.getAttribute('src');
  677. break;
  678. }
  679. }
  680. if (value === undefined && aframeObject.nodeName == "A-GLTF-MODEL") {
  681. switch (propertyName) {
  682. case "src":
  683. value = aframeObject.getAttribute('src');
  684. break;
  685. }
  686. }
  687. }
  688. if (value !== undefined) {
  689. propertyValue = value;
  690. }
  691. return value;
  692. }
  693. });
  694. function createAFrameObject(node, config) {
  695. var protos = node.prototypes;
  696. var aframeObj = undefined;
  697. if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/ascene.vwf")) {
  698. aframeObj = document.createElement('a-scene');
  699. self.state.scenes[node.ID] = aframeObj;
  700. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/acamera.vwf")) {
  701. aframeObj = document.createElement('a-camera');
  702. aframeObj.setAttribute('camera', 'active', false);
  703. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/alight.vwf")) {
  704. aframeObj = document.createElement('a-light');
  705. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/acursor.vwf")) {
  706. aframeObj = document.createElement('a-cursor');
  707. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/asky.vwf")) {
  708. aframeObj = document.createElement('a-sky');
  709. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/a-sun-sky.vwf")) {
  710. aframeObj = document.createElement('a-sun-sky');
  711. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/abox.vwf")) {
  712. aframeObj = document.createElement('a-box');
  713. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/aplane.vwf")) {
  714. aframeObj = document.createElement('a-plane');
  715. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/atext.vwf")) {
  716. aframeObj = document.createElement('a-text');
  717. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/acolladamodel.vwf")) {
  718. aframeObj = document.createElement('a-collada-model');
  719. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/agltfmodel.vwf")) {
  720. aframeObj = document.createElement('a-gltf-model');
  721. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/asphere.vwf")) {
  722. aframeObj = document.createElement('a-sphere');
  723. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/aanimation.vwf")) {
  724. aframeObj = document.createElement('a-animation');
  725. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/aentity.vwf")) {
  726. aframeObj = document.createElement('a-entity');
  727. }
  728. aframeObj.setAttribute('id', node.ID);
  729. return aframeObj;
  730. }
  731. function addNodeToHierarchy(node) {
  732. if (node.aframeObj) {
  733. if (self.state.nodes[node.parentID] !== undefined) {
  734. var parent = self.state.nodes[node.parentID];
  735. if (parent.aframeObj) {
  736. if (parent.children === undefined) {
  737. parent.children = [];
  738. }
  739. parent.children.push(node.ID);
  740. //console.info( "Adding child: " + childID + " to " + nodeID );
  741. parent.aframeObj.appendChild(node.aframeObj);
  742. }
  743. }
  744. if (node.aframeObj.nodeName !== "A-SCENE") {
  745. node.scene = self.state.scenes[self.kernel.application()];
  746. }
  747. }
  748. }
  749. function getPrototypes(kernel, extendsID) {
  750. var prototypes = [];
  751. var id = extendsID;
  752. while (id !== undefined) {
  753. prototypes.push(id);
  754. id = kernel.prototype(id);
  755. }
  756. return prototypes;
  757. }
  758. function isNodeDefinition(prototypes) {
  759. var found = false;
  760. if (prototypes) {
  761. for (var i = 0; i < prototypes.length && !found; i++) {
  762. found = (prototypes[i] == "http://vwf.example.com/aframe/node.vwf");
  763. }
  764. }
  765. return found;
  766. }
  767. function isAEntityDefinition(prototypes) {
  768. var found = false;
  769. if (prototypes) {
  770. for (var i = 0; i < prototypes.length && !found; i++) {
  771. found = (prototypes[i] == "http://vwf.example.com/aframe/aentity.vwf");
  772. }
  773. }
  774. return found;
  775. }
  776. // Changing this function significantly from the GLGE code
  777. // Will search hierarchy down until encountering a matching child
  778. // Will look into nodes that don't match.... this might not be desirable
  779. function FindChildByName(obj, childName, childType, recursive) {
  780. var child = undefined;
  781. if (recursive) {
  782. // TODO: If the obj itself has the child name, the object will be returned by this function
  783. // I don't think this this desirable.
  784. if (nameTest.call(this, obj, childName)) {
  785. child = obj;
  786. } else if (obj.children && obj.children.length > 0) {
  787. for (var i = 0; i < obj.children.length && child === undefined; i++) {
  788. child = FindChildByName(obj.children[i], childName, childType, true);
  789. }
  790. }
  791. } else {
  792. if (obj.children) {
  793. for (var i = 0; i < obj.children.length && child === undefined; i++) {
  794. if (nameTest.call(this, obj.children[i], childName)) {
  795. child = obj.children[i];
  796. }
  797. }
  798. }
  799. }
  800. return child;
  801. }
  802. function nameTest(obj, name) {
  803. if (obj.name == "") {
  804. return (obj.parent.name + "Child" == name);
  805. } else {
  806. return (obj.name == name || obj.id == name || obj.vwfID == name);
  807. }
  808. }
  809. function httpGet(url) {
  810. return new Promise(function (resolve, reject) {
  811. // do the usual Http request
  812. let request = new XMLHttpRequest();
  813. request.open('GET', url);
  814. request.onload = function () {
  815. if (request.status == 200) {
  816. resolve(request.response);
  817. } else {
  818. reject(Error(request.statusText));
  819. }
  820. };
  821. request.onerror = function () {
  822. reject(Error('Network Error'));
  823. };
  824. request.send();
  825. });
  826. }
  827. async function httpGetJson(url) {
  828. // check if the URL looks like a JSON file and call httpGet.
  829. let regex = /\.(json)$/i;
  830. if (regex.test(url)) {
  831. // call the async function, wait for the result
  832. return await httpGet(url);
  833. } else {
  834. throw Error('Bad Url Format');
  835. }
  836. }
  837. });