Showing
36 changed files
with
835 additions
and
897 deletions
1 | module.exports = function (grunt) { | 1 | module.exports = function (grunt) { |
2 | "use strict"; | 2 | "use strict"; |
3 | + | ||
4 | + let shim = function(obj) { return `\nexport default ${obj};\n`; }; | ||
3 | 5 | ||
4 | // Project configuration. | 6 | // Project configuration. |
5 | grunt.initConfig({ | 7 | grunt.initConfig({ |
6 | pkg: grunt.file.readJSON('package.json'), | 8 | pkg: grunt.file.readJSON('package.json'), |
9 | + copy: { | ||
10 | + dist: { | ||
11 | + files:[ | ||
12 | + {src: 'src/arcs_browser.js', dest: 'build/arcs_browser.js'}, | ||
13 | + {src: 'src/arcs_node.mjs', dest: 'build/arcs_node.mjs'} | ||
14 | + ] | ||
15 | + | ||
16 | + } | ||
17 | + }, | ||
7 | jsdoc: { | 18 | jsdoc: { |
8 | dist: { | 19 | dist: { |
9 | src: ['src/*.js', 'docs/Readme.md'], //, 'components/*.js'], | 20 | src: ['src/*.js', 'docs/Readme.md'], //, 'components/*.js'], |
... | @@ -43,16 +54,13 @@ module.exports = function (grunt) { | ... | @@ -43,16 +54,13 @@ module.exports = function (grunt) { |
43 | } | 54 | } |
44 | } | 55 | } |
45 | }, | 56 | }, |
46 | - uglify: { | 57 | + terser: { |
47 | build: { | 58 | build: { |
48 | - options: { | ||
49 | - banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n' | ||
50 | - }, | ||
51 | files: { | 59 | files: { |
52 | 'build/arcs.min.js': [ | 60 | 'build/arcs.min.js': [ |
53 | 'build/arcs.js' | 61 | 'build/arcs.js' |
54 | ], | 62 | ], |
55 | - 'build/arcs_browser.js': [ | 63 | + 'build/arcs_browser.min.js': [ |
56 | 'src/arcs_browser.js' | 64 | 'src/arcs_browser.js' |
57 | ], | 65 | ], |
58 | 'build/arcseditor.min.js': [ | 66 | 'build/arcseditor.min.js': [ |
... | @@ -74,7 +82,38 @@ module.exports = function (grunt) { | ... | @@ -74,7 +82,38 @@ module.exports = function (grunt) { |
74 | } | 82 | } |
75 | 83 | ||
76 | }, | 84 | }, |
77 | - concat: { | 85 | + file_append: { |
86 | + default_options: { | ||
87 | + files: [ | ||
88 | + { | ||
89 | + append: shim('AR'), | ||
90 | + prepend: `import CV from '../cv/index.js';\n`, | ||
91 | + input: './deps/aruco/index.js' | ||
92 | + }, | ||
93 | + { | ||
94 | + append: shim('CV'), | ||
95 | + input: './deps/cv/index.js' | ||
96 | + } | ||
97 | + ] | ||
98 | + } | ||
99 | + }, | ||
100 | + 'string-replace': { | ||
101 | + dist: { | ||
102 | + files: { | ||
103 | + 'deps/objloader/objloader.js': 'deps/objloader/index.js', | ||
104 | + 'deps/mtlloader/mtlloader.js': 'deps/mtlloader/index.js', | ||
105 | + 'deps/ddsloader/ddsloader.js': 'deps/ddsloader/index.js' | ||
106 | + }, | ||
107 | + options: { | ||
108 | + replacements:[{ | ||
109 | + pattern: '../../../build/three.module.js', | ||
110 | + replacement: '../three.js/index.js' | ||
111 | + }] | ||
112 | + } | ||
113 | + | ||
114 | + } | ||
115 | + }, | ||
116 | + concat: { | ||
78 | dist: { | 117 | dist: { |
79 | src: [ | 118 | src: [ |
80 | 'src/arcs.js', | 119 | 'src/arcs.js', |
... | @@ -88,7 +127,6 @@ module.exports = function (grunt) { | ... | @@ -88,7 +127,6 @@ module.exports = function (grunt) { |
88 | 'src/transitionnetwork.js', | 127 | 'src/transitionnetwork.js', |
89 | 'src/statemachine.js', | 128 | 'src/statemachine.js', |
90 | 'src/application.js', | 129 | 'src/application.js', |
91 | - 'src/arcs_module.js', | ||
92 | 'src/exports.js' | 130 | 'src/exports.js' |
93 | ], | 131 | ], |
94 | dest: 'build/arcs.js' | 132 | dest: 'build/arcs.js' |
... | @@ -106,21 +144,24 @@ module.exports = function (grunt) { | ... | @@ -106,21 +144,24 @@ module.exports = function (grunt) { |
106 | dest: 'build/arcseditor.js' | 144 | dest: 'build/arcseditor.js' |
107 | } | 145 | } |
108 | 146 | ||
109 | - } | 147 | + } |
110 | 148 | ||
111 | - | ||
112 | }); | 149 | }); |
113 | 150 | ||
114 | -// Load the plugin that provides the "uglify" task. | 151 | + // Load the plugin that provides the "uglify" task. |
115 | - grunt.loadNpmTasks('grunt-contrib-uglify'); | ||
116 | grunt.loadNpmTasks('grunt-contrib-concat'); | 152 | grunt.loadNpmTasks('grunt-contrib-concat'); |
153 | + grunt.loadNpmTasks('grunt-contrib-copy'); | ||
117 | grunt.loadNpmTasks('grunt-jsdoc'); | 154 | grunt.loadNpmTasks('grunt-jsdoc'); |
118 | grunt.loadNpmTasks('grunt-jslint'); | 155 | grunt.loadNpmTasks('grunt-jslint'); |
156 | + grunt.loadNpmTasks('grunt-terser'); | ||
119 | grunt.loadNpmTasks('grunt-bower-task'); | 157 | grunt.loadNpmTasks('grunt-bower-task'); |
158 | + grunt.loadNpmTasks('grunt-file-append'); | ||
159 | + grunt.loadNpmTasks('grunt-string-replace'); | ||
120 | 160 | ||
121 | - | 161 | + // Default task(s). |
122 | -// Default task(s). | 162 | + grunt.registerTask('default', ['concat','copy','terser']); |
123 | - grunt.registerTask('default', ['concat','uglify']); | ||
124 | grunt.registerTask('lint', ['jslint']); | 163 | grunt.registerTask('lint', ['jslint']); |
125 | grunt.registerTask('doc', ['jsdoc']); | 164 | grunt.registerTask('doc', ['jsdoc']); |
165 | + grunt.registerTask('install-deps', ['bower', 'file_append', 'string-replace']); | ||
166 | + | ||
126 | }; | 167 | }; | ... | ... |
1 | { | 1 | { |
2 | "name": "ARCS", | 2 | "name": "ARCS", |
3 | - "version": "0.1.0", | 3 | + "version": "0.2.0", |
4 | "description": "Augmented Reality Component System in web browser and node environment", | 4 | "description": "Augmented Reality Component System in web browser and node environment", |
5 | "main": "build/arcs.js", | 5 | "main": "build/arcs.js", |
6 | "keywords": [ | 6 | "keywords": [ |
... | @@ -10,12 +10,11 @@ | ... | @@ -10,12 +10,11 @@ |
10 | "author": "Jean-Yves Didier", | 10 | "author": "Jean-Yves Didier", |
11 | "license": "GPL", | 11 | "license": "GPL", |
12 | "dependencies": { | 12 | "dependencies": { |
13 | - "requirejs": "*", | ||
14 | "tracking.js": "*", | 13 | "tracking.js": "*", |
15 | - "three.js": "https://raw.githubusercontent.com/mrdoob/three.js/r68/build/three.min.js", | 14 | + "three.js": "https://raw.githubusercontent.com/mrdoob/three.js/r116/build/three.module.js", |
16 | - "objloader" : "https://raw.githubusercontent.com/mrdoob/three.js/r68/examples/js/loaders/OBJLoader.js", | 15 | + "objloader" : "https://raw.githubusercontent.com/mrdoob/three.js/r116/examples/jsm/loaders/OBJLoader.js", |
17 | - "mtlloader": "https://raw.githubusercontent.com/mrdoob/three.js/r68/examples/js/loaders/MTLLoader.js", | 16 | + "mtlloader" : "https://raw.githubusercontent.com/mrdoob/three.js/r116/examples/jsm/loaders/MTLLoader.js", |
18 | - "objmtlloader": "https://raw.githubusercontent.com/mrdoob/three.js/r68/examples/js/loaders/OBJMTLLoader.js", | 17 | + "ddsloader" : "https://raw.githubusercontent.com/mrdoob/three.js/r116/examples/jsm/loaders/DDSLoader.js", |
19 | "aruco": "https://raw.githubusercontent.com/jcmellado/js-aruco/master/src/aruco.js", | 18 | "aruco": "https://raw.githubusercontent.com/jcmellado/js-aruco/master/src/aruco.js", |
20 | "cv": "https://raw.githubusercontent.com/jcmellado/js-aruco/master/src/cv.js", | 19 | "cv": "https://raw.githubusercontent.com/jcmellado/js-aruco/master/src/cv.js", |
21 | "codemirror" : "*", | 20 | "codemirror" : "*", | ... | ... |
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
build/package.json
0 → 100644
1 | +{ "type": "module"} |
1 | -arcs_module( | 1 | + |
2 | - function (ARCS) { | 2 | +import ARCS from '../build/arcs.js'; |
3 | - var Animator; | 3 | + |
4 | +var Animator; | ||
4 | 5 | ||
5 | - /** | 6 | +/** |
6 | - * @class Animator | 7 | + * @class Animator |
7 | - * @classdesc A component that request new frames for animation. | 8 | + * @classdesc A component that request new frames for animation. |
8 | - * This component is useful when you want to create animations in the | 9 | + * This component is useful when you want to create animations in the |
9 | - * context of a web browser. | 10 | + * context of a web browser. |
10 | - */ | 11 | + */ |
11 | - Animator = ARCS.Component.create( | 12 | +Animator = ARCS.Component.create( |
12 | - function() { | 13 | + function() { |
13 | - var paused = false; | 14 | + var paused = false; |
14 | - var self=this; | 15 | + var self=this; |
15 | - | 16 | + |
16 | - var tick = function () { | 17 | + var tick = function () { |
17 | - if (paused === false) { | 18 | + if (paused === false) { |
18 | - requestAnimationFrame(tick); | 19 | + requestAnimationFrame(tick); |
19 | - self.emit("onAnimationFrame"); | 20 | + self.emit("onAnimationFrame"); |
20 | - } | 21 | + } |
21 | - } | 22 | + } |
22 | - | 23 | + |
23 | - /** | 24 | + /** |
24 | - * Starts requesting frames for animation. As soon as it is started, | 25 | + * Starts requesting frames for animation. As soon as it is started, |
25 | - * the signal <b>onAnimationFrame</b> is periodically triggered. | 26 | + * the signal <b>onAnimationFrame</b> is periodically triggered. |
26 | - * @slot | 27 | + * @slot |
27 | - * @emits onAnimationFrame | 28 | + * @emits onAnimationFrame |
28 | - * @function Animator#start | 29 | + * @function Animator#start |
29 | - */ | 30 | + */ |
30 | - this.start = function () { | 31 | + this.start = function () { |
31 | - paused = false; | 32 | + paused = false; |
32 | - tick(); | 33 | + tick(); |
33 | - }; | 34 | + }; |
34 | - | 35 | + |
35 | - /** | 36 | + /** |
36 | - * Stops requesting frames for animation. | 37 | + * Stops requesting frames for animation. |
37 | - * @slot | 38 | + * @slot |
38 | - * @function Animator#stop | 39 | + * @function Animator#stop |
39 | - */ | 40 | + */ |
40 | - this.stop = function () { | 41 | + this.stop = function () { |
41 | - paused = true; | 42 | + paused = true; |
42 | - }; | 43 | + }; |
43 | - | 44 | + |
44 | - /** | 45 | + /** |
45 | - * Signals that an animation frame is ready. | 46 | + * Signals that an animation frame is ready. |
46 | - * @signal | 47 | + * @signal |
47 | - * @function Animator#onAnimationFrame | 48 | + * @function Animator#onAnimationFrame |
48 | - */ | 49 | + */ |
49 | - }, | 50 | + }, |
50 | - ['start','stop'], | 51 | + ['start','stop'], |
51 | - 'onAnimationFrame' | 52 | + 'onAnimationFrame' |
52 | - ); | 53 | +); |
53 | 54 | ||
54 | - return {Animator: Animator}; | ||
55 | - } | ||
56 | -); | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
55 | +export default {Animator: Animator}; | ... | ... |
1 | -arcs_module( | 1 | +import ARCS from '../build/arcs.js'; |
2 | - function (ARCS, CV, AR) { | 2 | +import CV from '../deps/cv/index.js'; |
3 | - var ARUCODetector; | 3 | +import AR from '../deps/aruco/index.js'; |
4 | + | ||
5 | +var ARUCODetector; | ||
4 | 6 | ||
5 | - /** | 7 | +/** |
6 | - * @class ARUCODetector | 8 | + * @class ARUCODetector |
7 | - * @classdesc Component that detects ARUCO markers in images | 9 | + * @classdesc Component that detects ARUCO markers in images |
8 | - * This component encapsulate the {@link https://github.com/jcmellado/js-aruco|js-aruco} library. | 10 | + * This component encapsulate the {@link https://github.com/jcmellado/js-aruco|js-aruco} library. |
9 | - */ | 11 | + */ |
10 | - ARUCODetector = ARCS.Component.create( | 12 | +ARUCODetector = ARCS.Component.create( |
11 | - function() { | 13 | + function() { |
12 | - var detector ; | 14 | + var detector ; |
13 | 15 | ||
14 | - /*1 Instanciate here the detector */ | 16 | + /*1 Instanciate here the detector */ |
15 | - detector = new AR.Detector(); | 17 | + detector = new AR.Detector(); |
16 | 18 | ||
17 | - /** | 19 | + /** |
18 | - * Detects ARUCO markers in the given image. | 20 | + * Detects ARUCO markers in the given image. |
19 | - * If markers are detected, this slot triggers the signal <b>onMarkers</b>. | 21 | + * If markers are detected, this slot triggers the signal <b>onMarkers</b>. |
20 | - * @param image {obj} the image in which markers should be detected | 22 | + * @param image {obj} the image in which markers should be detected |
21 | - * @emits onMarkers | 23 | + * @emits onMarkers |
22 | - * @function ARUCODetector#detect | 24 | + * @function ARUCODetector#detect |
23 | - * @slot | 25 | + * @slot |
24 | - */ | 26 | + */ |
25 | - this.detect = function (image) { | 27 | + this.detect = function (image) { |
26 | - /*1 recover markers from image | 28 | + /*1 recover markers from image |
27 | - * then send they will be sent through onMarkers event | 29 | + * then send they will be sent through onMarkers event |
28 | - */ | 30 | + */ |
29 | - var markers = detector.detect(image); | 31 | + var markers = detector.detect(image); |
30 | - this.emit("onMarkers",markers); | 32 | + this.emit("onMarkers",markers); |
31 | - }; | 33 | + }; |
32 | - | 34 | + |
33 | - /** | 35 | + /** |
34 | - * Signal that is emitted when markers are detected in an image. | 36 | + * Signal that is emitted when markers are detected in an image. |
35 | - * @function ARUCODetector#onMarkers | 37 | + * @function ARUCODetector#onMarkers |
36 | - * @param markers {Marker[]} Array of detected markers. | 38 | + * @param markers {Marker[]} Array of detected markers. |
37 | - * @signal | 39 | + * @signal |
38 | - */ | 40 | + */ |
39 | - | 41 | + |
40 | - /** | 42 | + /** |
41 | - * @typedef {Object} Marker | 43 | + * @typedef {Object} Marker |
42 | - * @property {number} id - marker id | 44 | + * @property {number} id - marker id |
43 | - * @property {Object} pose - computed pose for the marker | 45 | + * @property {Object} pose - computed pose for the marker |
44 | - * @property {number[]} pose.rotation - rotation matrix (3x3) | 46 | + * @property {number[]} pose.rotation - rotation matrix (3x3) |
45 | - * @property {number[]} pose.position - translation (3 components) | 47 | + * @property {number[]} pose.position - translation (3 components) |
46 | - */ | 48 | + */ |
47 | - | ||
48 | - }, | ||
49 | - 'detect', | ||
50 | - ['onMarkers'] | ||
51 | - ); | ||
52 | 49 | ||
53 | - return {ARUCODetector: ARUCODetector}; | ||
54 | }, | 50 | }, |
55 | - [ | ||
56 | - {name:"deps/cv/index", exports:"CV"}, | ||
57 | - {name:"deps/aruco/index",exports:"AR"} | ||
58 | - ] | ||
59 | -); | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
51 | + 'detect', | ||
52 | + ['onMarkers'] | ||
53 | +); | ||
54 | + | ||
55 | +export default {ARUCODetector: ARUCODetector}; | ... | ... |
This diff is collapsed. Click to expand it.
1 | /* ugly hack in order to display data in web page instead of console */ | 1 | /* ugly hack in order to display data in web page instead of console */ |
2 | +import ARCS from '../build/arcs.js'; | ||
2 | 3 | ||
4 | +var Console; | ||
5 | +/** | ||
6 | + * @class Console | ||
7 | + * @classdesc Redirects console messages to a given HTML element in the page. | ||
8 | + * @param id {string} id of the HTML element in which console messages will be added. | ||
9 | + */ | ||
10 | +Console = ARCS.Component.create( | ||
11 | + function (id) { | ||
12 | + if (id === undefined) { | ||
13 | + return ; | ||
14 | + } | ||
15 | + | ||
16 | + var output = document.getElementById(id); | ||
17 | + | ||
18 | + if (output) { | ||
19 | + window.console = { | ||
20 | + timeRef: new Date().getTime(), | ||
21 | + output : output, | ||
22 | + display: function(color,args) { | ||
23 | + var s = document.createElement("span"); | ||
24 | + s.style.color=color; | ||
25 | + var elapsed = (new Date().getTime() - this.timeRef); | ||
3 | 26 | ||
4 | -arcs_module( | 27 | + s.innerHTML = '<span class="marker">' + (elapsed/1000).toFixed(3) + '</span> ' + Array.prototype.join.call(args, ' '); |
5 | - function(ARCS) { | 28 | + output.appendChild(s); |
6 | - var Console; | 29 | + output.appendChild(document.createElement("br")); |
7 | - /** | 30 | + }, |
8 | - * @class Console | 31 | + log: function () { |
9 | - * @classdesc Redirects console messages to a given HTML element in the page. | 32 | + this.display('green',arguments); |
10 | - * @param id {string} id of the HTML element in which console messages will be added. | 33 | + }, |
11 | - */ | 34 | + error: function () { |
12 | - Console = ARCS.Component.create( | 35 | + this.display('red',arguments); |
13 | - function (id) { | 36 | + }, |
14 | - if (id === undefined) { | 37 | + warn: function () { |
15 | - return ; | 38 | + this.display('orange',arguments); |
16 | } | 39 | } |
17 | - | 40 | + }; |
18 | - var output = document.getElementById(id); | 41 | + } |
19 | - | ||
20 | - if (output) { | ||
21 | - window.console = { | ||
22 | - timeRef: new Date().getTime(), | ||
23 | - output : output, | ||
24 | - display: function(color,args) { | ||
25 | - var s = document.createElement("span"); | ||
26 | - s.style.color=color; | ||
27 | - var elapsed = (new Date().getTime() - this.timeRef); | ||
28 | - | ||
29 | - s.innerHTML = '<span class="marker">' + (elapsed/1000).toFixed(3) + '</span>' + Array.prototype.join.call(args, ' '); | ||
30 | - output.appendChild(s); | ||
31 | - output.appendChild(document.createElement("br")); | ||
32 | - }, | ||
33 | - log: function () { | ||
34 | - this.display('green',arguments); | ||
35 | - }, | ||
36 | - error: function () { | ||
37 | - this.display('red',arguments); | ||
38 | - }, | ||
39 | - warn: function () { | ||
40 | - this.display('orange',arguments); | ||
41 | - } | ||
42 | - }; | ||
43 | - } | ||
44 | - } | ||
45 | - ); | ||
46 | - return { Console: Console}; | ||
47 | } | 42 | } |
43 | +); | ||
44 | + | ||
48 | 45 | ||
49 | -); | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
46 | +export default { Console: Console}; | ... | ... |
... | @@ -5,102 +5,99 @@ | ... | @@ -5,102 +5,99 @@ |
5 | * @file | 5 | * @file |
6 | */ | 6 | */ |
7 | 7 | ||
8 | -arcs_module(function (ARCS) { | 8 | +import ARCS from '../build/arcs.js'; |
9 | - var Loop, DisplayInt, Sum; | ||
10 | - /** @exports loop */ | ||
11 | - //console.log("loop: ", ARCS); | ||
12 | - /** | ||
13 | - * @class Loop | ||
14 | - * @classdesc loop component creation using a compact style. | ||
15 | - * This component iterates for a given number of times | ||
16 | - */ | ||
17 | - Loop = ARCS.Component.create( | ||
18 | - function () { | ||
19 | - /** | ||
20 | - * Sets the number of times the component should iterate. | ||
21 | - * It starts the iterations. At each iteration, a signal newIteration is | ||
22 | - * emitted, then, at the end of the iterations, a signal sendToken is | ||
23 | - * eventually triggered. | ||
24 | - * @param n {numeric} number of iterations | ||
25 | - * @function Loop#setIterations | ||
26 | - * @slot | ||
27 | - * @emits newIteration | ||
28 | - * @emits sendToken | ||
29 | - */ | ||
30 | - this.setIterations = function (n) { | ||
31 | - var i; | ||
32 | - for (i = 0; i < n; i++) { | ||
33 | - console.log("Loop : emitting ", i); | ||
34 | - this.emit("newIteration", i); | ||
35 | - } | ||
36 | - this.emit("endLoop"); | ||
37 | - }; | ||
38 | - | ||
39 | - /** @function Loop#newIteration | ||
40 | - * @signal | ||
41 | - * @param n {number} current iteration number. | ||
42 | - */ | ||
43 | - | ||
44 | - /** @function Loop#sendToken | ||
45 | - * @signal | ||
46 | - * @param s {string} token to emit. | ||
47 | - */ | ||
48 | - | ||
49 | - }, | ||
50 | - "setIterations", //slotList | ||
51 | - ["endLoop", "newIteration"] // signalList | ||
52 | - ); | ||
53 | - | ||
54 | 9 | ||
55 | - /** | 10 | +/** |
56 | - * @class DisplayInt | 11 | + * @class Loop |
57 | - * @classdesc displayInt component creation using a variation with defined slots | 12 | + * @classdesc loop component creation using a compact style. |
58 | - * in the constructor (a slot is a function). DisplayInt will display an integer | 13 | + * This component iterates for a given number of times |
59 | - * received on its display slot. | 14 | + */ |
60 | - */ | 15 | +var Loop = ARCS.Component.create( |
61 | - DisplayInt = function () { | 16 | + function () { |
62 | /** | 17 | /** |
63 | - * @param n {numeric} number to display | 18 | + * Sets the number of times the component should iterate. |
64 | - * @function DisplayInt#display | 19 | + * It starts the iterations. At each iteration, a signal newIteration is |
65 | - * @slot | 20 | + * emitted, then, at the end of the iterations, a signal sendToken is |
66 | - */ | 21 | + * eventually triggered. |
67 | - this.display = function (n) { | 22 | + * @param n {numeric} number of iterations |
68 | - console.log(" DisplayInt : " + n); | 23 | + * @function Loop#setIterations |
24 | + * @slot | ||
25 | + * @emits newIteration | ||
26 | + * @emits sendToken | ||
27 | + */ | ||
28 | + this.setIterations = function (n) { | ||
29 | + var i; | ||
30 | + for (i = 0; i < n; i++) { | ||
31 | + console.log("Loop : emitting ", i); | ||
32 | + this.emit("newIteration", i); | ||
33 | + } | ||
34 | + this.emit("endLoop"); | ||
69 | }; | 35 | }; |
70 | - }; | 36 | + |
37 | + /** @function Loop#newIteration | ||
38 | + * @signal | ||
39 | + * @param n {number} current iteration number. | ||
40 | + */ | ||
41 | + | ||
42 | + /** @function Loop#sendToken | ||
43 | + * @signal | ||
44 | + * @param s {string} token to emit. | ||
45 | + */ | ||
46 | + | ||
47 | + }, | ||
48 | + "setIterations", //slotList | ||
49 | + ["endLoop", "newIteration"] // signalList | ||
50 | +); | ||
71 | 51 | ||
72 | - ARCS.Component.create(DisplayInt); | ||
73 | - DisplayInt.slot("display"); | ||
74 | 52 | ||
75 | - | 53 | +/** |
76 | - /** | 54 | + * @class DisplayInt |
77 | - * @class Sum | 55 | + * @classdesc displayInt component creation using a variation with defined slots |
78 | - * @classdec Sum is a component summing integers passed to its slot "add" | 56 | + * in the constructor (a slot is a function). DisplayInt will display an integer |
79 | - * and the result is sent back by signal "sum". | 57 | + * received on its display slot. |
80 | - * This component is declared in two different phases: declaration of the | 58 | + */ |
81 | - * constructor and declaration of the slot "add". | 59 | +var DisplayInt = function () { |
82 | - */ | 60 | +/** |
83 | - Sum = function () { | 61 | + * @param n {numeric} number to display |
84 | - this.total = 0; | 62 | + * @function DisplayInt#display |
63 | + * @slot | ||
64 | + */ | ||
65 | + this.display = function (n) { | ||
66 | + console.log(" DisplayInt : " + n); | ||
85 | }; | 67 | }; |
68 | +}; | ||
69 | + | ||
70 | +ARCS.Component.create(DisplayInt); | ||
71 | +DisplayInt.slot("display"); | ||
86 | 72 | ||
87 | - ARCS.Component.create(Sum); | ||
88 | - /** | ||
89 | - * This slot adds its parameter to its internal sum and send it back by using | ||
90 | - * the signal "sum". | ||
91 | - * @param n {integer} add n to the internal sum of the component. | ||
92 | - * @function Sum#add | ||
93 | - * @slot | ||
94 | - */ | ||
95 | - Sum.slot("add", function (n) { | ||
96 | - this.total = this.total + n; | ||
97 | - this.emit("sum", this.total); //console.log(" Total : " + this.total); | ||
98 | - }); | ||
99 | - Sum.signal("sum"); | ||
100 | 73 | ||
101 | - // the anonymous function must return the components in one object: | 74 | +/** |
102 | - // keys are factory names, value are actual constructors modified by | 75 | + * @class Sum |
103 | - // ARCS.Component.create | 76 | + * @classdec Sum is a component summing integers passed to its slot "add" |
77 | + * and the result is sent back by signal "sum". | ||
78 | + * This component is declared in two different phases: declaration of the | ||
79 | + * constructor and declaration of the slot "add". | ||
80 | + */ | ||
81 | +var Sum = function () { | ||
82 | + this.total = 0; | ||
83 | +}; | ||
104 | 84 | ||
105 | - return {Loop: Loop, DisplayInt: DisplayInt, Sum: Sum}; | 85 | +ARCS.Component.create(Sum); |
86 | +/** | ||
87 | + * This slot adds its parameter to its internal sum and send it back by using | ||
88 | + * the signal "sum". | ||
89 | + * @param n {integer} add n to the internal sum of the component. | ||
90 | + * @function Sum#add | ||
91 | + * @slot | ||
92 | + */ | ||
93 | +Sum.slot("add", function (n) { | ||
94 | + this.total = this.total + n; | ||
95 | + this.emit("sum", this.total); //console.log(" Total : " + this.total); | ||
106 | }); | 96 | }); |
97 | +Sum.signal("sum"); | ||
98 | + | ||
99 | +// the anonymous function must return the components in one object: | ||
100 | +// keys are factory names, value are actual constructors modified by | ||
101 | +// ARCS.Component.create | ||
102 | + | ||
103 | +export default {Loop: Loop, DisplayInt: DisplayInt, Sum: Sum}; | ... | ... |
1 | +import ARCS from '../build/arcs.js'; | ||
2 | +import POS from '../deps/pose/square_pose.js'; | ||
1 | 3 | ||
4 | +var MarkerLocator; | ||
2 | 5 | ||
3 | -arcs_module( | 6 | + |
4 | - function (ARCS, POS) { | 7 | +MarkerLocator = ARCS.Component.create( |
5 | - var MarkerLocator; | 8 | + function () { |
9 | + var square_pose = new POS.SquareFiducial(); | ||
10 | + | ||
11 | + this.setFocalLength = function (focalLength) { | ||
12 | + square_pose.setFocalLength(focalLength); | ||
13 | + }; | ||
14 | + | ||
15 | + this.setModelSize = function (modelSize) { | ||
16 | + square_pose.setModelSize(modelSize); | ||
17 | + }; | ||
18 | + | ||
19 | + this.setIntrinsics = function (intrinsics) { | ||
20 | + square_pose.setMatrix(intrinsics); | ||
21 | + }; | ||
6 | 22 | ||
23 | + this.setImageSource = function (id) { | ||
24 | + var imageSource = document.getElementById(id); | ||
25 | + if (id === undefined) { | ||
26 | + return; | ||
27 | + } | ||
28 | + | ||
29 | + var imageSourceStyle = window.getComputedStyle(imageSource); | ||
30 | + square_pose.setImageSize(parseInt(imageSourceStyle.width),parseInt( imageSourceStyle.height)); | ||
31 | + | ||
32 | + }; | ||
7 | 33 | ||
8 | - MarkerLocator = ARCS.Component.create( | 34 | + this.locateMarkers = function (markers) { |
9 | - function () { | 35 | + var k, pose; |
10 | - var square_pose = new POS.SquareFiducial(); | 36 | + for (k=0; k < markers.length; k++) { |
11 | - | 37 | + corners = markers[k].corners; |
12 | - this.setFocalLength = function (focalLength) { | 38 | + markers[k].pose = square_pose.pose(corners); |
13 | - square_pose.setFocalLength(focalLength); | 39 | + } |
14 | - }; | 40 | + |
15 | - | 41 | + this.emit("onLocatedMarkers",markers); |
16 | - this.setModelSize = function (modelSize) { | 42 | + }; |
17 | - square_pose.setModelSize(modelSize); | 43 | + }, |
18 | - }; | 44 | + ['locateMarkers','setFocalLength','setModelSize','setImageSource'], |
19 | - | 45 | + ['onLocatedMarkers'] |
20 | - this.setIntrinsics = function (intrinsics) { | 46 | +); |
21 | - square_pose.setMatrix(intrinsics); | ||
22 | - }; | ||
23 | - | ||
24 | - this.setImageSource = function (id) { | ||
25 | - var imageSource = document.getElementById(id); | ||
26 | - if (id === undefined) { | ||
27 | - return; | ||
28 | - } | ||
29 | - | ||
30 | - var imageSourceStyle = window.getComputedStyle(imageSource); | ||
31 | - square_pose.setImageSize(parseInt(imageSourceStyle.width),parseInt( imageSourceStyle.height)); | ||
32 | - | ||
33 | - }; | ||
34 | - | ||
35 | - this.locateMarkers = function (markers) { | ||
36 | - var k, pose; | ||
37 | - for (k=0; k < markers.length; k++) { | ||
38 | - corners = markers[k].corners; | ||
39 | - markers[k].pose = square_pose.pose(corners); | ||
40 | - } | ||
41 | - | ||
42 | - this.emit("onLocatedMarkers",markers); | ||
43 | - }; | ||
44 | - }, | ||
45 | - ['locateMarkers','setFocalLength','setModelSize','setImageSource'], | ||
46 | - ['onLocatedMarkers'] | ||
47 | - ); | ||
48 | 47 | ||
49 | 48 | ||
50 | - return { MarkerLocator: MarkerLocator }; | ||
51 | - }, | ||
52 | - [ {name: "deps/pose/square_pose", exports: "POS"} ] | ||
53 | -); | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
49 | +export default { MarkerLocator: MarkerLocator }; | ... | ... |
1 | -arcs_module( | 1 | +import ARCS from '../build/arcs.js'; |
2 | - function(ARCS,_three) { | 2 | +import * as THREE from '../deps/three.js/index.js'; |
3 | - var ObjectTransform ; | ||
4 | 3 | ||
5 | - /** | 4 | +var ObjectTransform ; |
6 | - * @class ObjectTransform | ||
7 | - * @classdesc Apply transformations to objects | ||
8 | - */ | ||
9 | - ObjectTransform = ARCS.Component.create( | ||
10 | - function() { | ||
11 | - var objRoot; | ||
12 | - var refMat; | ||
13 | - var id = -1; | ||
14 | 5 | ||
15 | - /** | 6 | +/** |
16 | - * Sets the object of interest on which we would like to apply transforms. | 7 | + * @class ObjectTransform |
17 | - * @param obj {object} a Three.js Object3D | 8 | + * @classdesc Apply transformations to objects |
18 | - * @function ObjectTransform#setObject | 9 | + */ |
19 | - */ | 10 | +ObjectTransform = ARCS.Component.create( |
20 | - this.setObject = function (obj) { | 11 | + function() { |
21 | - objRoot = new THREE.Object3D(); | 12 | + var objRoot; |
22 | - obj.parent.add(objRoot); | 13 | + var refMat; |
23 | - obj.parent.remove(obj); | 14 | + var id = -1; |
24 | - objRoot.add(obj); | ||
25 | - | ||
26 | - var box = new THREE.Box3; | ||
27 | - box.setFromObject(obj); | ||
28 | - var s = box.size(); | ||
29 | - var scale = MAX3(s.x, s.y, s.z); | ||
30 | - console.log(scale); | ||
31 | - obj.add(new THREE.AxisHelper(scale / 2)); | ||
32 | - }; | ||
33 | - | ||
34 | - var MAX3 = function (a,b,c) { | ||
35 | - if ( a >= b ) { | ||
36 | - if ( a >= c) { | ||
37 | - return a; | ||
38 | - } else { | ||
39 | - return c; | ||
40 | - } | ||
41 | - } else { | ||
42 | - if (b >= c) { | ||
43 | - return b; | ||
44 | - } else { | ||
45 | - return c; | ||
46 | - } | ||
47 | - } | ||
48 | - }; | ||
49 | 15 | ||
50 | - | 16 | + /** |
51 | - | 17 | + * Sets the object of interest on which we would like to apply transforms. |
52 | - // right now, we make something compatible with aruco markers | 18 | + * @param obj {object} a Three.js Object3D |
53 | - // it may evolve in the future | 19 | + * @function ObjectTransform#setObject |
54 | - | 20 | + */ |
55 | - /** | 21 | + this.setObject = function (obj) { |
56 | - * Takes an array of markers and then applies transformations | 22 | + objRoot = new THREE.Object3D(); |
57 | - * to the referenced object. | 23 | + obj.parent.add(objRoot); |
58 | - * @function ObjectTransform#setTransform | 24 | + obj.parent.remove(obj); |
59 | - * @param arr {Marker[]} an array of detected markers. | 25 | + objRoot.add(obj); |
60 | - */ | 26 | + |
61 | - this.setTransform = function ( arr ) { | 27 | + var box = new THREE.Box3; |
62 | - /*2 set here the transformation we should apply on objRoot | 28 | + box.setFromObject(obj); |
63 | - * Each marker has 3 major properties : | 29 | + var s = box.size(); |
64 | - * - id is the marker id; | 30 | + var scale = MAX3(s.x, s.y, s.z); |
65 | - * - pose.rotation gives its orientation using a rotation matrix | 31 | + console.log(scale); |
66 | - * and is a 3x3 array | 32 | + obj.add(new THREE.AxisHelper(scale / 2)); |
67 | - * - pose.position gives its position with respect to the camera | 33 | + }; |
68 | - * and is a vector with 3 components. | ||
69 | - */ | ||
70 | - if (objRoot === undefined) { return ; } | ||
71 | - var i ; | ||
72 | - for ( i = 0; i < arr.length; i++) { | ||
73 | - if ( arr[i].id === id ) { | ||
74 | - // insert your code here. | ||
75 | - | ||
76 | - //<-- | ||
77 | - var rotation = arr[i].pose.rotation; | ||
78 | - var translation = arr[i].pose.position; | ||
79 | - /*var matrix = new THREE.Matrix4( | ||
80 | - rotation[0][0], rotation[0][1], rotation[0][2], translation[0], | ||
81 | - rotation[1][0], rotation[1][1], rotation[1][2], translation[1], | ||
82 | - rotation[2][0], rotation[2][1], rotation[2][2], translation[2], | ||
83 | - 0 , 0, 0, 1); | ||
84 | 34 | ||
85 | - var r = new THREE.Euler(); | 35 | + var MAX3 = function (a,b,c) { |
86 | - r.setFromRotationMatrix(matrix); | 36 | + if ( a >= b ) { |
87 | - objRoot.rotation.x = r.x; | 37 | + if ( a >= c) { |
88 | - objRoot.rotation.y = r.y; | 38 | + return a; |
89 | - objRoot.rotation.z = r.z; | 39 | + } else { |
90 | - | 40 | + return c; |
91 | - objRoot.position.x = translation[0]; | 41 | + } |
92 | - objRoot.position.y = translation[1]; | 42 | + } else { |
93 | - objRoot.position.z = translation[2]; | 43 | + if (b >= c) { |
94 | - | 44 | + return b; |
95 | - objRoot.scale.x = 1; | 45 | + } else { |
96 | - objRoot.scale.y = 1; | 46 | + return c; |
97 | - objRoot.scale.z = 1;*/ | ||
98 | - | ||
99 | - objRoot.rotation.x = -Math.asin(-rotation[1][2]); | ||
100 | - objRoot.rotation.y = -Math.atan2(rotation[0][2], rotation[2][2]); | ||
101 | - objRoot.rotation.z = Math.atan2(rotation[1][0], rotation[1][1]); | ||
102 | - | ||
103 | - objRoot.position.x = translation[0]; | ||
104 | - objRoot.position.y = translation[1]; | ||
105 | - objRoot.position.z = -translation[2]; | ||
106 | - //--> | ||
107 | - | ||
108 | - } | ||
109 | } | 47 | } |
110 | - }; | 48 | + } |
111 | - | 49 | + }; |
112 | - this.setId = function (i) { | ||
113 | - id = i; | ||
114 | - }; | ||
115 | - }, | ||
116 | - ['setObject', 'setTransform', 'setId'], | ||
117 | - [] | ||
118 | - ); | ||
119 | 50 | ||
51 | + | ||
52 | + | ||
53 | + // right now, we make something compatible with aruco markers | ||
54 | + // it may evolve in the future | ||
55 | + | ||
56 | + /** | ||
57 | + * Takes an array of markers and then applies transformations | ||
58 | + * to the referenced object. | ||
59 | + * @function ObjectTransform#setTransform | ||
60 | + * @param arr {Marker[]} an array of detected markers. | ||
61 | + */ | ||
62 | + this.setTransform = function ( arr ) { | ||
63 | + /*2 set here the transformation we should apply on objRoot | ||
64 | + * Each marker has 3 major properties : | ||
65 | + * - id is the marker id; | ||
66 | + * - pose.rotation gives its orientation using a rotation matrix | ||
67 | + * and is a 3x3 array | ||
68 | + * - pose.position gives its position with respect to the camera | ||
69 | + * and is a vector with 3 components. | ||
70 | + */ | ||
71 | + if (objRoot === undefined) { return ; } | ||
72 | + var i ; | ||
73 | + for ( i = 0; i < arr.length; i++) { | ||
74 | + if ( arr[i].id === id ) { | ||
75 | + // insert your code here. | ||
76 | + | ||
77 | + //<-- | ||
78 | + var rotation = arr[i].pose.rotation; | ||
79 | + var translation = arr[i].pose.position; | ||
80 | + /*var matrix = new THREE.Matrix4( | ||
81 | + rotation[0][0], rotation[0][1], rotation[0][2], translation[0], | ||
82 | + rotation[1][0], rotation[1][1], rotation[1][2], translation[1], | ||
83 | + rotation[2][0], rotation[2][1], rotation[2][2], translation[2], | ||
84 | + 0 , 0, 0, 1); | ||
120 | 85 | ||
86 | + var r = new THREE.Euler(); | ||
87 | + r.setFromRotationMatrix(matrix); | ||
88 | + objRoot.rotation.x = r.x; | ||
89 | + objRoot.rotation.y = r.y; | ||
90 | + objRoot.rotation.z = r.z; | ||
91 | + | ||
92 | + objRoot.position.x = translation[0]; | ||
93 | + objRoot.position.y = translation[1]; | ||
94 | + objRoot.position.z = translation[2]; | ||
95 | + | ||
96 | + objRoot.scale.x = 1; | ||
97 | + objRoot.scale.y = 1; | ||
98 | + objRoot.scale.z = 1;*/ | ||
99 | + | ||
100 | + objRoot.rotation.x = -Math.asin(-rotation[1][2]); | ||
101 | + objRoot.rotation.y = -Math.atan2(rotation[0][2], rotation[2][2]); | ||
102 | + objRoot.rotation.z = Math.atan2(rotation[1][0], rotation[1][1]); | ||
121 | 103 | ||
122 | - return { ObjectTransform : ObjectTransform }; | 104 | + objRoot.position.x = translation[0]; |
105 | + objRoot.position.y = translation[1]; | ||
106 | + objRoot.position.z = -translation[2]; | ||
107 | + //--> | ||
108 | + | ||
109 | + } | ||
110 | + } | ||
111 | + }; | ||
112 | + | ||
113 | + this.setId = function (i) { | ||
114 | + id = i; | ||
115 | + }; | ||
123 | }, | 116 | }, |
124 | - [ "deps/three.js/index" ] | ||
125 | -); | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
117 | + ['setObject', 'setTransform', 'setId'], | ||
118 | + [] | ||
119 | +); | ||
120 | + | ||
121 | +export default { ObjectTransform : ObjectTransform }; | ... | ... |
1 | -arcs_module( | 1 | +import ARCS from '../build/arcs.js'; |
2 | - function(ARCS, three, _objloader, _mtlloader, _objmtlloader) { | 2 | +import * as THREE from '../deps/three.js/index.js'; |
3 | - var OBJLoader; | 3 | +import { OBJLoader } from '../deps/objloader/objloader.js'; |
4 | +import { MTLLoader } from '../deps/mtlloader/mtlloader.js'; | ||
5 | +//import { DDSLoader } from '../deps/ddsloader/ddsloader.js'; | ||
4 | 6 | ||
7 | + | ||
8 | +var internalOBJLoader; | ||
9 | + | ||
10 | + | ||
11 | +internalOBJLoader = ARCS.Component.create( | ||
12 | + function() { | ||
13 | + var self = this; | ||
14 | + var innerObject; | ||
5 | 15 | ||
6 | - OBJLoader = ARCS.Component.create( | 16 | + var onLoadWrapper = function(obj) { |
7 | - function() { | 17 | + innerObject = obj; |
8 | - var self = this; | 18 | + console.log("[OBJLoader] object has %d components", obj.children.length); |
9 | - var innerObject; | 19 | + //console.log(obj); |
10 | - | 20 | + self.emit("onLoad", obj); |
11 | - var onLoadWrapper = function(obj) { | 21 | + }; |
12 | - innerObject = obj; | ||
13 | - console.log("[OBJLoader] object has %d components", obj.children.length); | ||
14 | - //console.log(obj); | ||
15 | - self.emit("onLoad", obj); | ||
16 | - }; | ||
17 | 22 | ||
18 | - var onLoadJSON = function(geom, mat) { | 23 | + var onLoadJSON = function(geom, mat) { |
19 | - innerObject = new THREE.Mesh(geom, new THREE.MeshFaceMaterial(mat)); | 24 | + innerObject = new THREE.Mesh(geom, new THREE.MeshFaceMaterial(mat)); |
20 | - | 25 | + |
21 | - self.emit("onLoad", innerObject); | 26 | + self.emit("onLoad", innerObject); |
22 | - }; | 27 | + }; |
23 | - | 28 | + |
24 | - var progress = function ( xhr ) { | 29 | + var progress = function ( xhr ) { |
25 | - console.log( (xhr.loaded / xhr.total * 100) + '% loaded' ); | 30 | + console.log( (xhr.loaded / xhr.total * 100) + '% loaded' ); |
26 | - }; | 31 | + }; |
27 | - | 32 | + |
28 | - var error = function ( xhr ) { | 33 | + var error = function ( xhr ) { |
29 | - console.log( 'An error happened' ); | 34 | + console.log( 'An error happened' ); |
30 | - }; | 35 | + }; |
31 | - | 36 | + |
32 | - this.load = function(objURL, mtlURL) { | 37 | + this.load = function(objURL, mtlURL) { |
33 | - var loader; | 38 | + var loader; |
34 | - // we may use a string tokenizer to determine file types | 39 | + // we may use a string tokenizer to determine file types |
35 | - // then all would be in the same loading slot. | 40 | + // then all would be in the same loading slot. |
36 | - | 41 | + |
37 | - | 42 | + //console.log("loading objects", objURL, mtlURL); |
38 | - console.log("loading objects", objURL, mtlURL); | 43 | + var manager = new THREE.LoadingManager(); |
39 | - if (mtlURL === undefined) { | 44 | + //manager.addHandler( /\.dds$/i, new DDSLoader() ); |
40 | - //console.log("using loader"); | 45 | + |
41 | - loader = new THREE.OBJLoader(); | 46 | + if (mtlURL === undefined) { |
42 | - loader.load(objURL, onLoadWrapper, progress, error); | 47 | + //console.log("using loader"); |
48 | + loader = new OBJLoader(manager); | ||
49 | + loader.load(objURL, onLoadWrapper, progress, error); | ||
50 | + } else { | ||
51 | + //console.log("using mtl loader"); | ||
52 | + loader = new MTLLoader(manager); | ||
53 | + loader.load(mtlURL, function(materials) { | ||
54 | + materials.preload(); | ||
55 | + console.log(materials); | ||
56 | + new OBJLoader(manager) | ||
57 | + .setMaterials(materials) | ||
58 | + .load(objURL, onLoadWrapper, progress, error); | ||
59 | + }, progress, error); | ||
60 | + } | ||
61 | + }; | ||
62 | + | ||
63 | + this.loadJSON = function(jsonURL) { | ||
64 | + var loader; | ||
65 | + //console.log("loading objects", jsonURL); | ||
66 | + loader = new THREE.ObjectLoader(); | ||
67 | + loader.load(jsonURL, onLoadJSON); //, progress, error); | ||
68 | + | ||
69 | + | ||
70 | + }; | ||
71 | + | ||
72 | + var MAX3 = function (a,b,c) { | ||
73 | + if ( a >= b ) { | ||
74 | + if ( a >= c) { | ||
75 | + return a; | ||
43 | } else { | 76 | } else { |
44 | - //console.log("using mtl loader"); | 77 | + return c; |
45 | - loader = new THREE.OBJMTLLoader(); | ||
46 | - loader.load(objURL, mtlURL, onLoadWrapper, progress, error); | ||
47 | } | 78 | } |
48 | - }; | 79 | + } else { |
49 | - | 80 | + if (b >= c) { |
50 | - this.loadJSON = function(jsonURL) { | 81 | + return b; |
51 | - var loader; | ||
52 | - //console.log("loading objects", jsonURL); | ||
53 | - loader = new THREE.JSONLoader(); | ||
54 | - loader.load(jsonURL, onLoadJSON); //, progress, error); | ||
55 | - | ||
56 | - | ||
57 | - }; | ||
58 | - | ||
59 | - var MAX3 = function (a,b,c) { | ||
60 | - if ( a >= b ) { | ||
61 | - if ( a >= c) { | ||
62 | - return a; | ||
63 | - } else { | ||
64 | - return c; | ||
65 | - } | ||
66 | } else { | 82 | } else { |
67 | - if (b >= c) { | 83 | + return c; |
68 | - return b; | ||
69 | - } else { | ||
70 | - return c; | ||
71 | - } | ||
72 | } | 84 | } |
73 | - }; | 85 | + } |
74 | - | 86 | + }; |
75 | - this.unitize = function() { | 87 | + |
76 | - if (innerObject === undefined) { return ; } | 88 | + this.unitize = function() { |
77 | - var box = new THREE.Box3(); | 89 | + if (innerObject === undefined) { return ; } |
78 | - box.setFromObject(innerObject); | 90 | + var box = new THREE.Box3(); |
79 | - var s = box.size(); | 91 | + box.setFromObject(innerObject); |
80 | - var c = box.center(); | 92 | + var s = box.size(); |
81 | - var scale = 1 / MAX3(s.x, s.y, s.z); | 93 | + var c = box.center(); |
82 | - innerObject.scale.x = innerObject.scale.y = innerObject.scale.z = scale; | 94 | + var scale = 1 / MAX3(s.x, s.y, s.z); |
83 | - }; | 95 | + innerObject.scale.x = innerObject.scale.y = innerObject.scale.z = scale; |
84 | - | 96 | + }; |
85 | - this.resize = function(s) { | 97 | + |
86 | - this.unitize(); | 98 | + this.resize = function(s) { |
87 | - if (innerObject === undefined) { return ; } | 99 | + this.unitize(); |
88 | - innerObject.scale.x *= s; | 100 | + if (innerObject === undefined) { return ; } |
89 | - innerObject.scale.y *= s; | 101 | + innerObject.scale.x *= s; |
90 | - innerObject.scale.z *= s; | 102 | + innerObject.scale.y *= s; |
91 | - }; | 103 | + innerObject.scale.z *= s; |
92 | - | 104 | + }; |
93 | - }, | ||
94 | - ["load","unitize", "resize"], | ||
95 | - ["onLoad"] | ||
96 | - ); | ||
97 | 105 | ||
98 | - return { OBJLoader: OBJLoader}; | ||
99 | }, | 106 | }, |
100 | - [ 'deps/three.js/index', 'deps/objloader/index', 'deps/mtlloader/index','deps/objmtlloader/index' ] | ||
101 | -); | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
107 | + ["load","unitize", "resize"], | ||
108 | + ["onLoad"] | ||
109 | +); | ||
110 | + | ||
111 | +export default { OBJLoader: internalOBJLoader}; | ... | ... |
components/package.json
0 → 100644
1 | +{ "type": "module"} |
1 | -arcs_module(function(ARCS) { | 1 | +import ARCS from '../build/arcs.js'; |
2 | - var TokenSender; | ||
3 | 2 | ||
4 | - TokenSender = ARCS.Component.create( | 3 | +var TokenSender; |
5 | - function( arr ) { | ||
6 | - var i; | ||
7 | - var self = this; | ||
8 | - for (i=0; i< arr.length; i++) { | ||
9 | - if (typeof arr[i] === "string") { | ||
10 | - this.slots.push(arr[i]); | ||
11 | - //TokenSender.prototype.slots.push(arr[i]); | ||
12 | - this[arr[i]] = function( s ) { | ||
13 | - return function() { | ||
14 | - console.log("[TokenSender] emitting %s", s); | ||
15 | - this.emit("sendToken",s); | ||
16 | - }; | ||
17 | - } (arr[i]); | ||
18 | - } | ||
19 | - } | ||
20 | - }, | ||
21 | - [], | ||
22 | - ['sendToken'] | ||
23 | - ); | ||
24 | 4 | ||
25 | - return { TokenSender : TokenSender }; | ||
26 | -}); | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
5 | +TokenSender = ARCS.Component.create( | ||
6 | + function( arr ) { | ||
7 | + var i; | ||
8 | + var self = this; | ||
9 | + for (i=0; i< arr.length; i++) { | ||
10 | + if (typeof arr[i] === "string") { | ||
11 | + this.slots.push(arr[i]); | ||
12 | + //TokenSender.prototype.slots.push(arr[i]); | ||
13 | + this[arr[i]] = function( s ) { | ||
14 | + return function() { | ||
15 | + console.log("[TokenSender] emitting %s", s); | ||
16 | + this.emit("sendToken",s); | ||
17 | + }; | ||
18 | + } (arr[i]); | ||
19 | + } | ||
20 | + } | ||
21 | + }, | ||
22 | + [], | ||
23 | + ['sendToken'] | ||
24 | +); | ||
25 | + | ||
26 | +export default { TokenSender : TokenSender }; | ... | ... |
1 | -arcs_module(function(ARCS) { | 1 | +import ARCS from '../build/arcs.js'; |
2 | - var LiveSource, VideoSource; | 2 | + |
3 | - LiveSource = ARCS.Component.create( | 3 | +var LiveSource, VideoSource; |
4 | - function () { | 4 | +LiveSource = ARCS.Component.create( |
5 | - var context, canvas, video, imageData; | 5 | + function () { |
6 | - var defaultWidth = 320; | 6 | + var context, canvas, video, imageData; |
7 | - var defaultHeight = 240; | 7 | + var defaultWidth = 320; |
8 | - var self = this; | 8 | + var defaultHeight = 240; |
9 | - | 9 | + var self = this; |
10 | - var handleMediaStream = function(stream) { | 10 | + |
11 | - if (window.webkitURL) { | 11 | + var handleMediaStream = function(stream) { |
12 | - video.src = window.webkitURL.createObjectURL(stream); | 12 | + console.log(video,stream); |
13 | - } else if (video.mozSrcObject !== undefined) { | 13 | + if (window.webkitURL) { |
14 | - video.mozSrcObject = stream; | 14 | + video.src = window.webkitURL.createObjectURL(stream); |
15 | - } else if (video.srcObject !== undefined) { | 15 | + } else if (video.mozSrcObject !== undefined) { |
16 | - video.srcObject = stream; | 16 | + video.mozSrcObject = stream; |
17 | - } else { | 17 | + } else if (video.srcObject !== undefined) { |
18 | - video.src = stream; | 18 | + video.srcObject = stream; |
19 | - } | 19 | + } else { |
20 | - video.videoWidth=defaultWidth; | 20 | + video.src = stream; |
21 | - video.videoHeight=defaultHeight; | 21 | + } |
22 | - self.emit("onReady"); | 22 | + /*video.videoWidth=defaultWidth; |
23 | - }; | 23 | + video.videoHeight=defaultHeight;*/ |
24 | - | 24 | + self.emit("onReady"); |
25 | - var errorMediaStream = function(error) { | 25 | + }; |
26 | - console.error("Cannot initialize video component:", error.code); | 26 | + |
27 | - }; | 27 | + var errorMediaStream = function(error) { |
28 | - | 28 | + console.error("Cannot initialize video component:", error.code); |
29 | - var setUserMedia = function() { | 29 | + }; |
30 | - console.log("video test"); | 30 | + |
31 | - if (navigator.mediaDevices !== undefined) { | 31 | + var setUserMedia = function() { |
32 | - navigator.mediaDevices.getUserMedia({video:{facingMode : "environment"}}) | 32 | + if (navigator.mediaDevices !== undefined) { |
33 | - .then(handleMediaStream) | 33 | + navigator.mediaDevices.getUserMedia({video: {facingMode: "environment", width: defaultWidth, height: defaultHeight}}) |
34 | - .catch(errorMediaStream); | 34 | + .then(handleMediaStream) |
35 | - } else { | 35 | + .catch(errorMediaStream); |
36 | - var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia; | 36 | + } else { |
37 | - if (getUserMedia !== undefined) { | 37 | + var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia; |
38 | - console.log(getUserMedia(), handleMediaStream, errorMediaStream); | 38 | + if (getUserMedia !== undefined) { |
39 | - /*getUserMedia({video:true}, handleMediaStream, | 39 | + getUserMedia({video:true}).then(handleMediaStream); |
40 | - errorMediaStream | ||
41 | - );*/ | ||
42 | - getUserMedia({video:true}).then(handleMediaStream); | ||
43 | - } | ||
44 | - } | ||
45 | - }; | ||
46 | - | ||
47 | - this.grabFrame = function () { | ||
48 | - if ( context === undefined || canvas === undefined || video === undefined) | ||
49 | - return; | ||
50 | - if (video.readyState === video.HAVE_ENOUGH_DATA) { | ||
51 | - context.drawImage(video, 0, 0, canvas.width, canvas.height); | ||
52 | - imageData = context.getImageData(0, 0, canvas.width, canvas.height); | ||
53 | - this.emit("onImage",imageData); | ||
54 | } | 40 | } |
55 | - }; | 41 | + } |
42 | + }; | ||
43 | + | ||
44 | + this.grabFrame = function () { | ||
45 | + if ( context === undefined || canvas === undefined || video === undefined) | ||
46 | + return; | ||
47 | + if (video.readyState === video.HAVE_ENOUGH_DATA) { | ||
48 | + context.drawImage(video, 0, 0, canvas.width, canvas.height); | ||
49 | + imageData = context.getImageData(0, 0, canvas.width, canvas.height); | ||
50 | + this.emit("onImage",imageData); | ||
51 | + } | ||
52 | + }; | ||
53 | + | ||
54 | + this.setSize = function(x,y) { | ||
56 | 55 | ||
57 | - this.setSize = function(x,y) { | 56 | + }; |
58 | - | 57 | + |
59 | - }; | 58 | + this.setWidgets = function (videoId, canvasId) { |
59 | + video = document.getElementById(videoId); | ||
60 | + canvas = document.getElementById(canvasId); | ||
60 | 61 | ||
61 | - this.setWidgets = function (videoId, canvasId) { | 62 | + if (video === undefined || canvas === undefined) { |
62 | - video = document.getElementById(videoId); | 63 | + console.log("video elements not defined"); |
63 | - canvas = document.getElementById(canvasId); | 64 | + return; |
64 | - | 65 | + } |
65 | - if (video === undefined || canvas === undefined) { | 66 | + context = canvas.getContext("2d"); |
66 | - console.log("video elements not defined"); | 67 | + var canvasStyle= window.getComputedStyle(canvas); |
67 | - return; | 68 | + canvas.width=parseInt(canvasStyle.width); |
68 | - } | 69 | + canvas.height=parseInt(canvasStyle.height); |
69 | - context = canvas.getContext("2d"); | 70 | + setUserMedia(); |
70 | - var canvasStyle= window.getComputedStyle(canvas); | 71 | + }; |
71 | - canvas.width=parseInt(canvasStyle.width); | 72 | + }, |
72 | - canvas.height=parseInt(canvasStyle.height); | 73 | + ['grabFrame','setWidgets'], |
73 | - setUserMedia(); | 74 | + ['onReady','onImage'] |
74 | - }; | 75 | +); |
75 | - }, | 76 | + |
76 | - ['grabFrame','setWidgets'], | 77 | + |
77 | - ['onReady','onImage'] | 78 | +VideoSource = ARCS.Component.create( |
78 | - ); | 79 | + function() { |
79 | - | 80 | + var context, canvas, video, imageData; |
80 | - | 81 | + var defaultWidth=320; |
81 | - VideoSource = ARCS.Component.create( | 82 | + var defaultHeight=240; |
82 | - function() { | 83 | + var self=this; |
83 | - var context, canvas, video, imageData; | 84 | + |
84 | - var defaultWidth=320; | 85 | + this.setWidgets = function (videoId, canvasId) { |
85 | - var defaultHeight=240; | 86 | + video = document.getElementById(videoId); |
86 | - var self=this; | 87 | + canvas = document.getElementById(canvasId); |
87 | 88 | ||
88 | - this.setWidgets = function (videoId, canvasId) { | 89 | + if (video === undefined || canvas === undefined) { |
89 | - video = document.getElementById(videoId); | 90 | + return; |
90 | - canvas = document.getElementById(canvasId); | 91 | + } |
91 | - | 92 | + context = canvas.getContext("2d"); |
92 | - if (video === undefined || canvas === undefined) { | 93 | + var canvasStyle= window.getComputedStyle(canvas); |
93 | - return; | 94 | + canvas.width=parseInt(canvasStyle.width); |
94 | - } | 95 | + canvas.height=parseInt(canvasStyle.height); |
95 | - context = canvas.getContext("2d"); | ||
96 | - var canvasStyle= window.getComputedStyle(canvas); | ||
97 | - canvas.width=parseInt(canvasStyle.width); | ||
98 | - canvas.height=parseInt(canvasStyle.height); | ||
99 | 96 | ||
100 | - if (video.paused || video.ended) { | 97 | + if (video.paused || video.ended) { |
101 | - video.addEventListener('play', function() { | 98 | + video.addEventListener('play', function() { |
102 | - self.emit("onReady"); | ||
103 | - }); | ||
104 | - } else { | ||
105 | self.emit("onReady"); | 99 | self.emit("onReady"); |
106 | - } | 100 | + }); |
107 | - | 101 | + } else { |
108 | - | 102 | + self.emit("onReady"); |
109 | - }; | 103 | + } |
110 | 104 | ||
111 | - this.grabFrame = function () { | ||
112 | - if ( context === undefined || canvas === undefined || video === undefined) | ||
113 | - return; | ||
114 | - if (video.paused || video.ended) { | ||
115 | - return; | ||
116 | - } | ||
117 | - | ||
118 | - context.drawImage(video, 0, 0, canvas.width, canvas.height); | ||
119 | - imageData = context.getImageData(0, 0, canvas.width, canvas.height); | ||
120 | - this.emit("onImage",imageData); | ||
121 | - }; | ||
122 | 105 | ||
106 | + }; | ||
107 | + | ||
108 | + this.grabFrame = function () { | ||
109 | + if ( context === undefined || canvas === undefined || video === undefined) | ||
110 | + return; | ||
111 | + if (video.paused || video.ended) { | ||
112 | + return; | ||
113 | + } | ||
114 | + | ||
115 | + context.drawImage(video, 0, 0, canvas.width, canvas.height); | ||
116 | + imageData = context.getImageData(0, 0, canvas.width, canvas.height); | ||
117 | + this.emit("onImage",imageData); | ||
118 | + }; | ||
123 | 119 | ||
124 | - }, | ||
125 | - ['grabFrame', 'setWidgets'], | ||
126 | - ['onReady', 'onImage'] | ||
127 | - ); | ||
128 | - | ||
129 | 120 | ||
130 | - return {LiveSource: LiveSource, VideoSource: VideoSource}; | 121 | + }, |
131 | -}); | 122 | + ['grabFrame', 'setWidgets'], |
123 | + ['onReady', 'onImage'] | ||
124 | +); | ||
125 | + | ||
126 | +export default {LiveSource: LiveSource, VideoSource: VideoSource}; | ... | ... |
1 | -arcs_module( | 1 | +import ARCS from '../build/arcs.js'; |
2 | - function (ARCS) { | ||
3 | - var WindowEvent; | ||
4 | 2 | ||
5 | - WindowEvent = ARCS.Component.create( | 3 | +let WindowEvent; |
6 | - function () { | 4 | + |
7 | - var self= this; | 5 | +WindowEvent = ARCS.Component.create( |
8 | - | 6 | + function () { |
9 | - window.onresize = function() { | 7 | + let self= this; |
10 | - self.emit("onResize",window.innerWidth, window.innerHeight); | 8 | + |
11 | - }; | 9 | + window.onresize = function() { |
12 | - }, | 10 | + self.emit("onResize",window.innerWidth, window.innerHeight); |
13 | - [], | 11 | + }; |
14 | - ["onResize"] | 12 | + }, |
15 | - ); | 13 | + [], |
14 | + ["onResize"] | ||
15 | +); | ||
16 | 16 | ||
17 | - return { WindowEvent: WindowEvent}; | ||
18 | - } | ||
19 | -); | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
17 | + | ||
18 | +export default { WindowEvent: WindowEvent}; | ... | ... |
... | @@ -493,3 +493,5 @@ Mat3.prototype.row = function(index){ | ... | @@ -493,3 +493,5 @@ Mat3.prototype.row = function(index){ |
493 | 493 | ||
494 | return new Vec3( m[index][0], m[index][1], m[index][2] ); | 494 | return new Vec3( m[index][0], m[index][1], m[index][2] ); |
495 | }; | 495 | }; |
496 | + | ||
497 | +export default POS; | ... | ... |
... | @@ -529,3 +529,5 @@ POS.Pose = function(error1, rotation1, translation1, error2, rotation2, translat | ... | @@ -529,3 +529,5 @@ POS.Pose = function(error1, rotation1, translation1, error2, rotation2, translat |
529 | this.alternativeRotation = rotation2; | 529 | this.alternativeRotation = rotation2; |
530 | this.alternativeTranslation = translation2; | 530 | this.alternativeTranslation = translation2; |
531 | }; | 531 | }; |
532 | + | ||
533 | +export default POS; | ... | ... |
... | @@ -129,4 +129,6 @@ POS.SquareFiducial.prototype.crossProduct = function(a,b) { | ... | @@ -129,4 +129,6 @@ POS.SquareFiducial.prototype.crossProduct = function(a,b) { |
129 | POS.SimplePose = function(pos, rot) { | 129 | POS.SimplePose = function(pos, rot) { |
130 | this.position = pos; | 130 | this.position = pos; |
131 | this.rotation = rot; | 131 | this.rotation = rot; |
132 | -}; | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
132 | +}; | ||
133 | + | ||
134 | +export default POS; | ... | ... |
... | @@ -281,3 +281,5 @@ SVD.pythag = function(a, b){ | ... | @@ -281,3 +281,5 @@ SVD.pythag = function(a, b){ |
281 | SVD.sign = function(a, b){ | 281 | SVD.sign = function(a, b){ |
282 | return b >= 0.0? Math.abs(a): -Math.abs(a); | 282 | return b >= 0.0? Math.abs(a): -Math.abs(a); |
283 | }; | 283 | }; |
284 | + | ||
285 | +export default SVD; | ... | ... |
1 | -arcs_module(function(ARCS) { | 1 | +import * as THREE from './index.js'; |
2 | -THREE.FrustumCamera = function ( left, right, bottom, top, near, far ) { | 2 | + |
3 | +let FrustumCamera = function ( left, right, bottom, top, near, far ) { | ||
3 | 4 | ||
4 | THREE.Camera.call( this ); | 5 | THREE.Camera.call( this ); |
5 | 6 | ||
... | @@ -17,22 +18,22 @@ THREE.FrustumCamera = function ( left, right, bottom, top, near, far ) { | ... | @@ -17,22 +18,22 @@ THREE.FrustumCamera = function ( left, right, bottom, top, near, far ) { |
17 | 18 | ||
18 | }; | 19 | }; |
19 | 20 | ||
20 | -THREE.FrustumCamera.prototype = Object.create( THREE.Camera.prototype ); | 21 | +FrustumCamera.prototype = Object.create( THREE.Camera.prototype ); |
21 | -THREE.FrustumCamera.prototype.constructor = THREE.FrustumCamera; | 22 | +FrustumCamera.prototype.constructor = FrustumCamera; |
22 | 23 | ||
23 | 24 | ||
24 | 25 | ||
25 | 26 | ||
26 | -THREE.FrustumCamera.prototype.updateProjectionMatrix = function () { | 27 | +FrustumCamera.prototype.updateProjectionMatrix = function () { |
27 | 28 | ||
28 | this.projectionMatrix.makeFrustum( | 29 | this.projectionMatrix.makeFrustum( |
29 | this.left, this.right, this.bottom, this.top, this.near, this.far | 30 | this.left, this.right, this.bottom, this.top, this.near, this.far |
30 | ); | 31 | ); |
31 | }; | 32 | }; |
32 | 33 | ||
33 | -THREE.FrustumCamera.prototype.clone = function () { | 34 | +FrustumCamera.prototype.clone = function () { |
34 | 35 | ||
35 | - var camera = new THREE.FrustumCamera(); | 36 | + var camera = new FrustumCamera(); |
36 | 37 | ||
37 | THREE.Camera.prototype.clone.call( this, camera ); | 38 | THREE.Camera.prototype.clone.call( this, camera ); |
38 | 39 | ||
... | @@ -51,6 +52,4 @@ THREE.FrustumCamera.prototype.clone = function () { | ... | @@ -51,6 +52,4 @@ THREE.FrustumCamera.prototype.clone = function () { |
51 | 52 | ||
52 | }; | 53 | }; |
53 | 54 | ||
54 | -return {}; | 55 | +export default FrustumCamera; |
55 | -}, ['deps/three.js/index'] | ||
56 | -); | ... | ... |
... | @@ -11,14 +11,17 @@ | ... | @@ -11,14 +11,17 @@ |
11 | "Reality" | 11 | "Reality" |
12 | ], | 12 | ], |
13 | "author": "Jean-Yves Didier", | 13 | "author": "Jean-Yves Didier", |
14 | - "license": "GPL", | 14 | + "license": "GPL-3.0-or-later", |
15 | "devDependencies": { | 15 | "devDependencies": { |
16 | "bower": ">=1.3.9", | 16 | "bower": ">=1.3.9", |
17 | "grunt": ">=0.4.5", | 17 | "grunt": ">=0.4.5", |
18 | "grunt-jslint": ">=1.1.12", | 18 | "grunt-jslint": ">=1.1.12", |
19 | - "grunt-contrib-uglify": ">=0.5.1", | 19 | + "grunt-terser": "*", |
20 | "grunt-jsdoc": ">=0.5.6", | 20 | "grunt-jsdoc": ">=0.5.6", |
21 | "grunt-bower-task": ">=0.4.0", | 21 | "grunt-bower-task": ">=0.4.0", |
22 | - "grunt-contrib-concat": ">=0.5.0" | 22 | + "grunt-contrib-concat": ">=0.5.0", |
23 | + "grunt-contrib-copy": ">=1.0.0", | ||
24 | + "grunt-file-append": ">=0.0.7", | ||
25 | + "grunt-string-replace": ">=1.3.1" | ||
23 | } | 26 | } |
24 | } | 27 | } | ... | ... |
... | @@ -199,7 +199,7 @@ ARCS.Application = function () { | ... | @@ -199,7 +199,7 @@ ARCS.Application = function () { |
199 | * Starts the application | 199 | * Starts the application |
200 | */ | 200 | */ |
201 | this.start = function () { | 201 | this.start = function () { |
202 | - console.log("[ARCS] Starting application"); | 202 | + console.log("[ARCS] Starting application..."); |
203 | context.instanciate().then(preProcess); | 203 | context.instanciate().then(preProcess); |
204 | }; | 204 | }; |
205 | }; | 205 | }; | ... | ... |
... | @@ -22,19 +22,11 @@ var ARCS = ARCS || {}; | ... | @@ -22,19 +22,11 @@ var ARCS = ARCS || {}; |
22 | * Helper functions to determine environment | 22 | * Helper functions to determine environment |
23 | * ***************************************************************************/ | 23 | * ***************************************************************************/ |
24 | 24 | ||
25 | - | ||
26 | /** | 25 | /** |
27 | * @return {boolean} true if ARCS is run in a node.js environment | 26 | * @return {boolean} true if ARCS is run in a node.js environment |
28 | */ | 27 | */ |
29 | ARCS.isInNode = function () { | 28 | ARCS.isInNode = function () { |
30 | - return (typeof require === 'function' && require.resolve); | 29 | + return (typeof require === 'function' && require.resolve); |
31 | }; | 30 | }; |
32 | 31 | ||
33 | 32 | ||
34 | -/** | ||
35 | - * @return {boolean} true if ARCS is run with require.js | ||
36 | - */ | ||
37 | -ARCS.isInRequire = function () { | ||
38 | - return (typeof define === 'function' && define.amd); | ||
39 | -}; | ||
40 | - | ... | ... |
... | @@ -6,43 +6,31 @@ import ARCS from './arcs.js'; | ... | @@ -6,43 +6,31 @@ import ARCS from './arcs.js'; |
6 | * It relies on require.js to get the job done. | 6 | * It relies on require.js to get the job done. |
7 | * @file | 7 | * @file |
8 | */ | 8 | */ |
9 | +"use strict"; | ||
10 | + | ||
11 | +// basically, here we start by importing the module ARCS | ||
12 | +import ARCS from './arcs.js'; | ||
9 | 13 | ||
10 | -console.log("Bootstrapping ARCS..."); | 14 | + |
15 | +console.log("[ARCS] Bootstrapping..."); | ||
11 | 16 | ||
12 | var baseUrl, appDescription, requireMarkup, xhr; | 17 | var baseUrl, appDescription, requireMarkup, xhr; |
13 | 18 | ||
14 | -requireMarkup = document.querySelector('[data-main]'); | 19 | +requireMarkup = document.querySelector('[data-arcsapp]'); |
15 | if (requireMarkup !== undefined) { | 20 | if (requireMarkup !== undefined) { |
16 | baseUrl = requireMarkup.dataset.baseUrl ; | 21 | baseUrl = requireMarkup.dataset.baseUrl ; |
17 | appDescription = requireMarkup.dataset.arcsapp || "arcsapp.json"; | 22 | appDescription = requireMarkup.dataset.arcsapp || "arcsapp.json"; |
18 | } | 23 | } |
19 | 24 | ||
20 | -// do not move these lines: xhr.open must be performed before require | 25 | + |
21 | -// changes paths. | 26 | +(async function toto() { |
22 | -xhr = new XMLHttpRequest(); | 27 | +var description = await(fetch(appDescription)); |
23 | -xhr.open('GET',appDescription,true); | 28 | +var applicationObject = await(description.json()); |
24 | -xhr.overrideMimeType("application/json"); | 29 | + |
25 | -xhr.onerror = function (e) { | 30 | + |
26 | - console.error("[ARCS] Failed to get app description (",appDescription,"):",e.target.status,e.message); | 31 | +console.log("[ARCS] Application description loaded"); |
27 | -}; | 32 | + |
28 | - | 33 | +var aap = new ARCS.Application(); |
29 | -xhr.onreadystatechange = function() { | 34 | +aap.import(applicationObject); |
30 | - if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) { | 35 | +aap.start(); |
31 | - try { | 36 | +})(); |
32 | - console.log("ARCS application description loaded"); | ||
33 | - var applicationObject = JSON.parse(xhr.responseText); | ||
34 | - if (baseUrl) { | ||
35 | - // TODO change this line below | ||
36 | - require.config( { baseUrl: baseUrl }); | ||
37 | - } | ||
38 | - var aap = new ARCS.Application(); | ||
39 | - aap.import(applicationObject); | ||
40 | - console.log("Starting application..."); | ||
41 | - aap.start(); | ||
42 | - } catch (e) { | ||
43 | - console.error("[ARCS] Error while parsing JSON:",e); | ||
44 | - } | ||
45 | - } | ||
46 | -}; | ||
47 | - | ||
48 | -xhr.send(); | ... | ... |
src/arcs_module.js
deleted
100644 → 0
1 | -/** | ||
2 | - * definition of the main module function: | ||
3 | - * it takes an anonymous function as a parameter | ||
4 | - * the anonymous function has one parameter: the object encompassing | ||
5 | - * ARCS definitions (in order to able to use ARCS.Component.create, ...) | ||
6 | - * @param moduleDefinition {function} main function of the module. | ||
7 | - * It should return a list of components | ||
8 | - * @param deps {mixed[]} dependencies | ||
9 | - */ | ||
10 | - | ||
11 | -// TODO remove dependency handling | ||
12 | - | ||
13 | - | ||
14 | -// reimplementation using native promises | ||
15 | -arcs_module = function(moduleDefinition) { | ||
16 | - var storeComponents, i; | ||
17 | - | ||
18 | - // TODO verify if this is still needed | ||
19 | - if (typeof module !== 'undefined') { | ||
20 | - if (module.parent.exports) { | ||
21 | - ARCS = module.exports; | ||
22 | - } | ||
23 | - } | ||
24 | - | ||
25 | - | ||
26 | - storeComponents = function () { | ||
27 | - var mdef, p; | ||
28 | - // we should insert ARCS at the beginning of deps ! | ||
29 | - | ||
30 | - mdef = (typeof moduleDefinition === 'function') ? | ||
31 | - moduleDefinition.apply(this) : moduleDefinition; | ||
32 | - | ||
33 | - if (mdef === undefined) { | ||
34 | - throw new Error("[ARCS] Your module is undefined. Did you forget to export components?\nCode of module follows:\n" +moduleDefinition); | ||
35 | - } | ||
36 | - | ||
37 | - for (p in mdef) { | ||
38 | - if (mdef.hasOwnProperty(p) && ARCS.Context.currentContext != null) { | ||
39 | - ARCS.Context.currentContext.setFactory(p,mdef[p]); //.setFactory(ARCS.Application.currentApplication, p, mdef[p]); | ||
40 | - } | ||
41 | - } | ||
42 | - | ||
43 | - return Promise.resolve(); | ||
44 | - }; | ||
45 | - // until now, it is the very same code. | ||
46 | - | ||
47 | - | ||
48 | - ARCS.Context.currentContext.addLibraryPromise( | ||
49 | - storeComponents, | ||
50 | - function(reason) { console.error("[ARCS] Failed to load dependency ", reason ); }) | ||
51 | - | ||
52 | - ); | ||
53 | - | ||
54 | -} |
src/arcs_node.js
deleted
100644 → 0
src/arcs_node.mjs
0 → 100755
1 | +#!/usr/bin/env -S node --experimental-modules --experimental-json-modules | ||
2 | + | ||
3 | +import ARCS from './arcs.js'; | ||
4 | +import process from 'process'; | ||
5 | +import path from 'path'; | ||
6 | +import fs from 'fs'; | ||
7 | +//import application from './appli.json'; | ||
8 | + | ||
9 | +function usage() { | ||
10 | + let sp = process.argv[1].lastIndexOf(path.delimiter); | ||
11 | + console.log("usage:"); | ||
12 | + console.log("\t", | ||
13 | + process.argv[1], | ||
14 | + "description.json" | ||
15 | + ); | ||
16 | +} | ||
17 | + | ||
18 | +if (process.argv.length < 3) { | ||
19 | + usage(); | ||
20 | + process.exit(1); | ||
21 | +} | ||
22 | + | ||
23 | + | ||
24 | +var appDescription = fs.readFileSync(process.argv[2]); | ||
25 | +if (appDescription === '') { | ||
26 | + console.error("File '"+process.argv[2]+"' is empty."); | ||
27 | + process.exit(2); | ||
28 | +} | ||
29 | + | ||
30 | +var application = JSON.parse(appDescription); | ||
31 | + | ||
32 | +var aap = new ARCS.Application(); | ||
33 | +aap.import(application); | ||
34 | +aap.start(); |
... | @@ -9,7 +9,7 @@ ARCS.Context = function( ctx ) { | ... | @@ -9,7 +9,7 @@ ARCS.Context = function( ctx ) { |
9 | var constants = {}; | 9 | var constants = {}; |
10 | var factories = {}; | 10 | var factories = {}; |
11 | var libraries = []; | 11 | var libraries = []; |
12 | - var depLibPromises=[]; | 12 | + //var depLibPromises=[]; |
13 | var self = this; | 13 | var self = this; |
14 | var loadLibraries; | 14 | var loadLibraries; |
15 | var loadDataFile; | 15 | var loadDataFile; |
... | @@ -23,6 +23,7 @@ ARCS.Context = function( ctx ) { | ... | @@ -23,6 +23,7 @@ ARCS.Context = function( ctx ) { |
23 | if (ctx !== undefined) { | 23 | if (ctx !== undefined) { |
24 | libraries = ctx.libraries; | 24 | libraries = ctx.libraries; |
25 | 25 | ||
26 | + var p; | ||
26 | for (p in ctx.components) { | 27 | for (p in ctx.components) { |
27 | if (ctx.components.hasOwnProperty(p)) { | 28 | if (ctx.components.hasOwnProperty(p)) { |
28 | components[p] = ctx.components[p]; | 29 | components[p] = ctx.components[p]; |
... | @@ -39,8 +40,7 @@ ARCS.Context = function( ctx ) { | ... | @@ -39,8 +40,7 @@ ARCS.Context = function( ctx ) { |
39 | 40 | ||
40 | } | 41 | } |
41 | 42 | ||
42 | - | 43 | + var loadDataFile =async function(fileName) { |
43 | - loadDataFile = function(fileName) { | ||
44 | var dataPromise ; | 44 | var dataPromise ; |
45 | 45 | ||
46 | if (ARCS.isInNode()) { | 46 | if (ARCS.isInNode()) { |
... | @@ -53,59 +53,12 @@ ARCS.Context = function( ctx ) { | ... | @@ -53,59 +53,12 @@ ARCS.Context = function( ctx ) { |
53 | } | 53 | } |
54 | }); | 54 | }); |
55 | } else { | 55 | } else { |
56 | - return new Promise(function(resolve, reject) { | 56 | + var client = await fetch(fileName); |
57 | - var client = new XMLHttpRequest(); | 57 | + return client.json(); |
58 | - client.open('GET',fileName,true); | ||
59 | - client.overrideMimeType("application/json"); | ||
60 | - client.send(); | ||
61 | - | ||
62 | - client.onload = function() { | ||
63 | - if (this.status >= 200 && this.status < 300) { | ||
64 | - resolve(JSON.parse(this.responseText)); | ||
65 | - } else { | ||
66 | - console.error(this.statusText); | ||
67 | - reject(this.statusText); | ||
68 | - } | ||
69 | - }; | ||
70 | - client.onerror = function() { | ||
71 | - console.error(this.statusText); | ||
72 | - reject(this.statusText); | ||
73 | - }; | ||
74 | - }); | ||
75 | } | 58 | } |
76 | }; | 59 | }; |
77 | - | 60 | + |
78 | - this.addLibraryPromise = function(p) { | 61 | + var loadLibraries = function () { |
79 | - depLibPromises.push(p); | ||
80 | - }; | ||
81 | - | ||
82 | - promiseLibrary = function(libName) { | ||
83 | - return new Promise(function(resolve, reject) { | ||
84 | - if (libName.substr(-3) === '.js') { | ||
85 | - reject(libName); | ||
86 | - } | ||
87 | - | ||
88 | - if (ARCS.isInNode()) { | ||
89 | - if (require("./" + libraries[i] + ".js") === undefined) { | ||
90 | - reject(libName); | ||
91 | - } else { | ||
92 | - resolve(); | ||
93 | - } | ||
94 | - } else { | ||
95 | - require([libName], | ||
96 | - function() { | ||
97 | - resolve(); | ||
98 | - }, | ||
99 | - function(err) { | ||
100 | - reject(libName,err); | ||
101 | - | ||
102 | - } | ||
103 | - ); | ||
104 | - } | ||
105 | - }); | ||
106 | - }; | ||
107 | - | ||
108 | - loadLibraries = function () { | ||
109 | var i; | 62 | var i; |
110 | // we will use different instances of require either the one of node | 63 | // we will use different instances of require either the one of node |
111 | // or the one from require.js | 64 | // or the one from require.js |
... | @@ -113,14 +66,13 @@ ARCS.Context = function( ctx ) { | ... | @@ -113,14 +66,13 @@ ARCS.Context = function( ctx ) { |
113 | 66 | ||
114 | var res=[]; | 67 | var res=[]; |
115 | for(i=0; i < libraries.length; i++) { | 68 | for(i=0; i < libraries.length; i++) { |
116 | - res.push(promiseLibrary(libraries[i])); | 69 | + res.push(self.loadLibrary(libraries[i])); |
117 | } | 70 | } |
118 | return Promise.all(res); | 71 | return Promise.all(res); |
119 | }; | 72 | }; |
120 | 73 | ||
121 | - instanciateComponents = function() { | 74 | + var instanciateComponents = function() { |
122 | var p, promises=[]; | 75 | var p, promises=[]; |
123 | - console.log(components); | ||
124 | 76 | ||
125 | for (p in components) { | 77 | for (p in components) { |
126 | if (components.hasOwnProperty(p)) { | 78 | if (components.hasOwnProperty(p)) { |
... | @@ -129,7 +81,7 @@ ARCS.Context = function( ctx ) { | ... | @@ -129,7 +81,7 @@ ARCS.Context = function( ctx ) { |
129 | console.error("[ARCS] Context dump follows: ", libraries, components, constants); | 81 | console.error("[ARCS] Context dump follows: ", libraries, components, constants); |
130 | return ; | 82 | return ; |
131 | } | 83 | } |
132 | - factory = factories[components[p].type]; | 84 | + var factory = factories[components[p].type]; |
133 | //console.log("instanciating ", p); | 85 | //console.log("instanciating ", p); |
134 | try { | 86 | try { |
135 | if (components[p].value !== undefined || components[p].url !== undefined || components[p].ref !== undefined) { | 87 | if (components[p].value !== undefined || components[p].url !== undefined || components[p].ref !== undefined) { |
... | @@ -140,11 +92,12 @@ ARCS.Context = function( ctx ) { | ... | @@ -140,11 +92,12 @@ ARCS.Context = function( ctx ) { |
140 | // we need currying here ! | 92 | // we need currying here ! |
141 | var delayInstanciation = function(p,factory) { | 93 | var delayInstanciation = function(p,factory) { |
142 | return function(obj) { | 94 | return function(obj) { |
95 | + console.log("instanciating from data file"); | ||
143 | components[p].instance = new factory(obj); | 96 | components[p].instance = new factory(obj); |
144 | return Promise.resolve(); | 97 | return Promise.resolve(); |
145 | } | 98 | } |
146 | }; | 99 | }; |
147 | - | 100 | + console.log("loading data file", components[p].url); |
148 | promises.push( | 101 | promises.push( |
149 | loadDataFile(components[p].url).then(delayInstanciation(p,factory)) | 102 | loadDataFile(components[p].url).then(delayInstanciation(p,factory)) |
150 | ); | 103 | ); |
... | @@ -177,13 +130,23 @@ ARCS.Context = function( ctx ) { | ... | @@ -177,13 +130,23 @@ ARCS.Context = function( ctx ) { |
177 | libActualName = libName.name; | 130 | libActualName = libName.name; |
178 | libUrl = libName.url; | 131 | libUrl = libName.url; |
179 | } | 132 | } |
180 | - | 133 | + |
181 | - libraries.push(libActualName); | 134 | + if (libraries.indexOf(libActualName) < 0) { |
182 | - promiseLibrary(libUrl).then( function() { | 135 | + libraries.push(libActualName); |
136 | + } | ||
137 | + // TODO promisify call to cbFunction | ||
138 | + return import(libUrl).then( function(module) { | ||
139 | + // TODO insert here component factories | ||
140 | + for (p in module.default) { | ||
141 | + if (module.default.hasOwnProperty(p)) { | ||
142 | + ARCS.Context.currentContext.setFactory(p,module.default[p]); | ||
143 | + } | ||
144 | + } | ||
145 | + | ||
183 | if (cbFunction !== undefined) { | 146 | if (cbFunction !== undefined) { |
184 | cbFunction(); | 147 | cbFunction(); |
185 | } | 148 | } |
186 | - }); | 149 | + }).catch( function(msg) { console.error("[ARCS] Trouble loading '",libUrl,"' with reason -", msg) }); |
187 | }; | 150 | }; |
188 | 151 | ||
189 | /** | 152 | /** |
... | @@ -300,9 +263,9 @@ ARCS.Context = function( ctx ) { | ... | @@ -300,9 +263,9 @@ ARCS.Context = function( ctx ) { |
300 | 263 | ||
301 | // this should return a promise ! | 264 | // this should return a promise ! |
302 | this.instanciate = function () { | 265 | this.instanciate = function () { |
303 | - return loadLibraries().then(function() { return Promise.all(depLibPromises); }) | 266 | + //! TODO |
304 | - .then(instanciateComponents) | 267 | + return loadLibraries().then(instanciateComponents) |
305 | - .catch(function(msg) { console.log("[ARCS] Trouble instanciating context", msg); }); | 268 | + .catch(function(msg) { console.error("[ARCS] Trouble instanciating context", msg); }); |
306 | 269 | ||
307 | }; | 270 | }; |
308 | 271 | ... | ... |
1 | +// no longer needed with the use of imports | ||
1 | 2 | ||
2 | -// ARCS is then defined as a node.js module | 3 | +export { ARCS as default}; |
3 | -if (!ARCS.isInNode()) { | ||
4 | - var exports = {}; | ||
5 | -} | ||
6 | - | ||
7 | -exports.Component = ARCS.Component; | ||
8 | -exports.Connection = ARCS.Connection; | ||
9 | -exports.Invocation = ARCS.Invocation; | ||
10 | -exports.Statemachine = ARCS.Statemachine; | ||
11 | -exports.Sheet = ARCS.Sheet; | ||
12 | -exports.Application = ARCS.Application; | ||
13 | -exports.EventLogicParser = ARCS.EventLogicParser; | ||
14 | -exports.TransitionSystem = ARCS.TransitionSystem; | ||
15 | -exports.isInNode = ARCS.isInNode; | ||
16 | -exports.isInRequire = ARCS.isInRequire; | ||
17 | - | ||
18 | -// hack for require.js | ||
19 | -// ARCS is then defined as a require.js module. | ||
20 | -if (ARCS.isInRequire()) { | ||
21 | - //console.log("module ARCS in require.js"); | ||
22 | - define(exports); | ||
23 | -} | ||
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
... | @@ -35,7 +35,7 @@ ARCS.TransitionNetwork.build = function(tree, tokenEvents) { | ... | @@ -35,7 +35,7 @@ ARCS.TransitionNetwork.build = function(tree, tokenEvents) { |
35 | } | 35 | } |
36 | 36 | ||
37 | res = ARCS.TransitionNetwork.build(tree[0],tokenEvents); | 37 | res = ARCS.TransitionNetwork.build(tree[0],tokenEvents); |
38 | - | 38 | + var i; |
39 | for (i=1; i < tree.length; i++) { | 39 | for (i=1; i < tree.length; i++) { |
40 | if (tree[i].hasOwnProperty('and')) { | 40 | if (tree[i].hasOwnProperty('and')) { |
41 | rightTN = ARCS.TransitionNetwork.build(tree[i]['and'], tokenEvents); | 41 | rightTN = ARCS.TransitionNetwork.build(tree[i]['and'], tokenEvents); | ... | ... |
1 | { | 1 | { |
2 | "context": { | 2 | "context": { |
3 | "libraries": [ | 3 | "libraries": [ |
4 | - "components/arviewer","components/animator", | 4 | + "../components/arviewer.js","../components/animator.js", |
5 | - "components/objloader","components/video", | 5 | + "../components/objloader.js","../components/video.js", |
6 | - "components/arucodetector", "components/markerlocator", | 6 | + "../components/arucodetector.js", "../components/markerlocator.js", |
7 | - "components/windowevent", "components/tokensender", "components/objecttransform" | 7 | + "../components/windowevent.js", "../components/tokensender.js", "../components/objecttransform.js" |
8 | ], | 8 | ], |
9 | "components": { | 9 | "components": { |
10 | "viewer": { "type": "ARViewer"}, | 10 | "viewer": { "type": "ARViewer"}, | ... | ... |
... | @@ -2,15 +2,15 @@ | ... | @@ -2,15 +2,15 @@ |
2 | <head> | 2 | <head> |
3 | <title>ARCS: marker experiment</title> | 3 | <title>ARCS: marker experiment</title> |
4 | <link type="text/css" rel="stylesheet" href="arcs.css"> | 4 | <link type="text/css" rel="stylesheet" href="arcs.css"> |
5 | - <script data-main="../../build/arcs_browser" | 5 | + <script src="../../build/arcs_browser.js" |
6 | data-base-url="../.." | 6 | data-base-url="../.." |
7 | data-arcsapp="arcsapp.json" | 7 | data-arcsapp="arcsapp.json" |
8 | - src="../../deps/requirejs/require.js"> | 8 | + type="module"> |
9 | </script> | 9 | </script> |
10 | <meta charset="UTF-8"> | 10 | <meta charset="UTF-8"> |
11 | </head> | 11 | </head> |
12 | <body> | 12 | <body> |
13 | - <video id="video" width=320 height=240 autoplay="true" style="display: none;"></video> | 13 | + <video id="video" width=640 height=480 autoplay="true" style="display: none;"></video> |
14 | <canvas id="canvas"></canvas> | 14 | <canvas id="canvas"></canvas> |
15 | <div id="container" ></div> | 15 | <div id="container" ></div> |
16 | <div id="contents"> | 16 | <div id="contents"> | ... | ... |
1 | { | 1 | { |
2 | "context" : { | 2 | "context" : { |
3 | - "libraries" : [ "components/loop","components/console"], | 3 | + "libraries" : [ "../components/loop.js","../components/console.js"], |
4 | "components" : { | 4 | "components" : { |
5 | "loop": { "type": "Loop" }, | 5 | "loop": { "type": "Loop" }, |
6 | "dint": { "type": "DisplayInt" }, | 6 | "dint": { "type": "DisplayInt" }, | ... | ... |
1 | <html> | 1 | <html> |
2 | <head> | 2 | <head> |
3 | <title>ARCS engine</title> | 3 | <title>ARCS engine</title> |
4 | - <script data-main="../../build/arcs_browser" | 4 | + <script data-base-url="../.." |
5 | - data-base-url="../.." | 5 | + data-arcsapp="arcsapp.json" |
6 | - data-arcsapp="arcsapp.json" | 6 | + type="module" |
7 | - src="../../deps/requirejs/require.js"> | 7 | + src="../../build/arcs_browser.js"> |
8 | - </script> | 8 | + </script> |
9 | + <style> | ||
10 | + body { | ||
11 | + font-family: sans-serif; | ||
12 | + } | ||
13 | + </style> | ||
9 | </head> | 14 | </head> |
10 | <body> | 15 | <body> |
11 | <h1>ARCS in Web Browser</h1> | 16 | <h1>ARCS in Web Browser</h1> |
12 | - <div style="height:100px; overflow: auto; border: solid 1px navy;"> | 17 | + <div style="height:80vh; overflow: auto; border: solid 1px navy;"> |
13 | - <p id="output" style="margin: 5px; padding: 5px;"></p> | 18 | + <p id="output" style="margin: 5px; padding: 5px; font-family: monospace;"></p> |
14 | <div> | 19 | <div> |
15 | </body> | 20 | </body> |
16 | </html> | 21 | </html> | ... | ... |
-
Please register or login to post a comment