aframe.js 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048
  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 "position":
  190. this.state.setAFrameProperty('position', propertyValue, aframeObject);
  191. // if (propertyValue.hasOwnProperty('x')) {
  192. // aframeObject.setAttribute('position', propertyValue)
  193. // } else
  194. // if (Array.isArray(propertyValue)) {
  195. // aframeObject.setAttribute('position', { x: propertyValue[0], y: propertyValue[1], z: propertyValue[2] })
  196. // } else if (typeof propertyValue === 'string') {
  197. // aframeObject.setAttribute('position', AFRAME.utils.coordinates.parse(propertyValue))
  198. // }
  199. break;
  200. case "rotation":
  201. this.state.setAFrameProperty('rotation', propertyValue, aframeObject);
  202. // if (Array.isArray(propertyValue)) {
  203. // aframeObject.setAttribute('rotation', { x: propertyValue[0], y: propertyValue[1], z: propertyValue[2] });
  204. // } else {
  205. // aframeObject.setAttribute('rotation', AFRAME.utils.coordinates.parse(propertyValue));
  206. // }
  207. break;
  208. case "scale":
  209. this.state.setAFrameProperty('scale', propertyValue, aframeObject);
  210. // if (Array.isArray(propertyValue)) {
  211. // aframeObject.setAttribute('scale', { x: propertyValue[0], y: propertyValue[1], z: propertyValue[2] });
  212. // } else {
  213. // aframeObject.setAttribute('scale', AFRAME.utils.coordinates.parse(propertyValue));
  214. // }
  215. break;
  216. case "color":
  217. aframeObject.setAttribute('color', propertyValue);
  218. break;
  219. case "transparent":
  220. aframeObject.setAttribute('material', 'transparent', propertyValue);
  221. break;
  222. case "opacity":
  223. aframeObject.setAttribute('material', 'opacity', propertyValue);
  224. break;
  225. case "fog":
  226. aframeObject.setAttribute('material', 'fog', propertyValue);
  227. break;
  228. case "wireframe":
  229. aframeObject.setAttribute('wireframe', propertyValue);
  230. break;
  231. case "wireframe-linewidth":
  232. aframeObject.setAttribute('wireframeLinewidth', propertyValue);
  233. break;
  234. case "clickable":
  235. if (propertyValue) {
  236. aframeObject.setAttribute('class', 'intersectable');
  237. } else {
  238. aframeObject.setAttribute('class', 'nonintersectable');
  239. }
  240. node.events.clickable = propertyValue;
  241. break;
  242. case "visible":
  243. aframeObject.setAttribute('visible', propertyValue);
  244. break;
  245. // case "clickable":
  246. // console.log("set clickable!");
  247. // value = propertyValue;
  248. // break;
  249. // case "clickable":
  250. // if (propertyValue) {
  251. // aframeObject.addEventListener('click', function (evt) {
  252. // console.log("click!");
  253. // vwf_view.kernel.fireEvent(node.ID, "clickEvent",evt.detail.cursorEl.id);
  254. // });
  255. // }
  256. // break;
  257. case "src":
  258. aframeObject.setAttribute('src', propertyValue);
  259. break;
  260. case "repeat":
  261. aframeObject.setAttribute('repeat', propertyValue);
  262. break;
  263. case "look-controls-enabled":
  264. aframeObject.setAttribute('look-controls', 'enabled', propertyValue);
  265. break;
  266. case "wasd-controls":
  267. aframeObject.setAttribute('wasd-controls', 'enabled', propertyValue);
  268. break;
  269. default:
  270. value = undefined;
  271. break;
  272. }
  273. }
  274. if (value === undefined && aframeObject.nodeName == "A-TEXT") {
  275. value = propertyValue;
  276. switch (propertyName) {
  277. case "value":
  278. aframeObject.setAttribute('value', propertyValue);
  279. break;
  280. case "color":
  281. aframeObject.setAttribute('color', propertyValue);
  282. break;
  283. case "side":
  284. aframeObject.setAttribute('side', propertyValue);
  285. break;
  286. default:
  287. value = undefined;
  288. break;
  289. }
  290. }
  291. if (value === undefined && aframeObject.nodeName == "A-SCENE") {
  292. value = propertyValue;
  293. switch (propertyName) {
  294. case "fog":
  295. aframeObject.setAttribute('fog', propertyValue);
  296. break;
  297. case "assets":
  298. var assetsElement = document.createElement('a-assets');
  299. aframeObject.appendChild(assetsElement);
  300. if (propertyValue) {
  301. httpGetJson(propertyValue).then(function (response) {
  302. console.log(JSON.parse(response));
  303. let assets = JSON.parse(response);
  304. for (var prop in assets) {
  305. var elm = document.createElement(assets[prop].tag);
  306. elm.setAttribute('id', prop);
  307. elm.setAttribute('src', assets[prop].src);
  308. assetsElement.appendChild(elm);
  309. }
  310. }).catch(function (error) {
  311. console.log(error);
  312. });
  313. }
  314. break;
  315. default:
  316. value = undefined;
  317. break;
  318. }
  319. }
  320. if (value === undefined && aframeObject.nodeName == "A-BOX") {
  321. value = propertyValue;
  322. switch (propertyName) {
  323. case "depth":
  324. aframeObject.setAttribute('depth', propertyValue);
  325. break;
  326. case "height":
  327. aframeObject.setAttribute('height', propertyValue);
  328. break;
  329. case "width":
  330. aframeObject.setAttribute('width', propertyValue);
  331. break;
  332. default:
  333. value = undefined;
  334. break;
  335. }
  336. }
  337. if (value === undefined && aframeObject.nodeName == "A-LIGHT") {
  338. value = propertyValue;
  339. switch (propertyName) {
  340. //"angle", "color", "decay", "distance", "ground-color", "intensity", "penumbra", "type", "target"
  341. case "color":
  342. aframeObject.setAttribute('color', propertyValue);
  343. break;
  344. case "type":
  345. aframeObject.setAttribute('type', propertyValue);
  346. break;
  347. case "intensity":
  348. aframeObject.setAttribute('intensity', propertyValue);
  349. break;
  350. case "distance":
  351. aframeObject.setAttribute('distance', propertyValue);
  352. break;
  353. default:
  354. value = undefined;
  355. break;
  356. }
  357. }
  358. if (value === undefined && aframeObject.nodeName == "A-GLTF-MODEL") {
  359. value = propertyValue;
  360. switch (propertyName) {
  361. case "src":
  362. aframeObject.setAttribute('src', propertyValue);
  363. break;
  364. default:
  365. value = undefined;
  366. break;
  367. }
  368. }
  369. if (value === undefined && aframeObject.nodeName == "A-COLLADA-MODEL") {
  370. value = propertyValue;
  371. switch (propertyName) {
  372. case "src":
  373. aframeObject.setAttribute('src', propertyValue);
  374. break;
  375. default:
  376. value = undefined;
  377. break;
  378. }
  379. }
  380. if (value === undefined && aframeObject.nodeName == "A-PLANE") {
  381. value = propertyValue;
  382. switch (propertyName) {
  383. case "height":
  384. aframeObject.setAttribute('height', propertyValue);
  385. break;
  386. case "width":
  387. aframeObject.setAttribute('width', propertyValue);
  388. break;
  389. default:
  390. value = undefined;
  391. break;
  392. }
  393. }
  394. if (value === undefined && aframeObject.nodeName == "A-SPHERE") {
  395. value = propertyValue;
  396. switch (propertyName) {
  397. case "radius":
  398. aframeObject.setAttribute('radius', propertyValue);
  399. break;
  400. default:
  401. value = undefined;
  402. break;
  403. }
  404. }
  405. if (value === undefined && aframeObject.nodeName == "A-ANIMATION") {
  406. value = propertyValue;
  407. switch (propertyName) {
  408. // attribute:
  409. // dur:
  410. // from:
  411. // to:
  412. // repeat:
  413. case "dur":
  414. aframeObject.setAttribute('dur', propertyValue);
  415. break;
  416. case "from":
  417. aframeObject.setAttribute('from', propertyValue);
  418. break;
  419. case "to":
  420. aframeObject.setAttribute('to', propertyValue);
  421. break;
  422. case "repeat":
  423. aframeObject.setAttribute('repeat', propertyValue);
  424. break;
  425. case "attribute":
  426. aframeObject.setAttribute('attribute', propertyValue);
  427. break;
  428. case "begin":
  429. aframeObject.setAttribute('begin', propertyValue);
  430. break;
  431. default:
  432. value = undefined;
  433. break;
  434. }
  435. }
  436. if (value === undefined && aframeObject.nodeName == "A-CAMERA") {
  437. value = propertyValue;
  438. switch (propertyName) {
  439. case "userHeight":
  440. aframeObject.setAttribute('camera', 'userHeight', propertyValue);
  441. break;
  442. // case "active":
  443. // aframeObject.setAttribute('camera', 'active', propertyValue);
  444. // break;
  445. default:
  446. value = undefined;
  447. break;
  448. }
  449. }
  450. }
  451. return value;
  452. },
  453. // -- gettingProperty ----------------------------------------------------------------------
  454. gettingProperty: function (nodeID, propertyName, propertyValue) {
  455. var node = this.state.nodes[nodeID];
  456. var value = undefined;
  457. if (node && node.aframeObj) {
  458. var aframeObject = node.aframeObj;
  459. if (isNodeDefinition(node.prototypes)) {
  460. switch (propertyName) {
  461. }
  462. }
  463. if (value === undefined && isAEntityDefinition(node.prototypes)) {
  464. switch (propertyName) {
  465. // case "interpolation":
  466. // var interpolation = aframeObject.getAttribute('interpolation');
  467. // if (interpolation !== null && interpolation !== undefined) {
  468. // value = interpolation.duration;
  469. // }
  470. // break;
  471. case "position":
  472. var pos = aframeObject.getAttribute('position');
  473. if (pos !== undefined) {
  474. value = AFRAME.utils.coordinates.stringify(pos);
  475. }
  476. break;
  477. case "scale":
  478. var scale = aframeObject.getAttribute('scale');
  479. if (scale !== undefined) {
  480. value = AFRAME.utils.coordinates.stringify(scale);
  481. }
  482. break;
  483. case "rotation":
  484. var rot = aframeObject.getAttribute('rotation');
  485. if (rot !== undefined) {
  486. value = AFRAME.utils.coordinates.stringify(rot);
  487. }
  488. break;
  489. case "color":
  490. value = aframeObject.getAttribute('color');
  491. break;
  492. case "fog":
  493. if (aframeObject.getAttribute('material')) {
  494. value = aframeObject.getAttribute('material').fog;
  495. }
  496. break;
  497. case "opacity":
  498. if (aframeObject.getAttribute('material')) {
  499. value = aframeObject.getAttribute('material').opacity;
  500. }
  501. break;
  502. case "transparent":
  503. if (aframeObject.getAttribute('material')) {
  504. value = aframeObject.getAttribute('material').transparent;
  505. }
  506. break;
  507. case "wireframe":
  508. value = aframeObject.getAttribute('wireframe');
  509. break;
  510. case "wireframe-linewidth":
  511. value = aframeObject.getAttribute('wireframeLinewidth');
  512. break;
  513. case "clickable":
  514. value = node.events.clickable;
  515. break;
  516. case "src":
  517. value = aframeObject.getAttribute('src');
  518. break;
  519. case "repeat":
  520. value = aframeObject.getAttribute('repeat');
  521. case "look-controls-enabled":
  522. var look = aframeObject.getAttribute('look-controls-enabled');
  523. if (look !== null && look !== undefined) {
  524. value = aframeObject.getAttribute('look-controls').enabled;
  525. }
  526. break;
  527. case "wasd-controls":
  528. var wasd = aframeObject.getAttribute('wasd-controls');
  529. if (wasd !== null && wasd !== undefined) {
  530. value = aframeObject.getAttribute('wasd-controls').enabled;
  531. }
  532. break;
  533. case "visible":
  534. value = aframeObject.getAttribute('visible');
  535. break;
  536. }
  537. }
  538. if (value === undefined && aframeObject.nodeName == "A-SCENE") {
  539. switch (propertyName) {
  540. case "fog":
  541. value = aframeObject.getAttribute('fog');
  542. break;
  543. }
  544. }
  545. if (value === undefined && aframeObject.nodeName == "A-BOX") {
  546. switch (propertyName) {
  547. case "depth":
  548. value = aframeObject.getAttribute('depth');
  549. break;
  550. case "height":
  551. value = aframeObject.getAttribute('height');
  552. break;
  553. case "width":
  554. value = aframeObject.getAttribute('width');
  555. break;
  556. }
  557. }
  558. if (value === undefined && aframeObject.nodeName == "A-LIGHT") {
  559. //"angle", "color", "decay", "distance", "ground-color", "intensity", "penumbra", "type", "target"
  560. switch (propertyName) {
  561. case "color":
  562. value = aframeObject.getAttribute('color');
  563. break;
  564. case "type":
  565. value = aframeObject.getAttribute('type');
  566. break;
  567. case "distance":
  568. value = aframeObject.getAttribute('distance');
  569. break;
  570. case "intensity":
  571. value = aframeObject.getAttribute('intensity');
  572. break;
  573. }
  574. }
  575. if (value === undefined && aframeObject.nodeName == "A-PLANE") {
  576. switch (propertyName) {
  577. case "height":
  578. value = aframeObject.getAttribute('height');
  579. break;
  580. case "width":
  581. value = aframeObject.getAttribute('width');
  582. break;
  583. }
  584. }
  585. if (value === undefined && aframeObject.nodeName == "A-SPHERE") {
  586. switch (propertyName) {
  587. case "radius":
  588. value = aframeObject.getAttribute('radius');
  589. break;
  590. }
  591. }
  592. if (value === undefined && aframeObject.nodeName == "A-TEXT") {
  593. switch (propertyName) {
  594. case "value":
  595. value = aframeObject.getAttribute('value');
  596. break;
  597. case "color":
  598. value = aframeObject.getAttribute('color');
  599. break;
  600. case "side":
  601. value = aframeObject.getAttribute('side');
  602. break;
  603. }
  604. }
  605. if (value === undefined && aframeObject.nodeName == "A-ANIMATION") {
  606. switch (propertyName) {
  607. case "attribute":
  608. value = aframeObject.getAttribute('attribute');
  609. break;
  610. case "dur":
  611. value = aframeObject.getAttribute('dur');
  612. break;
  613. case "from":
  614. value = aframeObject.getAttribute('from');
  615. break;
  616. case "to":
  617. value = aframeObject.getAttribute('to');
  618. break;
  619. case "repeat":
  620. value = aframeObject.getAttribute('repeat');
  621. break;
  622. case "begin":
  623. value = aframeObject.getAttribute('begin');
  624. break;
  625. }
  626. }
  627. if (value === undefined && aframeObject.nodeName == "A-CAMERA") {
  628. switch (propertyName) {
  629. case "userHeight":
  630. value = aframeObject.getAttribute('camera').userHeight;
  631. break;
  632. }
  633. // switch (propertyName) {
  634. // case "active":
  635. // value = aframeObject.getAttribute('camera').active;
  636. // break;
  637. // }
  638. }
  639. if (value === undefined && aframeObject.nodeName == "A-COLLADA-MODEL") {
  640. switch (propertyName) {
  641. case "src":
  642. value = aframeObject.getAttribute('src');
  643. break;
  644. }
  645. }
  646. if (value === undefined && aframeObject.nodeName == "A-GLTF-MODEL") {
  647. switch (propertyName) {
  648. case "src":
  649. value = aframeObject.getAttribute('src');
  650. break;
  651. }
  652. }
  653. }
  654. if (value !== undefined) {
  655. propertyValue = value;
  656. }
  657. return value;
  658. }
  659. });
  660. function createAFrameObject(node, config) {
  661. var protos = node.prototypes;
  662. var aframeObj = undefined;
  663. if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/ascene.vwf")) {
  664. aframeObj = document.createElement('a-scene');
  665. self.state.scenes[node.ID] = aframeObj;
  666. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/acamera.vwf")) {
  667. aframeObj = document.createElement('a-camera');
  668. aframeObj.setAttribute('camera', 'active', false);
  669. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/alight.vwf")) {
  670. aframeObj = document.createElement('a-light');
  671. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/acursor.vwf")) {
  672. aframeObj = document.createElement('a-cursor');
  673. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/asky.vwf")) {
  674. aframeObj = document.createElement('a-sky');
  675. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/abox.vwf")) {
  676. aframeObj = document.createElement('a-box');
  677. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/aplane.vwf")) {
  678. aframeObj = document.createElement('a-plane');
  679. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/atext.vwf")) {
  680. aframeObj = document.createElement('a-text');
  681. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/acolladamodel.vwf")) {
  682. aframeObj = document.createElement('a-collada-model');
  683. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/agltfmodel.vwf")) {
  684. aframeObj = document.createElement('a-gltf-model');
  685. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/asphere.vwf")) {
  686. aframeObj = document.createElement('a-sphere');
  687. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/aanimation.vwf")) {
  688. aframeObj = document.createElement('a-animation');
  689. } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/aentity.vwf")) {
  690. aframeObj = document.createElement('a-entity');
  691. }
  692. aframeObj.setAttribute('id', node.ID);
  693. return aframeObj;
  694. }
  695. function addNodeToHierarchy(node) {
  696. if (node.aframeObj) {
  697. if (self.state.nodes[node.parentID] !== undefined) {
  698. var parent = self.state.nodes[node.parentID];
  699. if (parent.aframeObj) {
  700. if (parent.children === undefined) {
  701. parent.children = [];
  702. }
  703. parent.children.push(node.ID);
  704. //console.info( "Adding child: " + childID + " to " + nodeID );
  705. parent.aframeObj.appendChild(node.aframeObj);
  706. }
  707. }
  708. if (node.aframeObj.nodeName !== "A-SCENE") {
  709. node.scene = self.state.scenes[self.kernel.application()];
  710. }
  711. }
  712. }
  713. function getPrototypes(kernel, extendsID) {
  714. var prototypes = [];
  715. var id = extendsID;
  716. while (id !== undefined) {
  717. prototypes.push(id);
  718. id = kernel.prototype(id);
  719. }
  720. return prototypes;
  721. }
  722. function isNodeDefinition(prototypes) {
  723. var found = false;
  724. if (prototypes) {
  725. for (var i = 0; i < prototypes.length && !found; i++) {
  726. found = (prototypes[i] == "http://vwf.example.com/aframe/node.vwf");
  727. }
  728. }
  729. return found;
  730. }
  731. function isAEntityDefinition(prototypes) {
  732. var found = false;
  733. if (prototypes) {
  734. for (var i = 0; i < prototypes.length && !found; i++) {
  735. found = (prototypes[i] == "http://vwf.example.com/aframe/aentity.vwf");
  736. }
  737. }
  738. return found;
  739. }
  740. // Changing this function significantly from the GLGE code
  741. // Will search hierarchy down until encountering a matching child
  742. // Will look into nodes that don't match.... this might not be desirable
  743. function FindChildByName(obj, childName, childType, recursive) {
  744. var child = undefined;
  745. if (recursive) {
  746. // TODO: If the obj itself has the child name, the object will be returned by this function
  747. // I don't think this this desirable.
  748. if (nameTest.call(this, obj, childName)) {
  749. child = obj;
  750. } else if (obj.children && obj.children.length > 0) {
  751. for (var i = 0; i < obj.children.length && child === undefined; i++) {
  752. child = FindChildByName(obj.children[i], childName, childType, true);
  753. }
  754. }
  755. } else {
  756. if (obj.children) {
  757. for (var i = 0; i < obj.children.length && child === undefined; i++) {
  758. if (nameTest.call(this, obj.children[i], childName)) {
  759. child = obj.children[i];
  760. }
  761. }
  762. }
  763. }
  764. return child;
  765. }
  766. function nameTest(obj, name) {
  767. if (obj.name == "") {
  768. return (obj.parent.name + "Child" == name);
  769. } else {
  770. return (obj.name == name || obj.id == name || obj.vwfID == name);
  771. }
  772. }
  773. function httpGet(url) {
  774. return new Promise(function (resolve, reject) {
  775. // do the usual Http request
  776. let request = new XMLHttpRequest();
  777. request.open('GET', url);
  778. request.onload = function () {
  779. if (request.status == 200) {
  780. resolve(request.response);
  781. } else {
  782. reject(Error(request.statusText));
  783. }
  784. };
  785. request.onerror = function () {
  786. reject(Error('Network Error'));
  787. };
  788. request.send();
  789. });
  790. }
  791. async function httpGetJson(url) {
  792. // check if the URL looks like a JSON file and call httpGet.
  793. let regex = /\.(json)$/i;
  794. if (regex.test(url)) {
  795. // call the async function, wait for the result
  796. return await httpGet(url);
  797. } else {
  798. throw Error('Bad Url Format');
  799. }
  800. }
  801. });